pax_global_header00006660000000000000000000000064136116702070014515gustar00rootroot0000000000000052 comment=5c88d758d0b4a6cd3b075bfc4454e5714ec22b23 zxing-cpp-1.0.8+ds2/000077500000000000000000000000001361167020700141265ustar00rootroot00000000000000zxing-cpp-1.0.8+ds2/.appveyor.yml000066400000000000000000000030431361167020700165740ustar00rootroot00000000000000version: '{branch}.{build}' branches: only: - /v\d*\.\d*\.\d*/ skip_non_tags: true image: Visual Studio 2017 build_script: - cmd: >- set CMAKE_EXE="cmake.exe" set DESTINATION="wrappers\winrt\UAP\v0.8.0.0\ExtensionSDKs\ZXingWinRT\1.0.0.0" set BASE_DIR="%CD%" cd %DESTINATION% set DESTINATION=%CD% cd %BASE_DIR% set BUILD_LOC=build_uwp_x86 md %BUILD_LOC% cd %BUILD_LOC% %CMAKE_EXE% -G "Visual Studio 15 2017" -DCMAKE_SYSTEM_NAME=WindowsStore -DCMAKE_SYSTEM_VERSION=10.0 -DEXTENSION_SDK_OUTPUT="%DESTINATION%" ..\wrappers\winrt %CMAKE_EXE% --build . --config Release cd %BASE_DIR% set BUILD_LOC=build_uwp_x64 md %BUILD_LOC% cd %BUILD_LOC% %CMAKE_EXE% -G "Visual Studio 15 2017 Win64" -DCMAKE_SYSTEM_NAME=WindowsStore -DCMAKE_SYSTEM_VERSION=10.0 -DEXTENSION_SDK_OUTPUT="%DESTINATION%" ..\wrappers\winrt %CMAKE_EXE% --build . --config Release cd %BASE_DIR% set BUILD_LOC=build_uwp_arm md %BUILD_LOC% cd %BUILD_LOC% %CMAKE_EXE% -G "Visual Studio 15 2017 ARM" -DCMAKE_SYSTEM_NAME=WindowsStore -DCMAKE_SYSTEM_VERSION=10.0 -DEXTENSION_SDK_OUTPUT="%DESTINATION%" ..\wrappers\winrt %CMAKE_EXE% --build . --config Release cd %BASE_DIR% nuget pack -Version %APPVEYOR_REPO_BRANCH:~1% wrappers\winrt\nuget\ZXingWinRT.nuspec artifacts: - path: '*.nupkg' deploy: - provider: NuGet api_key: secure: OMvgm0WQ+yV7E+yxtmrOn6c/uO/V1fsbBERdz9aQUicqHGImzWqWoSBAankUtxdEwDZx0XrJ5hlUsIuL5tdQD+C8ZKrI1L3FukbXdbqVdKM= artifact: /.*\.nupkg/ on: APPVEYOR_REPO_TAG: true zxing-cpp-1.0.8+ds2/.travis.yml000066400000000000000000000006041361167020700162370ustar00rootroot00000000000000language: cpp dist: bionic os: - linux script: - mkdir build && cd build - cmake ../core - make -j10 - cd .. - mkdir build-unit && cd build-unit - cmake ../test/unit - make -j10 - ./ZXingUnitTest - cd .. - mkdir build-test && cd build-test - cmake -DCMAKE_BUILD_TYPE=Release ../test/blackbox - make -j10 - ./ReaderTest ../test/samples - ./WriterTest - ./ReaderTest *.png zxing-cpp-1.0.8+ds2/AUTHORS.ZXing000066400000000000000000000047241361167020700162430ustar00rootroot00000000000000This project consists of contributions from several people, recognized here for convenience, in alphabetical order. Agustín Delgado (Servinform S.A.) Aitor Almeida (University of Deusto) Alasdair Mackintosh (Google) Alex Dupre Alexander Martin (Haase & Martin GmbH) Alexander Schmidt Anders Borg Andreas Pillath Andrew Walbran (Google) Andrey Sitnik Androida.hu / http://www.androida.hu/ Antonio Manuel Benjumea (Servinform S.A.) Asier Iturralde Asmuri Anwar atereshchuk Betaminos Brian Brown (Google) Bruce Allen Chang Hyun Park Christian Brunschen (Google) Christoph Schulz (creatale GmbH) crowdin.net Daisuke Makiuchi Daniel Switkin (Google) Dave MacLachlan (Google) David Phillip Oster (Google) David Albert (Bug Labs) David Olivier David Walker (Google) Diego Pierotto Dion Hardy drejc83 Eduardo Castillejo (University of Deusto) Emanuele Aina Eric Kobrin (Velocitude) evansepdx Erik Barbara Facundo Farias fakhri626 fics.danmark Francois B. (Google) Frank Yellin Fred Lin (Anobiit) gcstang Guenther Grau Guillaume Cottenceau Guillaume Le Biller Hannes Erven Hartmut Neubauer (Schweers Informationstechnologie GmbH) hosigumayuugi hypest (Barcorama project) Ian W. Davis Isaac Potoczny-Jones Ivan Poliakov Jacob Haynes (Google) Jeff Breidenbach (Google) jjYBdx4IL Joan Montané (Softcatalà.cat) John Connolly (Bug Labs) Jonas Petersson (Prisjakt) Joseph Wain (Google) Juha Kuitunen Juho Mikkonen Jukka Nurmi jwicks Kamil Kaczmarczyk Kazuki Nishiura Kevin O'Sullivan (SITA) Kevin Xue (NetDragon Websoft Inc., China) Lachezar Dobrev Loránt Gerencsér Luiz Silva Luka Finžgar Łukasz Stefaniak Malte Starostik Manuel Kasten Marcelo Marcin Górny Markus Helm Mateusz Jędrasik Matthew Schulkind (Google) Matt York (LifeMarks) MicheleMas mike32767 mikej06 / micjahn Mike Kicinski Mohamad Fairol Morgan Courbet Nikolaos Ftylitakis Nikolaus Huber Olexandr Nesterenko Olli Pablo Orduña (University of Deusto) Paul Hackenberger perennialmind Radu Silaghi Ralf Kistner Randy Shen (Acer) Rasmus Schrøder Sørensen Richard Hřivňák Romain Pechayre Roman Nurik (Google) Rustam Abdullaev Ryan Alford Sanford Squires Satoshi Kametaya Shachar Shemesh Sean Owen (Google) Shiyuan Guo / 郭世元 ShumovichY Simon Flannery (Ericsson) slepmog Stephen Furlani Steven Parkes stoty74 Suraj Supekar Sven Klinkhamer taku0 techinstantdx tgibson11 Thanapon Namjittrong Thomas Gerbet Thomas Weißschuh Tim Gernat v.anestis Vince Francis (LifeMarks) Wolfgang Jung Yahoe001 Yakov Okshtein (Google) Yao Wei Younes CHTIOUI Yunhao Tian zxing-cpp-1.0.8+ds2/CMakeLists.txt000066400000000000000000000060421361167020700166700ustar00rootroot00000000000000cmake_minimum_required (VERSION 3.1.3) set (ZXING_VERSION_MAJOR 1) set (ZXING_VERSION_MINOR 0) set (ZXING_VERSION_PATCH 7) project (ZXingCpp VERSION ${ZXING_VERSION_MAJOR}.${ZXING_VERSION_MINOR}.${ZXING_VERSION_PATCH}) set (ENABLE_ENCODERS ON CACHE BOOL "Check to include encoders") set (ENABLE_DECODERS ON CACHE BOOL "Check to include decoders") IF (NOT WIN32) set (BUILD_SHARED_LIBRARY ON CACHE BOOL "Check to build ZXingCore as shared library") ELSE () set (BUILD_SHARED_LIBRARY OFF CACHE BOOL "Check to build ZXingCore as shared library") ENDIF () if (MSVC) set (LINK_CPP_STATICALLY OFF CACHE BOOL "MSVC only, check to link statically standard library (/MT and /MTd)") add_definitions (-DUNICODE -D_UNICODE) set (CMAKE_C_FLAGS_RELEASE "${CMAKE_C_FLAGS_RELEASE} /Oi /GS-") set (CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE} /Oi /GS-") if (LINK_CPP_STATICALLY) set (CMAKE_C_FLAGS_RELEASE "${CMAKE_C_FLAGS_RELEASE} /MT") set (CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE} /MT") set (CMAKE_C_FLAGS_DEBUG "${CMAKE_C_FLAGS_DEBUG} /MTd") set (CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} /MTd") endif() else() set (CMAKE_C_FLAGS_DEBUG "${CMAKE_C_FLAGS_DEBUG} -D_DEBUG") set (CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} -D_DEBUG") endif() set (DEFAULT_BUILD_TYPE "Release") if (NOT CMAKE_BUILD_TYPE) message (STATUS "Setting build type to '${DEFAULT_BUILD_TYPE}' as none was specified.") set (CMAKE_BUILD_TYPE "${DEFAULT_BUILD_TYPE}" CACHE STRING "Choose the type of build." FORCE) set_property (CACHE CMAKE_BUILD_TYPE PROPERTY STRINGS "Debug" "Release" "MinSizeRel" "RelWithDebInfo") endif() if (BUILD_SHARED_LIBRARY) set (BUILD_SHARED_LIBS ON) set (CMAKE_WINDOWS_EXPORT_ALL_SYMBOLS ON) endif() add_subdirectory (core) set(TARGET_ZXING "ZXingCore" CACHE STRING "The name for the ZXing library") set_target_properties (${TARGET_ZXING} PROPERTIES VERSION ${PROJECT_VERSION}) set_target_properties (${TARGET_ZXING} PROPERTIES SOVERSION ${ZXING_VERSION_MAJOR}) set (CMAKECONFIG_INSTALL_DIR "${CMAKE_INSTALL_LIBDIR}/cmake/ZXing") install ( EXPORT ZXingTargets DESTINATION ${CMAKECONFIG_INSTALL_DIR} NAMESPACE ZXing:: ) install ( DIRECTORY core/src/ DESTINATION include/ZXing FILES_MATCHING PATTERN "*.h" ) configure_file ( core/ZXVersion.h.in ZXVersion.h ) install ( FILES "${CMAKE_CURRENT_BINARY_DIR}/ZXVersion.h" DESTINATION include/ZXing ) # PC file generation. if (NOT DEFINED INSTALLDIR) set (INSTALLDIR ${CMAKE_INSTALL_PREFIX}) get_filename_component(INSTALLDIR ${INSTALLDIR} ABSOLUTE) endif() IF (NOT WIN32) configure_file(zxing.pc.in zxing.pc @ONLY) install(FILES ${CMAKE_CURRENT_BINARY_DIR}/zxing.pc DESTINATION ${CMAKE_INSTALL_LIBDIR}/pkgconfig) ENDIF() include (CMakePackageConfigHelpers) configure_package_config_file ( core/ZXingConfig.cmake.in ZXingConfig.cmake INSTALL_DESTINATION ${CMAKECONFIG_INSTALL_DIR} ) install ( FILES "${CMAKE_CURRENT_BINARY_DIR}/ZXingConfig.cmake" DESTINATION ${CMAKECONFIG_INSTALL_DIR} ) zxing-cpp-1.0.8+ds2/LGPL_EXCEPTION.Qt000066400000000000000000000022541361167020700166130ustar00rootroot00000000000000The Qt Company Qt LGPL Exception version 1.1 As an additional permission to the GNU Lesser General Public License version 2.1, the object code form of a "work that uses the Library" may incorporate material from a header file that is part of the Library. You may distribute such object code under terms of your choice, provided that: (i) the header files of the Library have not been modified; and (ii) the incorporated material is limited to numerical parameters, data structure layouts, accessors, macros, inline functions and templates; and (iii) you comply with the terms of Section 6 of the GNU Lesser General Public License version 2.1. Moreover, you may apply this exception to a modified version of the Library, provided that such modification does not involve copying material from the Library into the modified Library's header files unless such material is limited to (i) numerical parameters; (ii) data structure layouts; (iii) accessors; and (iv) small macros, templates and inline functions of five lines or less in length. Furthermore, you are not required to apply this additional permission to a modified version of the Library. zxing-cpp-1.0.8+ds2/LICENSE000066400000000000000000000261361361167020700151430ustar00rootroot00000000000000 Apache License Version 2.0, January 2004 http://www.apache.org/licenses/ TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION 1. Definitions. "License" shall mean the terms and conditions for use, reproduction, and distribution as defined by Sections 1 through 9 of this document. "Licensor" shall mean the copyright owner or entity authorized by the copyright owner that is granting the License. "Legal Entity" shall mean the union of the acting entity and all other entities that control, are controlled by, or are under common control with that entity. For the purposes of this definition, "control" means (i) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the outstanding shares, or (iii) beneficial ownership of such entity. "You" (or "Your") shall mean an individual or Legal Entity exercising permissions granted by this License. "Source" form shall mean the preferred form for making modifications, including but not limited to software source code, documentation source, and configuration files. "Object" form shall mean any form resulting from mechanical transformation or translation of a Source form, including but not limited to compiled object code, generated documentation, and conversions to other media types. "Work" shall mean the work of authorship, whether in Source or Object form, made available under the License, as indicated by a copyright notice that is included in or attached to the work (an example is provided in the Appendix below). "Derivative Works" shall mean any work, whether in Source or Object form, that is based on (or derived from) the Work and for which the editorial revisions, annotations, elaborations, or other modifications represent, as a whole, an original work of authorship. For the purposes of this License, Derivative Works shall not include works that remain separable from, or merely link (or bind by name) to the interfaces of, the Work and Derivative Works thereof. "Contribution" shall mean any work of authorship, including the original version of the Work and any modifications or additions to that Work or Derivative Works thereof, that is intentionally submitted to Licensor for inclusion in the Work by the copyright owner or by an individual or Legal Entity authorized to submit on behalf of the copyright owner. For the purposes of this definition, "submitted" means any form of electronic, verbal, or written communication sent to the Licensor or its representatives, including but not limited to communication on electronic mailing lists, source code control systems, and issue tracking systems that are managed by, or on behalf of, the Licensor for the purpose of discussing and improving the Work, but excluding communication that is conspicuously marked or otherwise designated in writing by the copyright owner as "Not a Contribution." "Contributor" shall mean Licensor and any individual or Legal Entity on behalf of whom a Contribution has been received by Licensor and subsequently incorporated within the Work. 2. Grant of Copyright License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable copyright license to reproduce, prepare Derivative Works of, publicly display, publicly perform, sublicense, and distribute the Work and such Derivative Works in Source or Object form. 3. Grant of Patent License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable (except as stated in this section) patent license to make, have made, use, offer to sell, sell, import, and otherwise transfer the Work, where such license applies only to those patent claims licensable by such Contributor that are necessarily infringed by their Contribution(s) alone or by combination of their Contribution(s) with the Work to which such Contribution(s) was submitted. If You institute patent litigation against any entity (including a cross-claim or counterclaim in a lawsuit) alleging that the Work or a Contribution incorporated within the Work constitutes direct or contributory patent infringement, then any patent licenses granted to You under this License for that Work shall terminate as of the date such litigation is filed. 4. Redistribution. You may reproduce and distribute copies of the Work or Derivative Works thereof in any medium, with or without modifications, and in Source or Object form, provided that You meet the following conditions: (a) You must give any other recipients of the Work or Derivative Works a copy of this License; and (b) You must cause any modified files to carry prominent notices stating that You changed the files; and (c) You must retain, in the Source form of any Derivative Works that You distribute, all copyright, patent, trademark, and attribution notices from the Source form of the Work, excluding those notices that do not pertain to any part of the Derivative Works; and (d) If the Work includes a "NOTICE" text file as part of its distribution, then any Derivative Works that You distribute must include a readable copy of the attribution notices contained within such NOTICE file, excluding those notices that do not pertain to any part of the Derivative Works, in at least one of the following places: within a NOTICE text file distributed as part of the Derivative Works; within the Source form or documentation, if provided along with the Derivative Works; or, within a display generated by the Derivative Works, if and wherever such third-party notices normally appear. The contents of the NOTICE file are for informational purposes only and do not modify the License. You may add Your own attribution notices within Derivative Works that You distribute, alongside or as an addendum to the NOTICE text from the Work, provided that such additional attribution notices cannot be construed as modifying the License. You may add Your own copyright statement to Your modifications and may provide additional or different license terms and conditions for use, reproduction, or distribution of Your modifications, or for any such Derivative Works as a whole, provided Your use, reproduction, and distribution of the Work otherwise complies with the conditions stated in this License. 5. Submission of Contributions. Unless You explicitly state otherwise, any Contribution intentionally submitted for inclusion in the Work by You to the Licensor shall be under the terms and conditions of this License, without any additional terms or conditions. Notwithstanding the above, nothing herein shall supersede or modify the terms of any separate license agreement you may have executed with Licensor regarding such Contributions. 6. Trademarks. This License does not grant permission to use the trade names, trademarks, service marks, or product names of the Licensor, except as required for reasonable and customary use in describing the origin of the Work and reproducing the content of the NOTICE file. 7. Disclaimer of Warranty. Unless required by applicable law or agreed to in writing, Licensor provides the Work (and each Contributor provides its Contributions) on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied, including, without limitation, any warranties or conditions of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A PARTICULAR PURPOSE. You are solely responsible for determining the appropriateness of using or redistributing the Work and assume any risks associated with Your exercise of permissions under this License. 8. Limitation of Liability. In no event and under no legal theory, whether in tort (including negligence), contract, or otherwise, unless required by applicable law (such as deliberate and grossly negligent acts) or agreed to in writing, shall any Contributor be liable to You for damages, including any direct, indirect, special, incidental, or consequential damages of any character arising as a result of this License or out of the use or inability to use the Work (including but not limited to damages for loss of goodwill, work stoppage, computer failure or malfunction, or any and all other commercial damages or losses), even if such Contributor has been advised of the possibility of such damages. 9. Accepting Warranty or Additional Liability. While redistributing the Work or Derivative Works thereof, You may choose to offer, and charge a fee for, acceptance of support, warranty, indemnity, or other liability obligations and/or rights consistent with this License. However, in accepting such obligations, You may act only on Your own behalf and on Your sole responsibility, not on behalf of any other Contributor, and only if You agree to indemnify, defend, and hold each Contributor harmless for any liability incurred by, or claims asserted against, such Contributor by reason of your accepting any such warranty or additional liability. END OF TERMS AND CONDITIONS APPENDIX: How to apply the Apache License to your work. To apply the Apache License to your work, attach the following boilerplate notice, with the fields enclosed by brackets "{}" replaced with your own identifying information. (Don't include the brackets!) The text should be enclosed in the appropriate comment syntax for the file format. We also recommend that a file or class name and description of purpose be included on the same "printed page" as the copyright notice for easier identification within third-party archives. Copyright {yyyy} {name of copyright owner} Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. zxing-cpp-1.0.8+ds2/LICENSE.Qt000066400000000000000000000643201361167020700155230ustar00rootroot00000000000000 GNU LESSER GENERAL PUBLIC LICENSE The Qt Toolkit is Copyright (C) 2015 The Qt Company Ltd. Contact: http://www.qt.io/licensing/ You may use, distribute and copy the Qt GUI Toolkit under the terms of GNU Lesser General Public License version 2.1, which is displayed below. ------------------------------------------------------------------------- GNU LESSER GENERAL PUBLIC LICENSE Version 2.1, February 1999 Copyright (C) 1991, 1999 Free Software Foundation, Inc. 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA Everyone is permitted to copy and distribute verbatim copies of this license document, but changing it is not allowed. [This is the first released version of the Lesser GPL. It also counts as the successor of the GNU Library Public License, version 2, hence the version number 2.1.] Preamble The licenses for most software are designed to take away your freedom to share and change it. By contrast, the GNU General Public Licenses are intended to guarantee your freedom to share and change free software--to make sure the software is free for all its users. This license, the Lesser General Public License, applies to some specially designated software packages--typically libraries--of the Free Software Foundation and other authors who decide to use it. You can use it too, but we suggest you first think carefully about whether this license or the ordinary General Public License is the better strategy to use in any particular case, based on the explanations below. When we speak of free software, we are referring to freedom of use, not price. Our General Public Licenses are designed to make sure that you have the freedom to distribute copies of free software (and charge for this service if you wish); that you receive source code or can get it if you want it; that you can change the software and use pieces of it in new free programs; and that you are informed that you can do these things. To protect your rights, we need to make restrictions that forbid distributors to deny you these rights or to ask you to surrender these rights. These restrictions translate to certain responsibilities for you if you distribute copies of the library or if you modify it. For example, if you distribute copies of the library, whether gratis or for a fee, you must give the recipients all the rights that we gave you. You must make sure that they, too, receive or can get the source code. If you link other code with the library, you must provide complete object files to the recipients, so that they can relink them with the library after making changes to the library and recompiling it. And you must show them these terms so they know their rights. We protect your rights with a two-step method: (1) we copyright the library, and (2) we offer you this license, which gives you legal permission to copy, distribute and/or modify the library. To protect each distributor, we want to make it very clear that there is no warranty for the free library. Also, if the library is modified by someone else and passed on, the recipients should know that what they have is not the original version, so that the original author's reputation will not be affected by problems that might be introduced by others. Finally, software patents pose a constant threat to the existence of any free program. We wish to make sure that a company cannot effectively restrict the users of a free program by obtaining a restrictive license from a patent holder. Therefore, we insist that any patent license obtained for a version of the library must be consistent with the full freedom of use specified in this license. Most GNU software, including some libraries, is covered by the ordinary GNU General Public License. This license, the GNU Lesser General Public License, applies to certain designated libraries, and is quite different from the ordinary General Public License. We use this license for certain libraries in order to permit linking those libraries into non-free programs. When a program is linked with a library, whether statically or using a shared library, the combination of the two is legally speaking a combined work, a derivative of the original library. The ordinary General Public License therefore permits such linking only if the entire combination fits its criteria of freedom. The Lesser General Public License permits more lax criteria for linking other code with the library. We call this license the "Lesser" General Public License because it does Less to protect the user's freedom than the ordinary General Public License. It also provides other free software developers Less of an advantage over competing non-free programs. These disadvantages are the reason we use the ordinary General Public License for many libraries. However, the Lesser license provides advantages in certain special circumstances. For example, on rare occasions, there may be a special need to encourage the widest possible use of a certain library, so that it becomes a de-facto standard. To achieve this, non-free programs must be allowed to use the library. A more frequent case is that a free library does the same job as widely used non-free libraries. In this case, there is little to gain by limiting the free library to free software only, so we use the Lesser General Public License. In other cases, permission to use a particular library in non-free programs enables a greater number of people to use a large body of free software. For example, permission to use the GNU C Library in non-free programs enables many more people to use the whole GNU operating system, as well as its variant, the GNU/Linux operating system. Although the Lesser General Public License is Less protective of the users' freedom, it does ensure that the user of a program that is linked with the Library has the freedom and the wherewithal to run that program using a modified version of the Library. The precise terms and conditions for copying, distribution and modification follow. Pay close attention to the difference between a "work based on the library" and a "work that uses the library". The former contains code derived from the library, whereas the latter must be combined with the library in order to run. GNU LESSER GENERAL PUBLIC LICENSE TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION 0. This License Agreement applies to any software library or other program which contains a notice placed by the copyright holder or other authorized party saying it may be distributed under the terms of this Lesser General Public License (also called "this License"). Each licensee is addressed as "you". A "library" means a collection of software functions and/or data prepared so as to be conveniently linked with application programs (which use some of those functions and data) to form executables. The "Library", below, refers to any such software library or work which has been distributed under these terms. A "work based on the Library" means either the Library or any derivative work under copyright law: that is to say, a work containing the Library or a portion of it, either verbatim or with modifications and/or translated straightforwardly into another language. (Hereinafter, translation is included without limitation in the term "modification".) "Source code" for a work means the preferred form of the work for making modifications to it. For a library, complete source code means all the source code for all modules it contains, plus any associated interface definition files, plus the scripts used to control compilation and installation of the library. Activities other than copying, distribution and modification are not covered by this License; they are outside its scope. The act of running a program using the Library is not restricted, and output from such a program is covered only if its contents constitute a work based on the Library (independent of the use of the Library in a tool for writing it). Whether that is true depends on what the Library does and what the program that uses the Library does. 1. You may copy and distribute verbatim copies of the Library's complete source code as you receive it, in any medium, provided that you conspicuously and appropriately publish on each copy an appropriate copyright notice and disclaimer of warranty; keep intact all the notices that refer to this License and to the absence of any warranty; and distribute a copy of this License along with the Library. You may charge a fee for the physical act of transferring a copy, and you may at your option offer warranty protection in exchange for a fee. 2. You may modify your copy or copies of the Library or any portion of it, thus forming a work based on the Library, and copy and distribute such modifications or work under the terms of Section 1 above, provided that you also meet all of these conditions: a) The modified work must itself be a software library. b) You must cause the files modified to carry prominent notices stating that you changed the files and the date of any change. c) You must cause the whole of the work to be licensed at no charge to all third parties under the terms of this License. d) If a facility in the modified Library refers to a function or a table of data to be supplied by an application program that uses the facility, other than as an argument passed when the facility is invoked, then you must make a good faith effort to ensure that, in the event an application does not supply such function or table, the facility still operates, and performs whatever part of its purpose remains meaningful. (For example, a function in a library to compute square roots has a purpose that is entirely well-defined independent of the application. Therefore, Subsection 2d requires that any application-supplied function or table used by this function must be optional: if the application does not supply it, the square root function must still compute square roots.) These requirements apply to the modified work as a whole. If identifiable sections of that work are not derived from the Library, and can be reasonably considered independent and separate works in themselves, then this License, and its terms, do not apply to those sections when you distribute them as separate works. But when you distribute the same sections as part of a whole which is a work based on the Library, the distribution of the whole must be on the terms of this License, whose permissions for other licensees extend to the entire whole, and thus to each and every part regardless of who wrote it. Thus, it is not the intent of this section to claim rights or contest your rights to work written entirely by you; rather, the intent is to exercise the right to control the distribution of derivative or collective works based on the Library. In addition, mere aggregation of another work not based on the Library with the Library (or with a work based on the Library) on a volume of a storage or distribution medium does not bring the other work under the scope of this License. 3. You may opt to apply the terms of the ordinary GNU General Public License instead of this License to a given copy of the Library. To do this, you must alter all the notices that refer to this License, so that they refer to the ordinary GNU General Public License, version 2, instead of to this License. (If a newer version than version 2 of the ordinary GNU General Public License has appeared, then you can specify that version instead if you wish.) Do not make any other change in these notices. Once this change is made in a given copy, it is irreversible for that copy, so the ordinary GNU General Public License applies to all subsequent copies and derivative works made from that copy. This option is useful when you wish to copy part of the code of the Library into a program that is not a library. 4. You may copy and distribute the Library (or a portion or derivative of it, under Section 2) in object code or executable form under the terms of Sections 1 and 2 above provided that you accompany it with the complete corresponding machine-readable source code, which must be distributed under the terms of Sections 1 and 2 above on a medium customarily used for software interchange. If distribution of object code is made by offering access to copy from a designated place, then offering equivalent access to copy the source code from the same place satisfies the requirement to distribute the source code, even though third parties are not compelled to copy the source along with the object code. 5. A program that contains no derivative of any portion of the Library, but is designed to work with the Library by being compiled or linked with it, is called a "work that uses the Library". Such a work, in isolation, is not a derivative work of the Library, and therefore falls outside the scope of this License. However, linking a "work that uses the Library" with the Library creates an executable that is a derivative of the Library (because it contains portions of the Library), rather than a "work that uses the library". The executable is therefore covered by this License. Section 6 states terms for distribution of such executables. When a "work that uses the Library" uses material from a header file that is part of the Library, the object code for the work may be a derivative work of the Library even though the source code is not. Whether this is true is especially significant if the work can be linked without the Library, or if the work is itself a library. The threshold for this to be true is not precisely defined by law. If such an object file uses only numerical parameters, data structure layouts and accessors, and small macros and small inline functions (ten lines or less in length), then the use of the object file is unrestricted, regardless of whether it is legally a derivative work. (Executables containing this object code plus portions of the Library will still fall under Section 6.) Otherwise, if the work is a derivative of the Library, you may distribute the object code for the work under the terms of Section 6. Any executables containing that work also fall under Section 6, whether or not they are linked directly with the Library itself. 6. As an exception to the Sections above, you may also combine or link a "work that uses the Library" with the Library to produce a work containing portions of the Library, and distribute that work under terms of your choice, provided that the terms permit modification of the work for the customer's own use and reverse engineering for debugging such modifications. You must give prominent notice with each copy of the work that the Library is used in it and that the Library and its use are covered by this License. You must supply a copy of this License. If the work during execution displays copyright notices, you must include the copyright notice for the Library among them, as well as a reference directing the user to the copy of this License. Also, you must do one of these things: a) Accompany the work with the complete corresponding machine-readable source code for the Library including whatever changes were used in the work (which must be distributed under Sections 1 and 2 above); and, if the work is an executable linked with the Library, with the complete machine-readable "work that uses the Library", as object code and/or source code, so that the user can modify the Library and then relink to produce a modified executable containing the modified Library. (It is understood that the user who changes the contents of definitions files in the Library will not necessarily be able to recompile the application to use the modified definitions.) b) Use a suitable shared library mechanism for linking with the Library. A suitable mechanism is one that (1) uses at run time a copy of the library already present on the user's computer system, rather than copying library functions into the executable, and (2) will operate properly with a modified version of the library, if the user installs one, as long as the modified version is interface-compatible with the version that the work was made with. c) Accompany the work with a written offer, valid for at least three years, to give the same user the materials specified in Subsection 6a, above, for a charge no more than the cost of performing this distribution. d) If distribution of the work is made by offering access to copy from a designated place, offer equivalent access to copy the above specified materials from the same place. e) Verify that the user has already received a copy of these materials or that you have already sent this user a copy. For an executable, the required form of the "work that uses the Library" must include any data and utility programs needed for reproducing the executable from it. However, as a special exception, the materials to be distributed need not include anything that is normally distributed (in either source or binary form) with the major components (compiler, kernel, and so on) of the operating system on which the executable runs, unless that component itself accompanies the executable. It may happen that this requirement contradicts the license restrictions of other proprietary libraries that do not normally accompany the operating system. Such a contradiction means you cannot use both them and the Library together in an executable that you distribute. 7. You may place library facilities that are a work based on the Library side-by-side in a single library together with other library facilities not covered by this License, and distribute such a combined library, provided that the separate distribution of the work based on the Library and of the other library facilities is otherwise permitted, and provided that you do these two things: a) Accompany the combined library with a copy of the same work based on the Library, uncombined with any other library facilities. This must be distributed under the terms of the Sections above. b) Give prominent notice with the combined library of the fact that part of it is a work based on the Library, and explaining where to find the accompanying uncombined form of the same work. 8. You may not copy, modify, sublicense, link with, or distribute the Library except as expressly provided under this License. Any attempt otherwise to copy, modify, sublicense, link with, or distribute the Library is void, and will automatically terminate your rights under this License. However, parties who have received copies, or rights, from you under this License will not have their licenses terminated so long as such parties remain in full compliance. 9. You are not required to accept this License, since you have not signed it. However, nothing else grants you permission to modify or distribute the Library or its derivative works. These actions are prohibited by law if you do not accept this License. Therefore, by modifying or distributing the Library (or any work based on the Library), you indicate your acceptance of this License to do so, and all its terms and conditions for copying, distributing or modifying the Library or works based on it. 10. Each time you redistribute the Library (or any work based on the Library), the recipient automatically receives a license from the original licensor to copy, distribute, link with or modify the Library subject to these terms and conditions. You may not impose any further restrictions on the recipients' exercise of the rights granted herein. You are not responsible for enforcing compliance by third parties with this License. 11. If, as a consequence of a court judgment or allegation of patent infringement or for any other reason (not limited to patent issues), conditions are imposed on you (whether by court order, agreement or otherwise) that contradict the conditions of this License, they do not excuse you from the conditions of this License. If you cannot distribute so as to satisfy simultaneously your obligations under this License and any other pertinent obligations, then as a consequence you may not distribute the Library at all. For example, if a patent license would not permit royalty-free redistribution of the Library by all those who receive copies directly or indirectly through you, then the only way you could satisfy both it and this License would be to refrain entirely from distribution of the Library. If any portion of this section is held invalid or unenforceable under any particular circumstance, the balance of the section is intended to apply, and the section as a whole is intended to apply in other circumstances. It is not the purpose of this section to induce you to infringe any patents or other property right claims or to contest validity of any such claims; this section has the sole purpose of protecting the integrity of the free software distribution system which is implemented by public license practices. Many people have made generous contributions to the wide range of software distributed through that system in reliance on consistent application of that system; it is up to the author/donor to decide if he or she is willing to distribute software through any other system and a licensee cannot impose that choice. This section is intended to make thoroughly clear what is believed to be a consequence of the rest of this License. 12. If the distribution and/or use of the Library is restricted in certain countries either by patents or by copyrighted interfaces, the original copyright holder who places the Library under this License may add an explicit geographical distribution limitation excluding those countries, so that distribution is permitted only in or among countries not thus excluded. In such case, this License incorporates the limitation as if written in the body of this License. 13. The Free Software Foundation may publish revised and/or new versions of the Lesser General Public License from time to time. Such new versions will be similar in spirit to the present version, but may differ in detail to address new problems or concerns. Each version is given a distinguishing version number. If the Library specifies a version number of this License which applies to it and "any later version", you have the option of following the terms and conditions either of that version or of any later version published by the Free Software Foundation. If the Library does not specify a license version number, you may choose any version ever published by the Free Software Foundation. 14. If you wish to incorporate parts of the Library into other free programs whose distribution conditions are incompatible with these, write to the author to ask for permission. For software which is copyrighted by the Free Software Foundation, write to the Free Software Foundation; we sometimes make exceptions for this. Our decision will be guided by the two goals of preserving the free status of all derivatives of our free software and of promoting the sharing and reuse of software generally. NO WARRANTY 15. BECAUSE THE LIBRARY IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY FOR THE LIBRARY, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES PROVIDE THE LIBRARY "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE LIBRARY IS WITH YOU. SHOULD THE LIBRARY PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. 16. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR REDISTRIBUTE THE LIBRARY AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE LIBRARY (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A FAILURE OF THE LIBRARY TO OPERATE WITH ANY OTHER SOFTWARE), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. END OF TERMS AND CONDITIONS How to Apply These Terms to Your New Libraries If you develop a new library, and you want it to be of the greatest possible use to the public, we recommend making it free software that everyone can redistribute and change. You can do so by permitting redistribution under these terms (or, alternatively, under the terms of the ordinary General Public License). To apply these terms, attach the following notices to the library. It is safest to attach them to the start of each source file to most effectively convey the exclusion of warranty; and each file should have at least the "copyright" line and a pointer to where the full notice is found. Copyright (C) This library 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 library 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 library; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA Also add information on how to contact you by electronic and paper mail. You should also get your employer (if you work as a programmer) or your school, if any, to sign a "copyright disclaimer" for the library, if necessary. Here is a sample; alter the names: Yoyodyne, Inc., hereby disclaims all copyright interest in the library `Frob' (a library for tweaking knobs) written by James Random Hacker. , 1 April 1990 Ty Coon, President of Vice That's all there is to it! zxing-cpp-1.0.8+ds2/LICENSE.ZXing000066400000000000000000000261361361167020700162010ustar00rootroot00000000000000 Apache License Version 2.0, January 2004 http://www.apache.org/licenses/ TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION 1. Definitions. "License" shall mean the terms and conditions for use, reproduction, and distribution as defined by Sections 1 through 9 of this document. "Licensor" shall mean the copyright owner or entity authorized by the copyright owner that is granting the License. "Legal Entity" shall mean the union of the acting entity and all other entities that control, are controlled by, or are under common control with that entity. For the purposes of this definition, "control" means (i) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the outstanding shares, or (iii) beneficial ownership of such entity. "You" (or "Your") shall mean an individual or Legal Entity exercising permissions granted by this License. "Source" form shall mean the preferred form for making modifications, including but not limited to software source code, documentation source, and configuration files. "Object" form shall mean any form resulting from mechanical transformation or translation of a Source form, including but not limited to compiled object code, generated documentation, and conversions to other media types. "Work" shall mean the work of authorship, whether in Source or Object form, made available under the License, as indicated by a copyright notice that is included in or attached to the work (an example is provided in the Appendix below). "Derivative Works" shall mean any work, whether in Source or Object form, that is based on (or derived from) the Work and for which the editorial revisions, annotations, elaborations, or other modifications represent, as a whole, an original work of authorship. For the purposes of this License, Derivative Works shall not include works that remain separable from, or merely link (or bind by name) to the interfaces of, the Work and Derivative Works thereof. "Contribution" shall mean any work of authorship, including the original version of the Work and any modifications or additions to that Work or Derivative Works thereof, that is intentionally submitted to Licensor for inclusion in the Work by the copyright owner or by an individual or Legal Entity authorized to submit on behalf of the copyright owner. For the purposes of this definition, "submitted" means any form of electronic, verbal, or written communication sent to the Licensor or its representatives, including but not limited to communication on electronic mailing lists, source code control systems, and issue tracking systems that are managed by, or on behalf of, the Licensor for the purpose of discussing and improving the Work, but excluding communication that is conspicuously marked or otherwise designated in writing by the copyright owner as "Not a Contribution." "Contributor" shall mean Licensor and any individual or Legal Entity on behalf of whom a Contribution has been received by Licensor and subsequently incorporated within the Work. 2. Grant of Copyright License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable copyright license to reproduce, prepare Derivative Works of, publicly display, publicly perform, sublicense, and distribute the Work and such Derivative Works in Source or Object form. 3. Grant of Patent License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable (except as stated in this section) patent license to make, have made, use, offer to sell, sell, import, and otherwise transfer the Work, where such license applies only to those patent claims licensable by such Contributor that are necessarily infringed by their Contribution(s) alone or by combination of their Contribution(s) with the Work to which such Contribution(s) was submitted. If You institute patent litigation against any entity (including a cross-claim or counterclaim in a lawsuit) alleging that the Work or a Contribution incorporated within the Work constitutes direct or contributory patent infringement, then any patent licenses granted to You under this License for that Work shall terminate as of the date such litigation is filed. 4. Redistribution. You may reproduce and distribute copies of the Work or Derivative Works thereof in any medium, with or without modifications, and in Source or Object form, provided that You meet the following conditions: (a) You must give any other recipients of the Work or Derivative Works a copy of this License; and (b) You must cause any modified files to carry prominent notices stating that You changed the files; and (c) You must retain, in the Source form of any Derivative Works that You distribute, all copyright, patent, trademark, and attribution notices from the Source form of the Work, excluding those notices that do not pertain to any part of the Derivative Works; and (d) If the Work includes a "NOTICE" text file as part of its distribution, then any Derivative Works that You distribute must include a readable copy of the attribution notices contained within such NOTICE file, excluding those notices that do not pertain to any part of the Derivative Works, in at least one of the following places: within a NOTICE text file distributed as part of the Derivative Works; within the Source form or documentation, if provided along with the Derivative Works; or, within a display generated by the Derivative Works, if and wherever such third-party notices normally appear. The contents of the NOTICE file are for informational purposes only and do not modify the License. You may add Your own attribution notices within Derivative Works that You distribute, alongside or as an addendum to the NOTICE text from the Work, provided that such additional attribution notices cannot be construed as modifying the License. You may add Your own copyright statement to Your modifications and may provide additional or different license terms and conditions for use, reproduction, or distribution of Your modifications, or for any such Derivative Works as a whole, provided Your use, reproduction, and distribution of the Work otherwise complies with the conditions stated in this License. 5. Submission of Contributions. Unless You explicitly state otherwise, any Contribution intentionally submitted for inclusion in the Work by You to the Licensor shall be under the terms and conditions of this License, without any additional terms or conditions. Notwithstanding the above, nothing herein shall supersede or modify the terms of any separate license agreement you may have executed with Licensor regarding such Contributions. 6. Trademarks. This License does not grant permission to use the trade names, trademarks, service marks, or product names of the Licensor, except as required for reasonable and customary use in describing the origin of the Work and reproducing the content of the NOTICE file. 7. Disclaimer of Warranty. Unless required by applicable law or agreed to in writing, Licensor provides the Work (and each Contributor provides its Contributions) on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied, including, without limitation, any warranties or conditions of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A PARTICULAR PURPOSE. You are solely responsible for determining the appropriateness of using or redistributing the Work and assume any risks associated with Your exercise of permissions under this License. 8. Limitation of Liability. In no event and under no legal theory, whether in tort (including negligence), contract, or otherwise, unless required by applicable law (such as deliberate and grossly negligent acts) or agreed to in writing, shall any Contributor be liable to You for damages, including any direct, indirect, special, incidental, or consequential damages of any character arising as a result of this License or out of the use or inability to use the Work (including but not limited to damages for loss of goodwill, work stoppage, computer failure or malfunction, or any and all other commercial damages or losses), even if such Contributor has been advised of the possibility of such damages. 9. Accepting Warranty or Additional Liability. While redistributing the Work or Derivative Works thereof, You may choose to offer, and charge a fee for, acceptance of support, warranty, indemnity, or other liability obligations and/or rights consistent with this License. However, in accepting such obligations, You may act only on Your own behalf and on Your sole responsibility, not on behalf of any other Contributor, and only if You agree to indemnify, defend, and hold each Contributor harmless for any liability incurred by, or claims asserted against, such Contributor by reason of your accepting any such warranty or additional liability. END OF TERMS AND CONDITIONS APPENDIX: How to apply the Apache License to your work. To apply the Apache License to your work, attach the following boilerplate notice, with the fields enclosed by brackets "[]" replaced with your own identifying information. (Don't include the brackets!) The text should be enclosed in the appropriate comment syntax for the file format. We also recommend that a file or class name and description of purpose be included on the same "printed page" as the copyright notice for easier identification within third-party archives. Copyright [yyyy] [name of copyright owner] Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. zxing-cpp-1.0.8+ds2/NOTICE000066400000000000000000000022471361167020700150370ustar00rootroot00000000000000-------------------------------------------------------------------------------- NOTICES FOR TextCodec -------------------------------------------------------------------------------- Part of this software uses code source from Qt under LGPL license. Copyright (C) 2015 The Qt Company Ltd. -------------------------------------------------------------------------------- NOTICES FOR ZXing -------------------------------------------------------------------------------- Copyright 2016 ZXing authors. https://github.com/zxing -------------------------------------------------------------------------------- NOTICES FOR BARCODE4J -------------------------------------------------------------------------------- Barcode4J Copyright 2002-2010 Jeremias Märki Copyright 2005-2006 Dietmar Bürkle Portions of this software were contributed under section 5 of the Apache License. Contributors are listed under: http://barcode4j.sourceforge.net/contributors.html -------------------------------------------------------------------------------- NOTICES FOR JCOMMANDER -------------------------------------------------------------------------------- Copyright 2010 Cedric Beust cedric@beust.com zxing-cpp-1.0.8+ds2/README.md000066400000000000000000000152551361167020700154150ustar00rootroot00000000000000[![Build Status](https://travis-ci.org/nu-book/zxing-cpp.svg?branch=master)](https://travis-ci.org/nu-book/zxing-cpp) # ZXing-C++ This project is a C++ port of [ZXing Library](https://github.com/zxing/zxing). ## Features * In pure C++14, no third-party dependencies * Stateless, thread-safe readers/generators * Wrapper to create WinRT component * Wrapper for Android * Wrapper for WebAssembly * Python binding ## Supported Formats Same as ZXing, following barcode are supported: | 1D product | 1D industrial | 2D | ---------- | ------------- | -------------- | UPC-A | Code 39 | QR Code | UPC-E | Code 93 | Data Matrix | EAN-8 | Code 128 | Aztec (beta) | EAN-13 | Codabar | PDF 417 (beta) | | ITF | | | RSS-14 | | | RSS-Expanded | ## Web Demos - [Scan barcodes](https://nu-book.github.io/zxing-cpp/demo_reader.html) - [Generate barcodes](https://nu-book.github.io/zxing-cpp/demo_writer.html) - [Scan with camera](https://nu-book.github.io/zxing-cpp/zxing_viddemo.html) ## WinRT Package A nuget package is available for WinRT: [huycn.zxingcpp.winrt](https://www.nuget.org/packages/huycn.zxingcpp.winrt). To install it, run the following command in the Package Manager Console ```sh PM> Install-Package huycn.zxingcpp.winrt ``` ## Getting Started The wrappers export very simple API to use, check `BarcodeReader` and `BarcodeGenerator` in each wrapper. For more fine-grain control in scanning process, check [`MultiFormatReader`](core/src/MultiFormatReader.h) class. For more customization when generating particular barcode format, you need to instantiate appropriate writer, see [`MultiFormatWriter`](core/src/MultiFormatWriter.h) for more details. ## Build Instructions ### For Windows Desktop with VS 1. Download and install [CMake](https://cmake.org) if it's not already installed. 2. Open CMake GUI, specify [`wrappers/gdiplus`](wrappers/gdiplus) as source folder in the first input, specify the build output in the second input, and click on Generate. 3. At prompt, select "Visual Studio 14 2015" (or "Visual Studio 14 2015 Win64" if you want to build for x64 platform); leave the second input (Optional toolset...) empty; leave "Use default native compilers" checked; and click on Finish to generate the VS project. At the end, you will get a solution (.sln) in your binary output directory that you can open in VS. The project ZXingGdiPlus in the solution will generate a static library. ### For Windows Universal Platform 1. Download and install [CMake](https://cmake.org) 3.4 or more recent if it's not already installed. 2. Edit the file [`wrappers/winrt/BuildWinCom.bat`](wrappers/winrt/BuildWinCom.bat) to adjust the path to your CMake installation. 3. Double-click on the batch script to run it. 4. If the build succeeds, it will put the results in the folder UAP which is ready-to-use SDK extension. ### For Android NDK Note: The original Java-only [ZXing](https://github.com/zxing/zxing) project has a very good support for Android, whether you want to use it as external app via Intent or directly integrated into your app. You should consider using it first before trying this library since involving with native code is always more complex than Java-only code. Performance-wise, except for specific usecases, you won't notice the difference! 1. Edit [`wrappers/android/jni/Application.mk`](wrappers/android/jni/Application.mk) and adjust for your project. 2. On command line, `cd` into [`wrappers/android/jni`](wrappers/android/jni), type `ndk-build` (or `ndk-build -j `) 3. Copy files in `libs` and `java` into corresponding folders of your Android project. ### For web browser (WebAssembly) 1. [Install Emscripten](https://kripken.github.io/emscripten-site/docs/getting_started/) if not done already. 2. In a empty build folder, invoke `cmake` from `emconfigure` create Makefile, using [`wrappers/wasm/Toolchain-Emscripten.cmake`](wrappers/wasm/Toolchain-Emscripten.cmake) as toolchain file. For example: ``` EMSCRIPTEN_PATH= SOURCE_BASEDIR= emconfigure cmake -G "Unix Makefiles" -DCMAKE_BUILD_TYPE=Release -DCMAKE_TOOLCHAIN_FILE="$SOURCE_BASEDIR/Toolchain-Emscripten.cmake" -DEMSCRIPTEN_ROOT_PATH="$EMSCRIPTEN_PATH" "$SOURCE_BASEDIR" ``` 3. Invoke emmake to create `zxing.js` and `zxing.wasm` ``` emmake make ``` 4. Copy these two files to your web folder and create HTML page that includes `zxing.js`. See usage example of exported functions from [demos](https://nu-book.github.io/zxing-cpp/). By default, both encoder and decoder are included. If you don't plan to use either of them, you can disable it to reduce generated code size. To do so, in the line `emconfigure cmake ...` above, pass `-DENABLE_ENCODERS=0` to disable encoders or `-DENABLE_DECODERS=0` to disable decoders. ### For other platforms Wrappers are provided as convenient way to work with native image format. You still can use the library without a wrapper. ##### To read barcodes: As an example, have a look at [`scan_image.cpp`](example/scan_image.cpp). 1. Create a [`LuminanceSource`](core/src/LuminanceSource.h) instance. This interface abstracts an image source. You will need a third-party library to read your images. If you already have an image uncompressed in memory and you know its layout, you can easily go with [`GenericLuminanceSource`](core/src/GenericLuminanceSource.h). Otherwise, you will need to come up with your own implementation of the interface. 2. Use the `LuminanceSource` instance above to create an instance of [`BinaryBitmap`](core/src/BinaryBitmap.h). You have choices between [`HybridBinarizer`](core/src/HybridBinarizer.h) or [`GlobalHistogramBinarizer`](core/src/GlobalHistogramBinarizer.h). See class document in header files for more details on theses choices. 3. Create an instance of [`MultiFormatReader`](core/src/MultiFormatReader.h) with appropriate hints. Pay attention to `possibleFormats()`, `tryHarder()` and `tryRotate()`. These parameters will affect accuracy as well as reader's speed. 4. Call `MultiFormatReader::read()` with the `BinaryBitmap` created above to read your barcodes. ##### To write barcodes: As an example, have a look at [`generate_image.cpp`](example/generate_image.cpp). 1. Create a [`MultiFormatWriter`](core/src/MultiFormatWriter.h) instance with the format you want to generate. Set encoding and margins if needed. 2. Call `encode()` with text content and the image size. This returns a [`BitMatrix`](core/src/BitMatrix.h) which is a binary image of the barcode where `true` == visual black and `false` == visual white. 3. Convert the bit matrix to your native image format. See also the `toByteMatrix` helper method. zxing-cpp-1.0.8+ds2/core/000077500000000000000000000000001361167020700150565ustar00rootroot00000000000000zxing-cpp-1.0.8+ds2/core/Android.mk000066400000000000000000000070241361167020700167720ustar00rootroot00000000000000LOCAL_PATH:= $(call my-dir) include $(CLEAR_VARS) LOCAL_MODULE := zxing_core LOCAL_CPPFLAGS += -std=c++11 LOCAL_CFLAGS += -Wall LOCAL_CPPFLAGS += -Wno-missing-braces # Seems to be a bug in clang https://llvm.org/bugs/show_bug.cgi?id=21629 LOCAL_C_INCLUDES := $(LOCAL_PATH)/src LOCAL_EXPORT_C_INCLUDES := $(LOCAL_PATH)/src COMMON_FILES := \ src/BarcodeFormat.cpp \ src/BitArray.cpp \ src/BitMatrix.cpp \ src/BitSource.cpp \ src/CharacterSetECI.cpp \ src/DecodeHints.cpp \ src/DecodeStatus.cpp \ src/GenericGF.cpp \ src/GenericGFPoly.cpp \ src/GenericLuminanceSource.cpp \ src/GlobalHistogramBinarizer.cpp \ src/GridSampler.cpp \ src/HybridBinarizer.cpp \ src/LuminanceSource.cpp \ src/MultiFormatReader.cpp \ src/PerspectiveTransform.cpp \ src/ReedSolomonDecoder.cpp \ src/Result.cpp \ src/ResultMetadata.cpp \ src/ResultPoint.cpp \ src/TextDecoder.cpp \ src/TextUtfEncoding.cpp \ src/WhiteRectDetector.cpp \ src/ZXBigInteger.cpp AZTEC_FILES := \ src/aztec/AZDecoder.cpp \ src/aztec/AZDetector.cpp \ src/aztec/AZReader.cpp DATAMATRIX_FILES := \ src/datamatrix/DMBitMatrixParser.cpp \ src/datamatrix/DMDataBlock.cpp \ src/datamatrix/DMDecoder.cpp \ src/datamatrix/DMDetector.cpp \ src/datamatrix/DMReader.cpp \ src/datamatrix/DMVersion.cpp MAXICODE_FILES := \ src/maxicode/MCBitMatrixParser.cpp \ src/maxicode/MCDecoder.cpp \ src/maxicode/MCReader.cpp ONED_FILES := \ src/oned/ODCodabarReader.cpp \ src/oned/ODCode128Patterns.cpp \ src/oned/ODCode128Reader.cpp \ src/oned/ODCode39Reader.cpp \ src/oned/ODCode93Reader.cpp \ src/oned/ODEAN13Reader.cpp \ src/oned/ODEAN8Reader.cpp \ src/oned/ODEANManufacturerOrgSupport.cpp \ src/oned/ODITFReader.cpp \ src/oned/ODMultiUPCEANReader.cpp \ src/oned/ODRSS14Reader.cpp \ src/oned/ODRSSExpandedReader.cpp \ src/oned/ODReader.cpp \ src/oned/ODRowReader.cpp \ src/oned/ODUPCAReader.cpp \ src/oned/ODUPCEANCommon.cpp \ src/oned/ODUPCEANExtensionSupport.cpp \ src/oned/ODUPCEANReader.cpp \ src/oned/ODUPCEReader.cpp ONED_RSS_FILES := \ src/oned/rss/ODRSSExpandedBinaryDecoder.cpp \ src/oned/rss/ODRSSFieldParser.cpp \ src/oned/rss/ODRSSGenericAppIdDecoder.cpp \ src/oned/rss/ODRSSReaderHelper.cpp PDF417_FILES := \ src/pdf417/PDFBarcodeValue.cpp \ src/pdf417/PDFBoundingBox.cpp \ src/pdf417/PDFCodewordDecoder.cpp \ src/pdf417/PDFDecodedBitStreamParser.cpp \ src/pdf417/PDFDetectionResult.cpp \ src/pdf417/PDFDetectionResultColumn.cpp \ src/pdf417/PDFDetector.cpp \ src/pdf417/PDFModulusGF.cpp \ src/pdf417/PDFModulusPoly.cpp \ src/pdf417/PDFReader.cpp \ src/pdf417/PDFScanningDecoder.cpp QRCODE_FILES := \ src/qrcode/QRAlignmentPattern.cpp \ src/qrcode/QRAlignmentPatternFinder.cpp \ src/qrcode/QRBitMatrixParser.cpp \ src/qrcode/QRCodecMode.cpp \ src/qrcode/QRDataBlock.cpp \ src/qrcode/QRDataMask.cpp \ src/qrcode/QRDecoder.cpp \ src/qrcode/QRDetector.cpp \ src/qrcode/QRErrorCorrectionLevel.cpp \ src/qrcode/QRFinderPattern.cpp \ src/qrcode/QRFinderPatternFinder.cpp \ src/qrcode/QRFormatInformation.cpp \ src/qrcode/QRReader.cpp \ src/qrcode/QRVersion.cpp TEXT_CODEC_FILES := \ src/textcodec/Big5MapTable.cpp \ src/textcodec/Big5TextDecoder.cpp \ src/textcodec/GBTextDecoder.cpp \ src/textcodec/JPTextDecoder.cpp \ src/textcodec/KRHangulMapping.cpp \ src/textcodec/KRTextDecoder.cpp LOCAL_SRC_FILES := \ $(COMMON_FILES) \ $(AZTEC_FILES) \ $(DATAMATRIX_FILES) \ $(MAXICODE_FILES) \ $(ONED_FILES) \ $(ONED_RSS_FILES) \ $(PDF417_FILES) \ $(QRCODE_FILES) \ $(TEXT_CODEC_FILES) LOCAL_CPP_FEATURES += rtti exceptions include $(BUILD_STATIC_LIBRARY) zxing-cpp-1.0.8+ds2/core/CMakeLists.txt000066400000000000000000000325741361167020700176310ustar00rootroot00000000000000cmake_minimum_required (VERSION 3.1.3) if (NOT DEFINED ENABLE_ENCODERS) set (ENABLE_ENCODERS OFF) endif() if (NOT DEFINED ENABLE_DECODERS) set (ENABLE_DECODERS ON) endif() set (ZXING_CORE_DEFINES) if (WINRT) set (ZXING_CORE_DEFINES ${ZXING_CORE_DEFINES} -DWINRT ) endif() set (ZXING_CORE_LOCAL_DEFINES) if (MSVC) set (ZXING_CORE_LOCAL_DEFINES ${ZXING_CORE_LOCAL_DEFINES} -D_SCL_SECURE_NO_WARNINGS -D_CRT_SECURE_NO_WARNINGS -D_CRT_NONSTDC_NO_WARNINGS -DNOMINMAX ) else() set (ZXING_CORE_LOCAL_DEFINES ${ZXING_CORE_LOCAL_DEFINES} -Wall -Wextra -Wno-missing-braces) endif() set (CMAKE_CXX_STANDARD 14) ################# Source files set (COMMON_FILES src/BarcodeFormat.h src/BarcodeFormat.cpp src/BitArray.h src/BitArray.cpp src/BitHacks.h src/BitMatrix.h src/BitMatrix.cpp src/ByteArray.h src/CharacterSet.h src/CharacterSetECI.h src/CharacterSetECI.cpp src/CustomData.h src/GenericGF.h src/GenericGF.cpp src/GenericGFPoly.h src/GenericGFPoly.cpp src/TextUtfEncoding.h src/TextUtfEncoding.cpp src/ZXBigInteger.h src/ZXBigInteger.cpp src/ZXConfig.h src/ZXFilesystem.h src/ZXNullable.h src/ZXNumeric.h src/ZXContainerAlgorithms.h src/ZXStrConvWorkaround.h src/ZXTestSupport.h ) if (ENABLE_DECODERS) set (COMMON_FILES ${COMMON_FILES} src/BinaryBitmap.h src/BitSource.h src/BitSource.cpp src/DecodeHints.h src/DecodeHints.cpp src/DecodeStatus.h src/DecodeStatus.cpp src/DecoderResult.h src/DetectorResult.h src/GenericLuminanceSource.h src/GenericLuminanceSource.cpp src/GlobalHistogramBinarizer.h src/GlobalHistogramBinarizer.cpp src/GridSampler.h src/GridSampler.cpp src/HybridBinarizer.h src/HybridBinarizer.cpp src/LuminanceSource.h src/LuminanceSource.cpp src/MultiFormatReader.h src/MultiFormatReader.cpp src/PerspectiveTransform.h src/PerspectiveTransform.cpp src/Reader.h src/ReadBarcode.h src/ReadBarcode.cpp src/ReedSolomonDecoder.h src/ReedSolomonDecoder.cpp src/Result.h src/Result.cpp src/ResultMetadata.h src/ResultMetadata.cpp src/ResultPoint.h src/ResultPoint.cpp src/TextDecoder.h src/TextDecoder.cpp src/WhiteRectDetector.h src/WhiteRectDetector.cpp ) endif() if (ENABLE_ENCODERS) set (COMMON_FILES ${COMMON_FILES} src/ByteMatrix.h src/ReedSolomonEncoder.h src/ReedSolomonEncoder.cpp src/TextEncoder.h src/TextEncoder.cpp src/MultiFormatWriter.h src/MultiFormatWriter.cpp ) endif() set (AZTEC_FILES ) if (ENABLE_DECODERS) set (AZTEC_FILES ${AZTEC_FILES} src/aztec/AZDecoder.h src/aztec/AZDecoder.cpp src/aztec/AZDetector.h src/aztec/AZDetector.cpp src/aztec/AZDetectorResult.h src/aztec/AZReader.h src/aztec/AZReader.cpp ) endif() if (ENABLE_ENCODERS) set (AZTEC_FILES ${AZTEC_FILES} src/aztec/AZEncodingState.h src/aztec/AZEncoder.h src/aztec/AZEncoder.cpp src/aztec/AZHighLevelEncoder.h src/aztec/AZHighLevelEncoder.cpp src/aztec/AZToken.h src/aztec/AZToken.cpp src/aztec/AZWriter.h src/aztec/AZWriter.cpp ) endif() set (DATAMATRIX_FILES ) if (ENABLE_DECODERS) set (DATAMATRIX_FILES ${DATAMATRIX_FILES} src/datamatrix/DMBitMatrixParser.h src/datamatrix/DMBitMatrixParser.cpp src/datamatrix/DMECB.h src/datamatrix/DMDataBlock.h src/datamatrix/DMDataBlock.cpp src/datamatrix/DMDecoder.h src/datamatrix/DMDecoder.cpp src/datamatrix/DMDetector.h src/datamatrix/DMDetector.cpp src/datamatrix/DMVersion.h src/datamatrix/DMVersion.cpp src/datamatrix/DMReader.h src/datamatrix/DMReader.cpp ) endif() if (ENABLE_ENCODERS) set (DATAMATRIX_FILES ${DATAMATRIX_FILES} src/datamatrix/DMECEncoder.h src/datamatrix/DMECEncoder.cpp src/datamatrix/DMEncoderContext.h src/datamatrix/DMDefaultPlacement.h src/datamatrix/DMDefaultPlacement.cpp src/datamatrix/DMHighLevelEncoder.h src/datamatrix/DMHighLevelEncoder.cpp src/datamatrix/DMSymbolInfo.h src/datamatrix/DMSymbolInfo.cpp src/datamatrix/DMSymbolShape.h src/datamatrix/DMWriter.h src/datamatrix/DMWriter.cpp ) endif() set (MAXICODE_FILES ) if (ENABLE_DECODERS) set (MAXICODE_FILES ${MAXICODE_FILES} src/maxicode/MCBitMatrixParser.h src/maxicode/MCBitMatrixParser.cpp src/maxicode/MCDecoder.h src/maxicode/MCDecoder.cpp src/maxicode/MCReader.h src/maxicode/MCReader.cpp ) endif() set (ONED_FILES src/oned/ODUPCEANCommon.h src/oned/ODUPCEANCommon.cpp src/oned/ODCode128Patterns.h src/oned/ODCode128Patterns.cpp ) if (ENABLE_DECODERS) set (ONED_FILES ${ONED_FILES} src/oned/ODCodabarReader.h src/oned/ODCodabarReader.cpp src/oned/ODCode39Reader.h src/oned/ODCode39Reader.cpp src/oned/ODCode93Reader.h src/oned/ODCode93Reader.cpp src/oned/ODCode128Reader.h src/oned/ODCode128Reader.cpp src/oned/ODEAN8Reader.h src/oned/ODEAN8Reader.cpp src/oned/ODEAN13Reader.h src/oned/ODEAN13Reader.cpp src/oned/ODEANManufacturerOrgSupport.h src/oned/ODEANManufacturerOrgSupport.cpp src/oned/ODITFReader.h src/oned/ODITFReader.cpp src/oned/ODMultiUPCEANReader.h src/oned/ODMultiUPCEANReader.cpp src/oned/ODReader.h src/oned/ODReader.cpp src/oned/ODRowReader.h src/oned/ODRowReader.cpp src/oned/ODRSS14Reader.h src/oned/ODRSS14Reader.cpp src/oned/ODRSSExpandedReader.h src/oned/ODRSSExpandedReader.cpp src/oned/ODUPCAReader.h src/oned/ODUPCAReader.cpp src/oned/ODUPCEANExtensionSupport.h src/oned/ODUPCEANExtensionSupport.cpp src/oned/ODUPCEANReader.h src/oned/ODUPCEANReader.cpp src/oned/ODUPCEReader.h src/oned/ODUPCEReader.cpp ) endif() if (ENABLE_ENCODERS) set (ONED_FILES ${ONED_FILES} src/oned/ODCodabarWriter.h src/oned/ODCodabarWriter.cpp src/oned/ODCode39Writer.h src/oned/ODCode39Writer.cpp src/oned/ODCode93Writer.h src/oned/ODCode93Writer.cpp src/oned/ODCode128Writer.h src/oned/ODCode128Writer.cpp src/oned/ODEAN8Writer.h src/oned/ODEAN8Writer.cpp src/oned/ODEAN13Writer.h src/oned/ODEAN13Writer.cpp src/oned/ODITFWriter.h src/oned/ODITFWriter.cpp src/oned/ODUPCEWriter.h src/oned/ODUPCEWriter.cpp src/oned/ODUPCAWriter.h src/oned/ODUPCAWriter.cpp src/oned/ODWriterHelper.h src/oned/ODWriterHelper.cpp ) endif() set (ONED_RSS_FILES ) if (ENABLE_DECODERS) set (ONED_RSS_FILES ${ONED_RSS_FILES} src/oned/rss/ODRSSDataCharacter.h src/oned/rss/ODRSSExpandedBinaryDecoder.h src/oned/rss/ODRSSExpandedBinaryDecoder.cpp src/oned/rss/ODRSSExpandedPair.h src/oned/rss/ODRSSExpandedRow.h src/oned/rss/ODRSSFieldParser.h src/oned/rss/ODRSSFieldParser.cpp src/oned/rss/ODRSSFinderPattern.h src/oned/rss/ODRSSGenericAppIdDecoder.h src/oned/rss/ODRSSGenericAppIdDecoder.cpp src/oned/rss/ODRSSPair.h src/oned/rss/ODRSSReaderHelper.h src/oned/rss/ODRSSReaderHelper.cpp ) endif() set (PDF417_FILES ) if (ENABLE_DECODERS) set (PDF417_FILES ${PDF417_FILES} src/pdf417/PDFBarcodeMetadata.h src/pdf417/PDFBarcodeValue.h src/pdf417/PDFBarcodeValue.cpp src/pdf417/PDFBoundingBox.h src/pdf417/PDFBoundingBox.cpp src/pdf417/PDFCodeword.h src/pdf417/PDFCodewordDecoder.h src/pdf417/PDFCodewordDecoder.cpp src/pdf417/PDFDecodedBitStreamParser.h src/pdf417/PDFDecodedBitStreamParser.cpp src/pdf417/PDFDecoderResultExtra.h src/pdf417/PDFDetectionResult.h src/pdf417/PDFDetectionResult.cpp src/pdf417/PDFDetectionResultColumn.h src/pdf417/PDFDetectionResultColumn.cpp src/pdf417/PDFDetector.h src/pdf417/PDFDetector.cpp src/pdf417/PDFModulusGF.h src/pdf417/PDFModulusGF.cpp src/pdf417/PDFModulusPoly.h src/pdf417/PDFModulusPoly.cpp src/pdf417/PDFReader.h src/pdf417/PDFReader.cpp src/pdf417/PDFScanningDecoder.h src/pdf417/PDFScanningDecoder.cpp ) endif() if (ENABLE_ENCODERS) set (PDF417_FILES ${PDF417_FILES} src/pdf417/PDFCompaction.h src/pdf417/PDFEncoder.h src/pdf417/PDFEncoder.cpp src/pdf417/PDFHighLevelEncoder.h src/pdf417/PDFHighLevelEncoder.cpp src/pdf417/PDFWriter.h src/pdf417/PDFWriter.cpp ) endif() set (QRCODE_FILES src/qrcode/QRCodecMode.h src/qrcode/QRCodecMode.cpp src/qrcode/QRErrorCorrectionLevel.h src/qrcode/QRErrorCorrectionLevel.cpp src/qrcode/QRVersion.h src/qrcode/QRVersion.cpp ) if (ENABLE_DECODERS) set (QRCODE_FILES ${QRCODE_FILES} src/qrcode/QRAlignmentPattern.h src/qrcode/QRAlignmentPattern.cpp src/qrcode/QRAlignmentPatternFinder.h src/qrcode/QRAlignmentPatternFinder.cpp src/qrcode/QRBitMatrixParser.h src/qrcode/QRBitMatrixParser.cpp src/qrcode/QRDataBlock.h src/qrcode/QRDataBlock.cpp src/qrcode/QRDataMask.h src/qrcode/QRDataMask.cpp src/qrcode/QRDecoder.h src/qrcode/QRDecoder.cpp src/qrcode/QRDecoderMetadata.h src/qrcode/QRDetector.h src/qrcode/QRDetector.cpp src/qrcode/QRECB.h src/qrcode/QRFinderPattern.h src/qrcode/QRFinderPattern.cpp src/qrcode/QRFinderPatternFinder.h src/qrcode/QRFinderPatternFinder.cpp src/qrcode/QRFinderPatternInfo.h src/qrcode/QRFormatInformation.h src/qrcode/QRFormatInformation.cpp src/qrcode/QRReader.h src/qrcode/QRReader.cpp ) endif() if (ENABLE_ENCODERS) set (QRCODE_FILES ${QRCODE_FILES} src/qrcode/QREncoder.h src/qrcode/QREncoder.cpp src/qrcode/QREncodeResult.h src/qrcode/QRMaskUtil.h src/qrcode/QRMaskUtil.cpp src/qrcode/QRMatrixUtil.h src/qrcode/QRMatrixUtil.cpp src/qrcode/QRWriter.h src/qrcode/QRWriter.cpp ) endif() set (TEXT_CODEC_FILES src/textcodec/Big5MapTable.h src/textcodec/Big5MapTable.cpp src/textcodec/KRHangulMapping.h src/textcodec/KRHangulMapping.cpp ) if (ENABLE_DECODERS) set (TEXT_CODEC_FILES ${TEXT_CODEC_FILES} src/textcodec/Big5TextDecoder.h src/textcodec/Big5TextDecoder.cpp src/textcodec/GBTextDecoder.h src/textcodec/GBTextDecoder.cpp src/textcodec/JPTextDecoder.h src/textcodec/JPTextDecoder.cpp src/textcodec/KRTextDecoder.h src/textcodec/KRTextDecoder.cpp ) endif() if (ENABLE_ENCODERS) set (TEXT_CODEC_FILES ${TEXT_CODEC_FILES} src/textcodec/Big5TextEncoder.h src/textcodec/Big5TextEncoder.cpp src/textcodec/GBTextEncoder.h src/textcodec/GBTextEncoder.cpp src/textcodec/JPTextEncoder.h src/textcodec/JPTextEncoder.cpp src/textcodec/KRTextEncoder.h src/textcodec/KRTextEncoder.cpp ) endif() source_group (Sources FILES ${COMMON_FILES}) source_group (Sources\\aztec FILES ${AZTEC_FILES}) source_group (Sources\\datamatrix FILES ${DATAMATRIX_FILES}) source_group (Sources\\maxicode FILES ${MAXICODE_FILES}) source_group (Sources\\oned FILES ${ONED_FILES}) source_group (Sources\\oned\\rss FILES ${ONED_RSS_FILES}) source_group (Sources\\pdf417 FILES ${PDF417_FILES}) source_group (Sources\\qrcode FILES ${QRCODE_FILES}) source_group (Sources\\textcodec FILES ${TEXT_CODEC_FILES}) find_package (Threads) add_library (ZXingCore ${COMMON_FILES} ${AZTEC_FILES} ${DATAMATRIX_FILES} ${MAXICODE_FILES} ${ONED_FILES} ${ONED_RSS_FILES} ${PDF417_FILES} ${QRCODE_FILES} ${TEXT_CODEC_FILES} ) target_include_directories (ZXingCore PUBLIC "$" INTERFACE "$" ) target_compile_options (ZXingCore PUBLIC ${ZXING_CORE_DEFINES} PRIVATE ${ZXING_CORE_LOCAL_DEFINES} ) include (CheckCXXCompilerFlag) CHECK_CXX_COMPILER_FLAG ("-ffloat-store" COMPILER_NEEDS_FLOAT_STORE) if (COMPILER_NEEDS_FLOAT_STORE) target_compile_options(ZXingCore PRIVATE -ffloat-store # same floating point precision in all optimization levels ) endif() target_link_libraries (ZXingCore PUBLIC ${CMAKE_THREAD_LIBS_INIT}) add_library(ZXing::Core ALIAS ZXingCore) set_target_properties(ZXingCore PROPERTIES EXPORT_NAME Core) include (GNUInstallDirs) # Once we can require cmake 1.13, then we can move this to ../CMakeLists.txt, see: https://gitlab.kitware.com/cmake/cmake/merge_requests/2152 install ( TARGETS ZXingCore EXPORT ZXingTargets LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR} RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR} ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR} INCLUDES DESTINATION include ) zxing-cpp-1.0.8+ds2/core/ZXVersion.h.in000066400000000000000000000014001361167020700175360ustar00rootroot00000000000000#pragma once /* * Copyright 2019 Nu-book Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ // Version numbering #define ZXING_VERSION_MAJOR @ZXING_VERSION_MAJOR@ #define ZXING_VERSION_MINOR @ZXING_VERSION_MINOR@ #define ZXING_VERSION_PATCH @ZXING_VERSION_PATCH@ zxing-cpp-1.0.8+ds2/core/ZXingConfig.cmake.in000066400000000000000000000001071361167020700206500ustar00rootroot00000000000000@PACKAGE_INIT@ include("${CMAKE_CURRENT_LIST_DIR}/ZXingTargets.cmake") zxing-cpp-1.0.8+ds2/core/src/000077500000000000000000000000001361167020700156455ustar00rootroot00000000000000zxing-cpp-1.0.8+ds2/core/src/BarcodeFormat.cpp000066400000000000000000000027051361167020700210650ustar00rootroot00000000000000/* * Copyright 2016 Nu-book Inc. * Copyright 2016 ZXing authors * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #include "BarcodeFormat.h" #include "ZXContainerAlgorithms.h" #include #include #include #include namespace ZXing { static const char* FORMAT_STR[] = { "AZTEC", "CODABAR", "CODE_39", "CODE_93", "CODE_128", "DATA_MATRIX", "EAN_8", "EAN_13", "ITF", "MAXICODE", "PDF_417", "QR_CODE", "RSS_14", "RSS_EXPANDED", "UPC_A", "UPC_E", "UPC_EAN_EXTENSION", }; static_assert(Length(FORMAT_STR) == (int)BarcodeFormat::FORMAT_COUNT, "FORMAT_STR array is out of sync with BarcodeFormat"); const char * ToString(BarcodeFormat format) { return FORMAT_STR[(int)format]; } BarcodeFormat BarcodeFormatFromString(const std::string& str) { return BarcodeFormat(std::distance(std::begin(FORMAT_STR), std::find(std::begin(FORMAT_STR), std::end(FORMAT_STR), str))); } } // ZXing zxing-cpp-1.0.8+ds2/core/src/BarcodeFormat.h000066400000000000000000000037651361167020700205410ustar00rootroot00000000000000#pragma once /* * Copyright 2016 Nu-book Inc. * Copyright 2016 ZXing authors * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #include #include #include namespace ZXing { /** * Enumerates barcode formats known to this package. Please keep alphabetized. * * @author Sean Owen */ enum class BarcodeFormat { /** Aztec 2D barcode format. */ AZTEC, /** CODABAR 1D format. */ CODABAR, /** Code 39 1D format. */ CODE_39, /** Code 93 1D format. */ CODE_93, /** Code 128 1D format. */ CODE_128, /** Data Matrix 2D barcode format. */ DATA_MATRIX, /** EAN-8 1D format. */ EAN_8, /** EAN-13 1D format. */ EAN_13, /** ITF (Interleaved Two of Five) 1D format. */ ITF, /** MaxiCode 2D barcode format. */ MAXICODE, /** PDF417 format. */ PDF_417, /** QR Code 2D barcode format. */ QR_CODE, /** RSS 14 */ RSS_14, /** RSS EXPANDED */ RSS_EXPANDED, /** UPC-A 1D format. */ UPC_A, /** UPC-E 1D format. */ UPC_E, /** UPC/EAN extension format. Not a stand-alone format. */ UPC_EAN_EXTENSION, // Used to count the number of formats, thus it needs to be always the last listed here. // Setting the format to this value has no effect, i.e. if this is the only value, the // resulting list is empty, which means every format is accepted. So this effectively means // "look for all formats". FORMAT_COUNT, }; const char* ToString(BarcodeFormat format); // Return FORMAT_COUNT if str is unexpected BarcodeFormat BarcodeFormatFromString(const std::string& str); } // ZXing zxing-cpp-1.0.8+ds2/core/src/BinaryBitmap.h000066400000000000000000000065531361167020700204100ustar00rootroot00000000000000#pragma once /* * Copyright 2016 Nu-book Inc. * Copyright 2016 ZXing authors * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #include namespace ZXing { class BitArray; class BitMatrix; /** * This class is the core bitmap class used by ZXing to represent 1 bit data. Reader objects * accept a BinaryBitmap and attempt to decode it. * * @author dswitkin@google.com (Daniel Switkin) */ class BinaryBitmap { public: virtual ~BinaryBitmap() = default; /** * Image is a pure monochrome image of a barcode. */ virtual bool isPureBarcode() const = 0; /** * @return The width of the bitmap. */ virtual int width() const = 0; /** * @return The height of the bitmap. */ virtual int height() const = 0; /** * Converts one row of luminance data to 1 bit data. * This method is intended for decoding 1D barcodes and may choose to apply sharpening. * * @param y The row to fetch, which must be in [0, bitmap height) * @param row An optional preallocated array. If null or too small, it will be ignored. * If used, the Binarizer will call BitArray.clearBits(). Always use the returned object. * @return The array of bits for this row (true means black). * @throws NotFoundException if row can't be binarized */ virtual bool getBlackRow(int y, BitArray& outArray) const = 0; /** * Converts a 2D array of luminance data to 1 bit. This method is intended for decoding 2D * barcodes and may or may not apply sharpening. Therefore, a row from this matrix may not be * identical to one fetched using getBlackRow(), so don't mix and match between them. * * @return The 2D array of bits for the image (true means black). * @return null if image can't be binarized to make a matrix */ virtual std::shared_ptr getBlackMatrix() const = 0; /** * @return Whether this bitmap can be cropped. */ virtual bool canCrop() const = 0; /** * Returns a new object with cropped image data. Implementations may keep a reference to the * original data rather than a copy. Only callable if isCropSupported() is true. * * @param left The left coordinate, which must be in [0,getWidth()) * @param top The top coordinate, which must be in [0,getHeight()) * @param width The width of the rectangle to crop. * @param height The height of the rectangle to crop. * @return A cropped version of this object. */ virtual std::shared_ptr cropped(int left, int top, int width, int height) const = 0; /** * @return Whether this bitmap supports counter-clockwise rotation. */ virtual bool canRotate() const = 0; /** * Returns a new object with rotated image data by 90 degrees clockwise. * Only callable if {@link #isRotateSupported()} is true. * * @param degreeCW degree in clockwise direction, possible values are 90, 180 and 270 * @return A rotated version of this object. */ virtual std::shared_ptr rotated(int degreeCW) const = 0; }; } // ZXing zxing-cpp-1.0.8+ds2/core/src/BitArray.cpp000066400000000000000000000121221361167020700200640ustar00rootroot00000000000000/* * Copyright 2016 Nu-book Inc. * Copyright 2016 ZXing authors * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #include "BitArray.h" #include "BitHacks.h" #include #include namespace ZXing { #ifndef ZX_FAST_BIT_STORAGE #if 0 // unused code void BitArray::setRange(int start, int end) { if (end < start || start < 0 || end > _size) { throw std::invalid_argument("BitArray::setRange(): Invalid range"); } if (end == start) { return; } end--; // will be easier to treat this as the last actually set bit -- inclusive int firstInt = start / 32; int lastInt = end / 32; for (int i = firstInt; i <= lastInt; i++) { int firstBit = i > firstInt ? 0 : start & 0x1F; int lastBit = i < lastInt ? 31 : end & 0x1F; // Ones from firstBit to lastBit, inclusive uint32_t mask = (2UL << lastBit) - (1UL << firstBit); _bits[i] |= mask; } } #endif bool BitArray::isRange(int start, int end, bool value) const { if (end < start || start < 0 || end > _size) { throw std::invalid_argument("BitArray::isRange(): Invalid range"); } if (end == start) { return true; // empty range matches } end--; // will be easier to treat this as the last actually set bit -- inclusive int firstInt = start / 32; int lastInt = end / 32; for (int i = firstInt; i <= lastInt; i++) { int firstBit = i > firstInt ? 0 : start & 0x1F; int lastBit = i < lastInt ? 31 : end & 0x1F; // Ones from firstBit to lastBit, inclusive uint32_t mask = (2UL << lastBit) - (1UL << firstBit); // Return false if we're looking for 1s and the masked bits[i] isn't all 1s (that is, // equals the mask, or we're looking for 0s and the masked portion is not all 0s if ((_bits[i] & mask) != (value ? mask : 0U)) { return false; } } return true; } void BitArray::appendBits(int value, int numBits) { if (numBits < 0 || numBits > 32) { throw std::invalid_argument("BitArray::appendBits(): Num bits must be between 0 and 32"); } int i = _size; _size += numBits; _bits.resize((_size + 31) / 32, 0); for (--numBits; numBits >= 0; --numBits, ++i) { _bits[i / 32] |= ((value >> numBits) & 1) << (i & 0x1F); } } void BitArray::appendBit(bool bit) { _bits.resize((_size + 1 + 31) / 32, 0); if (bit) { _bits[_size / 32] |= 1 << (_size & 0x1F); } _size++; } void BitArray::appendBitArray(const BitArray& other) { if (_bits.empty()) { *this = other.copy(); } else if (other._size > 0) { unsigned offset = static_cast(_bits.size()) * 32 - _size; if (offset > 0) { auto buffer = other._bits; _bits.back() = (_bits.back() & (0xffffffff >> offset)) | (buffer.front() << (32 - offset)); BitHacks::ShiftRight(buffer, offset); size_t prevBlockSize = _bits.size(); _size += other._size; _bits.resize((_size + 31) / 32); std::copy_n(buffer.begin(), _bits.size() - prevBlockSize, _bits.begin() + prevBlockSize); } else { _size += other._size; _bits.insert(_bits.end(), other._bits.begin(), other._bits.end()); } } } void BitArray::getSubArray(int offset, int length, BitArray& result) const { if (offset < 0 || offset + length > _size) { throw std::invalid_argument("Invalid range"); } if (length < 0) { length = _size - offset; } if (length == 0) { result._size = 0; result._bits.clear(); } else { result._size = length; int startIndex = offset / 32; int endIndex = (offset + length + 31) / 32; result._bits.resize(endIndex - startIndex); std::copy_n(_bits.begin() + startIndex, result._bits.size(), result._bits.begin()); unsigned rightOffset = offset % 32; if (rightOffset > 0) { BitHacks::ShiftRight(result._bits, rightOffset); result._bits.resize((length + 31) / 32); } result._bits.back() &= (0xffffffff >> (result._bits.size() * 32 - result._size)); } } #endif void BitArray::bitwiseXOR(const BitArray& other) { if (size() != other.size()) { throw std::invalid_argument("BitArray::xor(): Sizes don't match"); } for (size_t i = 0; i < _bits.size(); i++) { // The last int could be incomplete (i.e. not have 32 bits in // it) but there is no problem since 0 XOR 0 == 0. _bits[i] ^= other._bits[i]; } } void BitArray::toBytes(int bitOffset, uint8_t* output, int numBytes) const { for (int i = 0; i < numBytes; i++) { int theByte = 0; for (int j = 0; j < 8; j++) { if (get(bitOffset)) { theByte |= 1 << (7 - j); } bitOffset++; } output[i] = (uint8_t)theByte; } } //std::string //BitArray::toString() const //{ // std::string result; // result.reserve(_size); // for (int i = 0; i < _size; ++i) { // if ((i & 0x07) == 0) { // result.push_back(' '); // } // result.push_back(get(i) ? 'X' : '.'); // } // return result; //} // } // ZXing zxing-cpp-1.0.8+ds2/core/src/BitArray.h000066400000000000000000000250371361167020700175420ustar00rootroot00000000000000#pragma once /* * Copyright 2016 Nu-book Inc. * Copyright 2016 ZXing authors * Copyright 2017 Axel Waggershauser * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #include "ZXConfig.h" #include "BitHacks.h" #include #include #include #include namespace ZXing { template struct Range { Iterator begin, end; explicit operator bool() const { return begin < end; } int size() const { return static_cast(end - begin); } }; /** *

A simple, fast array of bits, represented compactly by an array of ints internally.

* * @author Sean Owen */ class BitArray { #ifdef ZX_FAST_BIT_STORAGE std::vector _bits; #else int _size = 0; std::vector _bits; #endif friend class BitMatrix; // Nothing wrong to support it, just to make it explicit, instead of by mistake. // Use copy() below. BitArray(const BitArray &) = default; BitArray& operator=(const BitArray &) = delete; public: #ifdef ZX_FAST_BIT_STORAGE using Iterator = std::vector::const_iterator; #else class Iterator : public std::iterator { public: bool operator*() const { return (*_value & _mask) != 0; } Iterator& operator++() { if ((_mask <<= 1) == 0) { _mask = 1; ++_value; } return *this; } Iterator& operator--() { if ((_mask >>= 1) == 0) { _mask = 0x80000000; --_value; } return *this; } int operator-(const Iterator& rhs) const { return static_cast(_value - rhs._value) * 32 + (_mask >= rhs._mask ? +BitHacks::CountBitsSet(_mask - rhs._mask) : -BitHacks::CountBitsSet(rhs._mask - _mask)); } bool operator==(const Iterator& rhs) const { return _mask == rhs._mask && _value == rhs._value; } bool operator!=(const Iterator& rhs) const { return !(*this == rhs); } bool operator<(const Iterator& rhs) const { return _value < rhs._value || (_value == rhs._value && _mask < rhs._mask); } bool operator<=(const Iterator& rhs) const { return _value < rhs._value || (_value == rhs._value && _mask <= rhs._mask); } bool operator>(const Iterator& rhs) const { return !(*this <= rhs); } bool operator>=(const Iterator& rhs) const { return !(*this < rhs); } private: Iterator(std::vector::const_iterator p, uint32_t m) : _value(p), _mask(m) {} std::vector::const_iterator _value; uint32_t _mask; friend class BitArray; }; #endif using ReverseIterator = std::reverse_iterator; using Range = ZXing::Range; BitArray() = default; explicit BitArray(int size) : #ifdef ZX_FAST_BIT_STORAGE _bits(size, 0) {} #else _size(size), _bits((size + 31) / 32, 0) {} #endif BitArray(BitArray&& other) noexcept : #ifndef ZX_FAST_BIT_STORAGE _size(other._size), #endif _bits(std::move(other._bits)) {} BitArray& operator=(BitArray&& other) noexcept { #ifndef ZX_FAST_BIT_STORAGE _size = other._size; #endif _bits = std::move(other._bits); return *this; } BitArray copy() const { return *this; } int size() const noexcept { #ifdef ZX_FAST_BIT_STORAGE return static_cast(_bits.size()); #else return _size; #endif } int sizeInBytes() const noexcept { return (size() + 7) / 8; } /** * @param i bit to get * @return true iff bit i is set */ bool get(int i) const { #ifdef ZX_FAST_BIT_STORAGE return _bits.at(i) != 0; #else return (_bits.at(i >> 5) & (1 << (i & 0x1F))) != 0; #endif } // If you know exactly how may bits you are going to iterate // and that you access bit in sequence, iterator is faster than get(). // However, be extremly careful since there is no check whatsoever. // (Performance is the reason for the iterator to exist int the first place!) #ifdef ZX_FAST_BIT_STORAGE Iterator iterAt(int i) const noexcept { return {_bits.cbegin() + i}; } Iterator begin() const noexcept { return _bits.cbegin(); } Iterator end() const noexcept { return _bits.cend(); } template static ITER getNextSetTo(ITER begin, ITER end, bool v) noexcept { while( begin != end && *begin != static_cast(v) ) ++begin; return begin; } #else Iterator iterAt(int i) const noexcept { return {_bits.cbegin() + (i >> 5), 1U << (i & 0x1F)}; } Iterator begin() const noexcept { return iterAt(0); } Iterator end() const noexcept { return iterAt(_size); } static Iterator getNextSetTo(Iterator begin, Iterator end, bool v) { auto i = begin; // reconstruct _bits.end() auto bitsEnd = end._mask == 0x1 ? end._value : std::next(end._value); if (i._value >= bitsEnd) return end; // mask off lesser bits first auto currentBits = (v ? *i._value : ~*i._value) & ~(i._mask - 1); while (currentBits == 0) { if (++i._value == bitsEnd) { return end; } currentBits = v ? *i._value : ~*i._value; } i._mask = 1 << BitHacks::NumberOfTrailingZeros(currentBits); return i; } static ReverseIterator getNextSetTo(ReverseIterator begin, ReverseIterator end, bool v) { while( begin != end && *begin != v ) ++begin; return begin; } #endif Iterator getNextSetTo(Iterator i, bool v) const { return getNextSetTo(i, end(), v); } Iterator getNextSet(Iterator i) const { return getNextSetTo(i, true); } Iterator getNextUnset(Iterator i) const { return getNextSetTo(i, false); } ReverseIterator rbegin() const noexcept { return ReverseIterator(end()); } ReverseIterator rend() const noexcept { return ReverseIterator(begin()); } /** * Sets bit i. * * @param i bit to set */ void set(int i) { #ifdef ZX_FAST_BIT_STORAGE _bits.at(i) = 1; #else _bits.at(i >> 5) |= 1 << (i & 0x1F); #endif } #if 0 // deprecated / unused code /** * Flips bit i. * * @param i bit to set */ void flip(int i) { _bits.at(i >> 5) ^= 1 << (i & 0x1F); } void flipAll() { for (auto& i : _bits) { i = ~i; } } /** * @param from first bit to check * @return index of first bit that is set, starting from the given index, or size if none are set * at or beyond this given index * @see #getNextUnset(int) */ int getNextSet(int from) const { return getNextSet(iterAt(from)) - begin(); } /** * @param from index to start looking for unset bit * @return index of next unset bit, or {@code size} if none are unset until the end * @see #getNextSet(int) */ int getNextUnset(int from) const { return getNextUnset(iterAt(from)) - begin(); } /** * Sets a range of bits. * * @param start start of range, inclusive. * @param end end of range, exclusive */ void setRange(int start, int end); #endif // TODO: this method is used in BitWrapperBinerizer but never linked?!? void getSubArray(int offset, int length, BitArray& result) const; /** * Clears all bits (sets to false). */ void clearBits() { std::fill(_bits.begin(), _bits.end(), 0); } /** * Efficient method to check if a range of bits is set, or not set. * * @param start start of range, inclusive. * @param end end of range, exclusive * @param value if true, checks that bits in range are set, otherwise checks that they are not set * @return true iff all bits are set or not set in range, according to value argument * @throws IllegalArgumentException if end is less than or equal to start */ #ifdef ZX_FAST_BIT_STORAGE bool isRange(int start, int end, bool value) const { return std::all_of(std::begin(_bits) + start, std::begin(_bits) + end, [value](uint8_t v) { return v == static_cast(value); }); } #else bool isRange(int start, int end, bool value) const; #endif // Little helper method to make common isRange use case more readable. // Pass positive zone size to look for quite zone after i and negative for zone in front of i. // Set allowClippedZone to false if clipping the zone at the image border is not acceptable. bool hasQuiteZone(Iterator i, int signedZoneSize, bool allowClippedZone = true) const { int index = static_cast(i - begin()); if (signedZoneSize > 0) { if (!allowClippedZone && index + signedZoneSize >= size()) return false; return isRange(index, std::min(size(), index + signedZoneSize), false); } else { if (!allowClippedZone && index + signedZoneSize < 0) return false; return isRange(std::max(0, index + signedZoneSize), index, false); } } bool hasQuiteZone(ReverseIterator i, int signedZoneSize, bool allowClippedZone = true) const { return hasQuiteZone(i.base(), -signedZoneSize, allowClippedZone); } /** * Appends the least-significant bits, from value, in order from most-significant to * least-significant. For example, appending 6 bits from 0x000001E will append the bits * 0, 1, 1, 1, 1, 0 in that order. * * @param value {@code int} containing bits to append * @param numBits bits from value to append */ #ifdef ZX_FAST_BIT_STORAGE void appendBits(int value, int numBits) { for (; numBits; --numBits) _bits.push_back((value >> (numBits-1)) & 1); } void appendBit(bool bit) { _bits.push_back(bit); } void appendBitArray(const BitArray& other) { _bits.insert(_bits.end(), other.begin(), other.end()); } /** * Reverses all bits in the array. */ void reverse() { std::reverse(_bits.begin(), _bits.end()); } #else void appendBits(int value, int numBits); void appendBit(bool bit); void appendBitArray(const BitArray& other); /** * Reverses all bits in the array. */ void reverse() { BitHacks::Reverse(_bits, _bits.size() * 32 - _size); } #endif void bitwiseXOR(const BitArray& other); /** * * @param bitOffset first bit to start writing * @param ouput array to write into. Bytes are written most-significant byte first. This is the opposite * of the internal representation, which is exposed by {@link #getBitArray()} * @param numBytes how many bytes to write */ void toBytes(int bitOffset, uint8_t* output, int numBytes) const; /** * @return underlying array of ints. The first element holds the first 32 bits, and the least * significant bit is bit 0. */ //const std::vector& bitArray() const { return _bits; } friend bool operator==(const BitArray& a, const BitArray& b) { return #ifndef ZX_FAST_BIT_STORAGE a._size == b._size && #endif a._bits == b._bits; } }; } // ZXing zxing-cpp-1.0.8+ds2/core/src/BitHacks.h000066400000000000000000000077731361167020700175240ustar00rootroot00000000000000#pragma once /* * Copyright 2016 Huy Cuong Nguyen * Copyright 2017 Axel Waggershauser * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #include #include #include #if defined(__clang__) || defined(__GNUC__) #define ZX_HAS_GCC_BUILTINS #endif namespace ZXing { namespace BitHacks { /** * The code below is taken from https://graphics.stanford.edu/~seander/bithacks.html * All credits go to Sean Eron Anderson and other authors mentioned in that page. */ /// /// Compute the number of zero bits on the left. /// inline int NumberOfLeadingZeros(uint32_t x) { if (x == 0) return 32; #ifdef ZX_HAS_GCC_BUILTINS return __builtin_clz(x); #else int n = 0; if ((x & 0xFFFF0000) == 0) { n = n + 16; x = x << 16; } if ((x & 0xFF000000) == 0) { n = n + 8; x = x << 8; } if ((x & 0xF0000000) == 0) { n = n + 4; x = x << 4; } if ((x & 0xC0000000) == 0) { n = n + 2; x = x << 2; } if ((x & 0x80000000) == 0) { n = n + 1; } return n; #endif } /// /// Compute the number of zero bits on the right. /// inline int NumberOfTrailingZeros(uint32_t v) { #ifdef ZX_HAS_GCC_BUILTINS assert(v != 0); return __builtin_ctz(v); #else int c = 32; v &= -int32_t(v); if (v) c--; if (v & 0x0000FFFF) c -= 16; if (v & 0x00FF00FF) c -= 8; if (v & 0x0F0F0F0F) c -= 4; if (v & 0x33333333) c -= 2; if (v & 0x55555555) c -= 1; return c; #endif } inline uint32_t Reverse(uint32_t v) { #if 0 return __builtin_bitreverse32(v); #else v = ((v >> 1) & 0x55555555) | ((v & 0x55555555) << 1); // swap consecutive pairs v = ((v >> 2) & 0x33333333) | ((v & 0x33333333) << 2); // swap nibbles ... v = ((v >> 4) & 0x0F0F0F0F) | ((v & 0x0F0F0F0F) << 4); // swap bytes v = ((v >> 8) & 0x00FF00FF) | ((v & 0x00FF00FF) << 8); // swap 2-byte long pairs v = (v >> 16) | (v << 16); return v; #endif } inline int CountBitsSet(uint32_t v) { #ifdef ZX_HAS_GCC_BUILTINS return __builtin_popcount(v); #else v = v - ((v >> 1) & 0x55555555); // reuse input as temporary v = (v & 0x33333333) + ((v >> 2) & 0x33333333); // temp return (((v + (v >> 4)) & 0xF0F0F0F) * 0x1010101) >> 24; // count #endif } // this is the same as log base 2 of v inline int HighestBitSet(uint32_t v) { return 31 - NumberOfLeadingZeros(v); } // shift a whole array of bits by offset bits to the right (thinking of the array as a contiguous stream of bits // starting with the LSB of the first int and ending with the MSB of the last int, this is actually a left shift) template void ShiftRight(std::vector& bits, std::size_t offset) { assert(offset < sizeof(T) * 8); if (offset == 0 || bits.empty()) return; std::size_t leftOffset = sizeof(T) * 8 - offset; for (std::size_t i = 0; i < bits.size() - 1; ++i) { bits[i] = (bits[i] >> offset) | (bits[i + 1] << leftOffset); } bits.back() >>= offset; } // reverse a whole array of bits. padding is the number of 'dummy' bits at the end of the array template void Reverse(std::vector& bits, std::size_t padding) { static_assert(sizeof(T) == sizeof(uint32_t), "Reverse only implemented for 32 bit types"); // reverse all int's first (reversing the ints in the array and the bits in the ints at the same time) auto first = bits.begin(), last = bits.end(); for (; first < --last; ++first) { auto t = *first; *first = BitHacks::Reverse(*last); *last = BitHacks::Reverse(t); } if (first == last) *last = BitHacks::Reverse(*last); // now correct the int's if the bit size isn't a multiple of 32 ShiftRight(bits, padding); } } // BitHacks } // ZXing zxing-cpp-1.0.8+ds2/core/src/BitMatrix.cpp000066400000000000000000000157161361167020700202660ustar00rootroot00000000000000/* * Copyright 2016 Nu-book Inc. * Copyright 2016 ZXing authors * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #include "BitMatrix.h" #include "BitArray.h" #include "ByteMatrix.h" #include "BitHacks.h" #include namespace ZXing { //void //BitMatrix::xor(const BitMatrix& mask) //{ // if (_width != mask._width || _height != mask._height || _rowSize != mask._rowSize) // { // throw std::invalid_argument("BitMatrix::xor(): input matrix dimensions do not match"); // } // // for (size_t i = 0; i < _bits.size(); ++i) { // _bits[i] ^= mask._bits[i]; // } //} void BitMatrix::getRow(int y, BitArray& row) const { if (y < 0 || y >= _height) { throw std::out_of_range("Requested row is outside the matrix"); } if (row.size() != _width) row = BitArray(_width); std::copy_n(_bits.begin() + y * _rowSize, _rowSize, row._bits.begin()); } /** * @param y row to set * @param row {@link BitArray} to copy from */ void BitMatrix::setRow(int y, const BitArray& row) { if (int(row._bits.size()) != _rowSize) { throw std::invalid_argument("BitMatrix::setRegion(): row sizes do not match"); } std::copy(row._bits.begin(), row._bits.end(), _bits.begin() + y *_rowSize); } BitMatrix::BitMatrix(const ByteMatrix& other, int blackValue) : BitMatrix(other.width(), other.height()) { for (int y = 0; y < height(); ++y) for (int x = 0; x < width(); ++x) if (other.get(x, y) == blackValue) set(x, y); } ByteMatrix BitMatrix::toByteMatrix(int black, int white) const { ByteMatrix res(width(), height()); for (int y = 0; y < height(); ++y) for (int x = 0; x < width(); ++x) res.set(x, y, get(x, y) ? black : white); return res; } void BitMatrix::setRegion(int left, int top, int width, int height) { if (top < 0 || left < 0) { throw std::invalid_argument("BitMatrix::setRegion(): Left and top must be nonnegative"); } if (height < 1 || width < 1) { throw std::invalid_argument("BitMatrix::setRegion(): Height and width must be at least 1"); } int right = left + width; int bottom = top + height; if (bottom > _height || right > _width) { throw std::invalid_argument("BitMatrix::setRegion(): The region must fit inside the matrix"); } for (int y = top; y < bottom; y++) { size_t offset = y * _rowSize; for (int x = left; x < right; x++) { #ifdef ZX_FAST_BIT_STORAGE _bits[offset + x] = 1; #else _bits[offset + (x / 32)] |= 1 << (x & 0x1f); #endif } } } void BitMatrix::rotate90() { BitMatrix result(height(), width()); for (int x = 0; x < width(); ++x) { for (int y = 0; y < height(); ++y) { if (get(x, y)) { result.set(y, width() - x - 1); } } } *this = std::move(result); } void BitMatrix::rotate180() { #ifdef ZX_FAST_BIT_STORAGE std::reverse(_bits.begin(), _bits.end()); #else BitHacks::Reverse(_bits, _rowSize * 32 - _width); #endif } void BitMatrix::mirror() { for (int x = 0; x < _width; x++) { for (int y = x + 1; y < _height; y++) { if (get(x, y) != get(y, x)) { flip(y, x); flip(x, y); } } } } /** * This is useful in detecting the enclosing rectangle of a 'pure' barcode. * * @return {@code left,top,width,height} enclosing rectangle of all 1 bits, or null if it is all white */ bool BitMatrix::getEnclosingRectangle(int &left, int& top, int& width, int& height) const { left = _width; top = _height; int right = -1; int bottom = -1; for (int y = 0; y < _height; y++) { for (int x32 = 0; x32 < _rowSize; x32++) { uint32_t theBits = _bits[y * _rowSize + x32]; if (theBits != 0) { if (y < top) { top = y; } if (y > bottom) { bottom = y; } if (x32 * 32 < left) { int bit = 0; while ((theBits << (31 - bit)) == 0) { bit++; } if ((x32 * 32 + bit) < left) { left = x32 * 32 + bit; } } if (x32 * 32 + 31 > right) { int bit = 31; while ((theBits >> bit) == 0) { bit--; } if ((x32 * 32 + bit) > right) { right = x32 * 32 + bit; } } } } } if (right < left || bottom < top) { return false; } width = right - left + 1; height = bottom - top + 1; return true; } /** * This is useful in detecting a corner of a 'pure' barcode. * * @return {@code x,y} coordinate of top-left-most 1 bit, or null if it is all white */ bool BitMatrix::getTopLeftOnBit(int& left, int& top) const { int bitsOffset = 0; while (bitsOffset < (int)_bits.size() && _bits[bitsOffset] == 0) { bitsOffset++; } if (bitsOffset == (int)_bits.size()) { return false; } top = bitsOffset / _rowSize; left = (bitsOffset % _rowSize) * 32; uint32_t theBits = _bits[bitsOffset]; int bit = 0; while ((theBits << (31 - bit)) == 0) { bit++; } left += bit; return true; } bool BitMatrix::getBottomRightOnBit(int& right, int& bottom) const { int bitsOffset = int(_bits.size()) - 1; while (bitsOffset >= 0 && _bits[bitsOffset] == 0) { bitsOffset--; } if (bitsOffset < 0) { return false; } bottom = bitsOffset / _rowSize; right = (bitsOffset % _rowSize) * 32; uint32_t theBits = _bits[bitsOffset]; int bit = 31; while ((theBits >> bit) == 0) { bit--; } right += bit; return true; } BitMatrix Inflate(BitMatrix&& input, int width, int height, int quietZone) { const int codeWidth = input.width(); const int codeHeight = input.height(); const int outputWidth = std::max(width, codeWidth + 2 * quietZone); const int outputHeight = std::max(height, codeHeight + 2 * quietZone); if (input.width() == outputWidth && input.height() == outputHeight) return std::move(input); const int scale = std::min((outputWidth - 2*quietZone) / codeWidth, (outputHeight - 2*quietZone) / codeHeight); // Padding includes both the quiet zone and the extra white pixels to // accommodate the requested dimensions. const int leftPadding = (outputWidth - (codeWidth * scale)) / 2; const int topPadding = (outputHeight - (codeHeight * scale)) / 2; BitMatrix result(outputWidth, outputHeight); for (int inputY = 0, outputY = topPadding; inputY < input.height(); ++inputY, outputY += scale) { for (int inputX = 0, outputX = leftPadding; inputX < input.width(); ++inputX, outputX += scale) { if (input.get(inputX, inputY)) result.setRegion(outputX, outputY, scale, scale); } } return result; } BitMatrix Deflate(const BitMatrix& input, int width, int height, int top, int left, int subSampling) { BitMatrix result(width, height); for (int y = 0; y < result.height(); y++) { int yOffset = top + y * subSampling; for (int x = 0; x < result.width(); x++) { if (input.get(left + x * subSampling, yOffset)) result.set(x, y); } } return result; } } // ZXing zxing-cpp-1.0.8+ds2/core/src/BitMatrix.h000066400000000000000000000162341361167020700177270ustar00rootroot00000000000000#pragma once /* * Copyright 2016 Nu-book Inc. * Copyright 2016 ZXing authors * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #include #include #include "ZXConfig.h" namespace ZXing { class BitArray; class ByteMatrix; /** *

Represents a 2D matrix of bits. In function arguments below, and throughout the common * module, x is the column position, and y is the row position. The ordering is always x, y. * The origin is at the top-left.

* *

Internally the bits are represented in a 1-D array of 32-bit ints. However, each row begins * with a new int. This is done intentionally so that we can copy out a row into a BitArray very * efficiently.

* *

The ordering of bits is row-major. Within each int, the least significant bits are used first, * meaning they represent lower x values. This is compatible with BitArray's implementation.

* * @author Sean Owen * @author dswitkin@google.com (Daniel Switkin) */ class BitMatrix { int _width = 0; int _height = 0; int _rowSize = 0; #ifdef ZX_FAST_BIT_STORAGE std::vector _bits; #else std::vector _bits; #endif // There is nothing wrong to support this but disable to make it explicit since we may copy something very big here. // Use copy() below. BitMatrix(const BitMatrix&) = default; BitMatrix& operator=(const BitMatrix&) = delete; public: BitMatrix() = default; #ifdef ZX_FAST_BIT_STORAGE BitMatrix(int width, int height) : _width(width), _height(height), _rowSize(width), _bits(width * height, 0) {} #else BitMatrix(int width, int height) : _width(width), _height(height), _rowSize((width + 31) / 32), _bits(((width + 31) / 32) * _height, 0) {} #endif explicit BitMatrix(int dimension) : BitMatrix(dimension, dimension) {} // Construct a square matrix. BitMatrix(const ByteMatrix& other, int blackValue); BitMatrix(BitMatrix&& other) noexcept : _width(other._width), _height(other._height), _rowSize(other._rowSize), _bits(std::move(other._bits)) {} BitMatrix& operator=(BitMatrix&& other) noexcept { _width = other._width; _height = other._height; _rowSize = other._rowSize; _bits = std::move(other._bits); return *this; } BitMatrix copy() const { return *this; } ByteMatrix toByteMatrix(int black = 0, int white = 255) const; /** *

Gets the requested bit, where true means black.

* * @param x The horizontal component (i.e. which column) * @param y The vertical component (i.e. which row) * @return value of given bit in matrix */ bool get(int x, int y) const { #ifdef ZX_FAST_BIT_STORAGE return _bits.at(y * _width + x) != 0; #else return ((_bits.at(y * _rowSize + (x / 32)) >> (x & 0x1f)) & 1) != 0; #endif } /** *

Sets the given bit to true.

* * @param x The horizontal component (i.e. which column) * @param y The vertical component (i.e. which row) */ void set(int x, int y) { #ifdef ZX_FAST_BIT_STORAGE _bits.at(y * _width + x) = 1; #else _bits.at(y * _rowSize + (x / 32)) |= 1 << (x & 0x1f); #endif } void unset(int x, int y) { #ifdef ZX_FAST_BIT_STORAGE _bits.at(y * _width + x) = 0; #else _bits.at(y * _rowSize + (x / 32)) &= ~(1 << (x & 0x1f)); #endif } /** *

Flips the given bit.

* * @param x The horizontal component (i.e. which column) * @param y The vertical component (i.e. which row) */ void flip(int x, int y) { #ifdef ZX_FAST_BIT_STORAGE auto& v =_bits.at(y * _width + x); v = !v; #else _bits.at(y * _rowSize + (x / 32)) ^= 1 << (x & 0x1f); #endif } void flipAll() { for (auto& i : _bits) { i = ~i; } } /** * Exclusive-or (XOR): Flip the bit in this {@code BitMatrix} if the corresponding * mask bit is set. * * @param mask XOR mask */ //void xor(const BitMatrix& mask); /** * Clears all bits (sets to false). */ void clear() { std::fill(_bits.begin(), _bits.end(), 0); } /** *

Sets a square region of the bit matrix to true.

* * @param left The horizontal position to begin at (inclusive) * @param top The vertical position to begin at (inclusive) * @param width The width of the region * @param height The height of the region */ void setRegion(int left, int top, int width, int height); /** * A fast method to retrieve one row of data from the matrix as a BitArray. * * @param y The row to retrieve * @param row An optional caller-allocated BitArray, will be allocated if null or too small * @return The resulting BitArray - this reference should always be used even when passing * your own row */ void getRow(int y, BitArray& row) const; /** * @param y row to set * @param row {@link BitArray} to copy from */ void setRow(int y, const BitArray& row); /** * Modifies this {@code BitMatrix} to represent the same but rotated 90 degrees clockwise */ void rotate90(); /** * Modifies this {@code BitMatrix} to represent the same but rotated 180 degrees */ void rotate180(); void mirror(); /** * This is useful in detecting the enclosing rectangle of a 'pure' barcode. * * @return {@code left,top,width,height} enclosing rectangle of all 1 bits, or null if it is all white */ bool getEnclosingRectangle(int &left, int& top, int& width, int& height) const; /** * This is useful in detecting a corner of a 'pure' barcode. * * @return {@code x,y} coordinate of top-left-most 1 bit, or null if it is all white */ bool getTopLeftOnBit(int &left, int& top) const; bool getBottomRightOnBit(int &right, int& bottom) const; /** * @return The width of the matrix */ int width() const { return _width; } /** * @return The height of the matrix */ int height() const { return _height; } /** * @return The row size of the matrix. That is the number of 32-bits blocks that one row takes. */ int rowSize() const { return _rowSize; } bool empty() const { return _bits.empty(); } friend bool operator==(const BitMatrix& a, const BitMatrix& b) { return a._width == b._width && a._height == b._height && a._rowSize == b._rowSize && a._bits == b._bits; } }; /** * @brief Inflate scales a BitMatrix up and adds a quite Zone plus padding * @param matrix input to be expanded * @param width new width in bits (pixel) * @param height new height in bits (pixel) * @param quietZone size of quite zone to add in modules * @return expanded BitMatrix, maybe move(input) if size did not change */ BitMatrix Inflate(BitMatrix&& input, int width, int height, int quietZone); /** * @brief Deflate (crop + subsample) a bit matrix * @param matrix * @param width new width * @param height new height * @param top cropping starts at top row * @param left cropping starts at left col * @param subSampling typically the module size * @return deflated input */ BitMatrix Deflate(const BitMatrix& matrix, int width, int height, int top, int left, int subSampling); } // ZXing zxing-cpp-1.0.8+ds2/core/src/BitSource.cpp000066400000000000000000000035061361167020700202540ustar00rootroot00000000000000/* * Copyright 2016 Nu-book Inc. * Copyright 2016 ZXing authors * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #include "BitSource.h" #include "ByteArray.h" #include namespace ZXing { int BitSource::available() const { return 8 * (_bytes.length() - _byteOffset) - _bitOffset; } int BitSource::readBits(int numBits) { if (numBits < 1 || numBits > 32 || numBits > available()) { throw std::out_of_range("BitSource::readBits: out of range"); } int result = 0; // First, read remainder from current byte if (_bitOffset > 0) { int bitsLeft = 8 - _bitOffset; int toRead = numBits < bitsLeft ? numBits : bitsLeft; int bitsToNotRead = bitsLeft - toRead; int mask = (0xFF >> (8 - toRead)) << bitsToNotRead; result = (_bytes[_byteOffset] & mask) >> bitsToNotRead; numBits -= toRead; _bitOffset += toRead; if (_bitOffset == 8) { _bitOffset = 0; _byteOffset++; } } // Next read whole bytes if (numBits > 0) { while (numBits >= 8) { result = (result << 8) | _bytes[_byteOffset]; _byteOffset++; numBits -= 8; } // Finally read a partial byte if (numBits > 0) { int bitsToNotRead = 8 - numBits; int mask = (0xFF >> bitsToNotRead) << bitsToNotRead; result = (result << numBits) | ((_bytes[_byteOffset] & mask) >> bitsToNotRead); _bitOffset += numBits; } } return result; } } // ZXing zxing-cpp-1.0.8+ds2/core/src/BitSource.h000066400000000000000000000043411361167020700177170ustar00rootroot00000000000000#pragma once /* * Copyright 2016 Nu-book Inc. * Copyright 2016 ZXing authors * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ namespace ZXing { class ByteArray; /** *

This provides an easy abstraction to read bits at a time from a sequence of bytes, where the * number of bits read is not often a multiple of 8.

* *

This class is thread-safe but not reentrant -- unless the caller modifies the bytes array * it passed in, in which case all bets are off.

* * @author Sean Owen */ class BitSource { const ByteArray& _bytes; int _byteOffset = 0; int _bitOffset = 0; public: /** * @param bytes bytes from which this will read bits. Bits will be read from the first byte first. * Bits are read within a byte from most-significant to least-significant bit. * IMPORTANT: Bit source DOES NOT copy data byte, thus make sure that the bytes outlive the bit source object. */ explicit BitSource(const ByteArray& bytes) : _bytes(bytes) {} BitSource(BitSource &) = delete; BitSource& operator=(const BitSource &) = delete; /** * @return index of next bit in current byte which would be read by the next call to {@link #readBits(int)}. */ int bitOffset() const { return _bitOffset; } /** * @return index of next byte in input byte array which would be read by the next call to {@link #readBits(int)}. */ int byteOffset() const { return _byteOffset; } /** * @param numBits number of bits to read * @return int representing the bits read. The bits will appear as the least-significant * bits of the int * @throws IllegalArgumentException if numBits isn't in [1,32] or more than is available */ int readBits(int numBits); /** * @return number of bits that can be read successfully */ int available() const; }; } // ZXing zxing-cpp-1.0.8+ds2/core/src/ByteArray.h000066400000000000000000000022771361167020700177300ustar00rootroot00000000000000#pragma once /* * Copyright 2016 Nu-book Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #include #include namespace ZXing { /** ByteArray is an extension of std::vector. */ class ByteArray : public std::vector { public: ByteArray() = default; ByteArray(std::initializer_list list) : std::vector(list) {} explicit ByteArray(int len) : std::vector(len, 0) {} int length() const { return static_cast(size()); } const char* charPtr() const { return reinterpret_cast(data()); } char* charPtr() { return reinterpret_cast(data()); } }; } // ZXing zxing-cpp-1.0.8+ds2/core/src/ByteMatrix.h000066400000000000000000000036771361167020700201230ustar00rootroot00000000000000#pragma once /* * Copyright 2016 Huy Cuong Nguyen * Copyright 2016 ZXing authors * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #include #include #include namespace ZXing { class ByteMatrix { int _width = 0; int _height = 0; std::vector _data; // Nothing wrong to support it, just to make it explicit, instead of by mistake. // Use copy() below. ByteMatrix(const ByteMatrix &) = default; ByteMatrix& operator=(const ByteMatrix &) = delete; public: ByteMatrix() = default; ByteMatrix(int width, int height, int8_t val = 0) : _width(width), _height(height), _data(_width * _height, val) { } ByteMatrix(ByteMatrix&&) = default; ByteMatrix& operator=(ByteMatrix&&) = default; ByteMatrix copy() const { return *this; } int height() const { return _height; } int width() const { return _width; } int size() const { return static_cast(_data.size()); } const int8_t& get(int x, int y) const { return _data[y *_width + x]; } void set(int x, int y, int8_t value) { _data[y *_width + x] = value; } /** * @return an internal representation as bytes, in row-major order. array[y * width() + x] represents point (x,y) */ const int8_t* data() const { return _data.data(); } const int8_t* begin() const { return _data.data(); } const int8_t* end() const { return _data.data() + _width * _height; } void clear(int8_t value) { memset(_data.data(), value, _data.size()); } }; } // ZXing zxing-cpp-1.0.8+ds2/core/src/CharacterSet.h000066400000000000000000000017451361167020700203750ustar00rootroot00000000000000#pragma once /* * Copyright 2016 Nu-book Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ namespace ZXing { enum class CharacterSet { Unknown, ASCII, ISO8859_1, ISO8859_2, ISO8859_3, ISO8859_4, ISO8859_5, ISO8859_6, ISO8859_7, ISO8859_8, ISO8859_9, ISO8859_10, ISO8859_11, ISO8859_13, ISO8859_14, ISO8859_15, ISO8859_16, Cp437, Cp1250, Cp1251, Cp1252, Cp1256, Shift_JIS, Big5, GB2312, GB18030, EUC_JP, EUC_KR, UnicodeBig, UTF8, CharsetCount }; } // ZXing zxing-cpp-1.0.8+ds2/core/src/CharacterSetECI.cpp000066400000000000000000000113041361167020700212410ustar00rootroot00000000000000/* * Copyright 2016 Nu-book Inc. * Copyright 2016 ZXing authors * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #include "CharacterSetECI.h" #include "CharacterSet.h" #include #include namespace ZXing { namespace { static const std::map ECI_VALUE_TO_CHARSET = { {0, CharacterSet::Cp437}, {1, CharacterSet::ISO8859_1}, {2, CharacterSet::Cp437}, {3, CharacterSet::ISO8859_1}, {4, CharacterSet::ISO8859_2}, {5, CharacterSet::ISO8859_3}, {6, CharacterSet::ISO8859_4}, {7, CharacterSet::ISO8859_5}, {8, CharacterSet::ISO8859_6}, {9, CharacterSet::ISO8859_7}, {10, CharacterSet::ISO8859_8}, {11, CharacterSet::ISO8859_9}, {12, CharacterSet::ISO8859_10}, {13, CharacterSet::ISO8859_11}, {15, CharacterSet::ISO8859_13}, {16, CharacterSet::ISO8859_14}, {17, CharacterSet::ISO8859_15}, {18, CharacterSet::ISO8859_16}, {20, CharacterSet::Shift_JIS}, {21, CharacterSet::Cp1250}, {22, CharacterSet::Cp1251}, {23, CharacterSet::Cp1252}, {24, CharacterSet::Cp1256}, {25, CharacterSet::UnicodeBig}, {26, CharacterSet::UTF8}, {27, CharacterSet::ASCII}, {28, CharacterSet::Big5}, {29, CharacterSet::GB18030}, {30, CharacterSet::EUC_KR}, {170, CharacterSet::ASCII}, }; struct StringCmp { bool operator()(char const *a, char const *b) const { return std::strcmp(a, b) < 0; } }; static const std::map ECI_NAME_TO_CHARSET = { {"Cp437", CharacterSet::Cp437}, {"ISO8859_1", CharacterSet::ISO8859_1}, {"ISO-8859-1", CharacterSet::ISO8859_1}, {"ISO8859_2", CharacterSet::ISO8859_2}, {"ISO-8859-2", CharacterSet::ISO8859_2}, {"ISO8859_3", CharacterSet::ISO8859_3}, {"ISO-8859-3", CharacterSet::ISO8859_3}, {"ISO8859_4", CharacterSet::ISO8859_4}, {"ISO-8859-4", CharacterSet::ISO8859_4}, {"ISO8859_5", CharacterSet::ISO8859_5}, {"ISO-8859-5", CharacterSet::ISO8859_5}, {"ISO8859_6", CharacterSet::ISO8859_6}, {"ISO-8859-6", CharacterSet::ISO8859_6}, {"ISO8859_7", CharacterSet::ISO8859_7}, {"ISO-8859-7", CharacterSet::ISO8859_7}, {"ISO8859_8", CharacterSet::ISO8859_8}, {"ISO-8859-8", CharacterSet::ISO8859_8}, {"ISO8859_9", CharacterSet::ISO8859_9}, {"ISO-8859-9", CharacterSet::ISO8859_9}, {"ISO8859_10", CharacterSet::ISO8859_10}, {"ISO-8859-10", CharacterSet::ISO8859_10}, {"ISO8859_11", CharacterSet::ISO8859_11}, {"ISO-8859-11", CharacterSet::ISO8859_11}, {"ISO8859_13", CharacterSet::ISO8859_13}, {"ISO-8859-13", CharacterSet::ISO8859_13}, {"ISO8859_14", CharacterSet::ISO8859_14}, {"ISO-8859-14", CharacterSet::ISO8859_14}, {"ISO8859_15", CharacterSet::ISO8859_15}, {"ISO-8859-15", CharacterSet::ISO8859_15}, {"ISO8859_16", CharacterSet::ISO8859_16}, {"ISO-8859-16", CharacterSet::ISO8859_16}, {"SJIS", CharacterSet::Shift_JIS}, {"Shift_JIS", CharacterSet::Shift_JIS}, {"Cp1250", CharacterSet::Cp1250}, {"windows-1250",CharacterSet::Cp1250}, {"Cp1251", CharacterSet::Cp1251}, {"windows-1251",CharacterSet::Cp1251}, {"Cp1252", CharacterSet::Cp1252}, {"windows-1252",CharacterSet::Cp1252}, {"Cp1256", CharacterSet::Cp1256}, {"windows-1256",CharacterSet::Cp1256}, {"UnicodeBigUnmarked", CharacterSet::UnicodeBig}, {"UTF-16BE", CharacterSet::UnicodeBig}, {"UnicodeBig", CharacterSet::UnicodeBig}, {"UTF8", CharacterSet::UTF8}, {"UTF-8", CharacterSet::UTF8}, {"ASCII", CharacterSet::ASCII}, {"US-ASCII", CharacterSet::ASCII}, {"Big5", CharacterSet::Big5}, {"GB2312", CharacterSet::GB2312}, {"GB18030", CharacterSet::GB18030}, {"EUC_CN", CharacterSet::GB18030}, {"EUC-CN", CharacterSet::GB18030 }, {"GBK", CharacterSet::GB18030}, {"EUC_KR", CharacterSet::EUC_KR}, {"EUC-KR", CharacterSet::EUC_KR }, }; } // anonymous CharacterSet CharacterSetECI::CharsetFromValue(int value) { auto it = ECI_VALUE_TO_CHARSET.find(value); if (it != ECI_VALUE_TO_CHARSET.end()) { return it->second; } return CharacterSet::Unknown; } int CharacterSetECI::ValueForCharset(CharacterSet charset) { for (auto& entry : ECI_VALUE_TO_CHARSET) { if (entry.second == charset) { return entry.first; } } return 0; } CharacterSet CharacterSetECI::CharsetFromName(const char* name) { auto it = ECI_NAME_TO_CHARSET.find(name); if (it != ECI_NAME_TO_CHARSET.end()) { return it->second; } return CharacterSet::Unknown; }; } // ZXing zxing-cpp-1.0.8+ds2/core/src/CharacterSetECI.h000066400000000000000000000025641361167020700207160ustar00rootroot00000000000000#pragma once /* * Copyright 2016 Nu-book Inc. * Copyright 2016 ZXing authors * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ namespace ZXing { enum class CharacterSet; /** * Encapsulates a Character Set ECI, according to "Extended Channel Interpretations" 5.3.1.1 * of ISO 18004. * * @author Sean Owen */ class CharacterSetECI { public: /** * @param value character set ECI value * @return {@code CharacterSetECI} representing ECI of given value, or null if it is legal but * unsupported * @throws FormatException if ECI value is invalid */ static CharacterSet CharsetFromValue(int value); static int ValueForCharset(CharacterSet charset); /** * @param name character set ECI encoding name * @return CharacterSetECI representing ECI for character encoding, or null if it is legal * but unsupported */ static CharacterSet CharsetFromName(const char* name); }; } // ZXing zxing-cpp-1.0.8+ds2/core/src/CustomData.h000066400000000000000000000013701361167020700200630ustar00rootroot00000000000000#pragma once /* * Copyright 2016 Nu-book Inc. * Copyright 2016 ZXing authors * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ namespace ZXing { class CustomData { public: virtual ~CustomData() = default; protected: CustomData() = default; }; } // ZXing zxing-cpp-1.0.8+ds2/core/src/DecodeHints.cpp000066400000000000000000000024651361167020700205510ustar00rootroot00000000000000/* * Copyright 2016 Nu-book Inc. * Copyright 2016 ZXing authors * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #include "DecodeHints.h" #include "BarcodeFormat.h" #include "BitHacks.h" namespace ZXing { std::vector DecodeHints::possibleFormats() const { std::vector result; int formatCount = (int)BarcodeFormat::FORMAT_COUNT; result.reserve(BitHacks::CountBitsSet(_flags & ~(0xffffffff << formatCount))); for (int i = 0; i < formatCount; ++i) { if (_flags & (1 << i)) { result.push_back((BarcodeFormat)i); } } return result; } DecodeHints& DecodeHints::setPossibleFormats(const std::vector& formats) { _flags &= (0xffffffff << (int)BarcodeFormat::FORMAT_COUNT); for (BarcodeFormat format : formats) { _flags |= (1 << (int)format); } return *this; } } // ZXing zxing-cpp-1.0.8+ds2/core/src/DecodeHints.h000066400000000000000000000105331361167020700202110ustar00rootroot00000000000000#pragma once /* * Copyright 2016 Nu-book Inc. * Copyright 2016 ZXing authors * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #include #include #include #include "BarcodeFormat.h" namespace ZXing { class DecodeHints { public: std::vector possibleFormats() const; DecodeHints& setPossibleFormats(const std::vector& formats); bool hasFormat(BarcodeFormat f) const noexcept { return getFlag((int)f); } bool hasNoFormat() const noexcept { return (_flags & ~(0xffffffff << (int)BarcodeFormat::FORMAT_COUNT)) == 0; } /** * Spend more time to try to find a barcode; optimize for accuracy, not speed. */ bool tryHarder() const { return getFlag(TRY_HARDER); } DecodeHints& setTryHarder(bool v) { setFlag(TRY_HARDER, v); return *this; } /** * For 1D readers only, should try to rotate image 90 CCW if not barcode found. */ bool tryRotate() const { return getFlag(TRY_ROTATE); } DecodeHints& setTryRotate(bool v) { setFlag(TRY_ROTATE, v); return *this; } /** * Specifies what character encoding to use when decoding, where applicable. */ const std::string& characterSet() const { return _charset; } DecodeHints& setCharacterSet(const std::string& charset) { _charset = charset; return *this; } /** * Allowed lengths of encoded data -- reject anything else.. */ const std::vector& allowedLengths() const { return _lengths; } DecodeHints& setAllowLengths(const std::vector& lengths) { _lengths = lengths; return *this; } /** * If true, the CODE-39 reader will try to read extended mode. */ bool tryCode39ExtendedMode() const { return getFlag(WITH_CODE_39_EXTENDED); } DecodeHints& setTryCode39ExtendedMode(bool v) { setFlag(WITH_CODE_39_EXTENDED, v); return *this; } /** * Assume Code 39 codes employ a check digit. */ bool assumeCode39CheckDigit() const { return getFlag(ASSUME_CODE_39_CHECK_DIGIT); } DecodeHints& setAssumeCode39CheckDigit(bool v) { setFlag(ASSUME_CODE_39_CHECK_DIGIT, v); return *this; } /** * Assume the barcode is being processed as a GS1 barcode, and modify behavior as needed. * For example this affects FNC1 handling for Code 128 (aka GS1-128). */ bool assumeGS1() const { return getFlag(ASSUME_GS1); } DecodeHints& setAssumeGS1(bool v) { setFlag(ASSUME_GS1, v); return *this; } /** * If true, return the start and end digits in a Codabar barcode instead of stripping them. They * are alpha, whereas the rest are numeric. By default, they are stripped, but this causes them * to not be. */ bool returnCodabarStartEnd() const { return getFlag(RETURN_CODABAR_START_END); } DecodeHints& setReturnCodabarStartEnd(bool v) { setFlag(RETURN_CODABAR_START_END, v); return *this; } /** * Allowed extension lengths for EAN or UPC barcodes. Other formats will ignore this. * Maps to an {@code int[]} of the allowed extension lengths, for example [2], [5], or [2, 5]. * If it is optional to have an extension, do not set this hint. If this is set, * and a UPC or EAN barcode is found but an extension is not, then no result will be returned * at all. */ const std::vector& allowedEanExtensions() const { return _eanExts; } DecodeHints& setAllowedEanExtensions(const std::vector& extensions) { _eanExts = extensions; return *this; } private: uint32_t _flags = 0; std::string _charset; std::vector _lengths; std::vector _eanExts; enum HintFlag { TRY_HARDER = static_cast(BarcodeFormat::FORMAT_COUNT) + 1, TRY_ROTATE, WITH_CODE_39_EXTENDED, ASSUME_CODE_39_CHECK_DIGIT, ASSUME_GS1, RETURN_CODABAR_START_END, FLAG_COUNT }; static_assert(FLAG_COUNT < 8 * sizeof(_flags), "HintFlag overflow"); bool getFlag(int f) const { return (_flags & (1 << f)) != 0; } void setFlag(int f, bool v) { if (v) _flags |= (1 << f); else _flags &= ~(1 << f); } }; } // ZXing zxing-cpp-1.0.8+ds2/core/src/DecodeStatus.cpp000066400000000000000000000012301361167020700207340ustar00rootroot00000000000000/* * Copyright 2016 Nu-book Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #include "DecodeStatus.h" #include "BitHacks.h" namespace ZXing { } // ZXing zxing-cpp-1.0.8+ds2/core/src/DecodeStatus.h000066400000000000000000000015771361167020700204170ustar00rootroot00000000000000#pragma once /* * Copyright 2016 Nu-book Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ namespace ZXing { enum class DecodeStatus { NoError = 0, NotFound, FormatError, ChecksumError, }; inline bool StatusIsOK(DecodeStatus status) { return status == DecodeStatus::NoError; } inline bool StatusIsError(DecodeStatus status) { return status != DecodeStatus::NoError; } } // ZXing zxing-cpp-1.0.8+ds2/core/src/DecoderResult.h000066400000000000000000000073511361167020700205700ustar00rootroot00000000000000#pragma once /* * Copyright 2016 Nu-book Inc. * Copyright 2016 ZXing authors * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #include "ByteArray.h" #include "DecodeStatus.h" #include #include #include namespace ZXing { class CustomData; /** *

Encapsulates the result of decoding a matrix of bits. This typically * applies to 2D barcode formats. For now it contains the raw bytes obtained, * as well as a string interpretation of those bytes, if applicable.

* * @author Sean Owen */ class DecoderResult { DecodeStatus _status = DecodeStatus::NoError; ByteArray _rawBytes; int _numBits = 0; std::wstring _text; std::list _byteSegments; std::wstring _ecLevel; int _errorsCorrected = -1; int _erasures = -1; int _structuredAppendSequenceNumber = 0; int _structuredAppendCodeCount = 0; int _structuredAppendParity = 0; std::shared_ptr _extra; DecoderResult(const DecoderResult &) = delete; DecoderResult& operator=(const DecoderResult &) = delete; public: DecoderResult(DecodeStatus status) : _status(status) {} DecoderResult(ByteArray&& rawBytes, std::wstring&& text) : _rawBytes(std::move(rawBytes)), _text(std::move(text)) { _numBits = 8 * _rawBytes.length(); } DecoderResult() = default; DecoderResult(DecoderResult&&) = default; DecoderResult& operator=(DecoderResult&&) = default; bool isValid() const { return StatusIsOK(_status); } DecodeStatus errorCode() const { return _status; } const ByteArray& rawBytes() const & { return _rawBytes; } ByteArray&& rawBytes() && { return std::move(_rawBytes); } const std::wstring& text() const & { return _text; } std::wstring&& text() && { return std::move(_text); } // Simple macro to set up getter/setter methods that save lots of boilerplate. // It sets up a standard 'const & () const', 2 setters for setting lvalues via // copy and 2 for setting rvalues via move. They are provided each to work // either on lvalues (normal 'void (...)') or on rvalues (returning '*this' as // rvalue). The latter can be used to optionally initialize a temporary in a // return statement, e.g. // return DecoderResult(bytes, text).setEcLevel(level); #define ZX_PROPERTY(TYPE, GETTER, SETTER) \ const TYPE& GETTER() const & { return _##GETTER; } \ TYPE&& GETTER() && { return std::move(_##GETTER); } \ void SETTER(const TYPE& v) & { _##GETTER = v; } \ void SETTER(TYPE&& v) & { _##GETTER = std::move(v); } \ DecoderResult&& SETTER(const TYPE& v) && { _##GETTER = v; return std::move(*this); } \ DecoderResult&& SETTER(TYPE&& v) && { _##GETTER = std::move(v); return std::move(*this); } ZX_PROPERTY(int, numBits, setNumBits) ZX_PROPERTY(std::list, byteSegments, setByteSegments) ZX_PROPERTY(std::wstring, ecLevel, setEcLevel) ZX_PROPERTY(int, errorsCorrected, setErrorsCorrected) ZX_PROPERTY(int, erasures, setErasures) ZX_PROPERTY(int, structuredAppendParity, setStructuredAppendParity) ZX_PROPERTY(int, structuredAppendSequenceNumber, setStructuredAppendSequenceNumber) ZX_PROPERTY(int, structuredAppendCodeCount, setStructuredAppendCodeCount) ZX_PROPERTY(std::shared_ptr, extra, setExtra) #undef ZX_PROPERTY bool hasStructuredAppend() const { return _structuredAppendParity >= 0 && _structuredAppendSequenceNumber >= 0; } }; } // ZXing zxing-cpp-1.0.8+ds2/core/src/DetectorResult.h000066400000000000000000000031721361167020700207710ustar00rootroot00000000000000#pragma once /* * Copyright 2016 Nu-book Inc. * Copyright 2016 ZXing authors * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #include "ResultPoint.h" #include "BitMatrix.h" #include namespace ZXing { /** *

Encapsulates the result of detecting a barcode in an image. This includes the raw * matrix of black/white pixels corresponding to the barcode, and possibly points of interest * in the image, like the location of finder patterns or corners of the barcode in the image.

* * @author Sean Owen */ class DetectorResult { BitMatrix _bits; std::vector _points; DetectorResult(const DetectorResult&) = delete; DetectorResult& operator=(const DetectorResult&) = delete; public: DetectorResult() = default; DetectorResult(DetectorResult&&) = default; DetectorResult& operator=(DetectorResult&&) = default; DetectorResult(BitMatrix&& bits, std::vector&& points) : _bits(std::move(bits)), _points(std::move(points)) {} const BitMatrix& bits() const { return _bits; } const std::vector& points() const { return _points; } bool isValid() const { return !_bits.empty(); } }; } // ZXing zxing-cpp-1.0.8+ds2/core/src/GenericGF.cpp000066400000000000000000000051011361167020700201370ustar00rootroot00000000000000/* * Copyright 2016 Nu-book Inc. * Copyright 2016 ZXing authors * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #include "GenericGF.h" #include namespace ZXing { const GenericGF & GenericGF::AztecData12() { static GenericGF inst(0x1069, 4096, 1); // x^12 + x^6 + x^5 + x^3 + 1 return inst; } const GenericGF & GenericGF::AztecData10() { static GenericGF inst(0x409, 1024, 1); // x^10 + x^3 + 1 return inst; } const GenericGF & GenericGF::AztecData6() { static GenericGF inst(0x43, 64, 1); // x^6 + x + 1 return inst; } const GenericGF & GenericGF::AztecParam() { static GenericGF inst(0x13, 16, 1); // x^4 + x + 1 return inst; } const GenericGF & GenericGF::QRCodeField256() { static GenericGF inst(0x011D, 256, 0); // x^8 + x^4 + x^3 + x^2 + 1 return inst; } const GenericGF & GenericGF::DataMatrixField256() { static GenericGF inst(0x012D, 256, 1); // x^8 + x^5 + x^3 + x^2 + 1 return inst; } const GenericGF & GenericGF::AztecData8() { static GenericGF inst(0x012D, 256, 1); // = DATA_MATRIX_FIELD_256; return inst; } const GenericGF & GenericGF::MaxiCodeField64() { static GenericGF inst(0x43, 64, 1); // = AZTEC_DATA_6; return inst; } /** * Create a representation of GF(size) using the given primitive polynomial. * * @param primitive irreducible polynomial whose coefficients are represented by * the bits of an int, where the least-significant bit represents the constant * coefficient * @param size the size of the field * @param b the factor b in the generator polynomial can be 0- or 1-based * (g(x) = (x+a^b)(x+a^(b+1))...(x+a^(b+2t-1))). * In most cases it should be 1, but for QR code it is 0. */ GenericGF::GenericGF(int primitive, int size, int b) : _size(size), _generatorBase(b) { _expTable.resize(size, 0); _logTable.resize(size, 0); int x = 1; for (int i = 0; i < size; ++i) { _expTable[i] = x; x *= 2; // we're assuming the generator alpha is 2 if (x >= size) { x ^= primitive; x &= size - 1; } } for (int i = 0; i < size - 1; ++i) { _logTable[_expTable[i]] = i; } // logTable[0] == 0 but this should never be used } } // ZXing zxing-cpp-1.0.8+ds2/core/src/GenericGF.h000066400000000000000000000071031361167020700176100ustar00rootroot00000000000000#pragma once /* * Copyright 2016 Nu-book Inc. * Copyright 2016 ZXing authors * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #include "GenericGFPoly.h" #include #include #include namespace ZXing { /** *

This class contains utility methods for performing mathematical operations over * the Galois Fields. Operations use a given primitive polynomial in calculations.

* *

Throughout this package, elements of the GF are represented as an {@code int} * for convenience and speed (but at the cost of memory). *

* * @author Sean Owen * @author David Olivier */ class GenericGF { public: static const GenericGF& AztecData12(); static const GenericGF& AztecData10(); static const GenericGF& AztecData6(); static const GenericGF& AztecParam(); static const GenericGF& QRCodeField256(); static const GenericGF& DataMatrixField256(); static const GenericGF& AztecData8(); static const GenericGF& MaxiCodeField64(); /** * @return the monomial representing coefficient * x^degree */ GenericGFPoly& setMonomial(GenericGFPoly& poly, int degree, int coefficient) const { assert(degree >= 0); if (coefficient == 0) degree = 0; poly._field = this; poly._coefficients.resize(degree + 1); std::fill(poly._coefficients.begin(), poly._coefficients.end(), 0); poly._coefficients.front() = coefficient; return poly; } GenericGFPoly& setZero(GenericGFPoly& poly) const { return setMonomial(poly, 0, 0); } GenericGFPoly& setOne(GenericGFPoly& poly) const { return setMonomial(poly, 0, 1); } /** * Implements both addition and subtraction -- they are the same in GF(size). * * @return sum/difference of a and b */ int addOrSubtract(int a, int b) const { return a ^ b; } /** * @return 2 to the power of a in GF(size) */ int exp(int a) const { return _expTable.at(a); } /** * @return base 2 log of a in GF(size) */ int log(int a) const { if (a == 0) { throw std::invalid_argument("a == 0"); } return _logTable[a]; } /** * @return multiplicative inverse of a */ int inverse(int a) const { if (a == 0) { throw std::invalid_argument("a == 0"); } return _expTable[_size - _logTable[a] - 1]; } /** * @return product of a and b in GF(size) */ int multiply(int a, int b) const { if (a == 0 || b == 0) { return 0; } return _expTable[(_logTable[a] + _logTable[b]) % (_size - 1)]; } int size() const { return _size; } int generatorBase() const { return _generatorBase; } private: int _size; int _generatorBase; std::vector _expTable; std::vector _logTable; /** * Create a representation of GF(size) using the given primitive polynomial. * * @param primitive irreducible polynomial whose coefficients are represented by * the bits of an int, where the least-significant bit represents the constant * coefficient * @param size the size of the field * @param b the factor b in the generator polynomial can be 0- or 1-based * (g(x) = (x+a^b)(x+a^(b+1))...(x+a^(b+2t-1))). * In most cases it should be 1, but for QR code it is 0. */ GenericGF(int primitive, int size, int b); }; } // ZXing zxing-cpp-1.0.8+ds2/core/src/GenericGFPoly.cpp000066400000000000000000000111641361167020700210110ustar00rootroot00000000000000/* * Copyright 2016 Nu-book Inc. * Copyright 2016 ZXing authors * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #include "GenericGFPoly.h" #include "GenericGF.h" #include #include namespace ZXing { int GenericGFPoly::evaluateAt(int a) const { if (a == 0) { // Just return the x^0 coefficient return coefficient(0); } if (a == 1) { // Just the sum of the coefficients int result = 0; for (int coef : _coefficients) { result = _field->addOrSubtract(result, coef); } return result; } int result = _coefficients[0]; for (size_t i = 1; i < _coefficients.size(); ++i) { result = _field->addOrSubtract(_field->multiply(a, result), _coefficients[i]); } return result; } GenericGFPoly& GenericGFPoly::addOrSubtract(GenericGFPoly& other) { assert(_field == other._field); // "GenericGFPolys do not have same GenericGF field" if (isZero()) { swap(*this, other); return *this; } if (other.isZero()) { return *this; } auto& smallerCoefs = other._coefficients; auto& largerCoefs = _coefficients; if (smallerCoefs.size() > largerCoefs.size()) std::swap(smallerCoefs, largerCoefs); size_t lengthDiff = largerCoefs.size() - smallerCoefs.size(); // high-order terms only found in higher-degree polynomial's coefficients stay untouched for (size_t i = lengthDiff; i < largerCoefs.size(); ++i) largerCoefs[i] = _field->addOrSubtract(smallerCoefs[i - lengthDiff], largerCoefs[i]); normalize(); return *this; } GenericGFPoly& GenericGFPoly::multiply(const GenericGFPoly& other) { assert(_field == other._field); // "GenericGFPolys do not have same GenericGF field" if (isZero() || other.isZero()) return _field->setZero(*this); auto& a = _coefficients; auto& b = other._coefficients; // To disable the use of the malloc cache, simply uncomment: // Coefficients _cache; _cache.resize(a.size() + b.size() - 1); std::fill(_cache.begin(), _cache.end(), 0); for (size_t i = 0; i < a.size(); ++i) { for (size_t j = 0; j < b.size(); ++j) { _cache[i + j] = _field->addOrSubtract(_cache[i + j], _field->multiply(a[i], b[j])); } } _coefficients.swap(_cache); normalize(); return *this; } GenericGFPoly& GenericGFPoly::multiply(int scalar) { if (scalar == 0) { return _field->setZero(*this); } if (scalar == 1) { return *this; } for (int& c : _coefficients) { c = _field->multiply(c, scalar); } normalize(); return *this; } GenericGFPoly& GenericGFPoly::multiplyByMonomial(int degree, int coefficient) { assert(degree >= 0); if (coefficient == 0) { return _field->setZero(*this); } size_t size = _coefficients.size(); for (size_t i = 0; i < size; ++i) { _coefficients[i] = _field->multiply(_coefficients[i], coefficient); } _coefficients.resize(size + degree, 0); normalize(); return *this; } GenericGFPoly& GenericGFPoly::divide(const GenericGFPoly& other, GenericGFPoly& quotient) { assert(_field == other._field); // "GenericGFPolys do not have same GenericGF field" if (other.isZero()) { throw std::invalid_argument("Divide by 0"); } _field->setZero(quotient); auto& remainder = *this; int denominatorLeadingTerm = other.coefficient(other.degree()); int inverseDenominatorLeadingTerm = _field->inverse(denominatorLeadingTerm); ZX_THREAD_LOCAL GenericGFPoly temp; while (remainder.degree() >= other.degree() && !remainder.isZero()) { int degreeDifference = remainder.degree() - other.degree(); int scale = _field->multiply(remainder.coefficient(remainder.degree()), inverseDenominatorLeadingTerm); _field->setMonomial(temp, degreeDifference, scale); quotient.addOrSubtract(temp); temp = other; temp.multiplyByMonomial(degreeDifference, scale); remainder.addOrSubtract(temp); } return *this; } void GenericGFPoly::normalize() { auto& coefs = _coefficients; auto firstNonZero = std::find_if(coefs.cbegin(), coefs.cend(), [](int c){ return c != 0; }); // Leading term must be non-zero for anything except the constant polynomial "0" if (firstNonZero != coefs.cbegin()) { if (firstNonZero == coefs.end()) { coefs.resize(1, 0); } else { std::copy(firstNonZero, coefs.cend(), coefs.begin()); coefs.resize(coefs.cend() - firstNonZero); } } } } // ZXing zxing-cpp-1.0.8+ds2/core/src/GenericGFPoly.h000066400000000000000000000076441361167020700204660ustar00rootroot00000000000000#pragma once /* * Copyright 2016 Nu-book Inc. * Copyright 2016 ZXing authors * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #include "ZXConfig.h" #include #include #include #include namespace ZXing { class GenericGF; /** *

Represents a polynomial whose coefficients are elements of a GF. * Instances of this class are immutable.

* *

Much credit is due to William Rucklidge since portions of this code are an indirect * port of his C++ Reed-Solomon implementation.

* * @author Sean Owen */ class GenericGFPoly { struct Coefficients : public std::vector { void reserve(size_t s) { if (capacity() < s) std::vector::reserve(std::max(size_t(32), s)); } void resize(size_t s) { reserve(s); std::vector::resize(s); } void resize(size_t s, int i) { reserve(s); std::vector::resize(s, i); } }; public: // Build a invalid object, so that this can be used in container or return by reference, // any access to invalid object is undefined behavior. GenericGFPoly() = default; /** * @param field the {@link GenericGF} instance representing the field to use * to perform computations * @param coefficients coefficients as ints representing elements of GF(size), arranged * from most significant (highest-power term) coefficient to least significant * @throws IllegalArgumentException if argument is null or empty, * or if leading coefficient is 0 and this is not a * constant polynomial (that is, it is not the monomial "0"). */ GenericGFPoly(const GenericGF& field, std::vector&& coefficients) : _field(&field) { assert(!coefficients.empty()); _coefficients.swap(coefficients); // _coefficients = coefficients normalize(); } GenericGFPoly(const GenericGF& field, const std::vector& coefficients) : GenericGFPoly(field, std::vector(coefficients)) {} GenericGFPoly& operator=(GenericGFPoly&& other) = default; GenericGFPoly(GenericGFPoly&& other) = default; GenericGFPoly& operator=(const GenericGFPoly& other) { assert(_field == other._field); _coefficients.reserve(other._coefficients.size()); _coefficients = other._coefficients; return *this; } GenericGFPoly(const GenericGFPoly& other) { _field = other._field; *this = other; } const std::vector& coefficients() const { return _coefficients; } /** * @return degree of this polynomial */ int degree() const { return static_cast(_coefficients.size()) - 1; } /** * @return true iff this polynomial is the monomial "0" */ bool isZero() const { return _coefficients[0] == 0; } /** * @return coefficient of x^degree term in this polynomial */ int coefficient(int degree) const { return _coefficients[_coefficients.size() - 1 - degree]; } /** * @return evaluation of this polynomial at a given point */ int evaluateAt(int a) const; GenericGFPoly& addOrSubtract(GenericGFPoly& other); GenericGFPoly& multiply(const GenericGFPoly& other); GenericGFPoly& multiply(int scalar); GenericGFPoly& multiplyByMonomial(int degree, int coefficient); GenericGFPoly& divide(const GenericGFPoly& other, GenericGFPoly& quotient); friend void swap(GenericGFPoly& a, GenericGFPoly& b) { std::swap(a._field, b._field); std::swap(a._coefficients, b._coefficients); } private: friend class GenericGF; void normalize(); const GenericGF* _field = nullptr; Coefficients _coefficients, _cache; // _cache is used for malloc caching }; } // ZXing zxing-cpp-1.0.8+ds2/core/src/GenericLuminanceSource.cpp000066400000000000000000000151751361167020700227530ustar00rootroot00000000000000/* * Copyright 2016 Nu-book Inc. * Copyright 2016 ZXing authors * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #include "GenericLuminanceSource.h" #include "ByteArray.h" #include #include namespace ZXing { inline static uint8_t RGBToGray(unsigned r, unsigned g, unsigned b) { // This optimization is not necessary as the computation below is cheap enough. //if (r == g && g == b) { // // Image is already greyscale, so pick any channel. // return static_cast(r); //} // .299R + 0.587G + 0.114B (YUV/YIQ for PAL and NTSC), // (306*R) >> 10 is approximately equal to R*0.299, and so on. // 0x200 >> 10 is 0.5, it implements rounding. return static_cast((306 * r + 601 * g + 117 * b + 0x200) >> 10); } static std::shared_ptr MakeCopy(const void* src, int rowBytes, int left, int top, int width, int height) { auto result = std::make_shared(); result->resize(width * height); const uint8_t* srcRow = static_cast(src) + top * rowBytes + left; uint8_t* destRow = result->data(); for (int y = 0; y < height; ++y, srcRow += rowBytes, destRow += width) { std::copy_n(srcRow, width, destRow); } return result; } static std::shared_ptr MakeCopy(const ByteArray& pixels, int rowBytes, int left, int top, int width, int height) { if (top == 0 && left == 0 && width * height == (int)pixels.size()) { return std::make_shared(pixels); } return MakeCopy(pixels.data(), rowBytes, left, top, width, height); } GenericLuminanceSource::GenericLuminanceSource(int left, int top, int width, int height, const void* bytes, int rowBytes, int pixelBytes, int redIndex, int greenIndex, int blueIndex) : _left(0), // since we copy the pixels _top(0), _width(width), _height(height), _rowBytes(width) { if (left < 0 || top < 0 || width < 0 || height < 0) { throw std::out_of_range("Requested offset is outside the image"); } auto pixels = std::make_shared(); pixels->resize(width * height); const uint8_t *rgbSource = static_cast(bytes) + top * rowBytes; uint8_t *destRow = pixels->data(); for (int y = 0; y < height; ++y, rgbSource += rowBytes, destRow += width) { const uint8_t *src = rgbSource + left * pixelBytes; for (int x = 0; x < width; ++x, src += pixelBytes) { destRow[x] = RGBToGray(src[redIndex], src[greenIndex], src[blueIndex]); } } _pixels = pixels; } GenericLuminanceSource::GenericLuminanceSource(int left, int top, int width, int height, const void* bytes, int rowBytes) : _left(0), // since we copy the pixels _top(0), _width(width), _height(height), _rowBytes(width) { if (left < 0 || top < 0 || width < 0 || height < 0) { throw std::out_of_range("Requested offset is outside the image"); } _pixels = MakeCopy(bytes, rowBytes, left, top, width, height); } GenericLuminanceSource::GenericLuminanceSource(int left, int top, int width, int height, std::shared_ptr pixels, int rowBytes) : _pixels(std::move(pixels)), _left(left), _top(top), _width(width), _height(height), _rowBytes(rowBytes) { if (left < 0 || top < 0 || width < 0 || height < 0) { throw std::out_of_range("Requested offset is outside the image"); } } int GenericLuminanceSource::width() const { return _width; } int GenericLuminanceSource::height() const { return _height; } const uint8_t * GenericLuminanceSource::getRow(int y, ByteArray& buffer, bool forceCopy) const { if (y < 0 || y >= _height) { throw std::out_of_range("Requested row is outside the image"); } const uint8_t* row = _pixels->data() + (y + _top)*_rowBytes + _left; if (!forceCopy) { return row; } buffer.resize(_width); std::copy_n(row, _width, buffer.begin()); return buffer.data(); } const uint8_t * GenericLuminanceSource::getMatrix(ByteArray& buffer, int& outRowBytes, bool forceCopy) const { const uint8_t* row = _pixels->data() + _top*_rowBytes + _left; if (!forceCopy) { outRowBytes = _rowBytes; return row; } outRowBytes = _width; buffer.resize(_width * _height); uint8_t* dest = buffer.data(); for (int y = 0; y < _height; ++y, row += _rowBytes, dest += _width) { std::copy_n(row, _width, dest); } return buffer.data(); } bool GenericLuminanceSource::canCrop() const { return true; } std::shared_ptr GenericLuminanceSource::cropped(int left, int top, int width, int height) const { if (left < 0 || top < 0 || width < 0 || height < 0 || left + width > _width || top + height > _height) { throw std::out_of_range("Crop rectangle does not fit within image data."); } return std::make_shared(_left + left, _top + top, width, height, _pixels, _rowBytes); } bool GenericLuminanceSource::canRotate() const { return true; } std::shared_ptr GenericLuminanceSource::rotated(int degreeCW) const { degreeCW = (degreeCW + 360) % 360; if (degreeCW == 90) { auto pixels = std::make_shared(_width * _height); const uint8_t* srcRow = _pixels->data() + _top * _rowBytes + _left; uint8_t* dest = pixels->data(); for (int y = 0; y < _height; ++y, srcRow += _rowBytes) { for (int x = 0; x < _width; ++x) { dest[x * _height + (_height - y - 1)] = srcRow[x]; } } return std::make_shared(0, 0, _height, _width, pixels, _height); } else if (degreeCW == 180) { // same as a vertical flip followed a horizonal flip auto pixels = MakeCopy(*_pixels, _rowBytes, _left, _top, _width, _height); std::reverse(pixels->begin(), pixels->end()); return std::make_shared(0, 0, _width, _height, pixels, _width); } else if (degreeCW == 270) { auto pixels = std::make_shared(_width * _height); const uint8_t* srcRow = _pixels->data() + _top * _rowBytes + _left; uint8_t* dest = pixels->data(); for (int y = 0; y < _height; ++y, srcRow += _rowBytes) { for (int x = 0; x < _width; ++x) { dest[(_width - x - 1) * _height + y] = srcRow[x]; } } return std::make_shared(0, 0, _height, _width, pixels, _height); } else if (degreeCW == 0) { return std::make_shared(0, 0, _width, _height, _pixels, _width); } throw std::invalid_argument("Unsupported rotation"); } } // ZXing zxing-cpp-1.0.8+ds2/core/src/GenericLuminanceSource.h000066400000000000000000000055621361167020700224170ustar00rootroot00000000000000#pragma once /* * Copyright 2016 Nu-book Inc. * Copyright 2016 ZXing authors * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #include "LuminanceSource.h" namespace ZXing { /** * This decode images from an address in memory as RGB or ARGB data. */ class GenericLuminanceSource : public LuminanceSource { public: /** * Init with a RGB source. */ GenericLuminanceSource(int width, int height, const void* bytes, int rowBytes, int pixelBytes, int redIndex, int greenIndex, int blueIndex) : GenericLuminanceSource(0, 0, width, height, bytes, rowBytes, pixelBytes, redIndex, greenIndex, blueIndex) {} /** * Init with a RGB source, left, top, width, height specify the subregion area in orignal image; 'bytes' should still point the begining of image buffer (i.e. pixel (0,0)). */ GenericLuminanceSource(int left, int top, int width, int height, const void* bytes, int rowBytes, int pixelBytes, int redIndex, int greenIndex, int blueIndex); /** * Init with a grayscale source. */ GenericLuminanceSource(int width, int height, const void* bytes, int rowBytes) : GenericLuminanceSource(0, 0, width, height, bytes, rowBytes) {} /** * Init with a grayscale source, left, top, width, height specify the subregion area in orignal image; 'bytes' should still point the begining of image buffer (i.e. pixel (0,0)). */ GenericLuminanceSource(int left, int top, int width, int height, const void* bytes, int rowBytes); /** * Init with a grayscale source, left, top, width, height specify the subregion area in orignal image; 'bytes' should still point the begining of image buffer (i.e. pixel (0,0)). */ GenericLuminanceSource(int left, int top, int width, int height, std::shared_ptr pixels, int rowBytes); virtual int width() const override; virtual int height() const override; virtual const uint8_t* getRow(int y, ByteArray& buffer, bool forceCopy = false) const override; virtual const uint8_t* getMatrix(ByteArray& buffer, int& outRowBytes, bool forceCopy = false) const override; virtual bool canCrop() const override; virtual std::shared_ptr cropped(int left, int top, int width, int height) const override; virtual bool canRotate() const override; virtual std::shared_ptr rotated(int degreeCW) const override; private: std::shared_ptr _pixels; int _left; int _top; int _width; int _height; int _rowBytes; }; } // ZXing zxing-cpp-1.0.8+ds2/core/src/GlobalHistogramBinarizer.cpp000066400000000000000000000152731361167020700233050ustar00rootroot00000000000000/* * Copyright 2016 Nu-book Inc. * Copyright 2016 ZXing authors * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #include "GlobalHistogramBinarizer.h" #include "LuminanceSource.h" #include "BitArray.h" #include "BitMatrix.h" #include "ByteArray.h" #include "DecodeStatus.h" #include #include namespace ZXing { static const int LUMINANCE_BITS = 5; static const int LUMINANCE_SHIFT = 8 - LUMINANCE_BITS; static const int LUMINANCE_BUCKETS = 1 << LUMINANCE_BITS; struct GlobalHistogramBinarizer::DataCache { std::once_flag once; std::shared_ptr matrix; }; GlobalHistogramBinarizer::GlobalHistogramBinarizer(std::shared_ptr source, bool pureBarcode) : _source(std::move(source)), _pureBarcode(pureBarcode), _cache(new DataCache) { } GlobalHistogramBinarizer::~GlobalHistogramBinarizer() = default; bool GlobalHistogramBinarizer::isPureBarcode() const { return _pureBarcode; } int GlobalHistogramBinarizer::width() const { return _source->width(); } int GlobalHistogramBinarizer::height() const { return _source->height(); } // Return -1 on error static int EstimateBlackPoint(const std::array& buckets) { // Find the tallest peak in the histogram. auto firstPeakPos = std::max_element(buckets.begin(), buckets.end()); int firstPeak = static_cast(firstPeakPos - buckets.begin()); int firstPeakSize = *firstPeakPos; int maxBucketCount = firstPeakSize; // Find the second-tallest peak which is somewhat far from the tallest peak. int secondPeak = 0; int secondPeakScore = 0; for (int x = 0; x < LUMINANCE_BUCKETS; x++) { int distanceToBiggest = x - firstPeak; // Encourage more distant second peaks by multiplying by square of distance. int score = buckets[x] * distanceToBiggest * distanceToBiggest; if (score > secondPeakScore) { secondPeak = x; secondPeakScore = score; } } // Make sure firstPeak corresponds to the black peak. if (firstPeak > secondPeak) { std::swap(firstPeak, secondPeak); } // If there is too little contrast in the image to pick a meaningful black point, throw rather // than waste time trying to decode the image, and risk false positives. if (secondPeak - firstPeak <= LUMINANCE_BUCKETS / 16) { return -1; } // Find a valley between them that is low and closer to the white peak. int bestValley = secondPeak - 1; int bestValleyScore = -1; for (int x = secondPeak - 1; x > firstPeak; x--) { int fromFirst = x - firstPeak; int score = fromFirst * fromFirst * (secondPeak - x) * (maxBucketCount - buckets[x]); if (score > bestValleyScore) { bestValley = x; bestValleyScore = score; } } return bestValley << LUMINANCE_SHIFT; } // Applies simple sharpening to the row data to improve performance of the 1D Readers. bool GlobalHistogramBinarizer::getBlackRow(int y, BitArray& row) const { int width = _source->width(); if (row.size() != width) row = BitArray(width); else row.clearBits(); ByteArray buffer; const uint8_t* luminances = _source->getRow(y, buffer); std::array buckets = {}; for (int x = 0; x < width; x++) { int pixel = luminances[x]; buckets[pixel >> LUMINANCE_SHIFT]++; } int blackPoint = EstimateBlackPoint(buckets); if (blackPoint >= 0) { if (width < 3) { // Special case for very small images for (int x = 0; x < width; x++) { if (luminances[x] < blackPoint) { row.set(x); } } } else { if (luminances[0] < blackPoint) row.set(0); int left = luminances[0]; int center = luminances[1]; for (int x = 1; x < width - 1; x++) { int right = luminances[x + 1]; // A simple -1 4 -1 box filter with a weight of 2. if (((center * 4) - left - right) / 2 < blackPoint) { row.set(x); } left = center; center = right; } if (luminances[width-1] < blackPoint) row.set(width-1); } return true; } return false; } static void InitBlackMatrix(const LuminanceSource& source, std::shared_ptr& outMatrix) { int width = source.width(); int height = source.height(); auto matrix = std::make_shared(width, height); // Quickly calculates the histogram by sampling four rows from the image. This proved to be // more robust on the blackbox tests than sampling a diagonal as we used to do. std::array localBuckets = {}; { ByteArray buffer; for (int y = 1; y < 5; y++) { int row = height * y / 5; const uint8_t* luminances = source.getRow(row, buffer); int right = (width * 4) / 5; for (int x = width / 5; x < right; x++) { int pixel = luminances[x]; localBuckets[pixel >> LUMINANCE_SHIFT]++; } } } int blackPoint = EstimateBlackPoint(localBuckets); if (blackPoint >= 0) { // We delay reading the entire image luminance until the black point estimation succeeds. // Although we end up reading four rows twice, it is consistent with our motto of // "fail quickly" which is necessary for continuous scanning. ByteArray buffer; int stride; const uint8_t* luminances = source.getMatrix(buffer, stride); for (int y = 0; y < height; y++) { int offset = y * stride; for (int x = 0; x < width; x++) { int pixel = luminances[offset + x]; if (pixel < blackPoint) { matrix->set(x, y); } } } outMatrix = matrix; } } // Does not sharpen the data, as this call is intended to only be used by 2D Readers. std::shared_ptr GlobalHistogramBinarizer::getBlackMatrix() const { std::call_once(_cache->once, &InitBlackMatrix, std::cref(*_source), std::ref(_cache->matrix)); return _cache->matrix; } bool GlobalHistogramBinarizer::canCrop() const { return _source->canCrop(); } std::shared_ptr GlobalHistogramBinarizer::cropped(int left, int top, int width, int height) const { return newInstance(_source->cropped(left, top, width, height)); } bool GlobalHistogramBinarizer::canRotate() const { return _source->canRotate(); } std::shared_ptr GlobalHistogramBinarizer::rotated(int degreeCW) const { return newInstance(_source->rotated(degreeCW)); } std::shared_ptr GlobalHistogramBinarizer::newInstance(const std::shared_ptr& source) const { return std::make_shared(source, _pureBarcode); } } // ZXing zxing-cpp-1.0.8+ds2/core/src/GlobalHistogramBinarizer.h000066400000000000000000000041011361167020700227360ustar00rootroot00000000000000#pragma once /* * Copyright 2016 Nu-book Inc. * Copyright 2016 ZXing authors * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #include "BinaryBitmap.h" namespace ZXing { class LuminanceSource; /** * This Binarizer implementation uses the old ZXing global histogram approach. It is suitable * for low-end mobile devices which don't have enough CPU or memory to use a local thresholding * algorithm. However, because it picks a global black point, it cannot handle difficult shadows * and gradients. * * Faster mobile devices and all desktop applications should probably use HybridBinarizer instead. * * @author dswitkin@google.com (Daniel Switkin) * @author Sean Owen */ class GlobalHistogramBinarizer : public BinaryBitmap { protected: std::shared_ptr _source; bool _pureBarcode; public: explicit GlobalHistogramBinarizer(std::shared_ptr source, bool pureBarcode = false); ~GlobalHistogramBinarizer() override; bool isPureBarcode() const override; int width() const override; int height() const override; bool getBlackRow(int y, BitArray& row) const override; std::shared_ptr getBlackMatrix() const override; bool canCrop() const override; std::shared_ptr cropped(int left, int top, int width, int height) const override; bool canRotate() const override; std::shared_ptr rotated(int degreeCW) const override; virtual std::shared_ptr newInstance(const std::shared_ptr& source) const; private: struct DataCache; std::unique_ptr _cache; }; } // ZXing zxing-cpp-1.0.8+ds2/core/src/GridSampler.cpp000066400000000000000000000130431361167020700205630ustar00rootroot00000000000000/* * Copyright 2016 Nu-book Inc. * Copyright 2016 ZXing authors * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #include "GridSampler.h" #include "PerspectiveTransform.h" #include "BitMatrix.h" #include "DecodeStatus.h" #include #include namespace ZXing { namespace { /** *

Checks a set of points that have been transformed to sample points on an image against * the image's dimensions to see if the point are even within the image.

* *

This method will actually "nudge" the endpoints back onto the image if they are found to be * barely (less than 1 pixel) off the image. This accounts for imperfect detection of finder * patterns in an image where the QR Code runs all the way to the image border.

* *

For efficiency, the method will check points from either end of the line until one is found * to be within the image. Because the set of points are assumed to be linear, this is valid.

* * @param image image into which the points should map * @param points actual points in x1,y1,...,xn,yn form * @throws NotFoundException if an endpoint is lies outside the image boundaries */ static bool CheckAndNudgePoints(const BitMatrix& image, std::vector& points) { int width = image.width(); int height = image.height(); // Check and nudge points from start until we see some that are OK: bool nudged = true; for (size_t offset = 0; offset < points.size() && nudged; offset += 2) { int x = (int)points[offset]; int y = (int)points[offset + 1]; if (x < -1 || x > width || y < -1 || y > height) { return false; } nudged = false; if (x == -1) { points[offset] = 0.0f; nudged = true; } else if (x == width) { points[offset] = static_cast(width - 1); nudged = true; } if (y == -1) { points[offset + 1] = 0.0f; nudged = true; } else if (y == height) { points[offset + 1] = static_cast(height - 1); nudged = true; } } // Check and nudge points from end: nudged = true; for (int offset = int(points.size()) - 2; offset >= 0 && nudged; offset -= 2) { int x = (int)points[offset]; int y = (int)points[offset + 1]; if (x < -1 || x > width || y < -1 || y > height) { return false; } nudged = false; if (x == -1) { points[offset] = 0.0f; nudged = true; } else if (x == width) { points[offset] = static_cast(width - 1); nudged = true; } if (y == -1) { points[offset + 1] = 0.0f; nudged = true; } else if (y == height) { points[offset + 1] = static_cast(height - 1); nudged = true; } } return true; } class DefaultGridSampler : public GridSampler { public: BitMatrix sampleGrid(const BitMatrix& image, int dimensionX, int dimensionY, float p1ToX, float p1ToY, float p2ToX, float p2ToY, float p3ToX, float p3ToY, float p4ToX, float p4ToY, float p1FromX, float p1FromY, float p2FromX, float p2FromY, float p3FromX, float p3FromY, float p4FromX, float p4FromY) const override { auto transform = PerspectiveTransform::QuadrilateralToQuadrilateral( p1ToX, p1ToY, p2ToX, p2ToY, p3ToX, p3ToY, p4ToX, p4ToY, p1FromX, p1FromY, p2FromX, p2FromY, p3FromX, p3FromY, p4FromX, p4FromY); return sampleGrid(image, dimensionX, dimensionY, transform); } BitMatrix sampleGrid(const BitMatrix& image, int dimensionX, int dimensionY, const PerspectiveTransform& transform) const override { if (dimensionX <= 0 || dimensionY <= 0) return {}; BitMatrix result(dimensionX, dimensionY); int max = 2 * dimensionX; std::vector points(max); for (int y = 0; y < dimensionY; y++) { float iValue = (float)y + 0.5f; for (int x = 0; x < max; x += 2) { points[x] = static_cast(x / 2) + 0.5f; points[x + 1] = iValue; } transform.transformPoints(points.data(), max); // Quick check to see if points transformed to something inside the image; // sufficient to check the endpoints if (!CheckAndNudgePoints(image, points)) return {}; try { for (int x = 0; x < max; x += 2) { if (image.get(static_cast(points[x]), static_cast(points[x + 1]))) { // Black(-ish) pixel result.set(x / 2, y); } } } catch (const std::out_of_range&) { // This feels wrong, but, sometimes if the finder patterns are misidentified, the resulting // transform gets "twisted" such that it maps a straight line of points to a set of points // whose endpoints are in bounds, but others are not. There is probably some mathematical // way to detect this about the transformation that I don't know yet. // This results in an ugly runtime exception despite our clever checks above -- can't have // that. We could check each point's coordinates but that feels duplicative. We settle for // catching and wrapping ArrayIndexOutOfBoundsException. return {}; } } return result; } }; } // anonymous static std::shared_ptr globalInstance = std::make_shared(); std::shared_ptr GridSampler::Instance() { return globalInstance; } void GridSampler::SetInstance(const std::shared_ptr& inst) { globalInstance = inst; } } // ZXing zxing-cpp-1.0.8+ds2/core/src/GridSampler.h000066400000000000000000000063351361167020700202360ustar00rootroot00000000000000#pragma once /* * Copyright 2016 Nu-book Inc. * Copyright 2016 ZXing authors * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #include namespace ZXing { class BitMatrix; class PerspectiveTransform; /** * Implementations of this class can, given locations of finder patterns for a QR code in an * image, sample the right points in the image to reconstruct the QR code, accounting for * perspective distortion. It is abstracted since it is relatively expensive and should be allowed * to take advantage of platform-specific optimized implementations, like Sun's Java Advanced * Imaging library, but which may not be available in other environments such as J2ME, and vice * versa. * * The implementation used can be controlled by calling {@link #setGridSampler(GridSampler)} * with an instance of a class which implements this interface. * * @author Sean Owen */ class GridSampler { public: virtual ~GridSampler() = default; /** * Samples an image for a rectangular matrix of bits of the given dimension. The sampling * transformation is determined by the coordinates of 4 points, in the original and transformed * image space. * * @param image image to sample * @param dimensionX width of {@link BitMatrix} to sample from image * @param dimensionY height of {@link BitMatrix} to sample from image * @param p1ToX point 1 preimage X * @param p1ToY point 1 preimage Y * @param p2ToX point 2 preimage X * @param p2ToY point 2 preimage Y * @param p3ToX point 3 preimage X * @param p3ToY point 3 preimage Y * @param p4ToX point 4 preimage X * @param p4ToY point 4 preimage Y * @param p1FromX point 1 image X * @param p1FromY point 1 image Y * @param p2FromX point 2 image X * @param p2FromY point 2 image Y * @param p3FromX point 3 image X * @param p3FromY point 3 image Y * @param p4FromX point 4 image X * @param p4FromY point 4 image Y * @return {@link BitMatrix} representing a grid of points sampled from the image within a region * defined by the "from" parameters * @throws NotFoundException if image can't be sampled, for example, if the transformation defined * by the given points is invalid or results in sampling outside the image boundaries */ virtual BitMatrix sampleGrid(const BitMatrix& image, int dimensionX, int dimensionY, float p1ToX, float p1ToY, float p2ToX, float p2ToY, float p3ToX, float p3ToY, float p4ToX, float p4ToY, float p1FromX, float p1FromY, float p2FromX, float p2FromY, float p3FromX, float p3FromY, float p4FromX, float p4FromY) const = 0; virtual BitMatrix sampleGrid(const BitMatrix& image, int dimensionX, int dimensionY, const PerspectiveTransform& transform) const = 0; static std::shared_ptr Instance(); static void SetInstance(const std::shared_ptr& inst); }; } // ZXing zxing-cpp-1.0.8+ds2/core/src/HybridBinarizer.cpp000066400000000000000000000204101361167020700214350ustar00rootroot00000000000000/* * Copyright 2016 Nu-book Inc. * Copyright 2016 ZXing authors * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #include "HybridBinarizer.h" #include "LuminanceSource.h" #include "ByteArray.h" #include "BitArray.h" #include "BitMatrix.h" #include "DecodeStatus.h" #include "ZXNumeric.h" #include #include #include namespace ZXing { // This class uses 5x5 blocks to compute local luminance, where each block is 8x8 pixels. // So this is the smallest dimension in each axis we can accept. static const int BLOCK_SIZE_POWER = 3; static const int BLOCK_SIZE = 1 << BLOCK_SIZE_POWER; // ...0100...00 static const int BLOCK_SIZE_MASK = BLOCK_SIZE - 1; // ...0011...11 static const int MINIMUM_DIMENSION = BLOCK_SIZE * 5; static const int MIN_DYNAMIC_RANGE = 24; template class Matrix : std::vector { int _width, _height; public: Matrix(int width, int height) : std::vector(width*height), _width(width), _height(height) {} T& operator()(int x, int y) { assert(x < _width && y < _height); return std::vector::operator[](y* _width + x); } const T& operator()(int x, int y) const { assert(x < _width && y < _height); return std::vector::operator[](y* _width + x); } }; struct HybridBinarizer::DataCache { std::once_flag once; std::shared_ptr matrix; }; HybridBinarizer::HybridBinarizer(const std::shared_ptr& source, bool pureBarcode) : GlobalHistogramBinarizer(source, pureBarcode), _cache(new DataCache) { } HybridBinarizer::~HybridBinarizer() = default; /** * Calculates a single black point for each block of pixels and saves it away. * See the following thread for a discussion of this algorithm: * http://groups.google.com/group/zxing/browse_thread/thread/d06efa2c35a7ddc0 */ static Matrix CalculateBlackPoints(const uint8_t* luminances, int subWidth, int subHeight, int width, int height, int stride) { Matrix blackPoints(subWidth, subHeight); for (int y = 0; y < subHeight; y++) { int yoffset = y << BLOCK_SIZE_POWER; int maxYOffset = height - BLOCK_SIZE; if (yoffset > maxYOffset) { yoffset = maxYOffset; } for (int x = 0; x < subWidth; x++) { int xoffset = x << BLOCK_SIZE_POWER; int maxXOffset = width - BLOCK_SIZE; if (xoffset > maxXOffset) { xoffset = maxXOffset; } int sum = 0; int min = 0xFF; int max = 0; for (int yy = 0, offset = yoffset * stride + xoffset; yy < BLOCK_SIZE; yy++, offset += stride) { for (int xx = 0; xx < BLOCK_SIZE; xx++) { int pixel = luminances[offset + xx]; sum += pixel; // still looking for good contrast if (pixel < min) { min = pixel; } if (pixel > max) { max = pixel; } } // short-circuit min/max tests once dynamic range is met if (max - min > MIN_DYNAMIC_RANGE) { // finish the rest of the rows quickly for (yy++, offset += stride; yy < BLOCK_SIZE; yy++, offset += stride) { for (int xx = 0; xx < BLOCK_SIZE; xx++) { sum += luminances[offset + xx]; } } } } // The default estimate is the average of the values in the block. int average = sum >> (BLOCK_SIZE_POWER * 2); if (max - min <= MIN_DYNAMIC_RANGE) { // If variation within the block is low, assume this is a block with only light or only // dark pixels. In that case we do not want to use the average, as it would divide this // low contrast area into black and white pixels, essentially creating data out of noise. // // The default assumption is that the block is light/background. Since no estimate for // the level of dark pixels exists locally, use half the min for the block. average = min / 2; if (y > 0 && x > 0) { // Correct the "white background" assumption for blocks that have neighbors by comparing // the pixels in this block to the previously calculated black points. This is based on // the fact that dark barcode symbology is always surrounded by some amount of light // background for which reasonable black point estimates were made. The bp estimated at // the boundaries is used for the interior. // The (min < bp) is arbitrary but works better than other heuristics that were tried. int averageNeighborBlackPoint = (blackPoints(x, y - 1) + (2 * blackPoints(x - 1, y)) + blackPoints(x - 1, y - 1)) / 4; if (min < averageNeighborBlackPoint) { average = averageNeighborBlackPoint; } } } blackPoints(x, y) = average; } } return blackPoints; } /** * Applies a single threshold to a block of pixels. */ static void ThresholdBlock(const uint8_t* luminances, int xoffset, int yoffset, int threshold, int stride, BitMatrix& matrix) { for (int y = 0, offset = yoffset * stride + xoffset; y < BLOCK_SIZE; y++, offset += stride) { for (int x = 0; x < BLOCK_SIZE; x++) { // Comparison needs to be <= so that black == 0 pixels are black even if the threshold is 0. if (luminances[offset + x] <= threshold) { matrix.set(xoffset + x, yoffset + y); } } } } /** * For each block in the image, calculate the average black point using a 5x5 grid * of the blocks around it. Also handles the corner cases (fractional blocks are computed based * on the last pixels in the row/column which are also used in the previous block). */ static void CalculateThresholdForBlock(const uint8_t* luminances, int subWidth, int subHeight, int width, int height, int stride, const Matrix& blackPoints, BitMatrix& matrix) { for (int y = 0; y < subHeight; y++) { int yoffset = y << BLOCK_SIZE_POWER; int maxYOffset = height - BLOCK_SIZE; if (yoffset > maxYOffset) { yoffset = maxYOffset; } for (int x = 0; x < subWidth; x++) { int xoffset = x << BLOCK_SIZE_POWER; int maxXOffset = width - BLOCK_SIZE; if (xoffset > maxXOffset) { xoffset = maxXOffset; } int left = Clamp(x, 2, subWidth - 3); int top = Clamp(y, 2, subHeight - 3); int sum = 0; for (int dy = -2; dy <= 2; ++dy) { for (int dx = -2; dx <= 2; ++dx) { sum += blackPoints(left + dx, top + dy); } } int average = sum / 25; ThresholdBlock(luminances, xoffset, yoffset, average, stride, matrix); } } } /** * Calculates the final BitMatrix once for all requests. This could be called once from the * constructor instead, but there are some advantages to doing it lazily, such as making * profiling easier, and not doing heavy lifting when callers don't expect it. */ static void InitBlackMatrix(const LuminanceSource& source, std::shared_ptr& outMatrix) { int width = source.width(); int height = source.height(); ByteArray buffer; int stride; const uint8_t* luminances = source.getMatrix(buffer, stride); int subWidth = width >> BLOCK_SIZE_POWER; if ((width & BLOCK_SIZE_MASK) != 0) { subWidth++; } int subHeight = height >> BLOCK_SIZE_POWER; if ((height & BLOCK_SIZE_MASK) != 0) { subHeight++; } auto blackPoints = CalculateBlackPoints(luminances, subWidth, subHeight, width, height, stride); auto matrix = std::make_shared(width, height); CalculateThresholdForBlock(luminances, subWidth, subHeight, width, height, stride, blackPoints, *matrix); outMatrix = matrix; } std::shared_ptr HybridBinarizer::getBlackMatrix() const { int width = _source->width(); int height = _source->height(); if (width >= MINIMUM_DIMENSION && height >= MINIMUM_DIMENSION) { std::call_once(_cache->once, &InitBlackMatrix, std::cref(*_source), std::ref(_cache->matrix)); return _cache->matrix; } else { // If the image is too small, fall back to the global histogram approach. return GlobalHistogramBinarizer::getBlackMatrix(); } } std::shared_ptr HybridBinarizer::newInstance(const std::shared_ptr& source) const { return std::make_shared(source, _pureBarcode); } } // ZXing zxing-cpp-1.0.8+ds2/core/src/HybridBinarizer.h000066400000000000000000000041521361167020700211070ustar00rootroot00000000000000#pragma once /* * Copyright 2016 Nu-book Inc. * Copyright 2016 ZXing authors * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #include "GlobalHistogramBinarizer.h" namespace ZXing { /** * This class implements a local thresholding algorithm, which while slower than the * GlobalHistogramBinarizer, is fairly efficient for what it does. It is designed for * high frequency images of barcodes with black data on white backgrounds. For this application, * it does a much better job than a global blackpoint with severe shadows and gradients. * However it tends to produce artifacts on lower frequency images and is therefore not * a good general purpose binarizer for uses outside ZXing. * * This class extends GlobalHistogramBinarizer, using the older histogram approach for 1D readers, * and the newer local approach for 2D readers. 1D decoding using a per-row histogram is already * inherently local, and only fails for horizontal gradients. We can revisit that problem later, * but for now it was not a win to use local blocks for 1D. * * This Binarizer is the default for the unit tests and the recommended class for library users. * * @author dswitkin@google.com (Daniel Switkin) */ class HybridBinarizer : public GlobalHistogramBinarizer { public: explicit HybridBinarizer(const std::shared_ptr& source, bool pureBarcode = false); ~HybridBinarizer() override; std::shared_ptr getBlackMatrix() const override; std::shared_ptr newInstance(const std::shared_ptr& source) const override; private: struct DataCache; std::unique_ptr _cache; }; } // ZXing zxing-cpp-1.0.8+ds2/core/src/LuminanceSource.cpp000066400000000000000000000065111361167020700214500ustar00rootroot00000000000000/* * Copyright 2016 Nu-book Inc. * Copyright 2016 ZXing authors * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #include "LuminanceSource.h" #include "ByteArray.h" #include #include namespace ZXing { namespace { /** * A wrapper implementation of {@link LuminanceSource} which inverts the luminances it returns -- black becomes * white and vice versa, and each value becomes (255-value). * * @author Sean Owen */ class InvertedLuminanceSource : public LuminanceSource { std::shared_ptr _src; public: explicit InvertedLuminanceSource(std::shared_ptr src) : _src(std::move(src)) {} const uint8_t* getRow(int y, ByteArray& outBytes, bool) const override { _src->getRow(y, outBytes, true); std::transform(outBytes.begin(), outBytes.end(), outBytes.begin(), [](uint8_t b) { return 255 - b; }); return outBytes.data(); } const uint8_t* getMatrix(ByteArray& outBytes, int& outRowBytes, bool) const override { _src->getMatrix(outBytes, outRowBytes, true); std::transform(outBytes.begin(), outBytes.end(), outBytes.begin(), [](uint8_t b) { return 255 - b; }); return outBytes.data(); } int width() const override { return _src->width(); } /** * @return The height of the bitmap. */ int height() const override { return _src->height(); } bool canCrop() const override { return _src->canCrop(); } std::shared_ptr cropped(int left, int top, int width, int height) const override { return CreateInverted(_src->cropped(left, top, width, height)); } bool canRotate() const override { return _src->canRotate(); } std::shared_ptr rotated(int degreeCW) const override { return CreateInverted(_src->rotated(degreeCW)); } protected: std::shared_ptr getInverted() const override { return _src; } }; // InvertedLuminanceSource } // anonymous bool LuminanceSource::canCrop() const { return false; } std::shared_ptr LuminanceSource::cropped(int, int, int, int) const { throw std::runtime_error("This luminance source does not support cropping."); } bool LuminanceSource::canRotate() const { return false; } /** * Returns a new object with rotated image data by 90 degrees counterclockwise. * Only callable if {@link #isRotateSupported()} is true. * * @return A rotated version of this object. */ std::shared_ptr LuminanceSource::rotated(int) const { throw std::runtime_error("This luminance source does not support rotation by 90 degrees."); } std::shared_ptr LuminanceSource::getInverted() const { return nullptr; } std::shared_ptr LuminanceSource::CreateInverted(const std::shared_ptr& src) { auto result = src->getInverted(); if (result == nullptr) result = std::make_shared(src); return result; } } // ZXing zxing-cpp-1.0.8+ds2/core/src/LuminanceSource.h000066400000000000000000000077571361167020700211320ustar00rootroot00000000000000#pragma once /* * Copyright 2016 Nu-book Inc. * Copyright 2016 ZXing authors * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #include namespace ZXing { class ByteArray; /** * The purpose of this class hierarchy is to abstract different bitmap implementations across * platforms into a standard interface for requesting greyscale luminance values. The interface * only provides immutable methods; therefore crop and rotation create copies. This is to ensure * that one Reader does not modify the original luminance source and leave it in an unknown state * for other Readers in the chain. * * @author dswitkin@google.com (Daniel Switkin) */ class LuminanceSource { public: virtual ~LuminanceSource() = default; /** * @return The width of the bitmap. */ virtual int width() const = 0; /** * @return The height of the bitmap. */ virtual int height() const = 0; /** * Fetches one row of luminance data from the underlying platform's bitmap. Values range from * 0 (black) to 255 (white). Because Java does not have an unsigned byte type, callers will have * to bitwise and with 0xff for each value. It is preferable for implementations of this method * to only fetch this row rather than the whole image, since no 2D Readers may be installed and * getMatrix() may never be called. * * @param y The row to fetch, which must be in [0,getHeight()) * @param row An optional preallocated array. If null or too small, it will be ignored. * Always use the returned object, and ignore the .length of the array. * @return An array containing the luminance data. */ virtual const uint8_t* getRow(int y, ByteArray& buffer, bool forceCopy = false) const = 0; /** * Fetches luminance data for the underlying bitmap. Values should be fetched using: * {@code int luminance = array[y * width + x] & 0xff} * * @return A row-major 2D array of luminance values. Do not use result.length as it may be * larger than width * height bytes on some platforms. Do not modify the contents * of the result. */ virtual const uint8_t* getMatrix(ByteArray& buffer, int& outRowBytes, bool forceCopy = false) const = 0; /** * @return Whether this subclass supports cropping. */ virtual bool canCrop() const; /** * Returns a new object with cropped image data. Implementations may keep a reference to the * original data rather than a copy. Only callable if isCropSupported() is true. * * @param left The left coordinate, which must be in [0,getWidth()) * @param top The top coordinate, which must be in [0,getHeight()) * @param width The width of the rectangle to crop. * @param height The height of the rectangle to crop. * @return A cropped version of this object. */ virtual std::shared_ptr cropped(int left, int top, int width, int height) const; /** * @return Whether this subclass supports counter-clockwise rotation. */ virtual bool canRotate() const; /** * Returns a new object with rotated image data by 90 degrees counterclockwise. * Only callable if {@link #isRotateSupported()} is true. * * @return A rotated version of this object. */ virtual std::shared_ptr rotated(int degreeCW) const; /** * @return a wrapper of this {@code LuminanceSource} which inverts the luminances it returns -- black becomes * white and vice versa, and each value becomes (255-value). */ static std::shared_ptr CreateInverted(const std::shared_ptr& src); protected: virtual std::shared_ptr getInverted() const; }; } // ZXing zxing-cpp-1.0.8+ds2/core/src/MultiFormatReader.cpp000066400000000000000000000064021361167020700217410ustar00rootroot00000000000000/* * Copyright 2016 Nu-book Inc. * Copyright 2016 ZXing authors * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #include "MultiFormatReader.h" #include "DecodeHints.h" #include "BarcodeFormat.h" #include "Result.h" #include "oned/ODReader.h" #include "qrcode/QRReader.h" #include "datamatrix/DMReader.h" #include "aztec/AZReader.h" #include "maxicode/MCReader.h" #include "pdf417/PDFReader.h" #include namespace ZXing { MultiFormatReader::MultiFormatReader(const DecodeHints& hints) { bool tryHarder = hints.tryHarder(); if (!hints.hasNoFormat()) { bool addOneDReader = hints.hasFormat(BarcodeFormat::UPC_A) || hints.hasFormat(BarcodeFormat::UPC_E) || hints.hasFormat(BarcodeFormat::EAN_13) || hints.hasFormat(BarcodeFormat::EAN_8) || hints.hasFormat(BarcodeFormat::CODABAR) || hints.hasFormat(BarcodeFormat::CODE_39) || hints.hasFormat(BarcodeFormat::CODE_93) || hints.hasFormat(BarcodeFormat::CODE_128) || hints.hasFormat(BarcodeFormat::ITF) || hints.hasFormat(BarcodeFormat::RSS_14) || hints.hasFormat(BarcodeFormat::RSS_EXPANDED); // Put 1D readers upfront in "normal" mode if (addOneDReader && !tryHarder) { _readers.emplace_back(new OneD::Reader(hints)); } if (hints.hasFormat(BarcodeFormat::QR_CODE)) { _readers.emplace_back(new QRCode::Reader(hints)); } if (hints.hasFormat(BarcodeFormat::DATA_MATRIX)) { _readers.emplace_back(new DataMatrix::Reader(hints)); } if (hints.hasFormat(BarcodeFormat::AZTEC)) { _readers.emplace_back(new Aztec::Reader()); } if (hints.hasFormat(BarcodeFormat::PDF_417)) { _readers.emplace_back(new Pdf417::Reader()); } if (hints.hasFormat(BarcodeFormat::MAXICODE)) { _readers.emplace_back(new MaxiCode::Reader()); } // At end in "try harder" mode if (addOneDReader && tryHarder) { _readers.emplace_back(new OneD::Reader(hints)); } } if (_readers.empty()) { if (!tryHarder) { _readers.emplace_back(new OneD::Reader(hints)); } _readers.emplace_back(new QRCode::Reader(hints)); _readers.emplace_back(new DataMatrix::Reader(hints)); _readers.emplace_back(new Aztec::Reader()); _readers.emplace_back(new Pdf417::Reader()); _readers.emplace_back(new MaxiCode::Reader()); if (tryHarder) { _readers.emplace_back(new OneD::Reader(hints)); } } } MultiFormatReader::~MultiFormatReader() = default; Result MultiFormatReader::read(const BinaryBitmap& image) const { // If we have only one reader in our list, just return whatever that decoded. // This preserves information (e.g. ChecksumError) instead of just returning 'NotFound'. if (_readers.size() == 1) return _readers.front()->decode(image); for (const auto& reader : _readers) { Result r = reader->decode(image); if (r.isValid()) return r; } return Result(DecodeStatus::NotFound); } } // ZXing zxing-cpp-1.0.8+ds2/core/src/MultiFormatReader.h000066400000000000000000000025161361167020700214100ustar00rootroot00000000000000#pragma once /* * Copyright 2016 Nu-book Inc. * Copyright 2016 ZXing authors * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #include #include namespace ZXing { class Result; class Reader; class BinaryBitmap; class DecodeHints; /** * MultiFormatReader is a convenience class and the main entry point into the library for most uses. * By default it attempts to decode all barcode formats that the library supports. Optionally, you * can provide a hints object to request different behavior, for example only decoding QR codes. * * @author Sean Owen * @author dswitkin@google.com (Daniel Switkin) */ class MultiFormatReader { public: explicit MultiFormatReader(const DecodeHints& hints); ~MultiFormatReader(); Result read(const BinaryBitmap& image) const; private: std::vector> _readers; }; } // ZXing zxing-cpp-1.0.8+ds2/core/src/MultiFormatWriter.cpp000066400000000000000000000105201361167020700220070ustar00rootroot00000000000000/* * Copyright 2017 Huy Cuong Nguyen * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #include "MultiFormatWriter.h" #include "BitMatrix.h" #include "aztec/AZWriter.h" #include "datamatrix/DMWriter.h" #include "pdf417/PDFWriter.h" #include "qrcode/QRWriter.h" #include "qrcode/QRErrorCorrectionLevel.h" #include "oned/ODCodabarWriter.h" #include "oned/ODCode39Writer.h" #include "oned/ODCode93Writer.h" #include "oned/ODCode128Writer.h" #include "oned/ODEAN8Writer.h" #include "oned/ODEAN13Writer.h" #include "oned/ODITFWriter.h" #include "oned/ODUPCAWriter.h" #include "oned/ODUPCEWriter.h" namespace ZXing { namespace { template Writer CreateWriter(CharacterSet encoding, int eccLevel) { Writer writer; if (encoding != CharacterSet::Unknown) writer.setEncoding(encoding); if (eccLevel >= 0 && eccLevel <= 8) writer.setEccPercent(EccConverter()(eccLevel)); return writer; } template Writer CreateWriter(int margin) { Writer writer; if (margin >= 0) writer.setMargin(margin); return writer; } template Writer CreateWriter(CharacterSet encoding, int margin, int eccLevel) { Writer writer; if (encoding != CharacterSet::Unknown) writer.setEncoding(encoding); if (margin >= 0) writer.setMargin(margin); if (eccLevel >= 0 && eccLevel <= 8) writer.setErrorCorrectionLevel(EccConverter()(eccLevel)); return writer; } struct AztecEccConverter { int operator()(int eccLevel) const { // Aztec supports levels 0 to 100 in percentage return eccLevel * 100 / 8; } }; struct Pdf417EccConverter { int operator()(int eccLevel) const { return eccLevel; } }; struct QRCodeEccConverter { QRCode::ErrorCorrectionLevel operator()(int eccPercent) const { if (eccPercent <= 1) return QRCode::ErrorCorrectionLevel::Low; else if (eccPercent <= 4) return QRCode::ErrorCorrectionLevel::Medium; else if (eccPercent <= 6) return QRCode::ErrorCorrectionLevel::Quality; else return QRCode::ErrorCorrectionLevel::High; } }; } // anonymous BitMatrix MultiFormatWriter::encode(const std::wstring& contents, int width, int height) const { switch (_format) { case BarcodeFormat::AZTEC: return CreateWriter(_encoding, _eccLevel).encode(contents, width, height); case BarcodeFormat::DATA_MATRIX: return CreateWriter(_margin).encode(contents, width, height); case BarcodeFormat::PDF_417: return CreateWriter(_encoding, _margin, _eccLevel).encode(contents, width, height); case BarcodeFormat::QR_CODE: return CreateWriter(_encoding, _margin, _eccLevel).encode(contents, width, height); case BarcodeFormat::CODABAR: return CreateWriter(_margin).encode(contents, width, height); case BarcodeFormat::CODE_39: return CreateWriter(_margin).encode(contents, width, height); case BarcodeFormat::CODE_93: return CreateWriter(_margin).encode(contents, width, height); case BarcodeFormat::CODE_128: return CreateWriter(_margin).encode(contents, width, height); case BarcodeFormat::EAN_8: return CreateWriter(_margin).encode(contents, width, height); case BarcodeFormat::EAN_13: return CreateWriter(_margin).encode(contents, width, height); case BarcodeFormat::ITF: return CreateWriter(_margin).encode(contents, width, height); case BarcodeFormat::UPC_A: return CreateWriter(_margin).encode(contents, width, height); case BarcodeFormat::UPC_E: return CreateWriter(_margin).encode(contents, width, height); default: throw std::invalid_argument(std::string("Unsupported format: ") + ToString(_format)); } } } // ZXing zxing-cpp-1.0.8+ds2/core/src/MultiFormatWriter.h000066400000000000000000000032601361167020700214570ustar00rootroot00000000000000#pragma once /* * Copyright 2017 Huy Cuong Nguyen * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #include "BarcodeFormat.h" #include "CharacterSet.h" namespace ZXing { class BitMatrix; /** * This class is here just for convenience as it offers single-point service * to generate barcodes for all supported formats. As a result, this class * offer very limited customization compared to what are available in each * individual encoder. */ class MultiFormatWriter { public: explicit MultiFormatWriter(BarcodeFormat format) : _format(format) {} /** * Used for Aztec, PDF417, and QRCode only. */ MultiFormatWriter& setEncoding(CharacterSet encoding) { _encoding = encoding; return *this; } /** * Used for Aztec, PDF417, and QRCode only, [0-8]. */ MultiFormatWriter& setEccLevel(int level) { _eccLevel = level; return *this; } /** * Used for all 1D formats, PDF417, and QRCode only. */ MultiFormatWriter& setMargin(int margin) { _margin = margin; return *this; } BitMatrix encode(const std::wstring& contents, int width, int height) const; private: BarcodeFormat _format; CharacterSet _encoding = CharacterSet::Unknown; int _margin = -1; int _eccLevel = -1; }; } // ZXing zxing-cpp-1.0.8+ds2/core/src/PerspectiveTransform.cpp000066400000000000000000000076521361167020700225500ustar00rootroot00000000000000/* * Copyright 2016 Nu-book Inc. * Copyright 2016 ZXing authors * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #include "PerspectiveTransform.h" namespace ZXing { PerspectiveTransform::PerspectiveTransform(float b11, float b21, float b31, float b12, float b22, float b32, float b13, float b23, float b33) : a11(b11), a12(b12), a13(b13), a21(b21), a22(b22), a23(b23), a31(b31), a32(b32), a33(b33) { } void PerspectiveTransform::transformPoints(float* points, int count) const { int max = count - 1; for (int i = 0; i < max; i += 2) { float x = points[i]; float y = points[i + 1]; float denominator = a13 * x + a23 * y + a33; points[i] = (a11 * x + a21 * y + a31) / denominator; points[i + 1] = (a12 * x + a22 * y + a32) / denominator; } } void PerspectiveTransform::transformPoints(float* xValues, float* yValues, int count) const { for (int i = 0; i < count; i++) { float x = xValues[i]; float y = yValues[i]; float denominator = a13 * x + a23 * y + a33; xValues[i] = (a11 * x + a21 * y + a31) / denominator; yValues[i] = (a12 * x + a22 * y + a32) / denominator; } } PerspectiveTransform PerspectiveTransform::buildAdjoint() const { // Adjoint is the transpose of the cofactor matrix: return { a22 * a33 - a23 * a32, a23 * a31 - a21 * a33, a21 * a32 - a22 * a31, a13 * a32 - a12 * a33, a11 * a33 - a13 * a31, a12 * a31 - a11 * a32, a12 * a23 - a13 * a22, a13 * a21 - a11 * a23, a11 * a22 - a12 * a21 }; } PerspectiveTransform PerspectiveTransform::times(const PerspectiveTransform& other) const { return { a11 * other.a11 + a21 * other.a12 + a31 * other.a13, a11 * other.a21 + a21 * other.a22 + a31 * other.a23, a11 * other.a31 + a21 * other.a32 + a31 * other.a33, a12 * other.a11 + a22 * other.a12 + a32 * other.a13, a12 * other.a21 + a22 * other.a22 + a32 * other.a23, a12 * other.a31 + a22 * other.a32 + a32 * other.a33, a13 * other.a11 + a23 * other.a12 + a33 * other.a13, a13 * other.a21 + a23 * other.a22 + a33 * other.a23, a13 * other.a31 + a23 * other.a32 + a33 * other.a33 }; } PerspectiveTransform PerspectiveTransform::QuadrilateralToQuadrilateral(float x0, float y0, float x1, float y1, float x2, float y2, float x3, float y3, float x0p, float y0p, float x1p, float y1p, float x2p, float y2p, float x3p, float y3p) { PerspectiveTransform qToS = QuadrilateralToSquare(x0, y0, x1, y1, x2, y2, x3, y3); PerspectiveTransform sToQ = SquareToQuadrilateral(x0p, y0p, x1p, y1p, x2p, y2p, x3p, y3p); return sToQ.times(qToS); } PerspectiveTransform PerspectiveTransform::SquareToQuadrilateral(float x0, float y0, float x1, float y1, float x2, float y2, float x3, float y3) { float dx3 = x0 - x1 + x2 - x3; float dy3 = y0 - y1 + y2 - y3; if (dx3 == 0.0f && dy3 == 0.0f) { // Affine return {x1 - x0, x2 - x1, x0, y1 - y0, y2 - y1, y0, 0.0f, 0.0f, 1.0f}; } else { float dx1 = x1 - x2; float dx2 = x3 - x2; float dy1 = y1 - y2; float dy2 = y3 - y2; float denominator = dx1 * dy2 - dx2 * dy1; float a13 = (dx3 * dy2 - dx2 * dy3) / denominator; float a23 = (dx1 * dy3 - dx3 * dy1) / denominator; return {x1 - x0 + a13 * x1, x3 - x0 + a23 * x3, x0, y1 - y0 + a13 * y1, y3 - y0 + a23 * y3, y0, a13, a23, 1.0f}; } } PerspectiveTransform PerspectiveTransform::QuadrilateralToSquare(float x0, float y0, float x1, float y1, float x2, float y2, float x3, float y3) { // Here, the adjoint serves as the inverse: return SquareToQuadrilateral(x0, y0, x1, y1, x2, y2, x3, y3).buildAdjoint(); } } // ZXing zxing-cpp-1.0.8+ds2/core/src/PerspectiveTransform.h000066400000000000000000000041741361167020700222110ustar00rootroot00000000000000#pragma once /* * Copyright 2016 Nu-book Inc. * Copyright 2016 ZXing authors * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ namespace ZXing { /** *

This class implements a perspective transform in two dimensions. Given four source and four * destination points, it will compute the transformation implied between them. The code is based * directly upon section 3.4.2 of George Wolberg's "Digital Image Warping"; see pages 54-56.

* * @author Sean Owen */ class PerspectiveTransform { float a11 = 1.0f; float a12 = 0.0f; float a13 = 0.0f; float a21 = 0.0f; float a22 = 1.0f; float a23 = 0.0f; float a31 = 0.0f; float a32 = 0.0f; float a33 = 1.0f; public: PerspectiveTransform(float a11, float a21, float a31, float a12, float a22, float a32, float a13, float a23, float a33); void transformPoints(float* points, int count) const; void transformPoints(float* xValues, float* yValues, int count) const; PerspectiveTransform buildAdjoint() const; PerspectiveTransform times(const PerspectiveTransform& other) const; static PerspectiveTransform QuadrilateralToQuadrilateral(float x0, float y0, float x1, float y1, float x2, float y2, float x3, float y3, float x0p, float y0p, float x1p, float y1p, float x2p, float y2p, float x3p, float y3p); static PerspectiveTransform SquareToQuadrilateral(float x0, float y0, float x1, float y1, float x2, float y2, float x3, float y3); static PerspectiveTransform QuadrilateralToSquare(float x0, float y0, float x1, float y1, float x2, float y2, float x3, float y3); }; inline PerspectiveTransform operator*(const PerspectiveTransform& a, const PerspectiveTransform& b) { return a.times(b); } } // ZXing zxing-cpp-1.0.8+ds2/core/src/ReadBarcode.cpp000066400000000000000000000032741361167020700205120ustar00rootroot00000000000000/* * Copyright 2019 Axel Waggershauser * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #include "ReadBarcode.h" #include "DecodeHints.h" #include "MultiFormatReader.h" #include "GenericLuminanceSource.h" #include "HybridBinarizer.h" namespace ZXing { static Result ReadBarcode(GenericLuminanceSource&& source, std::vector formats, bool tryRotate, bool tryHarder) { HybridBinarizer binImage(std::shared_ptr(&source, [](void*) {})); MultiFormatReader reader(DecodeHints().setTryHarder(tryHarder).setTryRotate(tryRotate).setPossibleFormats(formats)); return reader.read(binImage); } Result ReadBarcode(int width, int height, unsigned char* data, int rowStride, std::vector formats, bool tryRotate, bool tryHarder) { return ReadBarcode({width, height, data, rowStride}, formats, tryRotate, tryHarder); } Result ReadBarcode(int width, int height, unsigned char* data, int rowStride, int pixelStride, int rIndex, int gIndex, int bIndex, std::vector formats, bool tryRotate, bool tryHarder) { return ReadBarcode({width, height, data, rowStride, pixelStride, rIndex, gIndex, bIndex}, formats, tryRotate, tryHarder); } } // ZXing zxing-cpp-1.0.8+ds2/core/src/ReadBarcode.h000066400000000000000000000051301361167020700201500ustar00rootroot00000000000000/* * Copyright 2019 Axel Waggershauser * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #pragma once #include "Result.h" #include "BarcodeFormat.h" #include namespace ZXing { /** * Read barcode from a grayscale buffer * *

Use {@link #ReadBarcode(int width, int height, unsigned char* data, int rowStride, std::vector formats = {}, bool tryRotate = true, bool tryHarder = true) to read a bar code from a buffer. * * @param width image width * @param height image height * @param data image buffer * @param rowstride row stride * @param formats A list of format to search for ( faster) * @param tryRotate try to rotate the buffer to find the barcode (slower) * @param tryHarder try harder to find the barcode(slower). TODO needs to explain * @return #Result structure * @since 0.x */ Result ReadBarcode(int width, int height, unsigned char* data, int rowStride, std::vector formats = {}, bool tryRotate = true, bool tryHarder = true); /** * Read barcode from a RGB buffer * *

Use {@link #ReadBarcode(int width, int height, unsigned char* data, int rowStride, int pixelStride, int rIndex, int gIndex, int bIndex, std::vector formats = {}, bool tryRotate = true, bool tryHarder = true) to read a bar code from a buffer. * * @param width image width * @param height image height * @param data image buffer * @param rowstride row stride * @param pixelstride pixel stride (ie 4 for 32 bits) * @param rIndex red index * @param gIndex green index * @param bIndex blue index * @param formats A list of format to search for ( faster) * @param tryRotate try to rotate the buffer to find the barcode (slower) * @param tryHarder try harder to find the barcode(slower). TODO needs to explain * @return #Result structure * @since 0.x */ Result ReadBarcode(int width, int height, unsigned char* data, int rowStride, int pixelStride, int rIndex, int gIndex, int bIndex, std::vector formats = {}, bool tryRotate = true, bool tryHarder = true); } // ZXing zxing-cpp-1.0.8+ds2/core/src/Reader.h000066400000000000000000000041741361167020700172260ustar00rootroot00000000000000#pragma once /* * Copyright 2016 Nu-book Inc. * Copyright 2016 ZXing authors * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ namespace ZXing { class BinaryBitmap; class Result; /** * Implementations of this interface can decode an image of a barcode in some format into * the string it encodes. For example, {@link com.google.zxing.qrcode.QRCodeReader} can * decode a QR code. The decoder may optionally receive hints from the caller which may help * it decode more quickly or accurately. * * See {@link MultiFormatReader}, which attempts to determine what barcode * format is present within the image as well, and then decodes it accordingly. * * All readers are thread-safe with no temporary state left behind after decode(). * * @author Sean Owen * @author dswitkin@google.com (Daniel Switkin) */ class Reader { public: virtual ~Reader() = default; /** * Locates and decodes a barcode in some format within an image. This method also accepts * hints, each possibly associated to some data, which may help the implementation decode. * * @param image image of barcode to decode * @param hints passed as a {@link java.util.Map} from {@link DecodeHintType} * to arbitrary data. The * meaning of the data depends upon the hint type. The implementation may or may not do * anything with these hints. * @return string which the barcode encodes * @throws NotFoundException if no potential barcode is found * @throws ChecksumException if a potential barcode is found but does not pass its checksum * @throws FormatException if a potential barcode is found but format is invalid */ virtual Result decode(const BinaryBitmap& image) const = 0; }; } // ZXing zxing-cpp-1.0.8+ds2/core/src/ReedSolomonDecoder.cpp000066400000000000000000000115061361167020700220700ustar00rootroot00000000000000/* * Copyright 2016 Nu-book Inc. * Copyright 2016 ZXing authors * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #include "ReedSolomonDecoder.h" #include "GenericGF.h" #include "DecodeStatus.h" #include namespace ZXing { // May throw ReedSolomonException static bool RunEuclideanAlgorithm(const GenericGF& field, std::vector&& rCoefs, int R, GenericGFPoly& sigma, GenericGFPoly& omega) { GenericGFPoly r(field, std::move(rCoefs)); GenericGFPoly& tLast = omega; GenericGFPoly& t = sigma; ZX_THREAD_LOCAL GenericGFPoly q, rLast; field.setMonomial(rLast, R, 1); field.setZero(tLast); field.setOne(t); // Assume r's degree is < rLast's if (r.degree() >= rLast.degree()) { swap(r, rLast); } // Run Euclidean algorithm until r's degree is less than R/2 while (r.degree() >= R / 2) { swap(tLast, t); swap(rLast, r); // Divide rLastLast by rLast, with quotient in q and remainder in r if (rLast.isZero()) { // Oops, Euclidean algorithm already terminated? //throw ReedSolomonException("r_{i-1} was zero"); return false; } r.divide(rLast, q); q.multiply(tLast); q.addOrSubtract(t); swap(t, q); // t = q if (r.degree() >= rLast.degree()) { throw std::runtime_error("Division algorithm failed to reduce polynomial?"); } } int sigmaTildeAtZero = t.coefficient(0); if (sigmaTildeAtZero == 0) { return false; } int inverse = field.inverse(sigmaTildeAtZero); t.multiply(inverse); r.multiply(inverse); // sigma is t omega = std::move(r); return true; } // May throw ReedSolomonException static std::vector FindErrorLocations(const GenericGF& field, const GenericGFPoly& errorLocator) { // This is a direct application of Chien's search int numErrors = errorLocator.degree(); std::vector outLocations(numErrors); if (numErrors == 1) { // shortcut outLocations[0] = errorLocator.coefficient(1); } int e = 0; for (int i = 1; i < field.size() && e < numErrors; i++) { if (errorLocator.evaluateAt(i) == 0) { outLocations[e] = field.inverse(i); e++; } } if (e != numErrors) { //throw ReedSolomonException("Error locator degree does not match number of roots"); return {}; } return outLocations; } static std::vector FindErrorMagnitudes(const GenericGF& field, const GenericGFPoly& errorEvaluator, const std::vector& errorLocations) { // This is directly applying Forney's Formula size_t s = errorLocations.size(); std::vector outMagnitudes(s); for (size_t i = 0; i < s; ++i) { int xiInverse = field.inverse(errorLocations[i]); int denominator = 1; for (size_t j = 0; j < s; ++j) { if (i != j) { //denominator = field.multiply(denominator, // GenericGF.addOrSubtract(1, field.multiply(errorLocations[j], xiInverse))); // Above should work but fails on some Apple and Linux JDKs due to a Hotspot bug. // Below is a funny-looking workaround from Steven Parkes int term = field.multiply(errorLocations[j], xiInverse); int termPlus1 = (term & 0x1) == 0 ? term | 1 : term & ~1; denominator = field.multiply(denominator, termPlus1); } } outMagnitudes[i] = field.multiply(errorEvaluator.evaluateAt(xiInverse), field.inverse(denominator)); if (field.generatorBase() != 0) { outMagnitudes[i] = field.multiply(outMagnitudes[i], xiInverse); } } return outMagnitudes; } bool ReedSolomonDecoder::Decode(const GenericGF& field, std::vector& received, int twoS) { GenericGFPoly poly(field, received); std::vector syndromeCoefficients(twoS, 0); bool noError = true; for (int i = 0; i < twoS; i++) { int eval = poly.evaluateAt(field.exp(i + field.generatorBase())); syndromeCoefficients[twoS - 1 - i] = eval; if (eval != 0) { noError = false; } } if (noError) { return true; } ZX_THREAD_LOCAL GenericGFPoly sigma, omega; if (!RunEuclideanAlgorithm(field, std::move(syndromeCoefficients), twoS, sigma, omega)) return false; auto errorLocations = FindErrorLocations(field, sigma); if (errorLocations.empty()) return false; auto errorMagnitudes = FindErrorMagnitudes(field, omega, errorLocations); int receivedCount = static_cast(received.size()); for (size_t i = 0; i < errorLocations.size(); ++i) { int position = receivedCount - 1 - field.log(errorLocations[i]); if (position < 0) return false; received[position] = field.addOrSubtract(received[position], errorMagnitudes[i]); } return true; } } // ZXing zxing-cpp-1.0.8+ds2/core/src/ReedSolomonDecoder.h000066400000000000000000000037451361167020700215430ustar00rootroot00000000000000#pragma once /* * Copyright 2016 Nu-book Inc. * Copyright 2016 ZXing authors * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #include namespace ZXing { class GenericGF; /** *

Implements Reed-Solomon decoding, as the name implies.

* *

The algorithm will not be explained here, but the following references were helpful * in creating this implementation:

* * * *

Much credit is due to William Rucklidge since portions of this code are an indirect * port of his C++ Reed-Solomon implementation.

* * @author Sean Owen * @author William Rucklidge * @author sanfordsquires */ class ReedSolomonDecoder { public: /** *

Decodes given set of received codewords, which include both data and error-correction * codewords. Really, this means it uses Reed-Solomon to detect and correct errors, in-place, * in the input.

* * @param received data and error-correction codewords * @param twoS number of error-correction codewords available * @throws ReedSolomonException if decoding fails for any reason */ static bool Decode(const GenericGF& field, std::vector& received, int twoS); }; } // ZXing zxing-cpp-1.0.8+ds2/core/src/ReedSolomonEncoder.cpp000066400000000000000000000041561361167020700221050ustar00rootroot00000000000000/* * Copyright 2016 Huy Cuong Nguyen * Copyright 2016 ZXing authors * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #include "ReedSolomonEncoder.h" #include "GenericGF.h" namespace ZXing { ReedSolomonEncoder::ReedSolomonEncoder(const GenericGF& field) : _field(&field) { _cachedGenerators.push_back(GenericGFPoly(field, { 1 })); } const GenericGFPoly& ReedSolomonEncoder::buildGenerator(int degree) { int cachedGenSize = static_cast(_cachedGenerators.size()); if (degree >= cachedGenSize) { GenericGFPoly lastGenerator = _cachedGenerators.back(); for (int d = cachedGenSize; d <= degree; d++) { lastGenerator.multiply(GenericGFPoly(*_field, { 1, _field->exp(d - 1 + _field->generatorBase()) })); _cachedGenerators.push_back(lastGenerator); } } return *std::next(_cachedGenerators.begin(), degree); } void ReedSolomonEncoder::encode(std::vector& toEncode, const int ecBytes) { if (ecBytes == 0) { throw std::invalid_argument("No error correction bytes"); } int dataBytes = static_cast(toEncode.size()) - ecBytes; if (dataBytes <= 0) { throw std::invalid_argument("No data bytes provided"); } GenericGFPoly info = GenericGFPoly(*_field, std::vector(toEncode.begin(), toEncode.begin() + dataBytes)); info.multiplyByMonomial(ecBytes, 1); GenericGFPoly _; info.divide(buildGenerator(ecBytes), _); auto& coefficients = info.coefficients(); int numZeroCoefficients = ecBytes - static_cast(coefficients.size()); std::fill_n(toEncode.begin() + dataBytes, numZeroCoefficients, 0); std::copy(coefficients.begin(), coefficients.end(), toEncode.begin() + dataBytes + numZeroCoefficients); } } // ZXing zxing-cpp-1.0.8+ds2/core/src/ReedSolomonEncoder.h000066400000000000000000000017321361167020700215470ustar00rootroot00000000000000#pragma once /* * Copyright 2016 Huy Cuong Nguyen * Copyright 2016 ZXing authors * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #include "GenericGFPoly.h" #include namespace ZXing { class ReedSolomonEncoder { public: explicit ReedSolomonEncoder(const GenericGF& field); void encode(std::vector& toEncode, int ecBytes); private: const GenericGF* _field; std::list _cachedGenerators; const GenericGFPoly& buildGenerator(int degree); }; } // ZXing zxing-cpp-1.0.8+ds2/core/src/Result.cpp000066400000000000000000000050241361167020700176300ustar00rootroot00000000000000/* * Copyright 2016 Nu-book Inc. * Copyright 2016 ZXing authors * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #include "Result.h" #include "TextDecoder.h" namespace ZXing { Result::Result(std::wstring&& text, std::vector&& resultPoints, BarcodeFormat format, ByteArray&& rawBytes) : _text(std::move(text)), _rawBytes(std::move(rawBytes)), _resultPoints(std::move(resultPoints)), _format(format) { _numBits = static_cast(_rawBytes.size()) * 8; } Result::Result(const std::string& text, int y, int xStart, int xStop, BarcodeFormat format, ByteArray&& rawBytes) : Result(TextDecoder::FromLatin1(text), {ResultPoint(xStart, y), ResultPoint(xStop, y)}, format, std::move(rawBytes)) {} Result::Result(DecoderResult&& decodeResult, std::vector&& resultPoints, BarcodeFormat format) : _status(decodeResult.errorCode()), _text(std::move(decodeResult).text()), _rawBytes(std::move(decodeResult).rawBytes()), _numBits(decodeResult.numBits()), _resultPoints(std::move(resultPoints)), _format(format) { if (!isValid()) return; //TODO: change ResultMetadata::put interface, so we can move from decodeResult? const auto& byteSegments = decodeResult.byteSegments(); if (!byteSegments.empty()) { metadata().put(ResultMetadata::BYTE_SEGMENTS, byteSegments); } const auto& ecLevel = decodeResult.ecLevel(); if (!ecLevel.empty()) { metadata().put(ResultMetadata::ERROR_CORRECTION_LEVEL, ecLevel); } if (decodeResult.hasStructuredAppend()) { metadata().put(ResultMetadata::STRUCTURED_APPEND_SEQUENCE, decodeResult.structuredAppendSequenceNumber()); metadata().put(ResultMetadata::STRUCTURED_APPEND_CODE_COUNT, decodeResult.structuredAppendCodeCount()); metadata().put(ResultMetadata::STRUCTURED_APPEND_PARITY, decodeResult.structuredAppendParity()); } //TODO: what about the other optional data in DecoderResult? } void Result::addResultPoints(const std::vector& points) { _resultPoints.insert(resultPoints().end(), points.begin(), points.end()); } } // ZXing zxing-cpp-1.0.8+ds2/core/src/Result.h000066400000000000000000000046541361167020700173050ustar00rootroot00000000000000#pragma once /* * Copyright 2016 Nu-book Inc. * Copyright 2016 ZXing authors * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #include "ByteArray.h" #include "BarcodeFormat.h" #include "ResultPoint.h" #include "ResultMetadata.h" #include "DecoderResult.h" #include "DecodeStatus.h" #include #include namespace ZXing { /** *

Encapsulates the result of decoding a barcode within an image.

* * @author Sean Owen */ class Result { public: explicit Result(DecodeStatus status) : _status(status) {} Result(std::wstring&& text, std::vector&& resultPoints, BarcodeFormat format, ByteArray&& rawBytes = {}); // 1D convenience constructor Result(const std::string& text, int y, int xStart, int xStop, BarcodeFormat format, ByteArray&& rawBytes = {}); Result(DecoderResult&& decodeResult, std::vector&& resultPoints, BarcodeFormat format); bool isValid() const { return StatusIsOK(_status); } DecodeStatus status() const { return _status; } const std::wstring& text() const { return _text; } void setText(std::wstring&& text) { _text = std::move(text); } const ByteArray& rawBytes() const { return _rawBytes; } int numBits() const { return _numBits; } const std::vector& resultPoints() const { return _resultPoints; } void setResultPoints(std::vector&& points) { _resultPoints = std::move(points); } void addResultPoints(const std::vector& points); BarcodeFormat format() const { return _format; } void setFormat(BarcodeFormat format) { _format = format; } const ResultMetadata& metadata() const { return _metadata; } ResultMetadata& metadata() { return _metadata; } private: DecodeStatus _status = DecodeStatus::NoError; std::wstring _text; ByteArray _rawBytes; int _numBits = 0; std::vector _resultPoints; BarcodeFormat _format = BarcodeFormat::FORMAT_COUNT; ResultMetadata _metadata; }; } // ZXing zxing-cpp-1.0.8+ds2/core/src/ResultMetadata.cpp000066400000000000000000000064641361167020700213020ustar00rootroot00000000000000/* * Copyright 2016 Nu-book Inc. * Copyright 2016 ZXing authors * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #include "ResultMetadata.h" #include "ByteArray.h" namespace ZXing { struct ResultMetadata::Value { virtual ~Value() = default; virtual int toInteger(int fallback) const { return fallback; } virtual std::wstring toString() const { return std::wstring(); } virtual std::list toByteArrayList() const { return std::list(); } virtual std::shared_ptr toCustomData() const { return nullptr; } }; struct ResultMetadata::IntegerValue : public Value { int value; explicit IntegerValue(int v) : value(v) {} int toInteger(int) const override { return value; } std::wstring toString() const override { return std::to_wstring(value); } }; struct ResultMetadata::StringValue : public Value { std::wstring value; explicit StringValue(std::wstring v) : value(std::move(v)) {} std::wstring toString() const override { return value; } }; struct ResultMetadata::ByteArrayListValue : public Value { std::list value; explicit ByteArrayListValue(std::list v) : value(std::move(v)) {} std::list toByteArrayList() const override { return value; } }; struct ResultMetadata::CustomDataValue : public Value { std::shared_ptr value; explicit CustomDataValue(std::shared_ptr v) : value(std::move(v)) {} std::shared_ptr toCustomData() const override { return value; } }; int ResultMetadata::getInt(Key key, int fallbackValue) const { auto it = _contents.find(key); return it != _contents.end() ? it->second->toInteger(fallbackValue) : fallbackValue; } std::wstring ResultMetadata::getString(Key key) const { auto it = _contents.find(key); return it != _contents.end() ? it->second->toString() : std::wstring(); } std::list ResultMetadata::getByteArrayList(Key key) const { auto it = _contents.find(key); return it != _contents.end() ? it->second->toByteArrayList() : std::list(); } std::shared_ptr ResultMetadata::getCustomData(Key key) const { auto it = _contents.find(key); return it != _contents.end() ? it->second->toCustomData() : nullptr; } void ResultMetadata::put(Key key, int value) { _contents[key] = std::make_shared(value); } void ResultMetadata::put(Key key, const std::wstring& value) { _contents[key] = std::make_shared(value); } void ResultMetadata::put(Key key, const std::list& value) { _contents[key] = std::make_shared(value); } void ResultMetadata::put(Key key, const std::shared_ptr& value) { _contents[key] = std::make_shared(value); } void ResultMetadata::putAll(const ResultMetadata& other) { _contents.insert(other._contents.begin(), other._contents.end()); } } // ZXing zxing-cpp-1.0.8+ds2/core/src/ResultMetadata.h000066400000000000000000000074501361167020700207430ustar00rootroot00000000000000#pragma once /* * Copyright 2016 Nu-book Inc. * Copyright 2016 ZXing authors * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #include #include #include #include #include namespace ZXing { class ByteArray; class CustomData; /** * @author Sean Owen */ class ResultMetadata { public: /** * Represents some type of metadata about the result of the decoding that the decoder * wishes to communicate back to the caller. */ enum Key { /** * Unspecified, application-specific metadata. Maps to an unspecified {@link CustomData}. */ OTHER, /** * Denotes the likely approximate orientation of the barcode in the image. This value * is given as degrees rotated clockwise from the normal, upright orientation. * For example a 1D barcode which was found by reading top-to-bottom would be * said to have orientation "90". This key maps to an {@link Integer} whose * value is in the range [0,360). */ ORIENTATION, /** *

2D barcode formats typically encode text, but allow for a sort of 'byte mode' * which is sometimes used to encode binary data. While {@link Result} makes available * the complete raw bytes in the barcode for these formats, it does not offer the bytes * from the byte segments alone.

* *

This maps to a {@link java.util.List} of byte arrays corresponding to the * raw bytes in the byte segments in the barcode, in order.

*/ BYTE_SEGMENTS, /** * Error correction level used, if applicable. The value type depends on the * format, but is typically a String. */ ERROR_CORRECTION_LEVEL, /** * For some periodicals, indicates the issue number as an {@link Integer}. */ ISSUE_NUMBER, /** * For some products, indicates the suggested retail price in the barcode as a * formatted {@link String}. */ SUGGESTED_PRICE, /** * For some products, the possible country of manufacture as a {@link String} denoting the * ISO country code. Some map to multiple possible countries, like "US/CA". */ POSSIBLE_COUNTRY, /** * For some products, the extension text */ UPC_EAN_EXTENSION, /** * PDF417-specific metadata */ PDF417_EXTRA_METADATA, /** * If the code format supports structured append and the current scanned code is part of one then the * sequence number is given with it. */ STRUCTURED_APPEND_SEQUENCE, /** * If the code format supports structured append and the current scanned code is part of one then the * total code count is given with it. */ STRUCTURED_APPEND_CODE_COUNT, /** * If the code format supports structured append and the current scanned code is part of one then the * parity is given with it. */ STRUCTURED_APPEND_PARITY, }; int getInt(Key key, int fallbackValue = 0) const; std::wstring getString(Key key) const; std::list getByteArrayList(Key key) const; std::shared_ptr getCustomData(Key key) const; void put(Key key, int value); void put(Key key, const std::wstring& value); void put(Key key, const std::list& value); void put(Key key, const std::shared_ptr& value); void putAll(const ResultMetadata& other); private: struct Value; struct IntegerValue; struct StringValue; struct ByteArrayListValue; struct CustomDataValue; std::map> _contents; }; } // ZXing zxing-cpp-1.0.8+ds2/core/src/ResultPoint.cpp000066400000000000000000000027201361167020700206420ustar00rootroot00000000000000/* * Copyright 2016 Nu-book Inc. * Copyright 2016 ZXing authors * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #include "ResultPoint.h" #include #include namespace ZXing { /** * @param pattern1 first pattern * @param pattern2 second pattern * @return distance between two points */ float ResultPoint::Distance(const ResultPoint& a, const ResultPoint& b) { auto dx = a.x() - b.x(); auto dy = a.y() - b.y(); return std::sqrt(dx*dx + dy*dy); } float ResultPoint::Distance(float aX, float aY, float bX, float bY) { auto dx = aX - bX; auto dy = aY - bY; return std::sqrt(dx * dx + dy * dy); } float ResultPoint::Distance(int aX, int aY, int bX, int bY) { auto dx = static_cast(aX - bX); auto dy = static_cast(aY - bY); return std::sqrt(dx * dx + dy * dy); } float ResultPoint::SquaredDistance(const ResultPoint& a, const ResultPoint& b) { auto dx = a.x() - b.x(); auto dy = a.y() - b.y(); return dx * dx + dy * dy; } } // ZXing zxing-cpp-1.0.8+ds2/core/src/ResultPoint.h000066400000000000000000000030571361167020700203130ustar00rootroot00000000000000#pragma once /* * Copyright 2016 Nu-book Inc. * Copyright 2016 ZXing authors * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ namespace ZXing { /** *

Encapsulates a point of interest in an image containing a barcode. Typically, this * would be the location of a finder pattern or the corner of the barcode, for example.

* * @author Sean Owen */ class ResultPoint { float _x = 0.f; float _y = 0.f; public: ResultPoint() = default; ResultPoint(float x, float y) : _x(x), _y(y) {} ResultPoint(int x, int y) : _x(static_cast(x)), _y(static_cast(y)) {} float x() const { return _x; } float y() const { return _y; } bool operator==(const ResultPoint& other) const { return _x == other._x && _y == other._y; } void set(float x, float y) { _x = x; _y = y; } static float Distance(const ResultPoint& a, const ResultPoint& b); static float Distance(float aX, float aY, float bX, float bY); static float Distance(int aX, int aY, int bX, int bY); static float SquaredDistance(const ResultPoint& a, const ResultPoint& b); }; } // ZXing zxing-cpp-1.0.8+ds2/core/src/TextDecoder.cpp000066400000000000000000000673531361167020700206010ustar00rootroot00000000000000/* * Copyright 2016 Nu-book Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #include "TextDecoder.h" #include "CharacterSet.h" #include "TextUtfEncoding.h" #include "textcodec/JPTextDecoder.h" #include "textcodec/GBTextDecoder.h" #include "textcodec/Big5TextDecoder.h" #include "textcodec/KRTextDecoder.h" namespace ZXing { namespace Codecs { static const uint16_t SINGLE_BYTE_CODEPAGES[] = { // ISO-8859-2 0x0080, 0x0081, 0x0082, 0x0083, 0x0084, 0x0085, 0x0086, 0x0087, 0x0088, 0x0089, 0x008A, 0x008B, 0x008C, 0x008D, 0x008E, 0x008F, 0x0090, 0x0091, 0x0092, 0x0093, 0x0094, 0x0095, 0x0096, 0x0097, 0x0098, 0x0099, 0x009A, 0x009B, 0x009C, 0x009D, 0x009E, 0x009F, 0x00A0, 0x0104, 0x02D8, 0x0141, 0x00A4, 0x013D, 0x015A, 0x00A7, 0x00A8, 0x0160, 0x015E, 0x0164, 0x0179, 0x00AD, 0x017D, 0x017B, 0x00B0, 0x0105, 0x02DB, 0x0142, 0x00B4, 0x013E, 0x015B, 0x02C7, 0x00B8, 0x0161, 0x015F, 0x0165, 0x017A, 0x02DD, 0x017E, 0x017C, 0x0154, 0x00C1, 0x00C2, 0x0102, 0x00C4, 0x0139, 0x0106, 0x00C7, 0x010C, 0x00C9, 0x0118, 0x00CB, 0x011A, 0x00CD, 0x00CE, 0x010E, 0x0110, 0x0143, 0x0147, 0x00D3, 0x00D4, 0x0150, 0x00D6, 0x00D7, 0x0158, 0x016E, 0x00DA, 0x0170, 0x00DC, 0x00DD, 0x0162, 0x00DF, 0x0155, 0x00E1, 0x00E2, 0x0103, 0x00E4, 0x013A, 0x0107, 0x00E7, 0x010D, 0x00E9, 0x0119, 0x00EB, 0x011B, 0x00ED, 0x00EE, 0x010F, 0x0111, 0x0144, 0x0148, 0x00F3, 0x00F4, 0x0151, 0x00F6, 0x00F7, 0x0159, 0x016F, 0x00FA, 0x0171, 0x00FC, 0x00FD, 0x0163, 0x02D9, // ISO-8859-3 0x0080, 0x0081, 0x0082, 0x0083, 0x0084, 0x0085, 0x0086, 0x0087, 0x0088, 0x0089, 0x008A, 0x008B, 0x008C, 0x008D, 0x008E, 0x008F, 0x0090, 0x0091, 0x0092, 0x0093, 0x0094, 0x0095, 0x0096, 0x0097, 0x0098, 0x0099, 0x009A, 0x009B, 0x009C, 0x009D, 0x009E, 0x009F, 0x00A0, 0x0126, 0x02D8, 0x00A3, 0x00A4, 0xFFFD, 0x0124, 0x00A7, 0x00A8, 0x0130, 0x015E, 0x011E, 0x0134, 0x00AD, 0xFFFD, 0x017B, 0x00B0, 0x0127, 0x00B2, 0x00B3, 0x00B4, 0x00B5, 0x0125, 0x00B7, 0x00B8, 0x0131, 0x015F, 0x011F, 0x0135, 0x00BD, 0xFFFD, 0x017C, 0x00C0, 0x00C1, 0x00C2, 0xFFFD, 0x00C4, 0x010A, 0x0108, 0x00C7, 0x00C8, 0x00C9, 0x00CA, 0x00CB, 0x00CC, 0x00CD, 0x00CE, 0x00CF, 0xFFFD, 0x00D1, 0x00D2, 0x00D3, 0x00D4, 0x0120, 0x00D6, 0x00D7, 0x011C, 0x00D9, 0x00DA, 0x00DB, 0x00DC, 0x016C, 0x015C, 0x00DF, 0x00E0, 0x00E1, 0x00E2, 0xFFFD, 0x00E4, 0x010B, 0x0109, 0x00E7, 0x00E8, 0x00E9, 0x00EA, 0x00EB, 0x00EC, 0x00ED, 0x00EE, 0x00EF, 0xFFFD, 0x00F1, 0x00F2, 0x00F3, 0x00F4, 0x0121, 0x00F6, 0x00F7, 0x011D, 0x00F9, 0x00FA, 0x00FB, 0x00FC, 0x016D, 0x015D, 0x02D9, // ISO-8859-4 0x0080, 0x0081, 0x0082, 0x0083, 0x0084, 0x0085, 0x0086, 0x0087, 0x0088, 0x0089, 0x008A, 0x008B, 0x008C, 0x008D, 0x008E, 0x008F, 0x0090, 0x0091, 0x0092, 0x0093, 0x0094, 0x0095, 0x0096, 0x0097, 0x0098, 0x0099, 0x009A, 0x009B, 0x009C, 0x009D, 0x009E, 0x009F, 0x00A0, 0x0104, 0x0138, 0x0156, 0x00A4, 0x0128, 0x013B, 0x00A7, 0x00A8, 0x0160, 0x0112, 0x0122, 0x0166, 0x00AD, 0x017D, 0x00AF, 0x00B0, 0x0105, 0x02DB, 0x0157, 0x00B4, 0x0129, 0x013C, 0x02C7, 0x00B8, 0x0161, 0x0113, 0x0123, 0x0167, 0x014A, 0x017E, 0x014B, 0x0100, 0x00C1, 0x00C2, 0x00C3, 0x00C4, 0x00C5, 0x00C6, 0x012E, 0x010C, 0x00C9, 0x0118, 0x00CB, 0x0116, 0x00CD, 0x00CE, 0x012A, 0x0110, 0x0145, 0x014C, 0x0136, 0x00D4, 0x00D5, 0x00D6, 0x00D7, 0x00D8, 0x0172, 0x00DA, 0x00DB, 0x00DC, 0x0168, 0x016A, 0x00DF, 0x0101, 0x00E1, 0x00E2, 0x00E3, 0x00E4, 0x00E5, 0x00E6, 0x012F, 0x010D, 0x00E9, 0x0119, 0x00EB, 0x0117, 0x00ED, 0x00EE, 0x012B, 0x0111, 0x0146, 0x014D, 0x0137, 0x00F4, 0x00F5, 0x00F6, 0x00F7, 0x00F8, 0x0173, 0x00FA, 0x00FB, 0x00FC, 0x0169, 0x016B, 0x02D9, // ISO-8859-5 0x0080, 0x0081, 0x0082, 0x0083, 0x0084, 0x0085, 0x0086, 0x0087, 0x0088, 0x0089, 0x008A, 0x008B, 0x008C, 0x008D, 0x008E, 0x008F, 0x0090, 0x0091, 0x0092, 0x0093, 0x0094, 0x0095, 0x0096, 0x0097, 0x0098, 0x0099, 0x009A, 0x009B, 0x009C, 0x009D, 0x009E, 0x009F, 0x00A0, 0x0401, 0x0402, 0x0403, 0x0404, 0x0405, 0x0406, 0x0407, 0x0408, 0x0409, 0x040A, 0x040B, 0x040C, 0x00AD, 0x040E, 0x040F, 0x0410, 0x0411, 0x0412, 0x0413, 0x0414, 0x0415, 0x0416, 0x0417, 0x0418, 0x0419, 0x041A, 0x041B, 0x041C, 0x041D, 0x041E, 0x041F, 0x0420, 0x0421, 0x0422, 0x0423, 0x0424, 0x0425, 0x0426, 0x0427, 0x0428, 0x0429, 0x042A, 0x042B, 0x042C, 0x042D, 0x042E, 0x042F, 0x0430, 0x0431, 0x0432, 0x0433, 0x0434, 0x0435, 0x0436, 0x0437, 0x0438, 0x0439, 0x043A, 0x043B, 0x043C, 0x043D, 0x043E, 0x043F, 0x0440, 0x0441, 0x0442, 0x0443, 0x0444, 0x0445, 0x0446, 0x0447, 0x0448, 0x0449, 0x044A, 0x044B, 0x044C, 0x044D, 0x044E, 0x044F, 0x2116, 0x0451, 0x0452, 0x0453, 0x0454, 0x0455, 0x0456, 0x0457, 0x0458, 0x0459, 0x045A, 0x045B, 0x045C, 0x00A7, 0x045E, 0x045F, // ISO-8859-6 0x0080, 0x0081, 0x0082, 0x0083, 0x0084, 0x0085, 0x0086, 0x0087, 0x0088, 0x0089, 0x008A, 0x008B, 0x008C, 0x008D, 0x008E, 0x008F, 0x0090, 0x0091, 0x0092, 0x0093, 0x0094, 0x0095, 0x0096, 0x0097, 0x0098, 0x0099, 0x009A, 0x009B, 0x009C, 0x009D, 0x009E, 0x009F, 0x00A0, 0xFFFD, 0xFFFD, 0xFFFD, 0x00A4, 0xFFFD, 0xFFFD, 0xFFFD, 0xFFFD, 0xFFFD, 0xFFFD, 0xFFFD, 0x060C, 0x00AD, 0xFFFD, 0xFFFD, 0xFFFD, 0xFFFD, 0xFFFD, 0xFFFD, 0xFFFD, 0xFFFD, 0xFFFD, 0xFFFD, 0xFFFD, 0xFFFD, 0xFFFD, 0x061B, 0xFFFD, 0xFFFD, 0xFFFD, 0x061F, 0xFFFD, 0x0621, 0x0622, 0x0623, 0x0624, 0x0625, 0x0626, 0x0627, 0x0628, 0x0629, 0x062A, 0x062B, 0x062C, 0x062D, 0x062E, 0x062F, 0x0630, 0x0631, 0x0632, 0x0633, 0x0634, 0x0635, 0x0636, 0x0637, 0x0638, 0x0639, 0x063A, 0xFFFD, 0xFFFD, 0xFFFD, 0xFFFD, 0xFFFD, 0x0640, 0x0641, 0x0642, 0x0643, 0x0644, 0x0645, 0x0646, 0x0647, 0x0648, 0x0649, 0x064A, 0x064B, 0x064C, 0x064D, 0x064E, 0x064F, 0x0650, 0x0651, 0x0652, 0xFFFD, 0xFFFD, 0xFFFD, 0xFFFD, 0xFFFD, 0xFFFD, 0xFFFD, 0xFFFD, 0xFFFD, 0xFFFD, 0xFFFD, 0xFFFD, 0xFFFD, // ISO-8859-7 0x0080, 0x0081, 0x0082, 0x0083, 0x0084, 0x0085, 0x0086, 0x0087, 0x0088, 0x0089, 0x008A, 0x008B, 0x008C, 0x008D, 0x008E, 0x008F, 0x0090, 0x0091, 0x0092, 0x0093, 0x0094, 0x0095, 0x0096, 0x0097, 0x0098, 0x0099, 0x009A, 0x009B, 0x009C, 0x009D, 0x009E, 0x009F, 0x00A0, 0x2018, 0x2019, 0x00A3, 0xFFFD, 0xFFFD, 0x00A6, 0x00A7, 0x00A8, 0x00A9, 0xFFFD, 0x00AB, 0x00AC, 0x00AD, 0xFFFD, 0x2015, 0x00B0, 0x00B1, 0x00B2, 0x00B3, 0x0384, 0x0385, 0x0386, 0x00B7, 0x0388, 0x0389, 0x038A, 0x00BB, 0x038C, 0x00BD, 0x038E, 0x038F, 0x0390, 0x0391, 0x0392, 0x0393, 0x0394, 0x0395, 0x0396, 0x0397, 0x0398, 0x0399, 0x039A, 0x039B, 0x039C, 0x039D, 0x039E, 0x039F, 0x03A0, 0x03A1, 0xFFFD, 0x03A3, 0x03A4, 0x03A5, 0x03A6, 0x03A7, 0x03A8, 0x03A9, 0x03AA, 0x03AB, 0x03AC, 0x03AD, 0x03AE, 0x03AF, 0x03B0, 0x03B1, 0x03B2, 0x03B3, 0x03B4, 0x03B5, 0x03B6, 0x03B7, 0x03B8, 0x03B9, 0x03BA, 0x03BB, 0x03BC, 0x03BD, 0x03BE, 0x03BF, 0x03C0, 0x03C1, 0x03C2, 0x03C3, 0x03C4, 0x03C5, 0x03C6, 0x03C7, 0x03C8, 0x03C9, 0x03CA, 0x03CB, 0x03CC, 0x03CD, 0x03CE, 0xFFFD, // ISO-8859-8 0x0080, 0x0081, 0x0082, 0x0083, 0x0084, 0x0085, 0x0086, 0x0087, 0x0088, 0x0089, 0x008A, 0x008B, 0x008C, 0x008D, 0x008E, 0x008F, 0x0090, 0x0091, 0x0092, 0x0093, 0x0094, 0x0095, 0x0096, 0x0097, 0x0098, 0x0099, 0x009A, 0x009B, 0x009C, 0x009D, 0x009E, 0x009F, 0x00A0, 0xFFFD, 0x00A2, 0x00A3, 0x00A4, 0x00A5, 0x00A6, 0x00A7, 0x00A8, 0x00A9, 0x00D7, 0x00AB, 0x00AC, 0x00AD, 0x00AE, 0x203E, 0x00B0, 0x00B1, 0x00B2, 0x00B3, 0x00B4, 0x00B5, 0x00B6, 0x00B7, 0x00B8, 0x00B9, 0x00F7, 0x00BB, 0x00BC, 0x00BD, 0x00BE, 0xFFFD, 0xFFFD, 0xFFFD, 0xFFFD, 0xFFFD, 0xFFFD, 0xFFFD, 0xFFFD, 0xFFFD, 0xFFFD, 0xFFFD, 0xFFFD, 0xFFFD, 0xFFFD, 0xFFFD, 0xFFFD, 0xFFFD, 0xFFFD, 0xFFFD, 0xFFFD, 0xFFFD, 0xFFFD, 0xFFFD, 0xFFFD, 0xFFFD, 0xFFFD, 0xFFFD, 0xFFFD, 0xFFFD, 0xFFFD, 0xFFFD, 0xFFFD, 0x2017, 0x05D0, 0x05D1, 0x05D2, 0x05D3, 0x05D4, 0x05D5, 0x05D6, 0x05D7, 0x05D8, 0x05D9, 0x05DA, 0x05DB, 0x05DC, 0x05DD, 0x05DE, 0x05DF, 0x05E0, 0x05E1, 0x05E2, 0x05E3, 0x05E4, 0x05E5, 0x05E6, 0x05E7, 0x05E8, 0x05E9, 0x05EA, 0xFFFD, 0xFFFD, 0xFFFD, 0xFFFD, 0xFFFD, // ISO-8859-9 0x0080, 0x0081, 0x0082, 0x0083, 0x0084, 0x0085, 0x0086, 0x0087, 0x0088, 0x0089, 0x008A, 0x008B, 0x008C, 0x008D, 0x008E, 0x008F, 0x0090, 0x0091, 0x0092, 0x0093, 0x0094, 0x0095, 0x0096, 0x0097, 0x0098, 0x0099, 0x009A, 0x009B, 0x009C, 0x009D, 0x009E, 0x009F, 0x00A0, 0x00A1, 0x00A2, 0x00A3, 0x00A4, 0x00A5, 0x00A6, 0x00A7, 0x00A8, 0x00A9, 0x00AA, 0x00AB, 0x00AC, 0x00AD, 0x00AE, 0x00AF, 0x00B0, 0x00B1, 0x00B2, 0x00B3, 0x00B4, 0x00B5, 0x00B6, 0x00B7, 0x00B8, 0x00B9, 0x00BA, 0x00BB, 0x00BC, 0x00BD, 0x00BE, 0x00BF, 0x00C0, 0x00C1, 0x00C2, 0x00C3, 0x00C4, 0x00C5, 0x00C6, 0x00C7, 0x00C8, 0x00C9, 0x00CA, 0x00CB, 0x00CC, 0x00CD, 0x00CE, 0x00CF, 0x011E, 0x00D1, 0x00D2, 0x00D3, 0x00D4, 0x00D5, 0x00D6, 0x00D7, 0x00D8, 0x00D9, 0x00DA, 0x00DB, 0x00DC, 0x0130, 0x015E, 0x00DF, 0x00E0, 0x00E1, 0x00E2, 0x00E3, 0x00E4, 0x00E5, 0x00E6, 0x00E7, 0x00E8, 0x00E9, 0x00EA, 0x00EB, 0x00EC, 0x00ED, 0x00EE, 0x00EF, 0x011F, 0x00F1, 0x00F2, 0x00F3, 0x00F4, 0x00F5, 0x00F6, 0x00F7, 0x00F8, 0x00F9, 0x00FA, 0x00FB, 0x00FC, 0x0131, 0x015F, 0x00FF, // ISO-8859-10 0x0080, 0x0081, 0x0082, 0x0083, 0x0084, 0x0085, 0x0086, 0x0087, 0x0088, 0x0089, 0x008A, 0x008B, 0x008C, 0x008D, 0x008E, 0x008F, 0x0090, 0x0091, 0x0092, 0x0093, 0x0094, 0x0095, 0x0096, 0x0097, 0x0098, 0x0099, 0x009A, 0x009B, 0x009C, 0x009D, 0x009E, 0x009F, 0x00A0, 0x0104, 0x0112, 0x0122, 0x012A, 0x0128, 0x0136, 0x00A7, 0x013B, 0x0110, 0x0160, 0x0166, 0x017D, 0x00AD, 0x016A, 0x014A, 0x00B0, 0x0105, 0x0113, 0x0123, 0x012B, 0x0129, 0x0137, 0x00B7, 0x013C, 0x0111, 0x0161, 0x0167, 0x017E, 0x2015, 0x016B, 0x014B, 0x0100, 0x00C1, 0x00C2, 0x00C3, 0x00C4, 0x00C5, 0x00C6, 0x012E, 0x010C, 0x00C9, 0x0118, 0x00CB, 0x0116, 0x00CD, 0x00CE, 0x00CF, 0x00D0, 0x0145, 0x014C, 0x00D3, 0x00D4, 0x00D5, 0x00D6, 0x0168, 0x00D8, 0x0172, 0x00DA, 0x00DB, 0x00DC, 0x00DD, 0x00DE, 0x00DF, 0x0101, 0x00E1, 0x00E2, 0x00E3, 0x00E4, 0x00E5, 0x00E6, 0x012F, 0x010D, 0x00E9, 0x0119, 0x00EB, 0x0117, 0x00ED, 0x00EE, 0x00EF, 0x00F0, 0x0146, 0x014D, 0x00F3, 0x00F4, 0x00F5, 0x00F6, 0x0169, 0x00F8, 0x0173, 0x00FA, 0x00FB, 0x00FC, 0x00FD, 0x00FE, 0x0138, // ISO-8859-11 0x20AC, 0xFFFD, 0xFFFD, 0xFFFD, 0xFFFD, 0x2026, 0xFFFD, 0xFFFD, 0xFFFD, 0xFFFD, 0xFFFD, 0xFFFD, 0xFFFD, 0xFFFD, 0xFFFD, 0xFFFD, 0xFFFD, 0x2018, 0x2019, 0x201C, 0x201D, 0x2022, 0x2013, 0x2014, 0xFFFD, 0xFFFD, 0xFFFD, 0xFFFD, 0xFFFD, 0xFFFD, 0xFFFD, 0xFFFD, 0xFFFD, 0x0E01, 0x0E02, 0x0E03, 0x0E04, 0x0E05, 0x0E06, 0x0E07, 0x0E08, 0x0E09, 0x0E0A, 0x0E0B, 0x0E0C, 0x0E0D, 0x0E0E, 0x0E0F, 0x0E10, 0x0E11, 0x0E12, 0x0E13, 0x0E14, 0x0E15, 0x0E16, 0x0E17, 0x0E18, 0x0E19, 0x0E1A, 0x0E1B, 0x0E1C, 0x0E1D, 0x0E1E, 0x0E1F, 0x0E20, 0x0E21, 0x0E22, 0x0E23, 0x0E24, 0x0E25, 0x0E26, 0x0E27, 0x0E28, 0x0E29, 0x0E2A, 0x0E2B, 0x0E2C, 0x0E2D, 0x0E2E, 0x0E2F, 0x0E30, 0x0E31, 0x0E32, 0x0E33, 0x0E34, 0x0E35, 0x0E36, 0x0E37, 0x0E38, 0x0E39, 0x0E3A, 0xFFFD, 0xFFFD, 0xFFFD, 0xFFFD, 0x0E3F, 0x0E40, 0x0E41, 0x0E42, 0x0E43, 0x0E44, 0x0E45, 0x0E46, 0x0E47, 0x0E48, 0x0E49, 0x0E4A, 0x0E4B, 0x0E4C, 0x0E4D, 0x0E4E, 0x0E4F, 0x0E50, 0x0E51, 0x0E52, 0x0E53, 0x0E54, 0x0E55, 0x0E56, 0x0E57, 0x0E58, 0x0E59, 0x0E5A, 0x0E5B, 0xFFFD, 0xFFFD, 0xFFFD, 0xFFFD, // ISO-8859-13 0x0080, 0x0081, 0x0082, 0x0083, 0x0084, 0x0085, 0x0086, 0x0087, 0x0088, 0x0089, 0x008A, 0x008B, 0x008C, 0x008D, 0x008E, 0x008F, 0x0090, 0x0091, 0x0092, 0x0093, 0x0094, 0x0095, 0x0096, 0x0097, 0x0098, 0x0099, 0x009A, 0x009B, 0x009C, 0x009D, 0x009E, 0x009F, 0x00A0, 0x201D, 0x00A2, 0x00A3, 0x00A4, 0x201E, 0x00A6, 0x00A7, 0x00D8, 0x00A9, 0x0156, 0x00AB, 0x00AC, 0x00AD, 0x00AE, 0x00C6, 0x00B0, 0x00B1, 0x00B2, 0x00B3, 0x201C, 0x00B5, 0x00B6, 0x00B7, 0x00F8, 0x00B9, 0x0157, 0x00BB, 0x00BC, 0x00BD, 0x00BE, 0x00E6, 0x0104, 0x012E, 0x0100, 0x0106, 0x00C4, 0x00C5, 0x0118, 0x0112, 0x010C, 0x00C9, 0x0179, 0x0116, 0x0122, 0x0136, 0x012A, 0x013B, 0x0160, 0x0143, 0x0145, 0x00D3, 0x014C, 0x00D5, 0x00D6, 0x00D7, 0x0172, 0x0141, 0x015A, 0x016A, 0x00DC, 0x017B, 0x017D, 0x00DF, 0x0105, 0x012F, 0x0101, 0x0107, 0x00E4, 0x00E5, 0x0119, 0x0113, 0x010D, 0x00E9, 0x017A, 0x0117, 0x0123, 0x0137, 0x012B, 0x013C, 0x0161, 0x0144, 0x0146, 0x00F3, 0x014D, 0x00F5, 0x00F6, 0x00F7, 0x0173, 0x0142, 0x015B, 0x016B, 0x00FC, 0x017C, 0x017E, 0x2019, // ISO-8859-14 0x0080, 0x0081, 0x0082, 0x0083, 0x0084, 0x0085, 0x0086, 0x0087, 0x0088, 0x0089, 0x008A, 0x008B, 0x008C, 0x008D, 0x008E, 0x008F, 0x0090, 0x0091, 0x0092, 0x0093, 0x0094, 0x0095, 0x0096, 0x0097, 0x0098, 0x0099, 0x009A, 0x009B, 0x009C, 0x009D, 0x009E, 0x009F, 0x00A0, 0x1E02, 0x1E03, 0x00A3, 0x010A, 0x010B, 0x1E0A, 0x00A7, 0x1E80, 0x00A9, 0x1E82, 0x1E0B, 0x1EF2, 0x00AD, 0x00AE, 0x0178, 0x1E1E, 0x1E1F, 0x0120, 0x0121, 0x1E40, 0x1E41, 0x00B6, 0x1E56, 0x1E81, 0x1E57, 0x1E83, 0x1E60, 0x1EF3, 0x1E84, 0x1E85, 0x1E61, 0x00C0, 0x00C1, 0x00C2, 0x00C3, 0x00C4, 0x00C5, 0x00C6, 0x00C7, 0x00C8, 0x00C9, 0x00CA, 0x00CB, 0x00CC, 0x00CD, 0x00CE, 0x00CF, 0x0174, 0x00D1, 0x00D2, 0x00D3, 0x00D4, 0x00D5, 0x00D6, 0x1E6A, 0x00D8, 0x00D9, 0x00DA, 0x00DB, 0x00DC, 0x00DD, 0x0176, 0x00DF, 0x00E0, 0x00E1, 0x00E2, 0x00E3, 0x00E4, 0x00E5, 0x00E6, 0x00E7, 0x00E8, 0x00E9, 0x00EA, 0x00EB, 0x00EC, 0x00ED, 0x00EE, 0x00EF, 0x0175, 0x00F1, 0x00F2, 0x00F3, 0x00F4, 0x00F5, 0x00F6, 0x1E6B, 0x00F8, 0x00F9, 0x00FA, 0x00FB, 0x00FC, 0x00FD, 0x0177, 0x00FF, // ISO-8859-15 0x0080, 0x0081, 0x0082, 0x0083, 0x0084, 0x0085, 0x0086, 0x0087, 0x0088, 0x0089, 0x008A, 0x008B, 0x008C, 0x008D, 0x008E, 0x008F, 0x0090, 0x0091, 0x0092, 0x0093, 0x0094, 0x0095, 0x0096, 0x0097, 0x0098, 0x0099, 0x009A, 0x009B, 0x009C, 0x009D, 0x009E, 0x009F, 0x00A0, 0x00A1, 0x00A2, 0x00A3, 0x20AC, 0x00A5, 0x0160, 0x00A7, 0x0161, 0x00A9, 0x00AA, 0x00AB, 0x00AC, 0x00AD, 0x00AE, 0x00AF, 0x00B0, 0x00B1, 0x00B2, 0x00B3, 0x017D, 0x00B5, 0x00B6, 0x00B7, 0x017E, 0x00B9, 0x00BA, 0x00BB, 0x0152, 0x0153, 0x0178, 0x00BF, 0x00C0, 0x00C1, 0x00C2, 0x00C3, 0x00C4, 0x00C5, 0x00C6, 0x00C7, 0x00C8, 0x00C9, 0x00CA, 0x00CB, 0x00CC, 0x00CD, 0x00CE, 0x00CF, 0x00D0, 0x00D1, 0x00D2, 0x00D3, 0x00D4, 0x00D5, 0x00D6, 0x00D7, 0x00D8, 0x00D9, 0x00DA, 0x00DB, 0x00DC, 0x00DD, 0x00DE, 0x00DF, 0x00E0, 0x00E1, 0x00E2, 0x00E3, 0x00E4, 0x00E5, 0x00E6, 0x00E7, 0x00E8, 0x00E9, 0x00EA, 0x00EB, 0x00EC, 0x00ED, 0x00EE, 0x00EF, 0x00F0, 0x00F1, 0x00F2, 0x00F3, 0x00F4, 0x00F5, 0x00F6, 0x00F7, 0x00F8, 0x00F9, 0x00FA, 0x00FB, 0x00FC, 0x00FD, 0x00FE, 0x00FF, // ISO-8859-16 0x0080, 0x0081, 0x0082, 0x0083, 0x0084, 0x0085, 0x0086, 0x0087, 0x0088, 0x0089, 0x008A, 0x008B, 0x008C, 0x008D, 0x008E, 0x008F, 0x0090, 0x0091, 0x0092, 0x0093, 0x0094, 0x0095, 0x0096, 0x0097, 0x0098, 0x0099, 0x009A, 0x009B, 0x009C, 0x009D, 0x009E, 0x009F, 0x00A0, 0x0104, 0x0105, 0x0141, 0x20AC, 0x201E, 0x0160, 0x00A7, 0x0161, 0x00A9, 0x0218, 0x00AB, 0x0179, 0x00AD, 0x017A, 0x017B, 0x00B0, 0x00B1, 0x010C, 0x0142, 0x017D, 0x201D, 0x00B6, 0x00B7, 0x017E, 0x010D, 0x0219, 0x00BB, 0x0152, 0x0153, 0x0178, 0x017C, 0x00C0, 0x00C1, 0x00C2, 0x0102, 0x00C4, 0x0106, 0x00C6, 0x00C7, 0x00C8, 0x00C9, 0x00CA, 0x00CB, 0x00CC, 0x00CD, 0x00CE, 0x00CF, 0x0110, 0x0143, 0x00D2, 0x00D3, 0x00D4, 0x0150, 0x00D6, 0x015A, 0x0170, 0x00D9, 0x00DA, 0x00DB, 0x00DC, 0x0118, 0x021A, 0x00DF, 0x00E0, 0x00E1, 0x00E2, 0x0103, 0x00E4, 0x0107, 0x00E6, 0x00E7, 0x00E8, 0x00E9, 0x00EA, 0x00EB, 0x00EC, 0x00ED, 0x00EE, 0x00EF, 0x0111, 0x0144, 0x00F2, 0x00F3, 0x00F4, 0x0151, 0x00F6, 0x015B, 0x0171, 0x00F9, 0x00FA, 0x00FB, 0x00FC, 0x0119, 0x021B, 0x00FF, // CP437 0x00c7, 0x00fc, 0x00e9, 0x00e2, 0x00e4, 0x00e0, 0x00e5, 0x00e7, 0x00ea, 0x00eb, 0x00e8, 0x00ef, 0x00ee, 0x00ec, 0x00c4, 0x00c5, 0x00c9, 0x00e6, 0x00c6, 0x00f4, 0x00f6, 0x00f2, 0x00fb, 0x00f9, 0x00ff, 0x00d6, 0x00dc, 0x00a2, 0x00a3, 0x00a5, 0x20a7, 0x0192, 0x00e1, 0x00ed, 0x00f3, 0x00fa, 0x00f1, 0x00d1, 0x00aa, 0x00ba, 0x00bf, 0x2310, 0x00ac, 0x00bd, 0x00bc, 0x00a1, 0x00ab, 0x00bb, 0x2591, 0x2592, 0x2593, 0x2502, 0x2524, 0x2561, 0x2562, 0x2556, 0x2555, 0x2563, 0x2551, 0x2557, 0x255d, 0x255c, 0x255b, 0x2510, 0x2514, 0x2534, 0x252c, 0x251c, 0x2500, 0x253c, 0x255e, 0x255f, 0x255a, 0x2554, 0x2569, 0x2566, 0x2560, 0x2550, 0x256c, 0x2567, 0x2568, 0x2564, 0x2565, 0x2559, 0x2558, 0x2552, 0x2553, 0x256b, 0x256a, 0x2518, 0x250c, 0x2588, 0x2584, 0x258c, 0x2590, 0x2580, 0x03b1, 0x00df, 0x0393, 0x03c0, 0x03a3, 0x03c3, 0x00b5, 0x03c4, 0x03a6, 0x0398, 0x03a9, 0x03b4, 0x221e, 0x03c6, 0x03b5, 0x2229, 0x2261, 0x00b1, 0x2265, 0x2264, 0x2320, 0x2321, 0x00f7, 0x2248, 0x00b0, 0x2219, 0x00b7, 0x221a, 0x207f, 0x00b2, 0x25a0, 0x00a0, // CP1250 0x20AC, 0xFFFD, 0x201A, 0xFFFD, 0x201E, 0x2026, 0x2020, 0x2021, 0xFFFD, 0x2030, 0x0160, 0x2039, 0x015A, 0x0164, 0x017D, 0x0179, 0xFFFD, 0x2018, 0x2019, 0x201C, 0x201D, 0x2022, 0x2013, 0x2014, 0xFFFD, 0x2122, 0x0161, 0x203A, 0x015B, 0x0165, 0x017E, 0x017A, 0x00A0, 0x02C7, 0x02D8, 0x0141, 0x00A4, 0x0104, 0x00A6, 0x00A7, 0x00A8, 0x00A9, 0x015E, 0x00AB, 0x00AC, 0x00AD, 0x00AE, 0x017B, 0x00B0, 0x00B1, 0x02DB, 0x0142, 0x00B4, 0x00B5, 0x00B6, 0x00B7, 0x00B8, 0x0105, 0x015F, 0x00BB, 0x013D, 0x02DD, 0x013E, 0x017C, 0x0154, 0x00C1, 0x00C2, 0x0102, 0x00C4, 0x0139, 0x0106, 0x00C7, 0x010C, 0x00C9, 0x0118, 0x00CB, 0x011A, 0x00CD, 0x00CE, 0x010E, 0x0110, 0x0143, 0x0147, 0x00D3, 0x00D4, 0x0150, 0x00D6, 0x00D7, 0x0158, 0x016E, 0x00DA, 0x0170, 0x00DC, 0x00DD, 0x0162, 0x00DF, 0x0155, 0x00E1, 0x00E2, 0x0103, 0x00E4, 0x013A, 0x0107, 0x00E7, 0x010D, 0x00E9, 0x0119, 0x00EB, 0x011B, 0x00ED, 0x00EE, 0x010F, 0x0111, 0x0144, 0x0148, 0x00F3, 0x00F4, 0x0151, 0x00F6, 0x00F7, 0x0159, 0x016F, 0x00FA, 0x0171, 0x00FC, 0x00FD, 0x0163, 0x02D9, // CP1251 0x0402, 0x0403, 0x201A, 0x0453, 0x201E, 0x2026, 0x2020, 0x2021, 0x20AC, 0x2030, 0x0409, 0x2039, 0x040A, 0x040C, 0x040B, 0x040F, 0x0452, 0x2018, 0x2019, 0x201C, 0x201D, 0x2022, 0x2013, 0x2014, 0xFFFD, 0x2122, 0x0459, 0x203A, 0x045A, 0x045C, 0x045B, 0x045F, 0x00A0, 0x040E, 0x045E, 0x0408, 0x00A4, 0x0490, 0x00A6, 0x00A7, 0x0401, 0x00A9, 0x0404, 0x00AB, 0x00AC, 0x00AD, 0x00AE, 0x0407, 0x00B0, 0x00B1, 0x0406, 0x0456, 0x0491, 0x00B5, 0x00B6, 0x00B7, 0x0451, 0x2116, 0x0454, 0x00BB, 0x0458, 0x0405, 0x0455, 0x0457, 0x0410, 0x0411, 0x0412, 0x0413, 0x0414, 0x0415, 0x0416, 0x0417, 0x0418, 0x0419, 0x041A, 0x041B, 0x041C, 0x041D, 0x041E, 0x041F, 0x0420, 0x0421, 0x0422, 0x0423, 0x0424, 0x0425, 0x0426, 0x0427, 0x0428, 0x0429, 0x042A, 0x042B, 0x042C, 0x042D, 0x042E, 0x042F, 0x0430, 0x0431, 0x0432, 0x0433, 0x0434, 0x0435, 0x0436, 0x0437, 0x0438, 0x0439, 0x043A, 0x043B, 0x043C, 0x043D, 0x043E, 0x043F, 0x0440, 0x0441, 0x0442, 0x0443, 0x0444, 0x0445, 0x0446, 0x0447, 0x0448, 0x0449, 0x044A, 0x044B, 0x044C, 0x044D, 0x044E, 0x044F, // CP1252 0x20AC, 0xFFFD, 0x201A, 0x0192, 0x201E, 0x2026, 0x2020, 0x2021, 0x02C6, 0x2030, 0x0160, 0x2039, 0x0152, 0xFFFD, 0x017D, 0xFFFD, 0xFFFD, 0x2018, 0x2019, 0x201C, 0x201D, 0x2022, 0x2013, 0x2014, 0x02DC, 0x2122, 0x0161, 0x203A, 0x0153, 0xFFFD, 0x017E, 0x0178, 0x00A0, 0x00A1, 0x00A2, 0x00A3, 0x00A4, 0x00A5, 0x00A6, 0x00A7, 0x00A8, 0x00A9, 0x00AA, 0x00AB, 0x00AC, 0x00AD, 0x00AE, 0x00AF, 0x00B0, 0x00B1, 0x00B2, 0x00B3, 0x00B4, 0x00B5, 0x00B6, 0x00B7, 0x00B8, 0x00B9, 0x00BA, 0x00BB, 0x00BC, 0x00BD, 0x00BE, 0x00BF, 0x00C0, 0x00C1, 0x00C2, 0x00C3, 0x00C4, 0x00C5, 0x00C6, 0x00C7, 0x00C8, 0x00C9, 0x00CA, 0x00CB, 0x00CC, 0x00CD, 0x00CE, 0x00CF, 0x00D0, 0x00D1, 0x00D2, 0x00D3, 0x00D4, 0x00D5, 0x00D6, 0x00D7, 0x00D8, 0x00D9, 0x00DA, 0x00DB, 0x00DC, 0x00DD, 0x00DE, 0x00DF, 0x00E0, 0x00E1, 0x00E2, 0x00E3, 0x00E4, 0x00E5, 0x00E6, 0x00E7, 0x00E8, 0x00E9, 0x00EA, 0x00EB, 0x00EC, 0x00ED, 0x00EE, 0x00EF, 0x00F0, 0x00F1, 0x00F2, 0x00F3, 0x00F4, 0x00F5, 0x00F6, 0x00F7, 0x00F8, 0x00F9, 0x00FA, 0x00FB, 0x00FC, 0x00FD, 0x00FE, 0x00FF, // CP1256 0x20AC, 0x067E, 0x201A, 0x0192, 0x201E, 0x2026, 0x2020, 0x2021, 0x02C6, 0x2030, 0x0679, 0x2039, 0x0152, 0x0686, 0x0698, 0x0688, 0x06AF, 0x2018, 0x2019, 0x201C, 0x201D, 0x2022, 0x2013, 0x2014, 0x06A9, 0x2122, 0x0691, 0x203A, 0x0153, 0x200C, 0x200D, 0x06BA, 0x00A0, 0x060C, 0x00A2, 0x00A3, 0x00A4, 0x00A5, 0x00A6, 0x00A7, 0x00A8, 0x00A9, 0x06BE, 0x00AB, 0x00AC, 0x00AD, 0x00AE, 0x00AF, 0x00B0, 0x00B1, 0x00B2, 0x00B3, 0x00B4, 0x00B5, 0x00B6, 0x00B7, 0x00B8, 0x00B9, 0x061B, 0x00BB, 0x00BC, 0x00BD, 0x00BE, 0x061F, 0x06C1, 0x0621, 0x0622, 0x0623, 0x0624, 0x0625, 0x0626, 0x0627, 0x0628, 0x0629, 0x062A, 0x062B, 0x062C, 0x062D, 0x062E, 0x062F, 0x0630, 0x0631, 0x0632, 0x0633, 0x0634, 0x0635, 0x0636, 0x00D7, 0x0637, 0x0638, 0x0639, 0x063A, 0x0640, 0x0641, 0x0642, 0x0643, 0x00E0, 0x0644, 0x00E2, 0x0645, 0x0646, 0x0647, 0x0648, 0x00E7, 0x00E8, 0x00E9, 0x00EA, 0x00EB, 0x0649, 0x064A, 0x00EE, 0x00EF, 0x064B, 0x064C, 0x064D, 0x064E, 0x00F4, 0x064F, 0x0650, 0x00F7, 0x0651, 0x00F9, 0x0652, 0x00FB, 0x00FC, 0x200E, 0x200F, 0x06D2, }; } // Codecs void TextDecoder::Append(std::wstring& str, const uint8_t* bytes, size_t length, CharacterSet charset) { switch (charset) { case CharacterSet::Unknown: case CharacterSet::ISO8859_1: case CharacterSet::ASCII: { str.append(bytes, bytes + length); break; } case CharacterSet::ISO8859_2: case CharacterSet::ISO8859_3: case CharacterSet::ISO8859_4: case CharacterSet::ISO8859_5: case CharacterSet::ISO8859_6: case CharacterSet::ISO8859_7: case CharacterSet::ISO8859_8: case CharacterSet::ISO8859_9: case CharacterSet::ISO8859_10: case CharacterSet::ISO8859_11: case CharacterSet::ISO8859_13: case CharacterSet::ISO8859_14: case CharacterSet::ISO8859_15: case CharacterSet::ISO8859_16: case CharacterSet::Cp437: case CharacterSet::Cp1250: case CharacterSet::Cp1251: case CharacterSet::Cp1252: case CharacterSet::Cp1256: { str.reserve(str.length() + length); for (size_t i = 0; i < length; ++i) { uint8_t c = bytes[i]; if (c < 128) str.push_back(c); else str.push_back(Codecs::SINGLE_BYTE_CODEPAGES[((int)charset - (int)CharacterSet::ISO8859_2) * 128 + c - 128]); } break; } case CharacterSet::Shift_JIS: { std::vector buf; JPTextDecoder::AppendShiftJIS(buf, bytes, length); TextUtfEncoding::AppendUtf16(str, buf.data(), buf.size()); break; } case CharacterSet::Big5: { std::vector buf; Big5TextDecoder::AppendBig5(buf, bytes, length); TextUtfEncoding::AppendUtf16(str, buf.data(), buf.size()); break; } case CharacterSet::GB2312: { std::vector buf; GBTextDecoder::AppendGB2312(buf, bytes, length); TextUtfEncoding::AppendUtf16(str, buf.data(), buf.size()); break; } case CharacterSet::GB18030: { std::vector buf; GBTextDecoder::AppendGB18030(buf, bytes, length); TextUtfEncoding::AppendUtf16(str, buf.data(), buf.size()); break; } case CharacterSet::EUC_JP: { std::vector buf; JPTextDecoder::AppendEUCJP(buf, bytes, length); TextUtfEncoding::AppendUtf16(str, buf.data(), buf.size()); break; } case CharacterSet::EUC_KR: { std::vector buf; KRTextDecoder::AppendEucKr(buf, bytes, length); TextUtfEncoding::AppendUtf16(str, buf.data(), buf.size()); break; break; } case CharacterSet::UnicodeBig: { str.reserve(str.length() + length / 2); for (size_t i = 0; i + 1 < length; i += 2) { str.push_back((static_cast(bytes[i]) << 8) + bytes[i + 1]); } break; } case CharacterSet::UTF8: { TextUtfEncoding::AppendUtf8(str, bytes, length); break; } default: break; } } /** * @param bytes bytes encoding a string, whose encoding should be guessed * @param hints decode hints if applicable * @return name of guessed encoding; at the moment will only guess one of: * {@link #SHIFT_JIS}, {@link #UTF8}, {@link #ISO88591}, or the platform * default encoding if none of these can possibly be correct */ CharacterSet TextDecoder::GuessEncoding(const uint8_t* bytes, size_t length, CharacterSet fallback) { // For now, merely tries to distinguish ISO-8859-1, UTF-8 and Shift_JIS, // which should be by far the most common encodings. bool canBeISO88591 = true; bool canBeShiftJIS = true; bool canBeUTF8 = true; int utf8BytesLeft = 0; //int utf8LowChars = 0; int utf2BytesChars = 0; int utf3BytesChars = 0; int utf4BytesChars = 0; int sjisBytesLeft = 0; //int sjisLowChars = 0; int sjisKatakanaChars = 0; //int sjisDoubleBytesChars = 0; int sjisCurKatakanaWordLength = 0; int sjisCurDoubleBytesWordLength = 0; int sjisMaxKatakanaWordLength = 0; int sjisMaxDoubleBytesWordLength = 0; //int isoLowChars = 0; //int isoHighChars = 0; int isoHighOther = 0; bool utf8bom = length > 3 && bytes[0] == 0xEF && bytes[1] == 0xBB && bytes[2] == 0xBF; for (size_t i = 0; i < length && (canBeISO88591 || canBeShiftJIS || canBeUTF8); ++i) { int value = bytes[i]; // UTF-8 stuff if (canBeUTF8) { if (utf8BytesLeft > 0) { if ((value & 0x80) == 0) { canBeUTF8 = false; } else { utf8BytesLeft--; } } else if ((value & 0x80) != 0) { if ((value & 0x40) == 0) { canBeUTF8 = false; } else { utf8BytesLeft++; if ((value & 0x20) == 0) { utf2BytesChars++; } else { utf8BytesLeft++; if ((value & 0x10) == 0) { utf3BytesChars++; } else { utf8BytesLeft++; if ((value & 0x08) == 0) { utf4BytesChars++; } else { canBeUTF8 = false; } } } } } //else { //utf8LowChars++; //} } // ISO-8859-1 stuff if (canBeISO88591) { if (value > 0x7F && value < 0xA0) { canBeISO88591 = false; } else if (value > 0x9F) { if (value < 0xC0 || value == 0xD7 || value == 0xF7) { isoHighOther++; } //else { //isoHighChars++; //} } //else { //isoLowChars++; //} } // Shift_JIS stuff if (canBeShiftJIS) { if (sjisBytesLeft > 0) { if (value < 0x40 || value == 0x7F || value > 0xFC) { canBeShiftJIS = false; } else { sjisBytesLeft--; } } else if (value == 0x80 || value == 0xA0 || value > 0xEF) { canBeShiftJIS = false; } else if (value > 0xA0 && value < 0xE0) { sjisKatakanaChars++; sjisCurDoubleBytesWordLength = 0; sjisCurKatakanaWordLength++; if (sjisCurKatakanaWordLength > sjisMaxKatakanaWordLength) { sjisMaxKatakanaWordLength = sjisCurKatakanaWordLength; } } else if (value > 0x7F) { sjisBytesLeft++; //sjisDoubleBytesChars++; sjisCurKatakanaWordLength = 0; sjisCurDoubleBytesWordLength++; if (sjisCurDoubleBytesWordLength > sjisMaxDoubleBytesWordLength) { sjisMaxDoubleBytesWordLength = sjisCurDoubleBytesWordLength; } } else { //sjisLowChars++; sjisCurKatakanaWordLength = 0; sjisCurDoubleBytesWordLength = 0; } } } if (canBeUTF8 && utf8BytesLeft > 0) { canBeUTF8 = false; } if (canBeShiftJIS && sjisBytesLeft > 0) { canBeShiftJIS = false; } // Easy -- if there is BOM or at least 1 valid not-single byte character (and no evidence it can't be UTF-8), done if (canBeUTF8 && (utf8bom || utf2BytesChars + utf3BytesChars + utf4BytesChars > 0)) { return CharacterSet::UTF8; } bool assumeShiftJIS = fallback == CharacterSet::Shift_JIS || fallback == CharacterSet::EUC_JP; // Easy -- if assuming Shift_JIS or at least 3 valid consecutive not-ascii characters (and no evidence it can't be), done if (canBeShiftJIS && (assumeShiftJIS || sjisMaxKatakanaWordLength >= 3 || sjisMaxDoubleBytesWordLength >= 3)) { return CharacterSet::Shift_JIS; } // Distinguishing Shift_JIS and ISO-8859-1 can be a little tough for short words. The crude heuristic is: // - If we saw // - only two consecutive katakana chars in the whole text, or // - at least 10% of bytes that could be "upper" not-alphanumeric Latin1, // - then we conclude Shift_JIS, else ISO-8859-1 if (canBeISO88591 && canBeShiftJIS) { return (sjisMaxKatakanaWordLength == 2 && sjisKatakanaChars == 2) || isoHighOther * 10 >= (int)length ? CharacterSet::Shift_JIS : CharacterSet::ISO8859_1; } // Otherwise, try in order ISO-8859-1, Shift JIS, UTF-8 and fall back to default platform encoding if (canBeISO88591) { return CharacterSet::ISO8859_1; } if (canBeShiftJIS) { return CharacterSet::Shift_JIS; } if (canBeUTF8) { return CharacterSet::UTF8; } // Otherwise, we take a wild guess with platform encoding return fallback; } CharacterSet TextDecoder::DefaultEncoding() { return CharacterSet::ISO8859_1; } } // ZXing zxing-cpp-1.0.8+ds2/core/src/TextDecoder.h000066400000000000000000000027121361167020700202320ustar00rootroot00000000000000#pragma once /* * Copyright 2016 Nu-book Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #include #include namespace ZXing { enum class CharacterSet; class TextDecoder { public: static CharacterSet DefaultEncoding(); static CharacterSet GuessEncoding(const uint8_t* bytes, size_t length, CharacterSet fallback = DefaultEncoding()); static void Append(std::wstring& str, const uint8_t* bytes, size_t length, CharacterSet charset); static void AppendLatin1(std::wstring& str, const std::string& latin1) { auto ptr = (const uint8_t*)latin1.data(); str.append(ptr, ptr + latin1.length()); } static std::wstring FromLatin1(const std::string& latin1) { auto ptr = (const uint8_t*)latin1.data(); return std::wstring(ptr, ptr + latin1.length()); } static std::wstring ToUnicode(const std::string& str, CharacterSet charset) { std::wstring r; Append(r, (const uint8_t*)str.data(), str.length(), charset); return r; } }; } // ZXing zxing-cpp-1.0.8+ds2/core/src/TextEncoder.cpp000066400000000000000000000346211361167020700206030ustar00rootroot00000000000000/* * Copyright 2016 Nu-book Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #include "TextEncoder.h" #include "CharacterSet.h" #include "TextUtfEncoding.h" #include "textcodec/JPTextEncoder.h" #include "textcodec/Big5TextEncoder.h" #include "textcodec/GBTextEncoder.h" #include "textcodec/KRTextEncoder.h" #include "ZXContainerAlgorithms.h" #include #include namespace ZXing { namespace { struct MapEntry { uint16_t unicode; uint8_t count; uint8_t charcode; }; inline bool operator<(const uint16_t& val, const MapEntry& b) { return val < b.unicode; } static const MapEntry latin2Mapping[45] = { {0x0080,33, 0}, {0x00a4, 1, 36}, {0x00a7, 2, 39}, {0x00ad, 1, 45}, {0x00b0, 1, 48}, {0x00b4, 1, 52}, {0x00b8, 1, 56}, {0x00c1, 2, 65}, {0x00c4, 1, 68}, {0x00c7, 1, 71}, {0x00c9, 1, 73}, {0x00cb, 1, 75}, {0x00cd, 2, 77}, {0x00d3, 2, 83}, {0x00d6, 2, 86}, {0x00da, 1, 90}, {0x00dc, 2, 92}, {0x00df, 1, 95}, {0x00e1, 2, 97}, {0x00e4, 1,100}, {0x00e7, 1,103}, {0x00e9, 1,105}, {0x00eb, 1,107}, {0x00ed, 2,109}, {0x00f3, 2,115}, {0x00f6, 2,118}, {0x00fa, 1,122}, {0x00fc, 2,124}, {0x0102, 6, 67}, {0x010c, 6, 72}, {0x0118, 4, 74}, {0x0139, 2, 69}, {0x013d, 2, 37}, {0x0141, 4, 35}, {0x0147, 2, 82}, {0x0150, 2, 85}, {0x0154, 2, 64}, {0x0158, 4, 88}, {0x015e, 8, 42}, {0x016e, 4, 89}, {0x0179, 6, 44}, {0x02c7, 1, 55}, {0x02d8, 2, 34}, {0x02db, 1, 50}, {0x02dd, 1, 61}, }; static const MapEntry latin3Mapping[30] = { {0x0080,33, 0}, {0x00a3, 2, 35}, {0x00a7, 2, 39}, {0x00ad, 1, 45}, {0x00b0, 1, 48}, {0x00b2, 4, 50}, {0x00b7, 2, 55}, {0x00bd, 1, 61}, {0x00c0, 3, 64}, {0x00c4, 1, 68}, {0x00c7, 9, 71}, {0x00d1, 4, 81}, {0x00d6, 2, 86}, {0x00d9, 4, 89}, {0x00df, 4, 95}, {0x00e4, 1,100}, {0x00e7, 9,103}, {0x00f1, 4,113}, {0x00f6, 2,118}, {0x00f9, 4,121}, {0x0108, 4, 70}, {0x011c, 6, 88}, {0x0124, 4, 38}, {0x0130, 2, 41}, {0x0134, 2, 44}, {0x015c, 4, 94}, {0x016c, 2, 93}, {0x017b, 2, 47}, {0x02d8, 2, 34}, {0xfffd, 1,112}, }; static const MapEntry latin4Mapping[40] = { {0x0080,33, 0}, {0x00a4, 1, 36}, {0x00a7, 2, 39}, {0x00ad, 1, 45}, {0x00af, 2, 47}, {0x00b4, 1, 52}, {0x00b8, 1, 56}, {0x00c1, 6, 65}, {0x00c9, 1, 73}, {0x00cb, 1, 75}, {0x00cd, 2, 77}, {0x00d4, 5, 84}, {0x00da, 3, 90}, {0x00df, 1, 95}, {0x00e1, 6, 97}, {0x00e9, 1,105}, {0x00eb, 1,107}, {0x00ed, 2,109}, {0x00f4, 5,116}, {0x00fa, 3,122}, {0x0100, 2, 64}, {0x0104, 2, 33}, {0x010c, 2, 72}, {0x0110, 4, 80}, {0x0116, 4, 76}, {0x0122, 2, 43}, {0x0128, 4, 37}, {0x012e, 2, 71}, {0x0136, 3, 83}, {0x013b, 2, 38}, {0x0145, 2, 81}, {0x014a, 4, 61}, {0x0156, 2, 35}, {0x0160, 2, 41}, {0x0166, 6, 44}, {0x0172, 2, 89}, {0x017d, 2, 46}, {0x02c7, 1, 55}, {0x02d9, 1,127}, {0x02db, 1, 50}, }; static const MapEntry latin5Mapping[8] = { {0x0080,33, 0}, {0x00a7, 1,125}, {0x00ad, 1, 45}, {0x0401,12, 33}, {0x040e,66, 46}, {0x0451,12,113}, {0x045e, 2,126}, {0x2116, 1,112}, }; static const MapEntry latin6Mapping[9] = { {0x0080,33, 0}, {0x00a4, 1, 36}, {0x00ad, 1, 45}, {0x060c, 1, 44}, {0x061b, 1, 59}, {0x061f, 1, 63}, {0x0621,26, 65}, {0x0640,19, 96}, {0xfffd, 1,127}, }; static const MapEntry latin7Mapping[16] = { {0x0080,33, 0}, {0x00a3, 1, 35}, {0x00a6, 4, 38}, {0x00ab, 3, 43}, {0x00b0, 4, 48}, {0x00b7, 1, 55}, {0x00bb, 1, 59}, {0x00bd, 1, 61}, {0x0384, 3, 52}, {0x0388, 3, 56}, {0x038c, 1, 60}, {0x038e,20, 62}, {0x03a3,44, 83}, {0x2015, 1, 47}, {0x2018, 2, 33}, {0xfffd, 1,127}, }; static const MapEntry latin8Mapping[11] = { {0x0080,33, 0}, {0x00a2, 8, 34}, {0x00ab, 4, 43}, {0x00b0,10, 48}, {0x00bb, 4, 59}, {0x00d7, 1, 42}, {0x00f7, 1, 58}, {0x05d0,27, 96}, {0x2017, 1, 95}, {0x203e, 1, 47}, {0xfffd, 1,127}, }; static const MapEntry latin9Mapping[8] = { {0x0080,80, 0}, {0x00d1,12, 81}, {0x00df,17, 95}, {0x00f1,12,113}, {0x00ff, 1,127}, {0x011e, 2, 80}, {0x0130, 2, 93}, {0x015e, 2, 94}, }; static const MapEntry latin10Mapping[36] = { {0x0080,33, 0}, {0x00a7, 1, 39}, {0x00ad, 1, 45}, {0x00b0, 1, 48}, {0x00b7, 1, 55}, {0x00c1, 6, 65}, {0x00c9, 1, 73}, {0x00cb, 1, 75}, {0x00cd, 4, 77}, {0x00d3, 4, 83}, {0x00d8, 1, 88}, {0x00da, 6, 90}, {0x00e1, 6, 97}, {0x00e9, 1,105}, {0x00eb, 1,107}, {0x00ed, 4,109}, {0x00f3, 4,115}, {0x00f8, 1,120}, {0x00fa, 5,122}, {0x0100, 2, 64}, {0x0104, 2, 33}, {0x010c, 2, 72}, {0x0110, 4, 41}, {0x0116, 4, 76}, {0x0122, 2, 35}, {0x0128, 4, 37}, {0x012e, 2, 71}, {0x0136, 3, 38}, {0x013b, 2, 40}, {0x0145, 2, 81}, {0x014a, 4, 47}, {0x0160, 2, 42}, {0x0166, 6, 43}, {0x0172, 2, 89}, {0x017d, 2, 44}, {0x2015, 1, 61}, }; static const MapEntry latin11Mapping[9] = { {0x0e01,58, 33}, {0x0e3f,29, 95}, {0x2013, 2, 22}, {0x2018, 2, 17}, {0x201c, 2, 19}, {0x2022, 1, 21}, {0x2026, 1, 5}, {0x20ac, 1, 0}, {0xfffd, 1,127}, }; static const MapEntry latin13Mapping[40] = { {0x0080,33, 0}, {0x00a2, 3, 34}, {0x00a6, 2, 38}, {0x00a9, 1, 41}, {0x00ab, 4, 43}, {0x00b0, 4, 48}, {0x00b5, 3, 53}, {0x00b9, 1, 57}, {0x00bb, 4, 59}, {0x00c4, 3, 68}, {0x00c9, 1, 73}, {0x00d3, 1, 83}, {0x00d5, 4, 85}, {0x00dc, 1, 92}, {0x00df, 1, 95}, {0x00e4, 3,100}, {0x00e9, 1,105}, {0x00f3, 1,115}, {0x00f5, 4,117}, {0x00fc, 1,124}, {0x0100, 2, 66}, {0x0104, 4, 64}, {0x010c, 2, 72}, {0x0112, 2, 71}, {0x0116, 4, 75}, {0x0122, 2, 76}, {0x012a, 2, 78}, {0x012e, 2, 65}, {0x0136, 2, 77}, {0x013b, 2, 79}, {0x0141, 6, 89}, {0x014c, 2, 84}, {0x0156, 2, 42}, {0x015a, 2, 90}, {0x0160, 2, 80}, {0x016a, 2, 91}, {0x0172, 2, 88}, {0x0179, 6, 74}, {0x2019, 1,127}, {0x201c, 3, 52}, }; static const MapEntry latin14Mapping[25] = { {0x0080,33, 0}, {0x00a3, 1, 35}, {0x00a7, 1, 39}, {0x00a9, 1, 41}, {0x00ad, 2, 45}, {0x00b6, 1, 54}, {0x00c0,16, 64}, {0x00d1, 6, 81}, {0x00d8, 6, 88}, {0x00df,17, 95}, {0x00f1, 6,113}, {0x00f8, 6,120}, {0x00ff, 1,127}, {0x010a, 2, 36}, {0x0120, 2, 50}, {0x0174, 5, 80}, {0x1e02, 2, 33}, {0x1e0a, 2, 38}, {0x1e1e, 2, 48}, {0x1e40, 2, 52}, {0x1e56, 2, 55}, {0x1e60, 2, 59}, {0x1e6a, 2, 87}, {0x1e80, 6, 40}, {0x1ef2, 2, 44}, }; static const MapEntry latin15Mapping[12] = { {0x0080,36, 0}, {0x00a5, 1, 37}, {0x00a7, 1, 39}, {0x00a9,11, 41}, {0x00b5, 3, 53}, {0x00b9, 3, 57}, {0x00bf,65, 63}, {0x0152, 2, 60}, {0x0160, 2, 38}, {0x0178, 1, 62}, {0x017d, 2, 52}, {0x20ac, 1, 36}, }; static const MapEntry latin16Mapping[34] = { {0x0080,33, 0}, {0x00a7, 1, 39}, {0x00a9, 1, 41}, {0x00ab, 1, 43}, {0x00ad, 1, 45}, {0x00b0, 2, 48}, {0x00b6, 2, 54}, {0x00bb, 1, 59}, {0x00c0, 3, 64}, {0x00c4, 1, 68}, {0x00c6,10, 70}, {0x00d2, 3, 82}, {0x00d6, 1, 86}, {0x00d9, 4, 89}, {0x00df, 4, 95}, {0x00e4, 1,100}, {0x00e6,10,102}, {0x00f2, 3,114}, {0x00f6, 1,118}, {0x00f9, 4,121}, {0x00ff, 1,127}, {0x0102, 6, 67}, {0x010c, 2, 50}, {0x0110, 2, 80}, {0x0118, 2, 93}, {0x0141, 4, 35}, {0x0150, 4, 85}, {0x015a, 2, 87}, {0x0160, 2, 38}, {0x0170, 2, 88}, {0x0178, 7, 62}, {0x0218, 4, 42}, {0x201d, 2, 53}, {0x20ac, 1, 36}, }; static const MapEntry cp437Mapping[58] = { {0x00a0, 4,127}, {0x00a5, 1, 29}, {0x00aa, 3, 38}, {0x00b0, 3,120}, {0x00b5, 1,102}, {0x00b7, 1,122}, {0x00ba, 4, 39}, {0x00bf, 1, 40}, {0x00c4, 4, 14}, {0x00c9, 1, 16}, {0x00d1, 1, 37}, {0x00d6, 1, 25}, {0x00dc, 1, 26}, {0x00df, 4, 97}, {0x00e4,12, 4}, {0x00f1, 4, 36}, {0x00f6, 2, 20}, {0x00f9, 4, 23}, {0x00ff, 1, 24}, {0x0192, 1, 31}, {0x0393, 1, 98}, {0x0398, 1,105}, {0x03a3, 1,100}, {0x03a6, 1,104}, {0x03a9, 1,106}, {0x03b1, 1, 96}, {0x03b4, 2,107}, {0x03c0, 1, 99}, {0x03c3, 2,101}, {0x03c6, 1,109}, {0x207f, 1,124}, {0x20a7, 1, 30}, {0x2219, 2,121}, {0x221e, 1,108}, {0x2229, 1,111}, {0x2248, 1,119}, {0x2261, 1,112}, {0x2264, 2,115}, {0x2310, 1, 41}, {0x2320, 2,116}, {0x2500, 1, 68}, {0x2502, 1, 51}, {0x250c, 1, 90}, {0x2510, 1, 63}, {0x2514, 1, 64}, {0x2518, 1, 89}, {0x251c, 1, 67}, {0x2524, 1, 52}, {0x252c, 1, 66}, {0x2534, 1, 65}, {0x253c, 1, 69}, {0x2550,29, 77}, {0x2580, 1, 95}, {0x2584, 1, 92}, {0x2588, 1, 91}, {0x258c, 1, 93}, {0x2590, 4, 94}, {0x25a0, 1,126}, }; static const MapEntry cp1250Mapping[55] = { {0x00a0, 1, 32}, {0x00a4, 1, 36}, {0x00a6, 4, 38}, {0x00ab, 4, 43}, {0x00b0, 2, 48}, {0x00b4, 5, 52}, {0x00bb, 1, 59}, {0x00c1, 2, 65}, {0x00c4, 1, 68}, {0x00c7, 1, 71}, {0x00c9, 1, 73}, {0x00cb, 1, 75}, {0x00cd, 2, 77}, {0x00d3, 2, 83}, {0x00d6, 2, 86}, {0x00da, 1, 90}, {0x00dc, 2, 92}, {0x00df, 1, 95}, {0x00e1, 2, 97}, {0x00e4, 1,100}, {0x00e7, 1,103}, {0x00e9, 1,105}, {0x00eb, 1,107}, {0x00ed, 2,109}, {0x00f3, 2,115}, {0x00f6, 2,118}, {0x00fa, 1,122}, {0x00fc, 2,124}, {0x0102, 6, 67}, {0x010c, 6, 72}, {0x0118, 4, 74}, {0x0139, 2, 69}, {0x013d, 2, 60}, {0x0141, 4, 35}, {0x0147, 2, 82}, {0x0150, 2, 85}, {0x0154, 2, 64}, {0x0158, 4, 88}, {0x015e, 8, 42}, {0x016e, 4, 89}, {0x0179, 6, 15}, {0x02c7, 1, 33}, {0x02d8, 2, 34}, {0x02db, 1, 50}, {0x02dd, 1, 61}, {0x2013, 2, 22}, {0x2018, 3, 17}, {0x201c, 3, 19}, {0x2020, 3, 6}, {0x2026, 1, 5}, {0x2030, 1, 9}, {0x2039, 2, 11}, {0x20ac, 1, 0}, {0x2122, 1, 25}, {0xfffd, 1, 24}, }; static const MapEntry cp1251Mapping[24] = { {0x00a0, 1, 32}, {0x00a4, 1, 36}, {0x00a6, 2, 38}, {0x00a9, 1, 41}, {0x00ab, 4, 43}, {0x00b0, 2, 48}, {0x00b5, 3, 53}, {0x00bb, 1, 59}, {0x0401,12, 40}, {0x040e,66, 33}, {0x0451,12, 56}, {0x045e, 2, 34}, {0x0490, 2, 37}, {0x2013, 2, 22}, {0x2018, 3, 17}, {0x201c, 3, 19}, {0x2020, 3, 6}, {0x2026, 1, 5}, {0x2030, 1, 9}, {0x2039, 2, 11}, {0x20ac, 1, 8}, {0x2116, 1, 57}, {0x2122, 1, 25}, {0xfffd, 1, 24}, }; static const MapEntry cp1252Mapping[18] = { {0x00a0,96, 32}, {0x0152, 2, 12}, {0x0160, 2, 10}, {0x0178, 1, 31}, {0x017d, 2, 14}, {0x0192, 1, 3}, {0x02c6, 1, 8}, {0x02dc, 1, 24}, {0x2013, 2, 22}, {0x2018, 3, 17}, {0x201c, 3, 19}, {0x2020, 3, 6}, {0x2026, 1, 5}, {0x2030, 1, 9}, {0x2039, 2, 11}, {0x20ac, 1, 0}, {0x2122, 1, 25}, {0xfffd, 1, 29}, }; static const MapEntry cp1256Mapping[43] = { {0x00a0, 1, 32}, {0x00a2, 8, 34}, {0x00ab,15, 43}, {0x00bb, 4, 59}, {0x00d7, 1, 87}, {0x00e0, 1, 96}, {0x00e2, 1, 98}, {0x00e7, 5,103}, {0x00ee, 2,110}, {0x00f4, 1,116}, {0x00f7, 1,119}, {0x00f9, 1,121}, {0x00fb, 2,123}, {0x0152, 2, 12}, {0x0192, 1, 3}, {0x02c6, 1, 8}, {0x060c, 1, 33}, {0x061b, 1, 58}, {0x061f, 1, 63}, {0x0621,26, 65}, {0x0640,19, 92}, {0x0679, 1, 10}, {0x067e, 1, 1}, {0x0686, 1, 13}, {0x0688, 1, 15}, {0x0691, 1, 26}, {0x0698, 1, 14}, {0x06a9, 1, 24}, {0x06af, 1, 16}, {0x06ba, 1, 31}, {0x06be, 1, 42}, {0x06c1, 1, 64}, {0x06d2, 1,127}, {0x200c, 4, 29}, {0x2013, 2, 22}, {0x2018, 3, 17}, {0x201c, 3, 19}, {0x2020, 3, 6}, {0x2026, 1, 5}, {0x2030, 1, 9}, {0x2039, 2, 11}, {0x20ac, 1, 0}, {0x2122, 1, 25}, }; static uint8_t unicodeToCharcode(uint16_t unicode, const MapEntry* entries, size_t entryCount) { auto it = std::upper_bound(entries, entries + entryCount, unicode); if (it != entries) { --it; if (unicode < it->unicode + it->count) { return it->charcode + (unicode - it->unicode) + 128; } } throw std::invalid_argument("Unexpected charcode"); } static void mapFromUnicode(const std::wstring& str, const MapEntry* entries, size_t entryCount, std::string& bytes) { bytes.reserve(str.length()); for (wchar_t c : str) { if (c < 0x80) { bytes.push_back(static_cast(c)); } else { bytes.push_back(static_cast(unicodeToCharcode(c, entries, entryCount))); } } } #define CONVERT_USING(table, str, bytes) mapFromUnicode(str, table, Length(table), bytes) } // anonymous void TextEncoder::GetBytes(const std::wstring& str, CharacterSet charset, std::string& bytes) { bytes.clear(); switch (charset) { case CharacterSet::Unknown: case CharacterSet::ISO8859_1: bytes.reserve(str.length()); for (wchar_t c : str) { if (c <= 0xff) { bytes.push_back(static_cast(c)); } else { throw std::invalid_argument("Unexpected charcode"); } } break; case CharacterSet::ASCII: { bytes.reserve(str.length()); for (wchar_t c : str) { if (c < 0x80) { bytes.push_back(static_cast(c)); } else { throw std::invalid_argument("Unexpected charcode"); } } break; } case CharacterSet::ISO8859_2: CONVERT_USING(latin2Mapping, str, bytes); break; case CharacterSet::ISO8859_3: CONVERT_USING(latin3Mapping, str, bytes); break; case CharacterSet::ISO8859_4: CONVERT_USING(latin4Mapping, str, bytes); break; case CharacterSet::ISO8859_5: CONVERT_USING(latin5Mapping, str, bytes); break; case CharacterSet::ISO8859_6: CONVERT_USING(latin6Mapping, str, bytes); break; case CharacterSet::ISO8859_7: CONVERT_USING(latin7Mapping, str, bytes); break; case CharacterSet::ISO8859_8: CONVERT_USING(latin8Mapping, str, bytes); break; case CharacterSet::ISO8859_9: CONVERT_USING(latin9Mapping, str, bytes); break; case CharacterSet::ISO8859_10: CONVERT_USING(latin10Mapping, str, bytes); break; case CharacterSet::ISO8859_11: CONVERT_USING(latin11Mapping, str, bytes); break; case CharacterSet::ISO8859_13: CONVERT_USING(latin13Mapping, str, bytes); break; case CharacterSet::ISO8859_14: CONVERT_USING(latin14Mapping, str, bytes); break; case CharacterSet::ISO8859_15: CONVERT_USING(latin15Mapping, str, bytes); break; case CharacterSet::ISO8859_16: CONVERT_USING(latin16Mapping, str, bytes); break; case CharacterSet::Cp437: CONVERT_USING(cp437Mapping, str, bytes); break; case CharacterSet::Cp1250: CONVERT_USING(cp1250Mapping, str, bytes); break; case CharacterSet::Cp1251: CONVERT_USING(cp1251Mapping, str, bytes); break; case CharacterSet::Cp1252: CONVERT_USING(cp1252Mapping, str, bytes); break; case CharacterSet::Cp1256: CONVERT_USING(cp1256Mapping, str, bytes); break; case CharacterSet::Shift_JIS: JPTextEncoder::EncodeShiftJIS(str, bytes); break; case CharacterSet::Big5: Big5TextEncoder::EncodeBig5(str, bytes); break; case CharacterSet::GB2312: GBTextEncoder::EncodeGB2312(str, bytes); break; case CharacterSet::GB18030: GBTextEncoder::EncodeGB18030(str, bytes); break; case CharacterSet::EUC_JP: JPTextEncoder::EncodeEUCJP(str, bytes); break; case CharacterSet::EUC_KR: KRTextDecoder::EncodeEucKr(str, bytes); break; case CharacterSet::UTF8: TextUtfEncoding::ToUtf8(str, bytes); break; default: break; } } } // ZXing zxing-cpp-1.0.8+ds2/core/src/TextEncoder.h000066400000000000000000000016501361167020700202440ustar00rootroot00000000000000#pragma once /* * Copyright 2016 Nu-book Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #include namespace ZXing { enum class CharacterSet; class TextEncoder { static void GetBytes(const std::wstring& str, CharacterSet charset, std::string& bytes); public: static std::string FromUnicode(const std::wstring& str, CharacterSet charset) { std::string r; GetBytes(str, charset, r); return r; } }; } // ZXing zxing-cpp-1.0.8+ds2/core/src/TextUtfEncoding.cpp000066400000000000000000000175301361167020700214310ustar00rootroot00000000000000/* * Copyright 2016 Nu-book Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #include "TextUtfEncoding.h" namespace ZXing { static size_t Utf8CountCodePoints(const uint8_t *utf8, size_t length) { size_t i = 0; size_t count = 0; while (i < length) { if (utf8[i] < 128) { ++i; } else { switch (utf8[i] & 0xf0) { case 0xc0: case 0xd0: i += 2; break; case 0xe0: i += 3; break; case 0xf0: i += 4; break; default: // we are in middle of a sequence ++i; while (i < length && (utf8[i] & 0xc0) == 0x80) ++i; break; } } ++count; } return count; } static const uint32_t kAccepted = 0; /// /// Copyright (c) 2008-2009 Bjoern Hoehrmann /// See http://bjoern.hoehrmann.de/utf-8/decoder/dfa/ for details. /// static uint32_t Utf8Decode(uint8_t byte, uint32_t& state, uint32_t& codep) { // Copyright (c) 2008-2009 Bjoern Hoehrmann // See http://bjoern.hoehrmann.de/utf-8/decoder/dfa/ for details. static const uint8_t kUtf8Data[] = { 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, // 00..1f 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, // 20..3f 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, // 40..5f 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, // 60..7f 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9, // 80..9f 7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7, // a0..bf 8,8,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2, // c0..df 0xa,0x3,0x3,0x3,0x3,0x3,0x3,0x3,0x3,0x3,0x3,0x3,0x3,0x4,0x3,0x3, // e0..ef 0xb,0x6,0x6,0x6,0x5,0x8,0x8,0x8,0x8,0x8,0x8,0x8,0x8,0x8,0x8,0x8, // f0..ff 0x0,0x1,0x2,0x3,0x5,0x8,0x7,0x1,0x1,0x1,0x4,0x6,0x1,0x1,0x1,0x1, // s0..s0 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,1,1,1,1,1,0,1,0,1,1,1,1,1,1, // s1..s2 1,2,1,1,1,1,1,2,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1, // s3..s4 1,2,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,3,1,3,1,1,1,1,1,1, // s5..s6 1,3,1,1,1,1,1,3,1,3,1,1,1,1,1,1,1,3,1,1,1,1,1,1,1,1,1,1,1,1,1,1, // s7..s8 }; uint32_t type = kUtf8Data[byte]; codep = (state != kAccepted) ? (byte & 0x3fu) | (codep << 6) : (0xff >> type) & (byte); state = kUtf8Data[256 + state * 16 + type]; return state; } template static void ConvertFromUtf8(const uint8_t* src, size_t length, std::basic_string& buffer, typename std::enable_if<(sizeof(WCharT) == 2)>::type* = nullptr) { const uint8_t* srcEnd = src + length; size_t destLen = Utf8CountCodePoints(src, length); if (destLen > 0) { buffer.reserve(buffer.size() + destLen); uint32_t codePoint = 0; uint32_t state = kAccepted; while (src < srcEnd) { if (Utf8Decode(*src++, state, codePoint) != kAccepted) { continue; } if (codePoint > 0xffff) { // surrogate pair buffer.push_back((WCharT)(0xd7c0 + (codePoint >> 10))); buffer.push_back((WCharT)(0xdc00 + (codePoint & 0x3ff))); } else { buffer.push_back((WCharT)codePoint); } } } } template static void ConvertFromUtf8(const uint8_t* src, size_t length, std::basic_string& buffer, typename std::enable_if<(sizeof(WCharT) == 4)>::type* = nullptr) { const uint8_t* srcEnd = src + length; size_t destLen = Utf8CountCodePoints(src, length); if (destLen > 0) { buffer.reserve(buffer.size() + destLen); uint32_t codePoint = 0; uint32_t state = kAccepted; while (src < srcEnd) { if (Utf8Decode(*src++, state, codePoint) != kAccepted) { continue; } buffer.push_back((WCharT)codePoint); } } } /// /// Count the number of bytes required to store given code points in UTF-8. /// template static size_t Utf8CountBytes(const WCharT* utf32, size_t length, typename std::enable_if<(sizeof(WCharT) == 4)>::type* = nullptr) { int result = 0; for (size_t i = 0; i < length; ++i) { unsigned codePoint = (unsigned)utf32[i]; if (codePoint < 0x80) { result += 1; } else if (codePoint < 0x800) { result += 2; } else if (codePoint < 0x10000) { result += 3; } else { result += 4; } } return result; } template static size_t Utf8CountBytes(const WCharT* utf16, size_t length, typename std::enable_if<(sizeof(WCharT) == 2)>::type* = nullptr) { int result = 0; for (size_t i = 0; i < length; ++i) { uint16_t codePoint = utf16[i]; if (codePoint < 0x80) { result += 1; } else if (codePoint < 0x800) { result += 2; } else if (TextUtfEncoding::IsUtf16HighSurrogate(codePoint)) { result += 4; ++i; } else { result += 3; } } return result; } static int Utf8Encode(uint32_t utf32, char* out) { if (utf32 < 0x80) { *out++ = static_cast(utf32); return 1; } if (utf32 < 0x800) { *out++ = static_cast((utf32 >> 6) | 0xc0); *out++ = static_cast((utf32 & 0x3f) | 0x80); return 2; } if (utf32 < 0x10000) { *out++ = static_cast((utf32 >> 12) | 0xe0); *out++ = static_cast(((utf32 >> 6) & 0x3f) | 0x80); *out++ = static_cast((utf32 & 0x3f) | 0x80); return 3; } *out++ = static_cast((utf32 >> 18) | 0xf0); *out++ = static_cast(((utf32 >> 12) & 0x3f) | 0x80); *out++ = static_cast(((utf32 >> 6) & 0x3f) | 0x80); *out++ = static_cast((utf32 & 0x3f) | 0x80); return 4; } template static void ConvertToUtf8(const std::basic_string& str, std::string& utf8, typename std::enable_if<(sizeof(WCharT) == 2)>::type* = nullptr) { char buffer[4]; int bufLength; for (size_t i = 0; i < str.length(); ++i) { if (i + 1 < str.length() && TextUtfEncoding::IsUtf16HighSurrogate(str[i]) && TextUtfEncoding::IsUtf16LowSurrogate(str[i + 1])) { bufLength = Utf8Encode(TextUtfEncoding::CodePointFromUtf16Surrogates(str[i], str[i + 1]), buffer); ++i; } else { bufLength = Utf8Encode(str[i], buffer); } utf8.append(buffer, bufLength); } } template static void ConvertToUtf8(const std::basic_string& str, std::string& utf8, typename std::enable_if<(sizeof(WCharT) == 4)>::type* = nullptr) { char buffer[4]; for (auto c : str) { auto bufLength = Utf8Encode(c, buffer); utf8.append(buffer, bufLength); } } void TextUtfEncoding::ToUtf8(const std::wstring& str, std::string& utf8) { utf8.reserve(str.length() + Utf8CountBytes(str.data(), str.length())); ConvertToUtf8(str, utf8); } std::wstring TextUtfEncoding::FromUtf8(const std::string& utf8) { std::wstring str; ConvertFromUtf8(reinterpret_cast(utf8.data()), utf8.length(), str); return str; } std::string TextUtfEncoding::ToUtf8(const std::wstring& str) { std::string utf8; ToUtf8(str, utf8); return utf8; } void TextUtfEncoding::AppendUtf16(std::wstring& str, const uint16_t* utf16, size_t length) { if (sizeof(wchar_t) == 2) { str.append(reinterpret_cast(utf16), length); } else { str.reserve(str.length() + length); for (size_t i = 0; i < length; ++i) { unsigned u = utf16[i]; if (IsUtf16HighSurrogate(u) && i + 1 < length) { unsigned low = utf16[i + 1]; if (IsUtf16LowSurrogate(low)) { ++i; u = CodePointFromUtf16Surrogates(u, low); } } str.push_back(static_cast(u)); } } } void TextUtfEncoding::AppendUtf8(std::wstring& str, const uint8_t* utf8, size_t length) { ConvertFromUtf8(utf8, length, str); } } // ZXing zxing-cpp-1.0.8+ds2/core/src/TextUtfEncoding.h000066400000000000000000000025501361167020700210720ustar00rootroot00000000000000#pragma once /* * Copyright 2016 Nu-book Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #include #include namespace ZXing { class TextUtfEncoding { public: static std::string ToUtf8(const std::wstring& str); static std::wstring FromUtf8(const std::string& utf8); static void ToUtf8(const std::wstring& str, std::string& utf8); static void AppendUtf16(std::wstring& str, const uint16_t* utf16, size_t length); static void AppendUtf8(std::wstring& str, const uint8_t* utf8, size_t length); template static bool IsUtf16HighSurrogate(T c) { return (c & 0xfc00) == 0xd800; } template static bool IsUtf16LowSurrogate(T c) { return (c & 0xfc00) == 0xdc00; } template static uint32_t CodePointFromUtf16Surrogates(T high, T low) { return (uint32_t(high) << 10) + low - 0x35fdc00; } }; } // ZXing zxing-cpp-1.0.8+ds2/core/src/WhiteRectDetector.cpp000066400000000000000000000177271361167020700217570ustar00rootroot00000000000000/* * Copyright 2016 Nu-book Inc. * Copyright 2016 ZXing authors * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #include "WhiteRectDetector.h" #include "BitMatrix.h" #include "DecodeStatus.h" #include "ZXNumeric.h" #include "ResultPoint.h" namespace ZXing { static const int INIT_SIZE = 10; static const int CORR = 1; bool WhiteRectDetector::Detect(const BitMatrix& image, ResultPoint& p0, ResultPoint& p1, ResultPoint& p2, ResultPoint& p3) { return Detect(image, INIT_SIZE, image.width() / 2, image.height() / 2, p0, p1, p2, p3); } /** * Determines whether a segment contains a black point * * @param a min value of the scanned coordinate * @param b max value of the scanned coordinate * @param fixed value of fixed coordinate * @param horizontal set to true if scan must be horizontal, false if vertical * @return true if a black point has been found, else false. */ static bool ContainsBlackPoint(const BitMatrix& image, int a, int b, int fixed, bool horizontal) { if (horizontal) { for (int x = a; x <= b; x++) { if (image.get(x, fixed)) { return true; } } } else { for (int y = a; y <= b; y++) { if (image.get(fixed, y)) { return true; } } } return false; } static bool GetBlackPointOnSegment(const BitMatrix& image, int aX, int aY, int bX, int bY, ResultPoint& result) { int dist = RoundToNearest(ResultPoint::Distance(aX, aY, bX, bY)); float xStep = static_cast(bX - aX) / dist; float yStep = static_cast(bY - aY) / dist; for (int i = 0; i < dist; i++) { int x = RoundToNearest(aX + i * xStep); int y = RoundToNearest(aY + i * yStep); if (image.get(x, y)) { result.set(static_cast(x), static_cast(y)); return true; } } return false; } /** * recenters the points of a constant distance towards the center * * @param y bottom most point * @param z left most point * @param x right most point * @param t top most point * @return {@link ResultPoint}[] describing the corners of the rectangular * region. The first and last points are opposed on the diagonal, as * are the second and third. The first point will be the topmost * point and the last, the bottommost. The second point will be * leftmost and the third, the rightmost */ static void CenterEdges(const ResultPoint& y, const ResultPoint& z, const ResultPoint& x, const ResultPoint& t, int width, ResultPoint& p0, ResultPoint& p1, ResultPoint& p2, ResultPoint& p3) { // // t t // z x // x OR z // y y // float yi = y.x(); float yj = y.y(); float zi = z.x(); float zj = z.y(); float xi = x.x(); float xj = x.y(); float ti = t.x(); float tj = t.y(); if (yi < width / 2.0f) { p0 = ResultPoint(ti - CORR, tj + CORR); p1 = ResultPoint(zi + CORR, zj + CORR); p2 = ResultPoint(xi - CORR, xj - CORR); p3 = ResultPoint(yi + CORR, yj - CORR); } else { p0 = ResultPoint(ti + CORR, tj + CORR); p1 = ResultPoint(zi + CORR, zj - CORR); p2 = ResultPoint(xi - CORR, xj + CORR); p3 = ResultPoint(yi - CORR, yj - CORR); } } /** *

* Detects a candidate barcode-like rectangular region within an image. It * starts around the center of the image, increases the size of the candidate * region until it finds a white rectangular region. *

* * @return {@link ResultPoint}[] describing the corners of the rectangular * region. The first and last points are opposed on the diagonal, as * are the second and third. The first point will be the topmost * point and the last, the bottommost. The second point will be * leftmost and the third, the rightmost * @throws NotFoundException if no Data Matrix Code can be found */ bool WhiteRectDetector::Detect(const BitMatrix& image, int initSize, int x, int y, ResultPoint& p0, ResultPoint& p1, ResultPoint& p2, ResultPoint& p3) { int height = image.height(); int width = image.width(); int halfsize = initSize / 2; int left = x - halfsize; int right = x + halfsize; int up = y - halfsize; int down = y + halfsize; if (up < 0 || left < 0 || down >= height || right >= width) { return false; } bool sizeExceeded = false; bool aBlackPointFoundOnBorder = true; bool atLeastOneBlackPointFoundOnBorder = false; bool atLeastOneBlackPointFoundOnRight = false; bool atLeastOneBlackPointFoundOnBottom = false; bool atLeastOneBlackPointFoundOnLeft = false; bool atLeastOneBlackPointFoundOnTop = false; while (aBlackPointFoundOnBorder) { aBlackPointFoundOnBorder = false; // ..... // . | // ..... bool rightBorderNotWhite = true; while ((rightBorderNotWhite || !atLeastOneBlackPointFoundOnRight) && right < width) { rightBorderNotWhite = ContainsBlackPoint(image, up, down, right, false); if (rightBorderNotWhite) { right++; aBlackPointFoundOnBorder = true; atLeastOneBlackPointFoundOnRight = true; } else if (!atLeastOneBlackPointFoundOnRight) { right++; } } if (right >= width) { sizeExceeded = true; break; } // ..... // . . // .___. bool bottomBorderNotWhite = true; while ((bottomBorderNotWhite || !atLeastOneBlackPointFoundOnBottom) && down < height) { bottomBorderNotWhite = ContainsBlackPoint(image, left, right, down, true); if (bottomBorderNotWhite) { down++; aBlackPointFoundOnBorder = true; atLeastOneBlackPointFoundOnBottom = true; } else if (!atLeastOneBlackPointFoundOnBottom) { down++; } } if (down >= height) { sizeExceeded = true; break; } // ..... // | . // ..... bool leftBorderNotWhite = true; while ((leftBorderNotWhite || !atLeastOneBlackPointFoundOnLeft) && left >= 0) { leftBorderNotWhite = ContainsBlackPoint(image, up, down, left, false); if (leftBorderNotWhite) { left--; aBlackPointFoundOnBorder = true; atLeastOneBlackPointFoundOnLeft = true; } else if (!atLeastOneBlackPointFoundOnLeft) { left--; } } if (left < 0) { sizeExceeded = true; break; } // .___. // . . // ..... bool topBorderNotWhite = true; while ((topBorderNotWhite || !atLeastOneBlackPointFoundOnTop) && up >= 0) { topBorderNotWhite = ContainsBlackPoint(image, left, right, up, true); if (topBorderNotWhite) { up--; aBlackPointFoundOnBorder = true; atLeastOneBlackPointFoundOnTop = true; } else if (!atLeastOneBlackPointFoundOnTop) { up--; } } if (up < 0) { sizeExceeded = true; break; } if (aBlackPointFoundOnBorder) { atLeastOneBlackPointFoundOnBorder = true; } } if (!sizeExceeded && atLeastOneBlackPointFoundOnBorder) { int maxSize = right - left; ResultPoint z; bool found = false; for (int i = 1; !found && i < maxSize; i++) { found = GetBlackPointOnSegment(image, left, down - i, left + i, down, z); } if (!found) { return false; } ResultPoint t; found = false; //go down right for (int i = 1; !found && i < maxSize; i++) { found = GetBlackPointOnSegment(image, left, up + i, left + i, up, t); } if (!found) { return false; } ResultPoint x; found = false; //go down left for (int i = 1; !found && i < maxSize; i++) { found = GetBlackPointOnSegment(image, right, up + i, right - i, up, x); } if (!found) { return false; } ResultPoint y; found = false; //go up left for (int i = 1; !found && i < maxSize; i++) { found = GetBlackPointOnSegment(image, right, down - i, right - i, down, y); } if (!found) { return false; } CenterEdges(y, z, x, t, width, p0, p1, p2, p3); return true; } else { return false; } } } // ZXing zxing-cpp-1.0.8+ds2/core/src/WhiteRectDetector.h000066400000000000000000000042001361167020700214020ustar00rootroot00000000000000#pragma once /* * Copyright 2016 Nu-book Inc. * Copyright 2016 ZXing authors * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ namespace ZXing { class BitMatrix; class ResultPoint; /** *

* Detects a candidate barcode-like rectangular region within an image. It * starts around the center of the image, increases the size of the candidate * region until it finds a white rectangular region. By keeping track of the * last black points it encountered, it determines the corners of the barcode. *

* * @author David Olivier */ class WhiteRectDetector { public: /** *

* Detects a candidate barcode-like rectangular region within an image. It * starts around the center of the image, increases the size of the candidate * region until it finds a white rectangular region. *

* * @param image barcode image to find a rectangle in * @param initSize initial size of search area around center * @param x x position of search center * @param y y position of search center * @return {@link ResultPoint}[] describing the corners of the rectangular * region. The first and last points are opposed on the diagonal, as * are the second and third. The first point will be the topmost * point and the last, the bottommost. The second point will be * leftmost and the third, the rightmost * @throws NotFoundException if no Data Matrix Code can be found */ static bool Detect(const BitMatrix& image, int initSize, int x, int y, ResultPoint& p0, ResultPoint& p1, ResultPoint& p2, ResultPoint& p3); static bool Detect(const BitMatrix& image, ResultPoint& p0, ResultPoint& p1, ResultPoint& p2, ResultPoint& p3); }; } // ZXing zxing-cpp-1.0.8+ds2/core/src/ZXBigInteger.cpp000066400000000000000000000411031361167020700206510ustar00rootroot00000000000000/* * Copyright 2016 Huy Cuong Nguyen * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #include "ZXBigInteger.h" #include "BitHacks.h" #include #include namespace ZXing { using Block = BigInteger::Block; using Magnitude = std::vector; static const size_t NB_BITS = 8 * sizeof(Block); static void AddMag(const Magnitude& a, const Magnitude& b, Magnitude& c) { // a2 points to the longer input, b2 points to the shorter const Magnitude& a2 = a.size() >= b.size() ? a : b; const Magnitude& b2 = a.size() >= b.size() ? b : a; // need to store the old sizes of a and b, in case c aliases either of them const size_t a2Size = a2.size(), b2Size = b2.size(); c.resize(a2Size + 1); size_t i = 0; bool carryIn = false; for (; i < b2Size; ++i) { auto temp = a2[i] + b2[i]; bool carryOut = (temp < a2[i]); if (carryIn) { ++temp; carryOut |= (temp == 0); } c[i] = temp; carryIn = carryOut; } // If there is a carry left over, increase blocks until one does not roll over. for (; i < a2Size && carryIn; ++i) { auto temp = a2[i] + 1; carryIn = (temp == 0); c[i] = temp; } // If the carry was resolved but the larger number still has blocks, copy them over. for (; i < a2Size; ++i) { c[i] = a2[i]; } // Set the extra block if there's still a carry, decrease length otherwise if (carryIn) { c[i] = 1; } else { c.pop_back(); } } // Note that we DO NOT support the case where b is greater than a. static void SubMag(const Magnitude& a, const Magnitude& b, Magnitude& c) { assert(a.size() >= b.size()); // need to store the old sizes of a and b, in case c aliases either of them const size_t aSize = a.size(), bSize = b.size(); c.resize(aSize); size_t i = 0; bool borrowIn = false; for (; i < bSize; ++i) { auto temp = a[i] - b[i]; // If a reverse rollover occurred, the result is greater than the block from a. bool borrowOut = (temp > a[i]); if (borrowIn) { borrowOut |= (temp == 0); temp--; } c[i] = temp; borrowIn = borrowOut; } // If there is a borrow left over, decrease blocks until one does not reverse rollover. for (; i < aSize && borrowIn; ++i) { borrowIn = (a[i] == 0); c[i] = a[i] - 1; } //if (borrowIn) { //throw error; //} // Copy over the rest of the blocks for (; i < aSize; ++i) { c[i] = a[i]; } // Zap leading zeros while (!c.empty() && c.back() == 0) { c.pop_back(); } } static inline Block GetShiftedBlock(const Magnitude& num, size_t x, size_t y) { Block part1 = (x == 0 || y == 0) ? Block(0) : (num[x - 1] >> (NB_BITS - y)); Block part2 = (x == num.size()) ? Block(0) : (num[x] << y); return part1 | part2; } static void MulMag(const Magnitude& a, const Magnitude& b, Magnitude& c) { // If either a or b is zero, set to zero. if (a.empty() || b.empty()) { c.clear(); return; } Magnitude tmp; Magnitude& r = &c == &a || &c == &b ? tmp : c; /* * Overall method: * * Set this = 0. * For each 1-bit of `a' (say the `i2'th bit of block `i'): * Add `b << (i blocks and i2 bits)' to *this. */ r.clear(); r.resize(a.size() + b.size(), 0); // For each block of the first number... for (size_t i = 0; i < a.size(); ++i) { // For each 1-bit of that block... for (size_t i2 = 0; i2 < NB_BITS; ++i2) { if ((a[i] & (Block(1) << i2)) == 0) continue; /* * Add b to this, shifted left i blocks and i2 bits. * j is the index in b, and k = i + j is the index in this. * * `getShiftedBlock', a short inline function defined above, * is now used for the bit handling. It replaces the more * complex `bHigh' code, in which each run of the loop dealt * immediately with the low bits and saved the high bits to * be picked up next time. The last run of the loop used to * leave leftover high bits, which were handled separately. * Instead, this loop runs an additional time with j == b.len. * These changes were made on 2005.01.11. */ size_t k = i; bool carryIn = false; for (size_t j = 0; j <= b.size(); ++j, ++k) { /* * The body of this loop is very similar to the body of the first loop * in `add', except that this loop does a `+=' instead of a `+'. */ auto temp = r[k] + GetShiftedBlock(b, j, i2); auto carryOut = (temp < r[k]); if (carryIn) { temp++; carryOut |= (temp == 0); } r[k] = temp; carryIn = carryOut; } // No more extra iteration to deal with `bHigh'. // Roll-over a carry as necessary. for (; carryIn; k++) { r[k]++; carryIn = (r[k] == 0); } } } // Zap possible leading zero if (r.back() == 0) { r.pop_back(); } if (&c != &r) c = std::move(r); } /* * DIVISION WITH REMAINDER * This monstrous function mods *this by the given divisor b while storing the * quotient in the given object q; at the end, *this contains the remainder. * The seemingly bizarre pattern of inputs and outputs was chosen so that the * function copies as little as possible (since it is implemented by repeated * subtraction of multiples of b from *this). * * "modWithQuotient" might be a better name for this function, but I would * rather not change the name now. */ static void DivideWithRemainder(const Magnitude& a, const Magnitude& b, Magnitude& qq, Magnitude& rr) { /* Defending against aliased calls is more complex than usual because we * are writing to both r and q. * * It would be silly to try to write quotient and remainder to the * same variable. Rule that out right away. */ assert(&rr != &qq); Magnitude tmp, tmp2; Magnitude& q = &qq == &a || &qq == &b ? tmp : qq; Magnitude& r = &rr == &b ? tmp2 : rr; /* * Knuth's definition of mod (which this function uses) is somewhat * different from the C++ definition of % in case of division by 0. * * We let a / 0 == 0 (it doesn't matter much) and a % 0 == a, no * exceptions thrown. This allows us to preserve both Knuth's demand * that a mod 0 == a and the useful property that * (a / b) * b + (a % b) == a. */ /* * If a.len < b.len, then a < b, and we can be sure that b doesn't go into * a at all. The quotient is 0 and *this is already the remainder (so leave it alone). */ if (b.empty() || a.size() < b.size()) { qq.clear(); rr = a; return; } // At this point we know a.len >= b.len > 0. (Whew!) /* * Overall method: * * For each appropriate i and i2, decreasing: * Subtract (b << (i blocks and i2 bits)) from *this, storing the * result in subtractBuf. * If the subtraction succeeds with a nonnegative result: * Turn on bit i2 of block i of the quotient q. * Copy subtractBuf back into *this. * Otherwise bit i2 of block i remains off, and *this is unchanged. * * Eventually q will contain the entire quotient, and *this will * be left with the remainder. * * subtractBuf[x] corresponds to blk[x], not blk[x+i], since 2005.01.11. * But on a single iteration, we don't touch the i lowest blocks of blk * (and don't use those of subtractBuf) because these blocks are * unaffected by the subtraction: we are subtracting * (b << (i blocks and i2 bits)), which ends in at least `i' zero * blocks. */ /* * Make sure we have an extra zero block just past the value. * * When we attempt a subtraction, we might shift `b' so * its first block begins a few bits left of the dividend, * and then we'll try to compare these extra bits with * a nonexistent block to the left of the dividend. The * extra zero block ensures sensible behavior; we need * an extra block in `subtractBuf' for exactly the same reason. */ if (&r != &a) { r.reserve(a.size() + 1); r = a; } r.push_back(0); Magnitude subtractBuf(r.size()); // Set preliminary length for quotient and make room q.resize(a.size() - b.size() + 1); // For each possible left-shift of b in blocks... size_t i = q.size(); while (i > 0) { i--; // For each possible left-shift of b in bits... // (Remember, N is the number of bits in a Blk.) q[i] = 0; size_t i2 = NB_BITS; while (i2 > 0) { i2--; /* * Subtract b, shifted left i blocks and i2 bits, from *this, * and store the answer in subtractBuf. In the for loop, `k == i + j'. * * Compare this to the middle section of `multiply'. They * are in many ways analogous. See especially the discussion * of `getShiftedBlock'. */ size_t k = i; bool borrowIn = false; for (size_t j = 0; j <= b.size(); ++j, ++k) { auto temp = r[k] - GetShiftedBlock(b, j, i2); bool borrowOut = (temp > r[k]); if (borrowIn) { borrowOut |= (temp == 0); temp--; } // Since 2005.01.11, indices of `subtractBuf' directly match those of `blk', so use `k'. subtractBuf[k] = temp; borrowIn = borrowOut; } // No more extra iteration to deal with `bHigh'. // Roll-over a borrow as necessary. for (; k < a.size() && borrowIn; k++) { borrowIn = (r[k] == 0); subtractBuf[k] = r[k] - 1; } /* * If the subtraction was performed successfully (!borrowIn), * set bit i2 in block i of the quotient. * * Then, copy the portion of subtractBuf filled by the subtraction * back to *this. This portion starts with block i and ends-- * where? Not necessarily at block `i + b.len'! Well, we * increased k every time we saved a block into subtractBuf, so * the region of subtractBuf we copy is just [i, k). */ if (!borrowIn) { q[i] |= (Block(1) << i2); while (k > i) { k--; r[k] = subtractBuf[k]; } } } } // Zap possible leading zero in quotient if (q.back() == 0) q.pop_back(); // Zap any/all leading zeros in remainder while (!r.empty() && r.back() == 0) { r.pop_back(); } if (&qq != &q) qq = std::move(q); if (&rr != &r) rr = std::move(r); } static int CompareMag(const Magnitude& a, const Magnitude& b) { // A bigger length implies a bigger number. if (a.size() < b.size()) { return -1; } else if (a.size() > b.size()) { return 1; } else { // Compare blocks one by one from left to right. auto p = std::mismatch(a.rbegin(), a.rend(), b.rbegin()); if (p.first != a.rend()) { return *p.first < *p.second ? -1 : 1; // note: cannot use substraction here } return 0; } } template static bool ParseFromString(const StrT& str, std::vector& mag, bool& negative) { auto iter = str.begin(); auto end = str.end(); while (iter != end && std::isspace(*iter)) ++iter; if (iter != end) { mag.clear(); negative = false; if (*iter == '-') { negative = true; ++iter; } else if (*iter == '+') { ++iter; } Magnitude ten{10}; Magnitude tmp{0}; for (int c; iter != end && std::isdigit(c = *iter); ++iter) { tmp[0] = c - '0'; MulMag(mag, ten, mag); AddMag(mag, tmp, mag); } return !mag.empty(); } return false; } bool BigInteger::TryParse(const std::string& str, BigInteger& result) { return ParseFromString(str, result.mag, result.negative); } bool BigInteger::TryParse(const std::wstring& str, BigInteger& result) { return ParseFromString(str, result.mag, result.negative); } void BigInteger::Add(const BigInteger& a, const BigInteger &b, BigInteger& c) { // If one argument is zero, copy the other. if (a.mag.empty()) { c = b; return; } if (b.mag.empty()) { c = a; return; } // If the arguments have the same sign, take the // common sign and add their magnitudes. if (a.negative == b.negative) { c.negative = a.negative; AddMag(a.mag, b.mag, c.mag); } else { // Otherwise, their magnitudes must be compared. int cmp = CompareMag(a.mag, b.mag); if (cmp < 0) { c.negative = b.negative; SubMag(b.mag, a.mag, c.mag); } else if (cmp > 0) { c.negative = a.negative; SubMag(a.mag, b.mag, c.mag); } else { c.negative = false; c.mag.clear(); } } } void BigInteger::Subtract(const BigInteger &a, const BigInteger &b, BigInteger& c) { if (a.mag.empty()) { c.negative = !b.negative; c.mag = b.mag; return; } if (b.mag.empty()) { c = a; return; } // If their signs differ, take a.sign and add the magnitudes. if (a.negative != b.negative) { c.negative = a.negative; AddMag(a.mag, b.mag, c.mag); } else { int cmp = CompareMag(a.mag, b.mag); if (cmp < 0) { c.negative = !b.negative; SubMag(b.mag, a.mag, c.mag); } else if (cmp > 0) { c.negative = a.negative; SubMag(a.mag, b.mag, c.mag); } else { c.negative = false; c.mag.clear(); } } } void BigInteger::Multiply(const BigInteger &a, const BigInteger &b, BigInteger& c) { if (a.mag.empty() || b.mag.empty()) { c.negative = false; c.mag.clear(); return; } c.negative = a.negative != b.negative; MulMag(a.mag, b.mag, c.mag); } /* * DIVISION WITH REMAINDER * Please read the comments before the definition of * `BigUnsigned::divideWithRemainder' in `BigUnsigned.cc' for lots of * information you should know before reading this function. * * Following Knuth, I decree that x / y is to be * 0 if y==0 and floor(real-number x / y) if y!=0. * Then x % y shall be x - y*(integer x / y). * * Note that x = y * (x / y) + (x % y) always holds. * In addition, (x % y) is from 0 to y - 1 if y > 0, * and from -(|y| - 1) to 0 if y < 0. (x % y) = x if y = 0. * * Examples: (q = a / b, r = a % b) * a b q r * === === === === * 4 3 1 1 * -4 3 -2 2 * 4 -3 -2 -2 * -4 -3 1 -1 */ void BigInteger::Divide(const BigInteger &a, const BigInteger &b, BigInteger "ient, BigInteger& remainder) { if (b.mag.empty() || a.mag.size() < b.mag.size()) { quotient.mag.clear(); quotient.negative = false; remainder = a; return; } // Do the operands have the same sign? if (a.negative == b.negative) { // Yes: easy case. Quotient is zero or positive. quotient.negative = false; DivideWithRemainder(a.mag, b.mag, quotient.mag, remainder.mag); } else { // No: harder case. Quotient is negative. quotient.negative = true; // Decrease the magnitude of the dividend by one. Magnitude one{ 1 }; Magnitude aa; SubMag(a.mag, one, aa); /* * We tinker with the dividend before and with the * quotient and remainder after so that the result * comes out right. To see why it works, consider the following * list of examples, where A is the magnitude-decreased * a, Q and R are the results of BigUnsigned division * with remainder on A and |b|, and q and r are the * final results we want: * * a A b Q R q r * -3 -2 3 0 2 -1 0 * -4 -3 3 1 0 -2 2 * -5 -4 3 1 1 -2 1 * -6 -5 3 1 2 -2 0 * * It appears that we need a total of 3 corrections: * Decrease the magnitude of a to get A. Increase the * magnitude of Q to get q (and make it negative). * Find r = (b - 1) - R and give it the desired sign. */ DivideWithRemainder(aa, b.mag, quotient.mag, remainder.mag); AddMag(quotient.mag, one, quotient.mag); // Modify the remainder. SubMag(b.mag, remainder.mag, remainder.mag); SubMag(remainder.mag, one, remainder.mag); } // Sign of the remainder is always the sign of the divisor b. remainder.negative = b.negative; // Set signs to zero as necessary. (Thanks David Allen!) if (remainder.mag.empty()) remainder.negative = false; if (quotient.mag.empty()) quotient.negative = false; } size_t ceilingDiv(size_t a, size_t b) { return (a + b - 1) / b; } std::string BigInteger::toString() const { if (mag.empty()) { return "0"; } std::string result; if (negative) { result.push_back('-'); } static const uint32_t base = 10; auto maxBitLenOfX = static_cast(mag.size()) * NB_BITS; int minBitsPerDigit = BitHacks::HighestBitSet(base); auto maxDigitLenOfX = (maxBitLenOfX + minBitsPerDigit - 1) / minBitsPerDigit; // ceilingDiv std::vector buffer; buffer.reserve(maxDigitLenOfX); Magnitude x2 = mag; Magnitude buBase{base}; Magnitude lastDigit; lastDigit.reserve(1); while (!x2.empty()) { // Get last digit. This is like `lastDigit = x2 % buBase, x2 /= buBase'. DivideWithRemainder(x2, buBase, x2, lastDigit); // Save the digit. buffer.push_back(static_cast(lastDigit.empty() ? 0 : lastDigit.front())); } size_t offset = result.size(); result.resize(offset + buffer.size()); std::transform(buffer.rbegin(), buffer.rend(), result.begin() + offset, [](uint8_t c) { return static_cast('0' + c); }); return result; } int BigInteger::toInt() const { if (mag.empty()) return 0; else if (negative) return -static_cast(mag.back()); else return static_cast(mag.back()); } } // ZXing zxing-cpp-1.0.8+ds2/core/src/ZXBigInteger.h000066400000000000000000000053251361167020700203240ustar00rootroot00000000000000#pragma once /* * Copyright 2016 Huy Cuong Nguyen * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #include #include #include #include #include #include namespace ZXing { /** * All credits on BigInteger below go to Matt McCutchen, as the code below is extracted/modified from his C++ Big Integer Library (https://mattmccutchen.net/bigint/) */ class BigInteger { public: using Block = size_t; // The number of bits in a block //static const unsigned int N = 8 * sizeof(Block); // Constructs zero. BigInteger() = default; template BigInteger(T x, typename std::enable_if::value && std::is_unsigned::value>::type* = nullptr) : mag(1, x) {} template BigInteger(T x, typename std::enable_if::value && std::is_signed::value>::type* = nullptr) : negative(x < 0), mag(1, std::abs(x)) {} static bool TryParse(const std::string& str, BigInteger& result); static bool TryParse(const std::wstring& str, BigInteger& result); bool isZero() const { return mag.empty(); } std::string toString() const; int toInt() const; inline BigInteger& operator+=(BigInteger&& a) { if (mag.empty()) *this = std::move(a); else Add(*this, a, *this); return *this; } friend inline BigInteger operator+(const BigInteger& a, const BigInteger& b) { BigInteger c; BigInteger::Add(a, b, c); return c; } friend inline BigInteger operator-(const BigInteger& a, const BigInteger& b) { BigInteger c; BigInteger::Subtract(a, b, c); return c; } friend inline BigInteger operator*(const BigInteger& a, const BigInteger& b) { BigInteger c; BigInteger::Multiply(a, b, c); return c; } friend inline std::ostream& operator<<(std::ostream& out, const BigInteger& x) { return out << x.toString(); } static void Add(const BigInteger& a, const BigInteger &b, BigInteger& c); static void Subtract(const BigInteger& a, const BigInteger &b, BigInteger& c); static void Multiply(const BigInteger& a, const BigInteger &b, BigInteger& c); static void Divide(const BigInteger& a, const BigInteger &b, BigInteger& quotient, BigInteger& remainder); private: bool negative = false; std::vector mag; }; } // ZXing zxing-cpp-1.0.8+ds2/core/src/ZXConfig.h000066400000000000000000000031351361167020700175070ustar00rootroot00000000000000#pragma once /* * Copyright 2016 Nu-book Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #ifndef __has_attribute #define __has_attribute(x) 0 #endif #define ZX_HAVE_CONFIG // Thread local or static memory may be used to reduce the number of (re-)allocations of temporary variables // in e.g. the ReedSolomonDecoder. It is disabled by default. It can be enabled by modifying the following define. // Note: The Apple clang compiler until XCode 8 does not support c++11's thread_local. // The alternative 'static' makes the code thread unsafe. #define ZX_THREAD_LOCAL // 'thread_local' or 'static' // The two basic data structures for storing bits (BitArray and BitMatrix) can be operated by storing one bit // of information either in one bit or one byte. Storing it in one byte is considerably faster, while obviously // using more memory. The effect of the memory usage while running the TestRunner is virtually invisible. // On embedded/mobile systems this might be of importance. Note: the BitMatrix in 'fast' mode still requires // only 1/3 of the same image in RGB. #define ZX_FAST_BIT_STORAGE // undef to disable zxing-cpp-1.0.8+ds2/core/src/ZXContainerAlgorithms.h000066400000000000000000000045071361167020700222620ustar00rootroot00000000000000#pragma once /* * Copyright 2017 Axel Waggershauser * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #include #include #include #include namespace ZXing { template auto Find(const Container& c, const Value& v) -> decltype(std::begin(c)) { return std::find(std::begin(c), std::end(c), v); } template auto FindIf(Container& c, Predicate p) -> decltype(std::begin(c)) { return std::find_if(std::begin(c), std::end(c), p); } template auto Contains(const Container& c, const Value& v) -> decltype(std::begin(c), bool()){ return std::find(std::begin(c), std::end(c), v) != std::end(c); } template auto Contains(const std::initializer_list& c, const Value& v) -> decltype(std::begin(c), bool()){ return std::find(std::begin(c), std::end(c), v) != std::end(c); } inline bool Contains(const char* str, char c) { return strchr(str, c) != nullptr; } template Value Accumulate(const Container& c, Value v = Value(0)) { return std::accumulate(std::begin(c), std::end(c), v); } template constexpr S Length(const T&) { return static_cast(std::extent::value); } template int IndexOf(const Container& c, const Value& v) { auto i = Find(c, v); return i == std::end(c) ? -1 : static_cast(i - std::begin(c)); } inline int IndexOf(const char* str, char c) { auto s = strchr(str, c); return s != nullptr ? static_cast(s - str) : -1; } template Value TransformReduce(const Container& c, Value s, UnaryOp op) { for (const auto& v : c) s += op(v); return s; } } // ZXing zxing-cpp-1.0.8+ds2/core/src/ZXFilesystem.h000066400000000000000000000024661361167020700204340ustar00rootroot00000000000000#pragma once /* * Copyright 2019 Axel Waggershauser. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #if __has_include() # include # ifdef __cpp_lib_filesystem namespace fs = std::filesystem; # endif #endif #if !defined(__cpp_lib_filesystem) && __has_include() # include # ifdef __cpp_lib_experimental_filesystem namespace fs = std::experimental::filesystem; # endif #endif #if !defined(__cpp_lib_filesystem) && !defined(__cpp_lib_experimental_filesystem) # error need standard filesystem library from c++-17 or the Filesystem TR #endif // compiling this with clang (e.g. version 6) might require linking against libc++experimental.a or libc++fs.a. // E.g.: CMAKE_EXE_LINKER_FLAGS = -L/usr/local/Cellar/llvm/6.0.1/lib -lc++experimental zxing-cpp-1.0.8+ds2/core/src/ZXNullable.h000066400000000000000000000052051361167020700200400ustar00rootroot00000000000000#pragma once /* * Copyright 2016 Huy Cuong Nguyen * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #include #include namespace ZXing { template class Nullable final { bool m_hasValue = false; T m_value; public: Nullable() = default; Nullable(const T &value) : m_hasValue(true), m_value(value) {} Nullable(T &&value) : m_hasValue(true), m_value(std::move(value)) {} Nullable(std::nullptr_t) {} Nullable & operator=(const T &value) { m_hasValue = true; m_value = value; return *this; } Nullable & operator=(T &&value) { m_hasValue = true; m_value = std::move(value); return *this; } Nullable & operator=(std::nullptr_t) { m_hasValue = false; m_value = T(); return *this; } operator T() const { if (!m_hasValue) { throw std::logic_error("Access empty value"); } return m_value; } bool hasValue() const { return m_hasValue; } const T & value() const { return m_value; } T & value() { return m_value; } friend inline bool operator==(const Nullable &a, const Nullable &b) { return a.m_hasValue == b.m_hasValue && (!a.m_hasValue || a.m_value == b.m_value); } friend inline bool operator!=(const Nullable &a, const Nullable &b) { return !(a == b); } friend inline bool operator==(const Nullable &a, const T &v) { return a.m_hasValue && a.m_value == v; } friend inline bool operator!=(const Nullable &a, const T &v) { return !(a == v); } friend inline bool operator==(const T &v, const Nullable &a) { return a.m_hasValue && a.m_value == v; } friend inline bool operator!=(const T &v, const Nullable &a) { return !(v == a); } friend inline bool operator==(const Nullable &a, std::nullptr_t) { return !a.m_hasValue; } friend inline bool operator!=(const Nullable &a, std::nullptr_t) { return a.m_hasValue; } friend inline bool operator==(std::nullptr_t, const Nullable &a) { return !a.m_hasValue; } friend inline bool operator!=(std::nullptr_t, const Nullable &a) { return a.m_hasValue; } friend inline void swap(Nullable &a, Nullable &b) { using std::swap; swap(a.m_value, b.m_value); swap(a.m_hasValue, b.m_hasValue); } }; } // ZXing zxing-cpp-1.0.8+ds2/core/src/ZXNumeric.h000066400000000000000000000065671361167020700177200ustar00rootroot00000000000000#pragma once /* * Copyright 2016 Huy Cuong Nguyen * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #include #include #include #include namespace ZXing { static const float kPi = 3.14159265358979323846f; static const float kPi2 = 1.57079632679489661923f; static const float kPi4 = 0.785398163397448309616f; static const float kEpsilon = std::numeric_limits::epsilon() * 10; static const float kDegPerRad = 180.0f/ kPi; static const float kRadPerDeg = kPi / 180.0f; static const float kDeg2Rad = kRadPerDeg; static const float kRad2Deg = kDegPerRad; static const float kInfinity = std::numeric_limits::infinity(); static const float kTinyDistance = 1e-4f; /// Test the 'closeness' of two numbers template typename std::enable_if::value, bool>::type FuzzyEqual(T a, T b, T tolerance = std::numeric_limits::epsilon() * 10) { T fa = std::fabs(a); T fb = std::fabs(b); return std::fabs(a - b) <= tolerance * (fa > fb ? fa : fb); } /// Test the equality of two numbers with a fixed tolerance template typename std::enable_if::value, bool>::type IsEqual(T a, T b, T tolerance = std::numeric_limits::epsilon() * 10) { return std::fabs(a - b) <= tolerance; } template typename std::enable_if::value, bool>::type IsEqual(T a, T b) { return a == b; } /// Test if a number is == 0 template typename std::enable_if::value, bool>::type IsZero(T a, T tolerance = std::numeric_limits::epsilon() * 10) { return std::fabs(a) <= tolerance; } template typename std::enable_if::value, bool>::type IsZero(T a) { return a == 0; } template inline T Clamp(T n, T lower, T upper) { return n <= lower ? lower : n >= upper ? upper : n; } template typename std::enable_if::value, int>::type RoundToNearest(T x) { #if defined(__ANDROID__) && defined(__GNUC__) return static_cast(round(x)); #else return static_cast(std::round(x)); #endif } /// /// Return -1 if x is negative, 1 if it's positve or 0 otherwise. /// template typename std::enable_if::value, T>::type SignOf(T x) { return T((x > 0) - (x < 0)); } template typename std::enable_if::value, T>::type SignOf(T x) { return (x >> (sizeof(T)*8 - 1)) | (T(-x) >> (sizeof(T)*8 - 1)); } template typename std::enable_if::value, bool>::type SameSign(T a, T b) { return (a^b) >= 0; } template typename std::enable_if::value, bool>::type SameSign(T a, T b) { return a*b >= 0; } template typename std::enable_if::value, T>::type HalfOf(T x) { return T(0.5) * x; } } // namespace ZXing zxing-cpp-1.0.8+ds2/core/src/ZXStrConvWorkaround.h000066400000000000000000000021501361167020700217500ustar00rootroot00000000000000#pragma once /* * Copyright 2016 Nu-book Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #if defined(__ANDROID__) && defined(__GNUC__) && !defined(__clang__) #include #include namespace std { template inline std::string to_string(T x) { std::stringstream buf; buf << x; return buf.str(); } template inline std::wstring to_wstring(T x) { std::wstringstream buf; buf << x; return buf.str(); } inline int stoi(const std::string& s) { return atoi(s.c_str()); } inline long long stoll(const std::string& s) { return atoll(s.c_str()); } } #endif zxing-cpp-1.0.8+ds2/core/src/ZXTestSupport.h000066400000000000000000000001741361167020700206160ustar00rootroot00000000000000#pragma once #ifdef ZXING_BUILD_FOR_TEST #define ZXING_EXPORT_TEST_ONLY #else #define ZXING_EXPORT_TEST_ONLY static #endif zxing-cpp-1.0.8+ds2/core/src/aztec/000077500000000000000000000000001361167020700167535ustar00rootroot00000000000000zxing-cpp-1.0.8+ds2/core/src/aztec/AZDecoder.cpp000066400000000000000000000247621361167020700212720ustar00rootroot00000000000000/* * Copyright 2016 Nu-book Inc. * Copyright 2016 ZXing authors * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #include "AZDecoder.h" #include "AZDetectorResult.h" #include "DecoderResult.h" #include "ReedSolomonDecoder.h" #include "GenericGF.h" #include "DecodeStatus.h" #include "BitMatrix.h" #include "TextDecoder.h" #include "ZXTestSupport.h" #include #include namespace ZXing { namespace Aztec { enum class Table { UPPER, LOWER, MIXED, DIGIT, PUNCT, BINARY }; static const char* UPPER_TABLE[] = { "CTRL_PS", " ", "A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K", "L", "M", "N", "O", "P", "Q", "R", "S", "T", "U", "V", "W", "X", "Y", "Z", "CTRL_LL", "CTRL_ML", "CTRL_DL", "CTRL_BS" }; static const char* LOWER_TABLE[] = { "CTRL_PS", " ", "a", "b", "c", "d", "e", "f", "g", "h", "i", "j", "k", "l", "m", "n", "o", "p", "q", "r", "s", "t", "u", "v", "w", "x", "y", "z", "CTRL_US", "CTRL_ML", "CTRL_DL", "CTRL_BS" }; static const char* MIXED_TABLE[] = { "CTRL_PS", " ", "\1", "\2", "\3", "\4", "\5", "\6", "\7", "\b", "\t", "\n", "\13", "\f", "\r", "\33", "\34", "\35", "\36", "\37", "@", "\\", "^", "_", "`", "|", "~", "\177", "CTRL_LL", "CTRL_UL", "CTRL_PL", "CTRL_BS" }; static const char* PUNCT_TABLE[] = { "", "\r", "\r\n", ". ", ", ", ": ", "!", "\"", "#", "$", "%", "&", "'", "(", ")", "*", "+", ",", "-", ".", "/", ":", ";", "<", "=", ">", "?", "[", "]", "{", "}", "CTRL_UL" }; static const char* DIGIT_TABLE[] = { "CTRL_PS", " ", "0", "1", "2", "3", "4", "5", "6", "7", "8", "9", ",", ".", "CTRL_UL", "CTRL_US" }; inline static int TotalBitsInLayer(int layers, bool compact) { return ((compact ? 88 : 112) + 16 * layers) * layers; } /** * Gets the array of bits from an Aztec Code matrix * * @return the array of bits */ static std::vector ExtractBits(const DetectorResult& ddata) { bool compact = ddata.isCompact(); int layers = ddata.nbLayers(); int baseMatrixSize = (compact ? 11 : 14) + layers * 4; // not including alignment lines std::vector alignmentMap(baseMatrixSize, 0); if (compact) { std::iota(alignmentMap.begin(), alignmentMap.end(), 0); } else { int matrixSize = baseMatrixSize + 1 + 2 * ((baseMatrixSize / 2 - 1) / 15); int origCenter = baseMatrixSize / 2; int center = matrixSize / 2; for (int i = 0; i < origCenter; i++) { int newOffset = i + i / 15; alignmentMap[origCenter - i - 1] = center - newOffset - 1; alignmentMap[origCenter + i] = center + newOffset + 1; } } auto& matrix = ddata.bits(); std::vector rawbits(TotalBitsInLayer(layers, compact)); for (int i = 0, rowOffset = 0; i < layers; i++) { int rowSize = (layers - i) * 4 + (compact ? 9 : 12); // The top-left most point of this layer is (not including alignment lines) int low = i * 2; // The bottom-right most point of this layer is (not including alignment lines) int high = baseMatrixSize - 1 - low; // We pull bits from the two 2 x rowSize columns and two rowSize x 2 rows for (int j = 0; j < rowSize; j++) { int columnOffset = j * 2; for (int k = 0; k < 2; k++) { // left column rawbits[rowOffset + columnOffset + k] = matrix.get(alignmentMap[low + k], alignmentMap[low + j]); // bottom row rawbits[rowOffset + 2 * rowSize + columnOffset + k] = matrix.get(alignmentMap[low + j], alignmentMap[high - k]); // right column rawbits[rowOffset + 4 * rowSize + columnOffset + k] = matrix.get(alignmentMap[high - k], alignmentMap[high - j]); // top row rawbits[rowOffset + 6 * rowSize + columnOffset + k] = matrix.get(alignmentMap[high - j], alignmentMap[low + k]); } } rowOffset += rowSize * 8; } return rawbits; } /** * Reads a code of given length and at given index in an array of bits */ static int ReadCode(const std::vector& rawbits, int startIndex, int length) { int res = 0; for (int i = startIndex; i < startIndex + length; i++) { res = (res << 1) | static_cast(rawbits[i]); } return res; } /** *

Performs RS error correction on an array of bits.

* * @return the corrected array * @throws FormatException if the input contains too many errors */ static bool CorrectBits(const DetectorResult& ddata, const std::vector& rawbits, std::vector& correctedBits) { const GenericGF* gf = nullptr; int codewordSize; if (ddata.nbLayers() <= 2) { codewordSize = 6; gf = &GenericGF::AztecData6(); } else if (ddata.nbLayers() <= 8) { codewordSize = 8; gf = &GenericGF::AztecData8(); } else if (ddata.nbLayers() <= 22) { codewordSize = 10; gf = &GenericGF::AztecData10(); } else { codewordSize = 12; gf = &GenericGF::AztecData12(); } int numDataCodewords = ddata.nbDatablocks(); int numCodewords = static_cast(rawbits.size()) / codewordSize; if (numCodewords < numDataCodewords) { return false; } int offset = rawbits.size() % codewordSize; int numECCodewords = numCodewords - numDataCodewords; std::vector dataWords(numCodewords); for (int i = 0; i < numCodewords; i++, offset += codewordSize) { dataWords[i] = ReadCode(rawbits, offset, codewordSize); } if (!ReedSolomonDecoder::Decode(*gf, dataWords, numECCodewords)) return false; // Now perform the unstuffing operation. // First, count how many bits are going to be thrown out as stuffing int mask = (1 << codewordSize) - 1; int stuffedBits = 0; for (int i = 0; i < numDataCodewords; i++) { int dataWord = dataWords[i]; if (dataWord == 0 || dataWord == mask) { return false; } else if (dataWord == 1 || dataWord == mask - 1) { stuffedBits++; } } // Now, actually unpack the bits and remove the stuffing correctedBits.resize(numDataCodewords * codewordSize - stuffedBits); int index = 0; for (int i = 0; i < numDataCodewords; i++) { int dataWord = dataWords[i]; if (dataWord == 1 || dataWord == mask - 1) { // next codewordSize-1 bits are all zeros or all ones std::fill_n(correctedBits.begin() + index, codewordSize - 1, dataWord > 1); index += codewordSize - 1; } else { for (int bit = codewordSize - 1; bit >= 0; --bit) { correctedBits[index++] = (dataWord & (1 << bit)) != 0; } } } return true; } /** * gets the table corresponding to the char passed */ static Table GetTable(char t) { switch (t) { case 'L': return Table::LOWER; case 'P': return Table::PUNCT; case 'M': return Table::MIXED; case 'D': return Table::DIGIT; case 'B': return Table::BINARY; case 'U': default: return Table::UPPER; } } /** * Gets the character (or string) corresponding to the passed code in the given table * * @param table the table used * @param code the code of the character */ static const char* GetCharacter(Table table, int code) { switch (table) { case Table::UPPER: return UPPER_TABLE[code]; case Table::LOWER: return LOWER_TABLE[code]; case Table::MIXED: return MIXED_TABLE[code]; case Table::PUNCT: return PUNCT_TABLE[code]; case Table::DIGIT: return DIGIT_TABLE[code]; default: return nullptr; // Should not reach here. //throw new IllegalStateException("Bad table"); } } /** * Gets the string encoded in the aztec code bits * * @return the decoded string */ ZXING_EXPORT_TEST_ONLY std::string GetEncodedData(const std::vector& correctedBits) { int endIndex = static_cast(correctedBits.size()); Table latchTable = Table::UPPER; // table most recently latched to Table shiftTable = Table::UPPER; // table to use for the next read std::string result; result.reserve(20); int index = 0; while (index < endIndex) { if (shiftTable == Table::BINARY) { if (endIndex - index < 5) { break; } int length = ReadCode(correctedBits, index, 5); index += 5; if (length == 0) { if (endIndex - index < 11) { break; } length = ReadCode(correctedBits, index, 11) + 31; index += 11; } for (int charCount = 0; charCount < length; charCount++) { if (endIndex - index < 8) { index = endIndex; // Force outer loop to exit break; } int code = ReadCode(correctedBits, index, 8); result.push_back((char)code); index += 8; } // Go back to whatever mode we had been in shiftTable = latchTable; } else { int size = shiftTable == Table::DIGIT ? 4 : 5; if (endIndex - index < size) { break; } int code = ReadCode(correctedBits, index, size); index += size; const char* str = GetCharacter(shiftTable, code); if (std::strncmp(str, "CTRL_", 5) == 0) { // Table changes // ISO/IEC 24778:2008 prescibes ending a shift sequence in the mode from which it was invoked. // That's including when that mode is a shift. // Our test case dlusbs.png for issue #642 exercises that. latchTable = shiftTable; // Latch the current mode, so as to return to Upper after U/S B/S shiftTable = GetTable(str[5]); if (str[6] == 'L') { latchTable = shiftTable; } } else { result.append(str); // Go back to whatever mode we had been in shiftTable = latchTable; } } } return result; } /** * Reads a code of length 8 in an array of bits, padding with zeros */ static uint8_t ReadByte(const std::vector& rawbits, int startIndex) { int n = static_cast(rawbits.size()) - startIndex; if (n >= 8) { return static_cast(ReadCode(rawbits, startIndex, 8)); } return static_cast(ReadCode(rawbits, startIndex, n) << (8 - n)); } /** * Packs a bit array into bytes, most significant bit first */ static ByteArray ConvertBoolArrayToByteArray(const std::vector& boolArr) { ByteArray byteArr(((int)boolArr.size() + 7) / 8); for (int i = 0; i < byteArr.length(); ++i) { byteArr[i] = ReadByte(boolArr, 8 * i); } return byteArr; } DecoderResult Decoder::Decode(const DetectorResult& detectorResult) { std::vector rawbits = ExtractBits(detectorResult); std::vector correctedBits; if (CorrectBits(detectorResult, rawbits, correctedBits)) { return DecoderResult(ConvertBoolArrayToByteArray(correctedBits), TextDecoder::FromLatin1(GetEncodedData(correctedBits))) .setNumBits(static_cast(correctedBits.size())); } else { return DecodeStatus::FormatError; } } } // Aztec } // ZXing zxing-cpp-1.0.8+ds2/core/src/aztec/AZDecoder.h000066400000000000000000000017441361167020700207320ustar00rootroot00000000000000#pragma once /* * Copyright 2016 Nu-book Inc. * Copyright 2016 ZXing authors * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ namespace ZXing { class DecoderResult; namespace Aztec { class DetectorResult; /** *

The main class which implements Aztec Code decoding -- as opposed to locating and extracting * the Aztec Code from an image.

* * @author David Olivier */ class Decoder { public: static DecoderResult Decode(const DetectorResult& detectorResult); }; } // Aztec } // ZXing zxing-cpp-1.0.8+ds2/core/src/aztec/AZDetector.cpp000066400000000000000000000430031361167020700214630ustar00rootroot00000000000000/* * Copyright 2016 Nu-book Inc. * Copyright 2016 ZXing authors * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #include "AZDetector.h" #include "AZDetectorResult.h" #include "BitHacks.h" #include "ZXNumeric.h" #include "ReedSolomonDecoder.h" #include "GenericGF.h" #include "WhiteRectDetector.h" #include "GridSampler.h" #include "DecodeStatus.h" #include "BitMatrix.h" #include namespace ZXing { namespace Aztec { static const int EXPECTED_CORNER_BITS[] = { 0xee0, // 07340 XXX .XX X.. ... 0x1dc, // 00734 ... XXX .XX X.. 0x83b, // 04073 X.. ... XXX .XX 0x707, // 03407 .XX X.. ... XXX }; // return -1 in case of error static int GetRotation(const std::array& sides, int length) { // In a normal pattern, we expect to See // ** .* D A // * * // // . * // .. .. C B // // Grab the 3 bits from each of the sides the form the locator pattern and concatenate // into a 12-bit integer. Start with the bit at A int cornerBits = 0; for (int side : sides) { // XX......X where X's are orientation marks int t = ((side >> (length - 2)) << 1) + (side & 1); cornerBits = (cornerBits << 3) + t; } // Mov the bottom bit to the top, so that the three bits of the locator pattern at A are // together. cornerBits is now: // 3 orientation bits at A || 3 orientation bits at B || ... || 3 orientation bits at D cornerBits = ((cornerBits & 1) << 11) + (cornerBits >> 1); // The result shift indicates which element of BullsEyeCorners[] goes into the top-left // corner. Since the four rotation values have a Hamming distance of 8, we // can easily tolerate two errors. for (int shift = 0; shift < 4; shift++) { if (BitHacks::CountBitsSet(cornerBits ^ EXPECTED_CORNER_BITS[shift]) <= 2) { return shift; } } return -1; } inline static bool IsValidPoint(int x, int y, int imgWidth, int imgHeight) { return x >= 0 && x < imgWidth && y > 0 && y < imgHeight; } inline static bool IsValidPoint(const ResultPoint& point, int imgWidth, int imgHeight) { return IsValidPoint(RoundToNearest(point.x()), RoundToNearest(point.y()), imgWidth, imgHeight); } //private static float distance(Point a, Point b) { // return MathUtils.distance(a.getX(), a.getY(), b.getX(), b.getY()); //} // //private static float distance(ResultPoint a, ResultPoint b) { // return MathUtils.distance(a.getX(), a.getY(), b.getX(), b.getY()); //} /** * Samples a line. * * @param p1 start point (inclusive) * @param p2 end point (exclusive) * @param size number of bits * @return the array of bits as an int (first bit is high-order bit of result) */ static int SampleLine(const BitMatrix& image, const ResultPoint& p1, const ResultPoint& p2, int size) { int result = 0; float d = ResultPoint::Distance(p1, p2); float moduleSize = d / size; float px = p1.x(); float py = p1.y(); float dx = moduleSize * (p2.x() - p1.x()) / d; float dy = moduleSize * (p2.y() - p1.y()) / d; for (int i = 0; i < size; i++) { if (image.get(RoundToNearest(px + i * dx), RoundToNearest(py + i * dy))) { result |= 1 << (size - i - 1); } } return result; } /** * Corrects the parameter bits using Reed-Solomon algorithm. * * @param parameterData parameter bits * @param compact true if this is a compact Aztec code */ static bool GetCorrectedParameterData(int64_t parameterData, bool compact, int& result) { int numCodewords; int numDataCodewords; if (compact) { numCodewords = 7; numDataCodewords = 2; } else { numCodewords = 10; numDataCodewords = 4; } int numECCodewords = numCodewords - numDataCodewords; std::vector parameterWords(numCodewords); for (int i = numCodewords - 1; i >= 0; --i) { parameterWords[i] = (int)parameterData & 0xF; parameterData >>= 4; } if (!ReedSolomonDecoder::Decode(GenericGF::AztecParam(), parameterWords, numECCodewords)) return false; // Toss the error correction. Just return the data as an integer result = 0; for (int i = 0; i < numDataCodewords; i++) { result = (result << 4) + parameterWords[i]; } return true; } /** * Extracts the number of data layers and data blocks from the layer around the bull's eye. * * @param bullsEyeCorners the array of bull's eye corners * @throws NotFoundException in case of too many errors or invalid parameters */ static bool ExtractParameters(const BitMatrix& image, const std::array& bullsEyeCorners, bool compact, int nbCenterLayers, int& nbLayers, int& nbDataBlocks, int& shift) { if (!IsValidPoint(bullsEyeCorners[0], image.width(), image.height()) || !IsValidPoint(bullsEyeCorners[1], image.width(), image.height()) || !IsValidPoint(bullsEyeCorners[2], image.width(), image.height()) || !IsValidPoint(bullsEyeCorners[3], image.width(), image.height())) { return false; } int length = 2 * nbCenterLayers; // Get the bits around the bull's eye std::array sides = { SampleLine(image, bullsEyeCorners[0], bullsEyeCorners[1], length), // Right side SampleLine(image, bullsEyeCorners[1], bullsEyeCorners[2], length), // Bottom SampleLine(image, bullsEyeCorners[2], bullsEyeCorners[3], length), // Left side SampleLine(image, bullsEyeCorners[3], bullsEyeCorners[0], length) // Top }; // bullsEyeCorners[shift] is the corner of the bulls'eye that has three // orientation marks. // sides[shift] is the row/column that goes from the corner with three // orientation marks to the corner with two. shift = GetRotation(sides, length); if (shift < 0) { return false; } // Flatten the parameter bits into a single 28- or 40-bit long int64_t parameterData = 0; for (int i = 0; i < 4; i++) { int side = sides[(shift + i) % 4]; if (compact) { // Each side of the form ..XXXXXXX. where Xs are parameter data parameterData <<= 7; parameterData += (side >> 1) & 0x7F; } else { // Each side of the form ..XXXXX.XXXXX. where Xs are parameter data parameterData <<= 10; parameterData += ((side >> 2) & (0x1f << 5)) + ((side >> 1) & 0x1F); } } // Corrects parameter data using RS. Returns just the data portion // without the error correction. int correctedData; if (!GetCorrectedParameterData(parameterData, compact, correctedData)) { return false; } if (compact) { // 8 bits: 2 bits layers and 6 bits data blocks nbLayers = (correctedData >> 6) + 1; nbDataBlocks = (correctedData & 0x3F) + 1; } else { // 16 bits: 5 bits layers and 11 bits data blocks nbLayers = (correctedData >> 11) + 1; nbDataBlocks = (correctedData & 0x7FF) + 1; } return true; } struct PixelPoint { int x; int y; ResultPoint toResultPoint() const { return {x, y}; } }; inline static float Distance(const PixelPoint& a, const PixelPoint& b) { return ResultPoint::Distance(a.x, a.y, b.x, b.y); } /** * Gets the color of a segment * * @return 1 if segment more than 90% black, -1 if segment is more than 90% white, 0 else */ static int GetColor(const BitMatrix& image, const PixelPoint& p1, const PixelPoint& p2) { if (!IsValidPoint(p1.x, p1.y, image.width(), image.height()) || !IsValidPoint(p2.x, p2.y, image.width(), image.height())) return 0; float d = Distance(p1, p2); float dx = (p2.x - p1.x) / d; float dy = (p2.y - p1.y) / d; int error = 0; float px = static_cast(p1.x); float py = static_cast(p1.y); bool colorModel = image.get(p1.x, p1.y); int iMax = (int)std::ceil(d); for (int i = 0; i < iMax; i++) { px += dx; py += dy; if (image.get(RoundToNearest(px), RoundToNearest(py)) != colorModel) { error++; } } float errRatio = error / d; if (errRatio > 0.1f && errRatio < 0.9f) { return 0; } return (errRatio <= 0.1f) == colorModel ? 1 : -1; } /** * @return true if the border of the rectangle passed in parameter is compound of white points only * or black points only */ static bool IsWhiteOrBlackRectangle(const BitMatrix& image, const PixelPoint& pt1, const PixelPoint& pt2, const PixelPoint& pt3, const PixelPoint& pt4) { int corr = 3; PixelPoint p1{ pt1.x - corr, pt1.y + corr }; PixelPoint p2{ pt2.x - corr, pt2.y - corr }; PixelPoint p3{ pt3.x + corr, pt3.y - corr }; PixelPoint p4{ pt4.x + corr, pt4.y + corr }; int cInit = GetColor(image, p4, p1); if (cInit == 0) { return false; } int c = GetColor(image, p1, p2); if (c != cInit) { return false; } c = GetColor(image, p2, p3); if (c != cInit) { return false; } c = GetColor(image, p3, p4); return c == cInit; } /** * Gets the coordinate of the first point with a different color in the given direction */ static PixelPoint GetFirstDifferent(const BitMatrix& image, const PixelPoint& init, bool color, int dx, int dy) { int x = init.x + dx; int y = init.y + dy; while (IsValidPoint(x, y, image.width(), image.height()) && image.get(x, y) == color) { x += dx; y += dy; } x -= dx; y -= dy; while (IsValidPoint(x, y, image.width(), image.height()) && image.get(x, y) == color) { x += dx; } x -= dx; while (IsValidPoint(x, y, image.width(), image.height()) && image.get(x, y) == color) { y += dy; } y -= dy; return PixelPoint{ x, y }; } /** * Expand the square represented by the corner points by pushing out equally in all directions * * @param cornerPoints the corners of the square, which has the bull's eye at its center * @param oldSide the original length of the side of the square in the target bit matrix * @param newSide the new length of the size of the square in the target bit matrix * @return the corners of the expanded square */ static void ExpandSquare(std::array& cornerPoints, float oldSide, float newSide) { float ratio = newSide / (2 * oldSide); float dx = cornerPoints[0].x() - cornerPoints[2].x(); float dy = cornerPoints[0].y() - cornerPoints[2].y(); float centerx = (cornerPoints[0].x() + cornerPoints[2].x()) / 2.0f; float centery = (cornerPoints[0].y() + cornerPoints[2].y()) / 2.0f; cornerPoints[0] = ResultPoint(centerx + ratio * dx, centery + ratio * dy); cornerPoints[2] = ResultPoint(centerx - ratio * dx, centery - ratio * dy); dx = cornerPoints[1].x() - cornerPoints[3].x(); dy = cornerPoints[1].y() - cornerPoints[3].y(); centerx = (cornerPoints[1].x() + cornerPoints[3].x()) / 2.0f; centery = (cornerPoints[1].y() + cornerPoints[3].y()) / 2.0f; cornerPoints[1] = ResultPoint(centerx + ratio * dx, centery + ratio * dy); cornerPoints[3] = ResultPoint(centerx - ratio * dx, centery - ratio * dy); } /** * Finds the corners of a bull-eye centered on the passed point. * This returns the centers of the diagonal points just outside the bull's eye * Returns [topRight, bottomRight, bottomLeft, topLeft] * * @param pCenter Center point * @return The corners of the bull-eye * @throws NotFoundException If no valid bull-eye can be found */ static bool GetBullsEyeCorners(const BitMatrix& image, const PixelPoint& pCenter, std::array& result, bool& compact, int& nbCenterLayers) { PixelPoint pina = pCenter; PixelPoint pinb = pCenter; PixelPoint pinc = pCenter; PixelPoint pind = pCenter; bool color = true; for (nbCenterLayers = 1; nbCenterLayers < 9; nbCenterLayers++) { PixelPoint pouta = GetFirstDifferent(image, pina, color, 1, -1); PixelPoint poutb = GetFirstDifferent(image, pinb, color, 1, 1); PixelPoint poutc = GetFirstDifferent(image, pinc, color, -1, 1); PixelPoint poutd = GetFirstDifferent(image, pind, color, -1, -1); //d a // //c b if (nbCenterLayers > 2) { float q = Distance(poutd, pouta) * nbCenterLayers / (Distance(pind, pina) * (nbCenterLayers + 2)); if (q < 0.75 || q > 1.25 || !IsWhiteOrBlackRectangle(image, pouta, poutb, poutc, poutd)) { break; } } pina = pouta; pinb = poutb; pinc = poutc; pind = poutd; color = !color; } if (nbCenterLayers != 5 && nbCenterLayers != 7) { return false; } compact = nbCenterLayers == 5; // Expand the square by .5 pixel in each direction so that we're on the border // between the white square and the black square result[0] = ResultPoint(pina.x + 0.5f, pina.y - 0.5f); result[1] = ResultPoint(pinb.x + 0.5f, pinb.y + 0.5f); result[2] = ResultPoint(pinc.x - 0.5f, pinc.y + 0.5f); result[3] = ResultPoint(pind.x - 0.5f, pind.y - 0.5f); // Expand the square so that its corners are the centers of the points // just outside the bull's eye. ExpandSquare(result, static_cast(2 * nbCenterLayers - 3), static_cast(2 * nbCenterLayers)); return true; } /** * Finds a candidate center point of an Aztec code from an image * * @return the center point */ static PixelPoint GetMatrixCenter(const BitMatrix& image) { //Get a white rectangle that can be the border of the matrix in center bull's eye or ResultPoint pointA, pointB, pointC, pointD; if (!WhiteRectDetector::Detect(image, pointA, pointB, pointC, pointD)) { // This exception can be in case the initial rectangle is white // In that case, surely in the bull's eye, we try to expand the rectangle. int cx = image.width() / 2; int cy = image.height() / 2; pointA = GetFirstDifferent(image, { cx + 7, cy - 7 }, false, 1, -1).toResultPoint(); pointB = GetFirstDifferent(image, { cx + 7, cy + 7 }, false, 1, 1).toResultPoint(); pointC = GetFirstDifferent(image, { cx - 7, cy + 7 }, false, -1, 1).toResultPoint(); pointD = GetFirstDifferent(image, { cx - 7, cy - 7 }, false, -1, -1).toResultPoint(); } //Compute the center of the rectangle int cx = RoundToNearest((pointA.x() + pointD.x() + pointB.x() + pointC.x()) / 4.0f); int cy = RoundToNearest((pointA.y() + pointD.y() + pointB.y() + pointC.y()) / 4.0f); // Redetermine the white rectangle starting from previously computed center. // This will ensure that we end up with a white rectangle in center bull's eye // in order to compute a more accurate center. if (!WhiteRectDetector::Detect(image, 15, cx, cy, pointA, pointB, pointC, pointD)) { // This exception can be in case the initial rectangle is white // In that case we try to expand the rectangle. pointA = GetFirstDifferent(image, { cx + 7, cy - 7 }, false, 1, -1).toResultPoint(); pointB = GetFirstDifferent(image, { cx + 7, cy + 7 }, false, 1, 1).toResultPoint(); pointC = GetFirstDifferent(image, { cx - 7, cy + 7 }, false, -1, 1).toResultPoint(); pointD = GetFirstDifferent(image, { cx - 7, cy - 7 }, false, -1, -1).toResultPoint(); } // Recompute the center of the rectangle cx = RoundToNearest((pointA.x() + pointD.x() + pointB.x() + pointC.x()) / 4.0f); cy = RoundToNearest((pointA.y() + pointD.y() + pointB.y() + pointC.y()) / 4.0f); return{ cx, cy }; } static int GetDimension(bool compact, int nbLayers) { if (compact) { return 4 * nbLayers + 11; } if (nbLayers <= 4) { return 4 * nbLayers + 15; } return 4 * nbLayers + 2 * ((nbLayers - 4) / 8 + 1) + 15; } /** * Gets the Aztec code corners from the bull's eye corners and the parameters. * * @param bullsEyeCorners the array of bull's eye corners * @return the array of aztec code corners */ static void GetMatrixCornerPoints(std::array& bullsEyeCorners, bool compact, int nbLayers, int nbCenterLayers) { ExpandSquare(bullsEyeCorners, static_cast(2 * nbCenterLayers), static_cast(GetDimension(compact, nbLayers))); } /** * Creates a BitMatrix by sampling the provided image. * topLeft, topRight, bottomRight, and bottomLeft are the centers of the squares on the * diagonal just outside the bull's eye. */ static BitMatrix SampleGrid(const BitMatrix& image, const ResultPoint& topLeft, const ResultPoint& topRight, const ResultPoint& bottomRight, const ResultPoint& bottomLeft, bool compact, int nbLayers, int nbCenterLayers) { int dimension = GetDimension(compact, nbLayers); float low = dimension / 2.0f - nbCenterLayers; float high = dimension / 2.0f + nbCenterLayers; return GridSampler::Instance()->sampleGrid(image, dimension, dimension, low, low, // topleft high, low, // topright high, high, // bottomright low, high, // bottomleft topLeft.x(), topLeft.y(), topRight.x(), topRight.y(), bottomRight.x(), bottomRight.y(), bottomLeft.x(), bottomLeft.y()); } DetectorResult Detector::Detect(const BitMatrix& image, bool isMirror) { // 1. Get the center of the aztec matrix auto pCenter = GetMatrixCenter(image); // 2. Get the center points of the four diagonal points just outside the bull's eye // [topRight, bottomRight, bottomLeft, topLeft] std::array bullsEyeCorners; bool compact = false; int nbCenterLayers = 0; if (!GetBullsEyeCorners(image, pCenter, bullsEyeCorners, compact, nbCenterLayers)) { return {}; } if (isMirror) { std::swap(bullsEyeCorners[0], bullsEyeCorners[2]); } // 3. Get the size of the matrix and other parameters from the bull's eye int nbLayers = 0; int nbDataBlocks = 0; int shift = 0; if (!ExtractParameters(image, bullsEyeCorners, compact, nbCenterLayers, nbLayers, nbDataBlocks, shift)) { return {}; } // 4. Sample the grid auto bits = SampleGrid(image, bullsEyeCorners[shift % 4], bullsEyeCorners[(shift + 1) % 4], bullsEyeCorners[(shift + 2) % 4], bullsEyeCorners[(shift + 3) % 4], compact, nbLayers, nbCenterLayers); if (bits.empty()) return {}; // 5. Get the corners of the matrix. GetMatrixCornerPoints(bullsEyeCorners, compact, nbLayers, nbCenterLayers); return {std::move(bits), {bullsEyeCorners.begin(), bullsEyeCorners.end()}, compact, nbDataBlocks, nbLayers}; } } // Aztec } // ZXing zxing-cpp-1.0.8+ds2/core/src/aztec/AZDetector.h000066400000000000000000000023771361167020700211410ustar00rootroot00000000000000#pragma once /* * Copyright 2016 Nu-book Inc. * Copyright 2016 ZXing authors * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ namespace ZXing { class BitMatrix; namespace Aztec { class DetectorResult; /** * Encapsulates logic that can detect an Aztec Code in an image, even if the Aztec Code * is rotated or skewed, or partially obscured. * * @author David Olivier * @author Frank Yellin */ class Detector { public: /** * Detects an Aztec Code in an image. * * @param isMirror if true, image is a mirror-image of original * @return {@link AztecDetectorResult} encapsulating results of detecting an Aztec Code * @throws NotFoundException if no Aztec Code can be found */ static DetectorResult Detect(const BitMatrix& image, bool isMirror); }; } // Aztec } // ZXing zxing-cpp-1.0.8+ds2/core/src/aztec/AZDetectorResult.h000066400000000000000000000027231361167020700223330ustar00rootroot00000000000000#pragma once /* * Copyright 2016 Nu-book Inc. * Copyright 2016 ZXing authors * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #include "DetectorResult.h" namespace ZXing { namespace Aztec { class DetectorResult : public ZXing::DetectorResult { bool _compact = false; int _nbDatablocks = 0; int _nbLayers = 0; DetectorResult(const DetectorResult&) = delete; DetectorResult& operator=(const DetectorResult&) = delete; public: DetectorResult() = default; DetectorResult(DetectorResult&&) = default; DetectorResult& operator=(DetectorResult&&) = default; DetectorResult(BitMatrix&& bits, std::vector&& points, bool isCompact, int nbDatablocks, int nbLayers) : ZXing::DetectorResult{std::move(bits), std::move(points)}, _compact(isCompact), _nbDatablocks(nbDatablocks), _nbLayers(nbLayers) {} bool isCompact() const { return _compact; } int nbDatablocks() const { return _nbDatablocks; } int nbLayers() const { return _nbLayers; } }; } // Aztec } // ZXing zxing-cpp-1.0.8+ds2/core/src/aztec/AZEncoder.cpp000066400000000000000000000245111361167020700212740ustar00rootroot00000000000000/* * Copyright 2016 Huy Cuong Nguyen * Copyright 2016 ZXing authors * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #include "AZEncoder.h" #include "AZHighLevelEncoder.h" #include "BitArray.h" #include "ReedSolomonEncoder.h" #include "GenericGF.h" #include "ZXStrConvWorkaround.h" #include "ZXTestSupport.h" #include namespace ZXing { namespace Aztec { static const int MAX_NB_BITS = 32; static const int MAX_NB_BITS_COMPACT = 4; static const int WORD_SIZE[] = { 4, 6, 6, 8, 8, 8, 8, 8, 8, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12 }; static void DrawBullsEye(BitMatrix& matrix, int center, int size) { for (int i = 0; i < size; i += 2) { for (int j = center - i; j <= center + i; j++) { matrix.set(j, center - i); matrix.set(j, center + i); matrix.set(center - i, j); matrix.set(center + i, j); } } matrix.set(center - size, center - size); matrix.set(center - size + 1, center - size); matrix.set(center - size, center - size + 1); matrix.set(center + size, center - size); matrix.set(center + size, center - size + 1); matrix.set(center + size, center + size - 1); } static const GenericGF& GetGFFromWordSize(int wordSize) { switch (wordSize) { case 4: return GenericGF::AztecParam(); case 6: return GenericGF::AztecData6(); case 8: return GenericGF::AztecData8(); case 10: return GenericGF::AztecData10(); case 12: return GenericGF::AztecData12(); default: throw std::invalid_argument("Unsupported word size " + std::to_string(wordSize)); } } static std::vector BitsToWords(const BitArray& stuffedBits, int wordSize, int totalWords) { std::vector message(totalWords, 0); int i; int n; for (i = 0, n = stuffedBits.size() / wordSize; i < n; i++) { int value = 0; for (int j = 0; j < wordSize; j++) { value |= stuffedBits.get(i * wordSize + j) ? (1 << (wordSize - j - 1)) : 0; } message[i] = value; } return message; } static void GenerateCheckWords(const BitArray& bitArray, int totalBits, int wordSize, BitArray& messageBits) { // bitArray is guaranteed to be a multiple of the wordSize, so no padding needed int messageSizeInWords = bitArray.size() / wordSize; ReedSolomonEncoder rs(GetGFFromWordSize(wordSize)); int totalWords = totalBits / wordSize; std::vector messageWords = BitsToWords(bitArray, wordSize, totalWords); rs.encode(messageWords, totalWords - messageSizeInWords); int startPad = totalBits % wordSize; messageBits = BitArray(); messageBits.appendBits(0, startPad); for (int messageWord : messageWords) { messageBits.appendBits(messageWord, wordSize); } } ZXING_EXPORT_TEST_ONLY void GenerateModeMessage(bool compact, int layers, int messageSizeInWords, BitArray& modeMessage) { modeMessage = BitArray(); if (compact) { modeMessage.appendBits(layers - 1, 2); modeMessage.appendBits(messageSizeInWords - 1, 6); GenerateCheckWords(modeMessage, 28, 4, modeMessage); } else { modeMessage.appendBits(layers - 1, 5); modeMessage.appendBits(messageSizeInWords - 1, 11); GenerateCheckWords(modeMessage, 40, 4, modeMessage); } } static void DrawModeMessage(BitMatrix& matrix, bool compact, int matrixSize, const BitArray& modeMessage) { int center = matrixSize / 2; if (compact) { for (int i = 0; i < 7; i++) { int offset = center - 3 + i; if (modeMessage.get(i)) { matrix.set(offset, center - 5); } if (modeMessage.get(i + 7)) { matrix.set(center + 5, offset); } if (modeMessage.get(20 - i)) { matrix.set(offset, center + 5); } if (modeMessage.get(27 - i)) { matrix.set(center - 5, offset); } } } else { for (int i = 0; i < 10; i++) { int offset = center - 5 + i + i / 5; if (modeMessage.get(i)) { matrix.set(offset, center - 7); } if (modeMessage.get(i + 10)) { matrix.set(center + 7, offset); } if (modeMessage.get(29 - i)) { matrix.set(offset, center + 7); } if (modeMessage.get(39 - i)) { matrix.set(center - 7, offset); } } } } ZXING_EXPORT_TEST_ONLY void StuffBits(const BitArray& bits, int wordSize, BitArray& out) { out = BitArray(); int n = bits.size(); int mask = (1 << wordSize) - 2; for (int i = 0; i < n; i += wordSize) { int word = 0; for (int j = 0; j < wordSize; j++) { if (i + j >= n || bits.get(i + j)) { word |= 1 << (wordSize - 1 - j); } } if ((word & mask) == mask) { out.appendBits(word & mask, wordSize); i--; } else if ((word & mask) == 0) { out.appendBits(word | 1, wordSize); i--; } else { out.appendBits(word, wordSize); } } } static int TotalBitsInLayer(int layers, bool compact) { return ((compact ? 88 : 112) + 16 * layers) * layers; } /** * Encodes the given binary content as an Aztec symbol * * @param data input data string * @param minECCPercent minimal percentage of error check words (According to ISO/IEC 24778:2008, * a minimum of 23% + 3 words is recommended) * @param userSpecifiedLayers if non-zero, a user-specified value for the number of layers * @return Aztec symbol matrix with metadata */ EncodeResult Encoder::Encode(const std::string& data, int minECCPercent, int userSpecifiedLayers) { // High-level encode BitArray bits = HighLevelEncoder::Encode(data); // stuff bits and choose symbol size int eccBits = bits.size() * minECCPercent / 100 + 11; int totalSizeBits = bits.size() + eccBits; bool compact; int layers; int totalBitsInLayer; int wordSize; BitArray stuffedBits; if (userSpecifiedLayers != DEFAULT_AZTEC_LAYERS) { compact = userSpecifiedLayers < 0; layers = std::abs(userSpecifiedLayers); if (layers > (compact ? MAX_NB_BITS_COMPACT : MAX_NB_BITS)) { throw std::invalid_argument("Illegal value for layers: " + std::to_string(userSpecifiedLayers)); } totalBitsInLayer = TotalBitsInLayer(layers, compact); wordSize = WORD_SIZE[layers]; int usableBitsInLayers = totalBitsInLayer - (totalBitsInLayer % wordSize); StuffBits(bits, wordSize, stuffedBits); if (stuffedBits.size() + eccBits > usableBitsInLayers) { throw std::invalid_argument("Data to large for user specified layer"); } if (compact && stuffedBits.size() > wordSize * 64) { // Compact format only allows 64 data words, though C4 can hold more words than that throw std::invalid_argument("Data to large for user specified layer"); } } else { wordSize = 0; // We look at the possible table sizes in the order Compact1, Compact2, Compact3, // Compact4, Normal4,... Normal(i) for i < 4 isn't typically used since Compact(i+1) // is the same size, but has more data. for (int i = 0; ; i++) { if (i > MAX_NB_BITS) { throw std::invalid_argument("Data too large for an Aztec code"); } compact = i <= 3; layers = compact ? i + 1 : i; totalBitsInLayer = TotalBitsInLayer(layers, compact); if (totalSizeBits > totalBitsInLayer) { continue; } // [Re]stuff the bits if this is the first opportunity, or if the // wordSize has changed if (wordSize != WORD_SIZE[layers]) { wordSize = WORD_SIZE[layers]; StuffBits(bits, wordSize, stuffedBits); } int usableBitsInLayers = totalBitsInLayer - (totalBitsInLayer % wordSize); if (compact && stuffedBits.size() > wordSize * 64) { // Compact format only allows 64 data words, though C4 can hold more words than that continue; } if (stuffedBits.size() + eccBits <= usableBitsInLayers) { break; } } } BitArray messageBits; GenerateCheckWords(stuffedBits, totalBitsInLayer, wordSize, messageBits); // generate mode message int messageSizeInWords = stuffedBits.size() / wordSize; BitArray modeMessage; GenerateModeMessage(compact, layers, messageSizeInWords, modeMessage); // allocate symbol int baseMatrixSize = (compact ? 11 : 14) + layers * 4; // not including alignment lines std::vector alignmentMap(baseMatrixSize, 0); int matrixSize; if (compact) { // no alignment marks in compact mode, alignmentMap is a no-op matrixSize = baseMatrixSize; for (int i = 0; i < (int)alignmentMap.size(); i++) { alignmentMap[i] = i; } } else { matrixSize = baseMatrixSize + 1 + 2 * ((baseMatrixSize / 2 - 1) / 15); int origCenter = baseMatrixSize / 2; int center = matrixSize / 2; for (int i = 0; i < origCenter; i++) { int newOffset = i + i / 15; alignmentMap[origCenter - i - 1] = center - newOffset - 1; alignmentMap[origCenter + i] = center + newOffset + 1; } } EncodeResult output{compact, matrixSize, layers, messageSizeInWords, BitMatrix(matrixSize)}; BitMatrix& matrix = output.matrix; // draw data bits for (int i = 0, rowOffset = 0; i < layers; i++) { int rowSize = (layers - i) * 4 + (compact ? 9 : 12); for (int j = 0; j < rowSize; j++) { int columnOffset = j * 2; for (int k = 0; k < 2; k++) { if (messageBits.get(rowOffset + columnOffset + k)) { matrix.set(alignmentMap[i * 2 + k], alignmentMap[i * 2 + j]); } if (messageBits.get(rowOffset + rowSize * 2 + columnOffset + k)) { matrix.set(alignmentMap[i * 2 + j], alignmentMap[baseMatrixSize - 1 - i * 2 - k]); } if (messageBits.get(rowOffset + rowSize * 4 + columnOffset + k)) { matrix.set(alignmentMap[baseMatrixSize - 1 - i * 2 - k], alignmentMap[baseMatrixSize - 1 - i * 2 - j]); } if (messageBits.get(rowOffset + rowSize * 6 + columnOffset + k)) { matrix.set(alignmentMap[baseMatrixSize - 1 - i * 2 - j], alignmentMap[i * 2 + k]); } } } rowOffset += rowSize * 8; } // draw mode message DrawModeMessage(matrix, compact, matrixSize, modeMessage); // draw alignment marks if (compact) { DrawBullsEye(matrix, matrixSize / 2, 5); } else { DrawBullsEye(matrix, matrixSize / 2, 7); for (int i = 0, j = 0; i < baseMatrixSize / 2 - 1; i += 15, j += 16) { for (int k = (matrixSize / 2) & 1; k < matrixSize; k += 2) { matrix.set(matrixSize / 2 - j, k); matrix.set(matrixSize / 2 + j, k); matrix.set(k, matrixSize / 2 - j); matrix.set(k, matrixSize / 2 + j); } } } return output; } } // Aztec } // ZXing zxing-cpp-1.0.8+ds2/core/src/aztec/AZEncoder.h000066400000000000000000000023171361167020700207410ustar00rootroot00000000000000#pragma once /* * Copyright 2016 Huy Cuong Nguyen * Copyright 2016 ZXing authors * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #include #include "BitMatrix.h" namespace ZXing { namespace Aztec { /** * Aztec 2D code representation * * @author Rustam Abdullaev */ struct EncodeResult { bool compact; int size; int layers; int codeWords; BitMatrix matrix; }; /** * Generates Aztec 2D barcodes. * * @author Rustam Abdullaev */ class Encoder { public: static const int DEFAULT_EC_PERCENT = 33; // default minimal percentage of error check words static const int DEFAULT_AZTEC_LAYERS = 0; static EncodeResult Encode(const std::string& data, int minECCPercent, int userSpecifiedLayers); }; } // Aztec } // ZXing zxing-cpp-1.0.8+ds2/core/src/aztec/AZEncodingState.h000066400000000000000000000026021361167020700221060ustar00rootroot00000000000000#pragma once /* * Copyright 2016 Huy Cuong Nguyen * Copyright 2016 ZXing authors * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #include "AZToken.h" #include namespace ZXing { namespace Aztec { class Token; /** * State represents all information about a sequence necessary to generate the current output. * Note that a state is immutable. */ class EncodingState { public: // The list of tokens that we output. If we are in Binary Shift mode, this // token list does *not* yet included the token for those bytes std::vector tokens; // The current mode of the encoding (or the mode to which we'll return if // we're in Binary Shift mode. int mode; // If non-zero, the number of most recent bytes that should be output // in Binary Shift mode. int binaryShiftByteCount; // The total number of bits generated (including Binary Shift). int bitCount; }; } // Aztec } // ZXing zxing-cpp-1.0.8+ds2/core/src/aztec/AZHighLevelEncoder.cpp000066400000000000000000000343061361167020700230670ustar00rootroot00000000000000/* * Copyright 2016 Huy Cuong Nguyen * Copyright 2016 ZXing authors * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #include "AZHighLevelEncoder.h" #include "AZEncodingState.h" #include "AZToken.h" #include "BitArray.h" #include "ZXContainerAlgorithms.h" #include #include #include namespace ZXing { namespace Aztec { // Do not change these constants static const int MODE_UPPER = 0; // 5 bits static const int MODE_LOWER = 1; // 5 bits static const int MODE_DIGIT = 2; // 4 bits static const int MODE_MIXED = 3; // 5 bits static const int MODE_PUNCT = 4; // 5 bits // The Latch Table shows, for each pair of Modes, the optimal method for // getting from one mode to another. In the worst possible case, this can // be up to 14 bits. In the best possible case, we are already there! // The high half-word of each entry gives the number of bits. // The low half-word of each entry are the actual bits necessary to change static const std::array, 5> LATCH_TABLE = { 0, (5 << 16) + 28, // UPPER -> LOWER (5 << 16) + 30, // UPPER -> DIGIT (5 << 16) + 29, // UPPER -> MIXED (10 << 16) + (29 << 5) + 30, // UPPER -> MIXED -> PUNCT (9 << 16) + (30 << 4) + 14, // LOWER -> DIGIT -> UPPER 0, (5 << 16) + 30, // LOWER -> DIGIT (5 << 16) + 29, // LOWER -> MIXED (10 << 16) + (29 << 5) + 30, // LOWER -> MIXED -> PUNCT (4 << 16) + 14, // DIGIT -> UPPER (9 << 16) + (14 << 5) + 28, // DIGIT -> UPPER -> LOWER 0, (9 << 16) + (14 << 5) + 29, // DIGIT -> UPPER -> MIXED (14 << 16) + (14 << 10) + (29 << 5) + 30, // DIGIT -> UPPER -> MIXED -> PUNCT (5 << 16) + 29, // MIXED -> UPPER (5 << 16) + 28, // MIXED -> LOWER (10 << 16) + (29 << 5) + 30, // MIXED -> UPPER -> DIGIT 0, (5 << 16) + 30, // MIXED -> PUNCT (5 << 16) + 31, // PUNCT -> UPPER (10 << 16) + (31 << 5) + 28, // PUNCT -> UPPER -> LOWER (10 << 16) + (31 << 5) + 30, // PUNCT -> UPPER -> DIGIT (10 << 16) + (31 << 5) + 29, // PUNCT -> UPPER -> MIXED 0, }; // A reverse mapping from [mode][char] to the encoding for that character // in that mode. An entry of 0 indicates no mapping exists. static const std::array, 5>& InitCharMap() { static std::array, 5> charmap = {}; charmap[MODE_UPPER][' '] = 1; for (int c = 'A'; c <= 'Z'; c++) { charmap[MODE_UPPER][c] = c - 'A' + 2; } charmap[MODE_LOWER][' '] = 1; for (int c = 'a'; c <= 'z'; c++) { charmap[MODE_LOWER][c] = c - 'a' + 2; } charmap[MODE_DIGIT][' '] = 1; for (int c = '0'; c <= '9'; c++) { charmap[MODE_DIGIT][c] = c - '0' + 2; } charmap[MODE_DIGIT][','] = 12; charmap[MODE_DIGIT]['.'] = 13; const int8_t mixedTable[] = { 0x00, 0x20, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f, 0x40, 0x5c, 0x5e, 0x5f, 0x60, 0x7c, 0x7d, 0x7f, }; for (uint8_t i = 0; i < Length(mixedTable); i++) { charmap[MODE_MIXED][mixedTable[i]] = i; } const char punctTable[] = { '\0', '\r', '\0', '\0', '\0', '\0', '!', '\'', '#', '$', '%', '&', '\'', '(', ')', '*', '+', ',', '-', '.', '/', ':', ';', '<', '=', '>', '?', '[', ']', '{', '}' }; for (uint8_t i = 0; i < Length(punctTable); i++) { if (punctTable[i] > 0) { charmap[MODE_PUNCT][punctTable[i]] = i; } } return charmap; } const std::array, 5>& CHAR_MAP = InitCharMap(); // A map showing the available shift codes. (The shifts to BINARY are not shown static const std::array, 6>& InitShiftTable() { static std::array, 6> table; for (auto& row : table) { std::fill(row.begin(), row.end(), -1); } table[MODE_UPPER][MODE_PUNCT] = 0; table[MODE_LOWER][MODE_PUNCT] = 0; table[MODE_LOWER][MODE_UPPER] = 28; table[MODE_MIXED][MODE_PUNCT] = 0; table[MODE_DIGIT][MODE_PUNCT] = 0; table[MODE_DIGIT][MODE_UPPER] = 15; return table; } const std::array, 6>& SHIFT_TABLE = InitShiftTable(); // Create a new state representing this state with a latch to a (not // necessary different) mode, and then a code. static EncodingState LatchAndAppend(const EncodingState& state, int mode, int value) { //assert binaryShiftByteCount == 0; int bitCount = state.bitCount; auto tokens = state.tokens; if (mode != state.mode) { int latch = LATCH_TABLE[state.mode][mode]; tokens.push_back(Token::CreateSimple(latch & 0xFFFF, latch >> 16)); bitCount += latch >> 16; } int latchModeBitCount = mode == MODE_DIGIT ? 4 : 5; tokens.push_back(Token::CreateSimple(value, latchModeBitCount)); return EncodingState{ tokens, mode, 0, bitCount + latchModeBitCount }; } // Create a new state representing this state, with a temporary shift // to a different mode to output a single value. static EncodingState ShiftAndAppend(const EncodingState& state, int mode, int value) { //assert binaryShiftByteCount == 0 && this.mode != mode; int thisModeBitCount = state.mode == MODE_DIGIT ? 4 : 5; // Shifts exist only to UPPER and PUNCT, both with tokens size 5. auto tokens = state.tokens; tokens.push_back(Token::CreateSimple(SHIFT_TABLE[state.mode][mode], thisModeBitCount)); tokens.push_back(Token::CreateSimple(value, 5)); return EncodingState{ tokens, state.mode, 0, state.bitCount + thisModeBitCount + 5 }; } // Create the state identical to this one, but we are no longer in // Binary Shift mode. static EncodingState EndBinaryShift(const EncodingState& state, int index) { if (state.binaryShiftByteCount == 0) { return state; } auto tokens = state.tokens; tokens.push_back(Token::CreateBinaryShift(index - state.binaryShiftByteCount, state.binaryShiftByteCount)); //assert token.getTotalBitCount() == this.bitCount; return EncodingState{ tokens, state.mode, 0, state.bitCount }; } // Create a new state representing this state, but an additional character // output in Binary Shift mode. static EncodingState AddBinaryShiftChar(const EncodingState& state, int index) { auto tokens = state.tokens; int mode = state.mode; int bitCount = state.bitCount; if (state.mode == MODE_PUNCT || state.mode == MODE_DIGIT) { //assert binaryShiftByteCount == 0; int latch = LATCH_TABLE[mode][MODE_UPPER]; tokens.push_back(Token::CreateSimple(latch & 0xFFFF, latch >> 16)); bitCount += latch >> 16; mode = MODE_UPPER; } int deltaBitCount = (state.binaryShiftByteCount == 0 || state.binaryShiftByteCount == 31) ? 18 : (state.binaryShiftByteCount == 62) ? 9 : 8; EncodingState result{ tokens, mode, state.binaryShiftByteCount + 1, bitCount + deltaBitCount }; if (result.binaryShiftByteCount == 2047 + 31) { // The string is as long as it's allowed to be. We should end it. result = EndBinaryShift(result, index + 1); } return result; } static int CalculateBinaryShiftCost(const EncodingState& state) { if (state.binaryShiftByteCount > 62) { return 21; // B/S with extended length } if (state.binaryShiftByteCount > 31) { return 20; // two B/S } if (state.binaryShiftByteCount > 0) { return 10; // one B/S } return 0; } // Returns true if "this" state is better (or equal) to be in than "that" // state under all possible circumstances. static bool IsBetterThanOrEqualTo(const EncodingState& state, const EncodingState& other) { int newModeBitCount = state.bitCount + (LATCH_TABLE[state.mode][other.mode] >> 16); if (state.binaryShiftByteCount < other.binaryShiftByteCount) { // add additional B/S encoding cost of other, if any newModeBitCount += CalculateBinaryShiftCost(other) - CalculateBinaryShiftCost(state); } else if (state.binaryShiftByteCount > other.binaryShiftByteCount && other.binaryShiftByteCount > 0) { // maximum possible additional cost (we end up exceeding the 31 byte boundary and other state can stay beneath it) newModeBitCount += 10; } return newModeBitCount <= other.bitCount; } static BitArray ToBitArray(const EncodingState& state, const std::string& text) { auto endState = EndBinaryShift(state, static_cast(text.length())); BitArray bits; // Add each token to the result. for (const Token& symbol : endState.tokens) { symbol.appendTo(bits, text); } //assert bitArray.getSize() == this.bitCount; return bits; } static void UpdateStateForPair(const EncodingState& state, int index, int pairCode, std::list& result) { EncodingState stateNoBinary = EndBinaryShift(state, index); // Possibility 1. Latch to MODE_PUNCT, and then append this code result.push_back(LatchAndAppend(stateNoBinary, MODE_PUNCT, pairCode)); if (state.mode != MODE_PUNCT) { // Possibility 2. Shift to MODE_PUNCT, and then append this code. // Every state except MODE_PUNCT (handled above) can shift result.push_back(ShiftAndAppend(stateNoBinary, MODE_PUNCT, pairCode)); } if (pairCode == 3 || pairCode == 4) { // both characters are in DIGITS. Sometimes better to just add two digits auto digitState = LatchAndAppend(stateNoBinary, MODE_DIGIT, 16 - pairCode); // period or comma in DIGIT result.push_back(LatchAndAppend(digitState, MODE_DIGIT, 1)); // space in DIGIT } if (state.binaryShiftByteCount > 0) { // It only makes sense to do the characters as binary if we're already // in binary mode. result.push_back(AddBinaryShiftChar(AddBinaryShiftChar(state, index), index + 1)); } } static std::list SimplifyStates(const std::list& states) { std::list result; for (auto& newState : states) { bool add = true; for (auto iterator = result.begin(); iterator != result.end();) { auto& oldState = *iterator; if (IsBetterThanOrEqualTo(oldState, newState)) { add = false; break; } if (IsBetterThanOrEqualTo(newState, oldState)) { iterator = result.erase(iterator); } else { ++iterator; } } if (add) { result.push_back(newState); } } return result; } static std::list UpdateStateListForPair(const std::list& states, int index, int pairCode) { std::list result; for (auto& state : states) { UpdateStateForPair(state, index, pairCode, result); } return SimplifyStates(result); } // Return a set of states that represent the possible ways of updating this // state for the next character. The resulting set of states are added to // the "result" list. static void UpdateStateForChar(const EncodingState& state, const std::string& text, int index, std::list& result) { int ch = text[index] & 0xff; bool charInCurrentTable = CHAR_MAP[state.mode][ch] > 0; EncodingState stateNoBinary; bool firstTime = true; for (int mode = 0; mode <= MODE_PUNCT; mode++) { int charInMode = CHAR_MAP[mode][ch]; if (charInMode > 0) { if (firstTime) { // Only create stateNoBinary the first time it's required. stateNoBinary = EndBinaryShift(state, index); firstTime = false; } // Try generating the character by latching to its mode if (!charInCurrentTable || mode == state.mode || mode == MODE_DIGIT) { // If the character is in the current table, we don't want to latch to // any other mode except possibly digit (which uses only 4 bits). Any // other latch would be equally successful *after* this character, and // so wouldn't save any bits. result.push_back(LatchAndAppend(stateNoBinary, mode, charInMode)); } // Try generating the character by switching to its mode. if (!charInCurrentTable && SHIFT_TABLE[state.mode][mode] >= 0) { // It never makes sense to temporarily shift to another mode if the // character exists in the current mode. That can never save bits. result.push_back(ShiftAndAppend(stateNoBinary, mode, charInMode)); } } } if (state.binaryShiftByteCount > 0 || CHAR_MAP[state.mode][ch] == 0) { // It's never worthwhile to go into binary shift mode if you're not already // in binary shift mode, and the character exists in your current mode. // That can never save bits over just outputting the char in the current mode. result.push_back(AddBinaryShiftChar(state, index)); } } // We update a set of states for a new character by updating each state // for the new character, merging the results, and then removing the // non-optimal states. static std::list UpdateStateListForChar(const std::list& states, const std::string& text, int index) { std::list result; for (auto& state : states) { UpdateStateForChar(state, text, index, result); } return result.size() > 1 ? SimplifyStates(result) : result; } /** * @return text represented by this encoder encoded as a {@link BitArray} */ BitArray HighLevelEncoder::Encode(const std::string& text) { std::list states; states.push_back(EncodingState{ std::vector(), MODE_UPPER, 0, 0 }); for (int index = 0; index < (int)text.length(); index++) { int pairCode; int nextChar = index + 1 < (int)text.length() ? text[index + 1] : 0; switch (text[index]) { case '\r': pairCode = nextChar == '\n' ? 2 : 0; break; case '.': pairCode = nextChar == ' ' ? 3 : 0; break; case ',': pairCode = nextChar == ' ' ? 4 : 0; break; case ':': pairCode = nextChar == ' ' ? 5 : 0; break; default: pairCode = 0; } if (pairCode > 0) { // We have one of the four special PUNCT pairs. Treat them specially. // Get a new set of states for the two new characters. states = UpdateStateListForPair(states, index, pairCode); index++; } else { // Get a new set of states for the new character. states = UpdateStateListForChar(states, text, index); } } // We are left with a set of states. Find the shortest one. EncodingState minState = *std::min_element(states.begin(), states.end(), [](const EncodingState& a, const EncodingState& b) { return a.bitCount < b.bitCount; }); // Convert it to a bit array, and return. return ToBitArray(minState, text); } } // Aztec } // ZXing zxing-cpp-1.0.8+ds2/core/src/aztec/AZHighLevelEncoder.h000066400000000000000000000023211361167020700225240ustar00rootroot00000000000000#pragma once /* * Copyright 2016 Huy Cuong Nguyen * Copyright 2016 ZXing authors * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #include namespace ZXing { class BitArray; namespace Aztec { /** * This produces nearly optimal encodings of text into the first-level of * encoding used by Aztec code. * * It uses a dynamic algorithm. For each prefix of the string, it determines * a set of encodings that could lead to this prefix. We repeatedly add a * character and generate a new set of optimal encodings until we have read * through the entire input. * * @author Frank Yellin * @author Rustam Abdullaev */ class HighLevelEncoder { public: static BitArray Encode(const std::string& text); }; } // Aztec } // ZXing zxing-cpp-1.0.8+ds2/core/src/aztec/AZReader.cpp000066400000000000000000000031261361167020700211160ustar00rootroot00000000000000/* * Copyright 2016 Nu-book Inc. * Copyright 2016 ZXing authors * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #include "AZReader.h" #include "AZDetector.h" #include "AZDetectorResult.h" #include "AZDecoder.h" #include "Result.h" #include "BitMatrix.h" #include "BinaryBitmap.h" #include "DecoderResult.h" #include "DecodeHints.h" namespace ZXing { namespace Aztec { Result Reader::decode(const BinaryBitmap& image) const { auto binImg = image.getBlackMatrix(); if (binImg == nullptr) { return Result(DecodeStatus::NotFound); } DetectorResult detectResult = Detector::Detect(*binImg, false); DecoderResult decodeResult = DecodeStatus::NotFound; std::vector points; if (detectResult.isValid()) { points = detectResult.points(); decodeResult = Decoder::Decode(detectResult); } if (!decodeResult.isValid()) { detectResult = Detector::Detect(*binImg, true); if (detectResult.isValid()) { points = detectResult.points(); decodeResult = Decoder::Decode(detectResult); } } return Result(std::move(decodeResult), std::move(points), BarcodeFormat::AZTEC); } } // Aztec } // ZXing zxing-cpp-1.0.8+ds2/core/src/aztec/AZReader.h000066400000000000000000000016261361167020700205660ustar00rootroot00000000000000#pragma once /* * Copyright 2016 Nu-book Inc. * Copyright 2016 ZXing authors * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #include "Reader.h" namespace ZXing { namespace Aztec { /** * This implementation can detect and decode Aztec codes in an image. * * @author David Olivier */ class Reader : public ZXing::Reader { public: Result decode(const BinaryBitmap& image) const override; }; } // Aztec } // ZXing zxing-cpp-1.0.8+ds2/core/src/aztec/AZToken.cpp000066400000000000000000000027341361167020700210000ustar00rootroot00000000000000/* * Copyright 2016 Huy Cuong Nguyen * Copyright 2016 ZXing authors * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #include "AZToken.h" #include "BitArray.h" #include namespace ZXing { namespace Aztec { void Token::appendTo(BitArray& bitArray, const std::string& text) const { if (_count < 0) { bitArray.appendBits(_value, -_count); } else { for (int i = 0; i < _count; i++) { if (i == 0 || (i == 31 && _count <= 62)) { // We need a header before the first character, and before // character 31 when the total byte code is <= 62 bitArray.appendBits(31, 5); // BINARY_SHIFT if (_count > 62) { bitArray.appendBits(_count - 31, 16); } else if (i == 0) { // 1 <= binaryShiftByteCode <= 62 bitArray.appendBits(std::min((int)_count, 31), 5); } else { // 32 <= binaryShiftCount <= 62 and i == 31 bitArray.appendBits(_count - 31, 5); } } bitArray.appendBits(text[_value + i], 8); } } } } // Aztec } // ZXing zxing-cpp-1.0.8+ds2/core/src/aztec/AZToken.h000066400000000000000000000022111361167020700204330ustar00rootroot00000000000000#pragma once /* * Copyright 2016 Huy Cuong Nguyen * Copyright 2016 ZXing authors * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #include namespace ZXing { class BitArray; namespace Aztec { class Token { public: void appendTo(BitArray& bitArray, const std::string& text) const; static Token CreateSimple(int value, int bitCount) { return {value, -bitCount}; } static Token CreateBinaryShift(int start, int byteCount) { return {start, byteCount}; } private: short _value; short _count; // is simple token if negative, public: Token(int value, int count) : _value((short)value), _count((short)count) {} }; } // Aztec } // ZXing zxing-cpp-1.0.8+ds2/core/src/aztec/AZWriter.cpp000066400000000000000000000023711361167020700211710ustar00rootroot00000000000000/* * Copyright 2016 Huy Cuong Nguyen * Copyright 2016 ZXing authors * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #include "AZWriter.h" #include "AZEncoder.h" #include "CharacterSet.h" #include "TextEncoder.h" #include namespace ZXing { namespace Aztec { Writer::Writer() : _encoding(CharacterSet::ISO8859_1), _eccPercent(Encoder::DEFAULT_EC_PERCENT), _layers(Encoder::DEFAULT_AZTEC_LAYERS) { } BitMatrix Writer::encode(const std::wstring& contents, int width, int height) const { std::string bytes = TextEncoder::FromUnicode(contents, _encoding); EncodeResult aztec = Encoder::Encode(bytes, _eccPercent, _layers); // Minimum required quite zone for Aztec is 0 return Inflate(std::move(aztec.matrix), width, height, 0); } } // Aztec } // ZXing zxing-cpp-1.0.8+ds2/core/src/aztec/AZWriter.h000066400000000000000000000022371361167020700206370ustar00rootroot00000000000000#pragma once /* * Copyright 2016 Huy Cuong Nguyen * Copyright 2016 ZXing authors * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #include namespace ZXing { enum class CharacterSet; class BitMatrix; namespace Aztec { class Writer { public: Writer(); Writer& setEncoding(CharacterSet encoding) { _encoding = encoding; return *this; } Writer& setEccPercent(int percent) { _eccPercent = percent; return *this; } Writer& setLayers(int layers) { _layers = layers; return *this; } BitMatrix encode(const std::wstring& contents, int width, int height) const; private: CharacterSet _encoding; int _eccPercent; int _layers; }; } // Aztec } // ZXing zxing-cpp-1.0.8+ds2/core/src/datamatrix/000077500000000000000000000000001361167020700200035ustar00rootroot00000000000000zxing-cpp-1.0.8+ds2/core/src/datamatrix/DMBitMatrixParser.cpp000066400000000000000000000077041361167020700240200ustar00rootroot00000000000000/* * Copyright 2016 Nu-book Inc. * Copyright 2016 ZXing authors * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #include "DMBitMatrixParser.h" #include "DMDefaultPlacement.h" #include "DMVersion.h" #include "BitMatrix.h" #include "DecodeStatus.h" #include "ByteArray.h" #include namespace ZXing { namespace DataMatrix { //private final BitMatrix mappingBitMatrix; //private final BitMatrix readMappingMatrix; //private final Version version; const Version* BitMatrixParser::ReadVersion(const BitMatrix& bits) { return Version::VersionForDimensions(bits.height(), bits.width()); } /** *

Extracts the data region from a {@link BitMatrix} that contains * alignment patterns.

* * @param bitMatrix Original {@link BitMatrix} with alignment patterns * @return BitMatrix that has the alignment patterns removed */ static BitMatrix ExtractDataRegion(const Version& version, const BitMatrix& bitMatrix) { int symbolSizeRows = version.symbolSizeRows(); int symbolSizeColumns = version.symbolSizeColumns(); if (bitMatrix.height() != symbolSizeRows) { throw std::invalid_argument("Dimension of bitMarix must match the version size"); } int dataRegionSizeRows = version.dataRegionSizeRows(); int dataRegionSizeColumns = version.dataRegionSizeColumns(); int numDataRegionsRow = symbolSizeRows / dataRegionSizeRows; int numDataRegionsColumn = symbolSizeColumns / dataRegionSizeColumns; int sizeDataRegionRow = numDataRegionsRow * dataRegionSizeRows; int sizeDataRegionColumn = numDataRegionsColumn * dataRegionSizeColumns; BitMatrix result(sizeDataRegionColumn, sizeDataRegionRow); for (int dataRegionRow = 0; dataRegionRow < numDataRegionsRow; ++dataRegionRow) { int dataRegionRowOffset = dataRegionRow * dataRegionSizeRows; for (int dataRegionColumn = 0; dataRegionColumn < numDataRegionsColumn; ++dataRegionColumn) { int dataRegionColumnOffset = dataRegionColumn * dataRegionSizeColumns; for (int i = 0; i < dataRegionSizeRows; ++i) { int readRowOffset = dataRegionRow * (dataRegionSizeRows + 2) + 1 + i; int writeRowOffset = dataRegionRowOffset + i; for (int j = 0; j < dataRegionSizeColumns; ++j) { int readColumnOffset = dataRegionColumn * (dataRegionSizeColumns + 2) + 1 + j; if (bitMatrix.get(readColumnOffset, readRowOffset)) { int writeColumnOffset = dataRegionColumnOffset + j; result.set(writeColumnOffset, writeRowOffset); } } } } } return result; } /** *

Reads the bits in the {@link BitMatrix} representing the mapping matrix (No alignment patterns) * in the correct order in order to reconstitute the codewords bytes contained within the * Data Matrix Code.

* * @return bytes encoded within the Data Matrix Code * @throws FormatException if the exact number of bytes expected is not read */ ByteArray BitMatrixParser::ReadCodewords(const BitMatrix& bits) { const Version* version = ReadVersion(bits); if (version == nullptr) { return {}; } BitMatrix dataBits = ExtractDataRegion(*version, bits); ByteArray result(version->totalCodewords()); auto codeword = result.begin(); VisitMatrix(dataBits.height(), dataBits.width(), [&codeword, &dataBits](const BitPosArray& bitPos) { // Read the 8 bits of one of the special corner/utah symbols into the current codeword *codeword = 0; for (auto& p : bitPos) { *codeword <<= 1; *codeword |= static_cast(dataBits.get(p.col, p.row)); } ++codeword; }); if (codeword != result.end()) return {}; return result; } } // DataMatrix } // ZXing zxing-cpp-1.0.8+ds2/core/src/datamatrix/DMBitMatrixParser.h000066400000000000000000000016041361167020700234560ustar00rootroot00000000000000#pragma once /* * Copyright 2016 Nu-book Inc. * Copyright 2016 ZXing authors * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ namespace ZXing { class BitMatrix; class ByteArray; namespace DataMatrix { class Version; class BitMatrixParser { public: static ByteArray ReadCodewords(const BitMatrix& bits); static const Version* ReadVersion(const BitMatrix& bits); }; } // DataMatrix } // ZXing zxing-cpp-1.0.8+ds2/core/src/datamatrix/DMDataBlock.cpp000066400000000000000000000057561361167020700225710ustar00rootroot00000000000000/* * Copyright 2016 Nu-book Inc. * Copyright 2016 ZXing authors * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #include "DMDataBlock.h" #include "DMVersion.h" #include "DecodeStatus.h" namespace ZXing { namespace DataMatrix { std::vector DataBlock::GetDataBlocks(const ByteArray& rawCodewords, const Version& version) { // First count the total number of data blocks // Now establish DataBlocks of the appropriate size and number of data codewords auto& ecBlocks = version.ecBlocks(); std::vector result(ecBlocks.numBlocks()); int numResultBlocks = 0; for (auto& ecBlock : ecBlocks.blockArray()) { for (int i = 0; i < ecBlock.count; i++) { auto& item = result[numResultBlocks++]; item._numDataCodewords = ecBlock.dataCodewords; item._codewords.resize(ecBlocks.codewordsPerBlock + ecBlock.dataCodewords); } } // All blocks have the same amount of data, except that the last n // (where n may be 0) have 1 less byte. Figure out where these start. // TODO(bbrown): There is only one case where there is a difference for Data Matrix for size 144 int longerBlocksTotalCodewords = result[0]._codewords.length(); //int shorterBlocksTotalCodewords = longerBlocksTotalCodewords - 1; int longerBlocksNumDataCodewords = longerBlocksTotalCodewords - ecBlocks.codewordsPerBlock; int shorterBlocksNumDataCodewords = longerBlocksNumDataCodewords - 1; // The last elements of result may be 1 element shorter for 144 matrix // first fill out as many elements as all of them have minus 1 int rawCodewordsOffset = 0; for (int i = 0; i < shorterBlocksNumDataCodewords; i++) { for (int j = 0; j < numResultBlocks; j++) { result[j]._codewords[i] = rawCodewords[rawCodewordsOffset++]; } } // Fill out the last data block in the longer ones bool specialVersion = version.versionNumber() == 24; int numLongerBlocks = specialVersion ? 8 : numResultBlocks; for (int j = 0; j < numLongerBlocks; j++) { result[j]._codewords[longerBlocksNumDataCodewords - 1] = rawCodewords[rawCodewordsOffset++]; } // Now add in error correction blocks int max = result[0]._codewords.length(); for (int i = longerBlocksNumDataCodewords; i < max; i++) { for (int j = 0; j < numResultBlocks; j++) { int jOffset = specialVersion ? (j + 8) % numResultBlocks : j; int iOffset = specialVersion && jOffset > 7 ? i - 1 : i; result[jOffset]._codewords[iOffset] = rawCodewords[rawCodewordsOffset++]; } } if (rawCodewordsOffset != rawCodewords.length()) return {}; return result; } } // DataMatrix } // ZXing zxing-cpp-1.0.8+ds2/core/src/datamatrix/DMDataBlock.h000066400000000000000000000036021361167020700222220ustar00rootroot00000000000000#pragma once /* * Copyright 2016 Nu-book Inc. * Copyright 2016 ZXing authors * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #include "ByteArray.h" namespace ZXing { namespace DataMatrix { class Version; /** *

Encapsulates a block of data within a Data Matrix Code. Data Matrix Codes may split their data into * multiple blocks, each of which is a unit of data and error-correction codewords. Each * is represented by an instance of this class.

* * @author bbrown@google.com (Brian Brown) */ class DataBlock { public: int numDataCodewords() const { return _numDataCodewords; } const ByteArray& codewords() const { return _codewords; } ByteArray& codewords() { return _codewords; } /** *

When Data Matrix Codes use multiple data blocks, they actually interleave the bytes of each of them. * That is, the first byte of data block 1 to n is written, then the second bytes, and so on. This * method will separate the data into original blocks.

* * @param rawCodewords bytes as read directly from the Data Matrix Code * @param version version of the Data Matrix Code * @return DataBlocks containing original bytes, "de-interleaved" from representation in the * Data Matrix Code */ static std::vector GetDataBlocks(const ByteArray& rawCodewords, const Version& version); private: int _numDataCodewords = 0; ByteArray _codewords; }; } // DataMatrix } // ZXing zxing-cpp-1.0.8+ds2/core/src/datamatrix/DMDecoder.cpp000066400000000000000000000411121361167020700222740ustar00rootroot00000000000000/* * Copyright 2016 Nu-book Inc. * Copyright 2016 ZXing authors * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #include "DMDecoder.h" #include "DMBitMatrixParser.h" #include "DMDataBlock.h" #include "DecoderResult.h" #include "BitMatrix.h" #include "ReedSolomonDecoder.h" #include "GenericGF.h" #include "BitSource.h" #include "DecodeStatus.h" #include "TextDecoder.h" #include "ZXContainerAlgorithms.h" #include "ZXStrConvWorkaround.h" #include "ZXTestSupport.h" #include namespace ZXing { namespace DataMatrix { /** *

Data Matrix Codes can encode text as bits in one of several modes, and can use multiple modes * in one Data Matrix Code. This class decodes the bits back into text.

* *

See ISO 16022:2006, 5.2.1 - 5.2.9.2

* * @author bbrown@google.com (Brian Brown) * @author Sean Owen */ namespace DecodedBitStreamParser { enum Mode { FORMAT_ERROR, PAD_ENCODE, // Not really a mode ASCII_ENCODE, C40_ENCODE, TEXT_ENCODE, ANSIX12_ENCODE, EDIFACT_ENCODE, BASE256_ENCODE }; /** * See ISO 16022:2006, Annex C Table C.1 * The C40 Basic Character Set (*'s used for placeholders for the shift values) */ static const char C40_BASIC_SET_CHARS[] = { '*', '*', '*', ' ', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z' }; static const char C40_SHIFT2_SET_CHARS[] = { '!', '"', '#', '$', '%', '&', '\'', '(', ')', '*', '+', ',', '-', '.', '/', ':', ';', '<', '=', '>', '?', '@', '[', '\\', ']', '^', '_' }; /** * See ISO 16022:2006, Annex C Table C.2 * The Text Basic Character Set (*'s used for placeholders for the shift values) */ static const char TEXT_BASIC_SET_CHARS[] = { '*', '*', '*', ' ', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z' }; // Shift 2 for Text is the same encoding as C40 #define TEXT_SHIFT2_SET_CHARS C40_SHIFT2_SET_CHARS static const char TEXT_SHIFT3_SET_CHARS[] = { '`', 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z', '{', '|', '}', '~', 127 }; /** * See ISO 16022:2006, 5.2.3 and Annex C, Table C.2 */ static Mode DecodeAsciiSegment(BitSource& bits, std::string& result, std::string& resultTrailer) { bool upperShift = false; do { int oneByte = bits.readBits(8); switch (oneByte) { case 0: return Mode::FORMAT_ERROR; case 129: // Pad return Mode::PAD_ENCODE; case 230: // Latch to C40 encodation return Mode::C40_ENCODE; case 231: // Latch to Base 256 encodation return Mode::BASE256_ENCODE; case 232: // FNC1 result.push_back((char)29); // translate as ASCII 29 break; case 233: case 234: // Structured Append, Reader Programming // Ignore these symbols for now //throw ReaderException.getInstance(); break; case 235: // Upper Shift (shift to Extended ASCII) upperShift = true; break; case 236: // 05 Macro result.append("[)>\x1E""05\x1D"); resultTrailer.insert(0, "\x1E\x04"); break; case 237: // 06 Macro result.append("[)>\x1E""06\x1D"); resultTrailer.insert(0, "\x1E\x04"); break; case 238: // Latch to ANSI X12 encodation return Mode::ANSIX12_ENCODE; case 239: // Latch to Text encodation return Mode::TEXT_ENCODE; case 240: // Latch to EDIFACT encodation return Mode::EDIFACT_ENCODE; case 241: // ECI Character // TODO(bbrown): I think we need to support ECI //throw ReaderException.getInstance(); // Ignore this symbol for now break; default: if (oneByte <= 128) { // ASCII data (ASCII value + 1) if (upperShift) { oneByte += 128; //upperShift = false; } result.push_back((char)(oneByte - 1)); return Mode::ASCII_ENCODE; } else if (oneByte <= 229) { // 2-digit data 00-99 (Numeric Value + 130) int value = oneByte - 130; if (value < 10) { // pad with '0' for single digit values result.push_back('0'); } result.append(std::to_string(value)); } else if (oneByte >= 242) { // Not to be used in ASCII encodation // ... but work around encoders that end with 254, latch back to ASCII if (oneByte != 254 || bits.available() != 0) { return Mode::FORMAT_ERROR; } } } } while (bits.available() > 0); return Mode::ASCII_ENCODE; } static std::array ParseTwoBytes(int firstByte, int secondByte) { int fullBitValue = (firstByte << 8) + secondByte - 1; int a = fullBitValue / 1600; fullBitValue -= a * 1600; int b = fullBitValue / 40; int c = fullBitValue - b * 40; return {a, b, c}; } /** * See ISO 16022:2006, 5.2.5 and Annex C, Table C.1 */ static bool DecodeC40Segment(BitSource& bits, std::string& result) { // Three C40 values are encoded in a 16-bit value as // (1600 * C1) + (40 * C2) + C3 + 1 // TODO(bbrown): The Upper Shift with C40 doesn't work in the 4 value scenario all the time bool upperShift = false; int shift = 0; do { // If there is only one byte left then it will be encoded as ASCII if (bits.available() == 8) { return true; } int firstByte = bits.readBits(8); if (firstByte == 254) { // Unlatch codeword return true; } for (int cValue : ParseTwoBytes(firstByte, bits.readBits(8))) { switch (shift) { case 0: if (cValue < 3) { shift = cValue + 1; } else if (cValue < Length(C40_BASIC_SET_CHARS)) { char c40char = C40_BASIC_SET_CHARS[cValue]; if (upperShift) { result.push_back((char)(c40char + 128)); upperShift = false; } else { result.push_back(c40char); } } else { return false; } break; case 1: if (upperShift) { result.push_back((char)(cValue + 128)); upperShift = false; } else { result.push_back((char)cValue); } shift = 0; break; case 2: if (cValue < Length(C40_SHIFT2_SET_CHARS)) { char c40char = C40_SHIFT2_SET_CHARS[cValue]; if (upperShift) { result.push_back((char)(c40char + 128)); upperShift = false; } else { result.push_back(c40char); } } else if (cValue == 27) { // FNC1 result.push_back((char)29); // translate as ASCII 29 } else if (cValue == 30) { // Upper Shift upperShift = true; } else { return false; } shift = 0; break; case 3: if (upperShift) { result.push_back((char)(cValue + 224)); upperShift = false; } else { result.push_back((char)(cValue + 96)); } shift = 0; break; default: return false; } } } while (bits.available() > 0); return true; } /** * See ISO 16022:2006, 5.2.6 and Annex C, Table C.2 */ static bool DecodeTextSegment(BitSource& bits, std::string& result) { // Three Text values are encoded in a 16-bit value as // (1600 * C1) + (40 * C2) + C3 + 1 // TODO(bbrown): The Upper Shift with Text doesn't work in the 4 value scenario all the time bool upperShift = false; int shift = 0; do { // If there is only one byte left then it will be encoded as ASCII if (bits.available() == 8) { return true; } int firstByte = bits.readBits(8); if (firstByte == 254) { // Unlatch codeword return true; } for (int cValue : ParseTwoBytes(firstByte, bits.readBits(8))) { switch (shift) { case 0: if (cValue < 3) { shift = cValue + 1; } else if (cValue < Length(TEXT_BASIC_SET_CHARS)) { char textChar = TEXT_BASIC_SET_CHARS[cValue]; if (upperShift) { result.push_back((char)(textChar + 128)); upperShift = false; } else { result.push_back(textChar); } } else { return false; } break; case 1: if (upperShift) { result.push_back((char)(cValue + 128)); upperShift = false; } else { result.push_back((char)cValue); } shift = 0; break; case 2: // Shift 2 for Text is the same encoding as C40 if (cValue < Length(TEXT_SHIFT2_SET_CHARS)) { char textChar = TEXT_SHIFT2_SET_CHARS[cValue]; if (upperShift) { result.push_back((char)(textChar + 128)); upperShift = false; } else { result.push_back(textChar); } } else if (cValue == 27) { // FNC1 result.push_back((char)29); // translate as ASCII 29 } else if (cValue == 30) { // Upper Shift upperShift = true; } else { return false; } shift = 0; break; case 3: if (cValue < Length(TEXT_SHIFT3_SET_CHARS)) { char textChar = TEXT_SHIFT3_SET_CHARS[cValue]; if (upperShift) { result.push_back((char)(textChar + 128)); upperShift = false; } else { result.push_back(textChar); } shift = 0; } else { return false; } break; default: return false; } } } while (bits.available() > 0); return true; } /** * See ISO 16022:2006, 5.2.7 */ static bool DecodeAnsiX12Segment(BitSource& bits, std::string& result) { // Three ANSI X12 values are encoded in a 16-bit value as // (1600 * C1) + (40 * C2) + C3 + 1 do { // If there is only one byte left then it will be encoded as ASCII if (bits.available() == 8) { return true; } int firstByte = bits.readBits(8); if (firstByte == 254) { // Unlatch codeword return true; } for (auto cValue : ParseTwoBytes(firstByte, bits.readBits(8))) { if (cValue == 0) { // X12 segment terminator result.push_back('\r'); } else if (cValue == 1) { // X12 segment separator * result.push_back('*'); } else if (cValue == 2) { // X12 sub-element separator > result.push_back('>'); } else if (cValue == 3) { // space result.push_back(' '); } else if (cValue < 14) { // 0 - 9 result.push_back((char)(cValue + 44)); } else if (cValue < 40) { // A - Z result.push_back((char)(cValue + 51)); } else { return false; } } } while (bits.available() > 0); return true; } /** * See ISO 16022:2006, 5.2.8 and Annex C Table C.3 */ static bool DecodeEdifactSegment(BitSource& bits, std::string& result) { do { // If there is only two or less bytes left then it will be encoded as ASCII if (bits.available() <= 16) { return true; } for (int i = 0; i < 4; i++) { int edifactValue = bits.readBits(6); // Check for the unlatch character if (edifactValue == 0x1F) { // 011111 // Read rest of byte, which should be 0, and stop int bitsLeft = 8 - bits.bitOffset(); if (bitsLeft != 8) { bits.readBits(bitsLeft); } return true; } if ((edifactValue & 0x20) == 0) { // no 1 in the leading (6th) bit edifactValue |= 0x40; // Add a leading 01 to the 6 bit binary value } result.push_back((char)edifactValue); } } while (bits.available() > 0); return true; } /** * See ISO 16022:2006, Annex B, B.2 */ static int Unrandomize255State(int randomizedBase256Codeword, int base256CodewordPosition) { int pseudoRandomNumber = ((149 * base256CodewordPosition) % 255) + 1; int tempVariable = randomizedBase256Codeword - pseudoRandomNumber; return tempVariable >= 0 ? tempVariable : tempVariable + 256; } /** * See ISO 16022:2006, 5.2.9 and Annex B, B.2 */ static bool DecodeBase256Segment(BitSource& bits, std::string& result, std::list& byteSegments) { // Figure out how long the Base 256 Segment is. int codewordPosition = 1 + bits.byteOffset(); // position is 1-indexed int d1 = Unrandomize255State(bits.readBits(8), codewordPosition++); int count; if (d1 == 0) { // Read the remainder of the symbol count = bits.available() / 8; } else if (d1 < 250) { count = d1; } else { count = 250 * (d1 - 249) + Unrandomize255State(bits.readBits(8), codewordPosition++); } // We're seeing NegativeArraySizeException errors from users. if (count < 0) { return false; } ByteArray bytes(count); for (int i = 0; i < count; i++) { // Have seen this particular error in the wild, such as at // http://www.bcgen.com/demo/IDAutomationStreamingDataMatrix.aspx?MODE=3&D=Fred&PFMT=3&PT=F&X=0.3&O=0&LM=0.2 if (bits.available() < 8) { return false; } bytes[i] = (uint8_t)Unrandomize255State(bits.readBits(8), codewordPosition++); } byteSegments.push_back(bytes); // bytes is in ISO-8859-1 result.append(bytes.charPtr(), bytes.size()); return true; } ZXING_EXPORT_TEST_ONLY DecoderResult Decode(ByteArray&& bytes) { BitSource bits(bytes); std::string result; result.reserve(100); std::string resultTrailer; std::list byteSegments; Mode mode = Mode::ASCII_ENCODE; do { if (mode == Mode::ASCII_ENCODE) { mode = DecodeAsciiSegment(bits, result, resultTrailer); } else { bool decodeOK; switch (mode) { case C40_ENCODE: decodeOK = DecodeC40Segment(bits, result); break; case TEXT_ENCODE: decodeOK = DecodeTextSegment(bits, result); break; case ANSIX12_ENCODE: decodeOK = DecodeAnsiX12Segment(bits, result); break; case EDIFACT_ENCODE: decodeOK = DecodeEdifactSegment(bits, result); break; case BASE256_ENCODE: decodeOK = DecodeBase256Segment(bits, result, byteSegments); break; default: decodeOK = false; break; } if (!decodeOK) { return DecodeStatus::FormatError; } mode = Mode::ASCII_ENCODE; } } while (mode != Mode::PAD_ENCODE && bits.available() > 0); if (resultTrailer.length() > 0) { result.append(resultTrailer); } return DecoderResult(std::move(bytes), TextDecoder::FromLatin1(result)).setByteSegments(std::move(byteSegments)); } } // namespace DecodedBitStreamParser //public DecoderResult decode(boolean[][] image) throws FormatException, ChecksumException{ // int dimension = image.length; //BitMatrix bits = new BitMatrix(dimension); //for (int i = 0; i < dimension; i++) { // for (int j = 0; j < dimension; j++) { // if (image[i][j]) { // bits.set(j, i); // } // } //} //return decode(bits); //} /** *

Given data and error-correction codewords received, possibly corrupted by errors, attempts to * correct the errors in-place using Reed-Solomon error correction.

* * @param codewordBytes data and error correction codewords * @param numDataCodewords number of codewords that are data bytes * @throws ChecksumException if error correction fails */ static bool CorrectErrors(ByteArray& codewordBytes, int numDataCodewords) { // First read into an array of ints std::vector codewordsInts(codewordBytes.begin(), codewordBytes.end()); int numECCodewords = codewordBytes.length() - numDataCodewords; if (!ReedSolomonDecoder::Decode(GenericGF::DataMatrixField256(), codewordsInts, numECCodewords)) return false; // Copy back into array of bytes -- only need to worry about the bytes that were data // We don't care about errors in the error-correction codewords std::copy_n(codewordsInts.begin(), numDataCodewords, codewordBytes.begin()); return true; } DecoderResult Decoder::Decode(const BitMatrix& bits) { // Construct a parser and read version, error-correction level const Version* version = BitMatrixParser::ReadVersion(bits); if (version == nullptr) { return DecodeStatus::FormatError; } // Read codewords ByteArray codewords = BitMatrixParser::ReadCodewords(bits); if (codewords.empty()) return DecodeStatus::FormatError; // Separate into data blocks std::vector dataBlocks = DataBlock::GetDataBlocks(codewords, *version); if (dataBlocks.empty()) return DecodeStatus::FormatError; // Count total number of data bytes int totalBytes = 0; for (const DataBlock& db : dataBlocks) { totalBytes += db.numDataCodewords(); } ByteArray resultBytes(totalBytes); // Error-correct and copy data blocks together into a stream of bytes int dataBlocksCount = static_cast(dataBlocks.size()); for (int j = 0; j < dataBlocksCount; j++) { auto& dataBlock = dataBlocks[j]; ByteArray& codewordBytes = dataBlock.codewords(); int numDataCodewords = dataBlock.numDataCodewords(); if (!CorrectErrors(codewordBytes, numDataCodewords)) return DecodeStatus::ChecksumError; for (int i = 0; i < numDataCodewords; i++) { // De-interlace data blocks. resultBytes[i * dataBlocksCount + j] = codewordBytes[i]; } } // Decode the contents of that stream of bytes return DecodedBitStreamParser::Decode(std::move(resultBytes)); } } // DataMatrix } // ZXing zxing-cpp-1.0.8+ds2/core/src/datamatrix/DMDecoder.h000066400000000000000000000035221361167020700217440ustar00rootroot00000000000000#pragma once /* * Copyright 2016 Nu-book Inc. * Copyright 2016 ZXing authors * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ namespace ZXing { class DecoderResult; class BitMatrix; namespace DataMatrix { /** *

The main class which implements Data Matrix Code decoding -- as opposed to locating and extracting * the Data Matrix Code from an image.

* * @author bbrown@google.com (Brian Brown) */ class Decoder { public: /** *

Convenience method that can decode a Data Matrix Code represented as a 2D array of booleans. * "true" is taken to mean a black module.

* * @param image booleans representing white/black Data Matrix Code modules * @return text and bytes encoded within the Data Matrix Code * @throws FormatException if the Data Matrix Code cannot be decoded * @throws ChecksumException if error correction fails */ //DecoderResult decode(boolean[][] image); /** *

Decodes a Data Matrix Code represented as a {@link BitMatrix}. A 1 or "true" is taken * to mean a black module.

* * @param bits booleans representing white/black Data Matrix Code modules * @return text and bytes encoded within the Data Matrix Code * @throws FormatException if the Data Matrix Code cannot be decoded * @throws ChecksumException if error correction fails */ static DecoderResult Decode(const BitMatrix& bits); }; } // DataMatrix } // ZXing zxing-cpp-1.0.8+ds2/core/src/datamatrix/DMDefaultPlacement.cpp000066400000000000000000000030561361167020700241510ustar00rootroot00000000000000/* * Copyright 2016 Huy Cuong Nguyen * Copyright 2006 Jeremias Maerki. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #include "DMDefaultPlacement.h" #include "ByteMatrix.h" #include "ByteArray.h" #include namespace ZXing { namespace DataMatrix { ByteMatrix DefaultPlacement::Place(const ByteArray& codewords, int numCols, int numRows) { ByteMatrix result(numCols, numRows, -1); auto codeword = codewords.begin(); VisitMatrix(numRows, numCols, [&codeword, &result](const BitPosArray& bitPos) { // Places the 8 bits of a corner or the utah-shaped symbol character in the result matrix uint8_t mask = 0x80; for (auto& p : bitPos) { bool value = *codeword & mask; result.set(p.col, p.row, value); mask >>= 1; } ++codeword; }); if (codeword != codewords.end()) return {}; // Lastly, if the lower righthand corner is untouched, fill in fixed pattern if (result.get(numCols - 1, numRows - 1) < 0) { result.set(numCols - 1, numRows - 1, true); result.set(numCols - 2, numRows - 2, true); } return result; } } // DataMatrix } // ZXing zxing-cpp-1.0.8+ds2/core/src/datamatrix/DMDefaultPlacement.h000066400000000000000000000071371361167020700236220ustar00rootroot00000000000000#pragma once /* * Copyright 2016 Huy Cuong Nguyen * Copyright 2006 Jeremias Maerki. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #include "BitMatrix.h" #include "ByteMatrix.h" #include "ByteArray.h" #include namespace ZXing { namespace DataMatrix { struct BitPos { int row, col; }; using BitPosArray = std::array; /** * VisitMatrix gets a functor/callback that is responsible for processing/visiting the bits in the matrix. */ template void VisitMatrix(int numRows, int numCols, VisitFunc visit) { //

See ISO 16022:2006, Figure F.3 to F.6

const BitPosArray CORNER1 = {{{-1, 0}, {-1, 1}, {-1, 2}, {0, -2}, {0, -1}, {1, -1}, {2, -1}, {3, -1}}}; const BitPosArray CORNER2 = {{{-3, 0}, {-2, 0}, {-1, 0}, {0, -4}, {0, -3}, {0, -2}, {0, -1}, {1, -1}}}; const BitPosArray CORNER3 = {{{-1, 0}, {-1,-1}, {0, -3}, {0, -2}, {0, -1}, {1, -3}, {1, -2}, {1, -1}}}; const BitPosArray CORNER4 = {{{-3, 0}, {-2, 0}, {-1, 0}, {0, -2}, {0, -1}, {1, -1}, {2, -1}, {3, -1}}}; BitMatrix visited(numCols, numRows); auto logAccess = [&visited](BitPos p){ visited.set(p.col, p.row); }; int row = 4; int col = 0; auto corner = [&numRows, &numCols, logAccess](const BitPosArray& corner) { auto clamp = [](int i, int max) { return i < 0 ? i + max : i; }; BitPosArray result; for (size_t bit = 0; bit < 8; ++bit) { result[bit] = {clamp(corner[bit].row, numRows), clamp(corner[bit].col, numCols)}; logAccess(result[bit]); } return result; }; auto utah = [&numRows, &numCols, logAccess](int row, int col) { const BitPosArray delta = {{{-2, -2}, {-2, -1}, {-1, -2}, {-1, -1}, {-1, 0}, {0, -2}, {0, -1}, {0, 0}}}; BitPosArray result; for (size_t bit = 0; bit < 8; ++bit) { int r = row + delta[bit].row; int c = col + delta[bit].col; if (r < 0) { r += numRows; c += 4 - ((numRows + 4) % 8); } if (c < 0) { c += numCols; r += 4 - ((numCols + 4) % 8); } result[bit] = {r, c}; logAccess(result[bit]); } return result; }; do { // Check the four corner cases if ((row == numRows) && (col == 0)) visit(corner(CORNER1)); else if ((row == numRows - 2) && (col == 0) && (numCols % 4 != 0)) visit(corner(CORNER2)); else if ((row == numRows + 4) && (col == 2) && (numCols % 8 == 0)) visit(corner(CORNER3)); else if ((row == numRows - 2) && (col == 0) && (numCols % 8 == 4)) visit(corner(CORNER4)); // Sweep upward diagonally to the right do { if ((row < numRows) && (col >= 0) && !visited.get(col, row)) visit(utah(row, col)); row -= 2; col += 2; } while (row >= 0 && col < numCols); row += 1; col += 3; // Sweep downward diagonally to the left do { if ((row >= 0) && (col < numCols) && !visited.get(col, row)) visit(utah(row, col)); row += 2; col -= 2; } while ((row < numRows) && (col >= 0)); row += 3; col += 1; } while ((row < numRows) || (col < numCols)); } /** * Symbol Character Placement Program. Adapted from Annex M.1 in ISO/IEC 16022:2000(E). */ class DefaultPlacement { public: static ByteMatrix Place(const ByteArray& codewords, int numcols, int numrows); }; } // DataMatrix } // ZXing zxing-cpp-1.0.8+ds2/core/src/datamatrix/DMDetector.cpp000066400000000000000000001057501361167020700225110ustar00rootroot00000000000000/* * Copyright 2016 Nu-book Inc. * Copyright 2016 ZXing authors * Copyright 2017 Axel Waggershauser * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ //#ifndef NDEBUG //#define PRINT_DEBUG //#endif #include "DMDetector.h" #include "BitMatrix.h" #include "DecodeStatus.h" #include "DetectorResult.h" #include "GridSampler.h" #include "WhiteRectDetector.h" #ifdef PRINT_DEBUG #include "ByteMatrix.h" #endif #include #include #include #include #include #include #include namespace ZXing { namespace DataMatrix { /** * The following code is the 'old' code by Sean Owen based on the Java upstream project. * It looks for a white rectangle, then cuts the corners until it hits a black pixel, which * results in 4 corner points. Then it determines the dimension by counting transitions * between the upper and right corners and samples the grid. * This code has several limitations compared to the new code below but has one advantage: * it works on high resolution scans with noisy/rippled black/white-edges and potentially * on partly occluded locator patterns (the surrounding border of modules/pixels). It is * therefore kept as a fall-back. */ /** * Simply encapsulates two points and a number of transitions between them. */ struct ResultPointsAndTransitions { const ResultPoint* from; const ResultPoint* to; int transitions; }; /** * Counts the number of black/white transitions between two points, using something like Bresenham's algorithm. */ static ResultPointsAndTransitions TransitionsBetween(const BitMatrix& image, const ResultPoint& from, const ResultPoint& to) { // See QR Code Detector, sizeOfBlackWhiteBlackRun() int fromX = static_cast(from.x()); int fromY = static_cast(from.y()); int toX = static_cast(to.x()); int toY = static_cast(to.y()); bool steep = std::abs(toY - fromY) > std::abs(toX - fromX); if (steep) { std::swap(fromX, fromY); std::swap(toX, toY); } int dx = std::abs(toX - fromX); int dy = std::abs(toY - fromY); int error = -dx / 2; int ystep = fromY < toY ? 1 : -1; int xstep = fromX < toX ? 1 : -1; int transitions = 0; bool inBlack = image.get(steep ? fromY : fromX, steep ? fromX : fromY); for (int x = fromX, y = fromY; x != toX; x += xstep) { bool isBlack = image.get(steep ? y : x, steep ? x : y); if (isBlack != inBlack) { transitions++; inBlack = isBlack; } error += dy; if (error > 0) { if (y == toY) { break; } y += ystep; error -= dx; } } return ResultPointsAndTransitions{ &from, &to, transitions }; } inline static bool IsValidPoint(const ResultPoint& p, int imgWidth, int imgHeight) { return p.x() >= 0 && p.x() < imgWidth && p.y() > 0 && p.y() < imgHeight; } inline static float RoundToNearest(float x) { #if defined(__ANDROID__) && defined(__GNUC__) return static_cast(round(x)); #else return std::round(x); #endif } /** * Calculates the position of the white top right module using the output of the rectangle detector * for a rectangular matrix */ static bool CorrectTopRightRectangular(const BitMatrix& image, const ResultPoint& bottomLeft, const ResultPoint& bottomRight, const ResultPoint& topLeft, const ResultPoint& topRight, int dimensionTop, int dimensionRight, ResultPoint& result) { float corr = RoundToNearest(ResultPoint::Distance(bottomLeft, bottomRight)) / static_cast(dimensionTop); float norm = RoundToNearest(ResultPoint::Distance(topLeft, topRight)); float cos = (topRight.x() - topLeft.x()) / norm; float sin = (topRight.y() - topLeft.y()) / norm; ResultPoint c1(topRight.x() + corr*cos, topRight.y() + corr*sin); corr = RoundToNearest(ResultPoint::Distance(bottomLeft, topLeft)) / (float)dimensionRight; norm = RoundToNearest(ResultPoint::Distance(bottomRight, topRight)); cos = (topRight.x() - bottomRight.x()) / norm; sin = (topRight.y() - bottomRight.y()) / norm; ResultPoint c2(topRight.x() + corr*cos, topRight.y() + corr*sin); if (!IsValidPoint(c1, image.width(), image.height())) { if (IsValidPoint(c2, image.width(), image.height())) { result = c2; return true; } return false; } if (!IsValidPoint(c2, image.width(), image.height())) { result = c1; return true; } int l1 = std::abs(dimensionTop - TransitionsBetween(image, topLeft, c1).transitions) + std::abs(dimensionRight - TransitionsBetween(image, bottomRight, c1).transitions); int l2 = std::abs(dimensionTop - TransitionsBetween(image, topLeft, c2).transitions) + std::abs(dimensionRight - TransitionsBetween(image, bottomRight, c2).transitions); result = l1 <= l2 ? c1 : c2; return true; } /** * Calculates the position of the white top right module using the output of the rectangle detector * for a square matrix */ static ResultPoint CorrectTopRight(const BitMatrix& image, const ResultPoint& bottomLeft, const ResultPoint& bottomRight, const ResultPoint& topLeft, const ResultPoint& topRight, int dimension) { float corr = RoundToNearest(ResultPoint::Distance(bottomLeft, bottomRight)) / (float)dimension; float norm = RoundToNearest(ResultPoint::Distance(topLeft, topRight)); float cos = (topRight.x() - topLeft.x()) / norm; float sin = (topRight.y() - topLeft.y()) / norm; ResultPoint c1(topRight.x() + corr * cos, topRight.y() + corr * sin); corr = RoundToNearest(ResultPoint::Distance(bottomLeft, topLeft)) / (float)dimension; norm = RoundToNearest(ResultPoint::Distance(bottomRight, topRight)); cos = (topRight.x() - bottomRight.x()) / norm; sin = (topRight.y() - bottomRight.y()) / norm; ResultPoint c2(topRight.x() + corr * cos, topRight.y() + corr * sin); if (!IsValidPoint(c1, image.width(), image.height())) { if (!IsValidPoint(c2, image.width(), image.height())) return topRight; return c2; } if (!IsValidPoint(c2, image.width(), image.height())) return c1; int l1 = std::abs(TransitionsBetween(image, topLeft, c1).transitions - TransitionsBetween(image, bottomRight, c1).transitions); int l2 = std::abs(TransitionsBetween(image, topLeft, c2).transitions - TransitionsBetween(image, bottomRight, c2).transitions); return l1 <= l2 ? c1 : c2; } static BitMatrix SampleGrid(const BitMatrix& image, const ResultPoint& topLeft, const ResultPoint& bottomLeft, const ResultPoint& bottomRight, const ResultPoint& topRight, int dimensionX, int dimensionY) { return GridSampler::Instance()->sampleGrid( image, dimensionX, dimensionY, 0.5f, 0.5f, dimensionX - 0.5f, 0.5f, dimensionX - 0.5f, dimensionY - 0.5f, 0.5f, dimensionY - 0.5f, topLeft.x(), topLeft.y(), topRight.x(), topRight.y(), bottomRight.x(), bottomRight.y(), bottomLeft.x(), bottomLeft.y()); } /** * Returns the z component of the cross product between vectors BC and BA. */ static float CrossProductZ(const ResultPoint& a, const ResultPoint& b, const ResultPoint& c) { return (c.x() - b.x())*(a.y() - b.y()) - (c.y() - b.y())*(a.x() - b.x()); } /** * Orders an array of three ResultPoints in an order [A,B,C] such that AB is less than AC * and BC is less than AC, and the angle between BC and BA is less than 180 degrees. * * @param patterns array of three {@code ResultPoint} to order */ static void OrderByBestPatterns(const ResultPoint*& p0, const ResultPoint*& p1, const ResultPoint*& p2) { // Find distances between pattern centers float zeroOneDistance = ResultPoint::Distance(*p0, *p1); float oneTwoDistance = ResultPoint::Distance(*p1, *p2); float zeroTwoDistance = ResultPoint::Distance(*p0, *p2); const ResultPoint* pointA; const ResultPoint* pointB; const ResultPoint* pointC; // Assume one closest to other two is B; A and C will just be guesses at first if (oneTwoDistance >= zeroOneDistance && oneTwoDistance >= zeroTwoDistance) { pointB = p0; pointA = p1; pointC = p2; } else if (zeroTwoDistance >= oneTwoDistance && zeroTwoDistance >= zeroOneDistance) { pointB = p1; pointA = p0; pointC = p2; } else { pointB = p2; pointA = p0; pointC = p1; } // Use cross product to figure out whether A and C are correct or flipped. // This asks whether BC x BA has a positive z component, which is the arrangement // we want for A, B, C. If it's negative, then we've got it flipped around and // should swap A and C. if (CrossProductZ(*pointA, *pointB, *pointC) < 0.0f) { std::swap(pointA, pointC); } p0 = pointA; p1 = pointB; p2 = pointC; } static DetectorResult DetectOld(const BitMatrix& image) { ResultPoint pointA, pointB, pointC, pointD; if (!WhiteRectDetector::Detect(image, pointA, pointB, pointC, pointD)) { return {}; } // Point A and D are across the diagonal from one another, // as are B and C. Figure out which are the solid black lines // by counting transitions std::array transitions = { TransitionsBetween(image, pointA, pointB), TransitionsBetween(image, pointA, pointC), TransitionsBetween(image, pointB, pointD), TransitionsBetween(image, pointC, pointD), }; std::sort(transitions.begin(), transitions.end(), [](const ResultPointsAndTransitions& a, const ResultPointsAndTransitions& b) { return a.transitions < b.transitions; }); // Sort by number of transitions. First two will be the two solid sides; last two // will be the two alternating black/white sides const auto& lSideOne = transitions[0]; const auto& lSideTwo = transitions[1]; // Figure out which point is their intersection by tallying up the number of times we see the // endpoints in the four endpoints. One will show up twice. std::map pointCount; pointCount[lSideOne.from] += 1; pointCount[lSideOne.to] += 1; pointCount[lSideTwo.from] += 1; pointCount[lSideTwo.to] += 1; const ResultPoint* bottomRight = nullptr; const ResultPoint* bottomLeft = nullptr; const ResultPoint* topLeft = nullptr; for (const auto& entry : pointCount) { if (entry.second == 2) { bottomLeft = entry.first; // this is definitely the bottom left, then -- end of two L sides } else { // Otherwise it's either top left or bottom right -- just assign the two arbitrarily now if (bottomRight == nullptr) { bottomRight = entry.first; } else { topLeft = entry.first; } } } if (bottomRight == nullptr || bottomLeft == nullptr || topLeft == nullptr) { return {}; } // Bottom left is correct but top left and bottom right might be switched // Use the dot product trick to sort them out OrderByBestPatterns(bottomRight, bottomLeft, topLeft); // Which point didn't we find in relation to the "L" sides? that's the top right corner const ResultPoint* topRight; if (pointCount.find(&pointA) == pointCount.end()) { topRight = &pointA; } else if (pointCount.find(&pointB) == pointCount.end()) { topRight = &pointB; } else if (pointCount.find(&pointC) == pointCount.end()) { topRight = &pointC; } else { topRight = &pointD; } // Next determine the dimension by tracing along the top or right side and counting black/white // transitions. Since we start inside a black module, we should see a number of transitions // equal to 1 less than the code dimension. Well, actually 2 less, because we are going to // end on a black module: // The top right point is actually the corner of a module, which is one of the two black modules // adjacent to the white module at the top right. Tracing to that corner from either the top left // or bottom right should work here. int dimensionTop = TransitionsBetween(image, *topLeft, *topRight).transitions; int dimensionRight = TransitionsBetween(image, *bottomRight, *topRight).transitions; if ((dimensionTop & 0x01) == 1) { // it can't be odd, so, round... up? dimensionTop++; } dimensionTop += 2; if ((dimensionRight & 0x01) == 1) { // it can't be odd, so, round... up? dimensionRight++; } dimensionRight += 2; if (dimensionTop < 10 || dimensionTop > 144 || dimensionRight < 8 || dimensionRight > 144 ) return {}; ResultPoint correctedTopRight; // Rectanguar symbols are 6x16, 6x28, 10x24, 10x32, 14x32, or 14x44. If one dimension is more // than twice the other, it's certainly rectangular, but to cut a bit more slack we accept it as // rectangular if the bigger side is at least 7/4 times the other: if (4 * dimensionTop >= 7 * dimensionRight || 4 * dimensionRight >= 7 * dimensionTop) { // The matrix is rectangular if (!CorrectTopRightRectangular(image, *bottomLeft, *bottomRight, *topLeft, *topRight, dimensionTop, dimensionRight, correctedTopRight)) { correctedTopRight = *topRight; } dimensionTop = TransitionsBetween(image, *topLeft, correctedTopRight).transitions; dimensionRight = TransitionsBetween(image, *bottomRight, correctedTopRight).transitions; if ((dimensionTop & 0x01) == 1) { // it can't be odd, so, round... up? dimensionTop++; } if ((dimensionRight & 0x01) == 1) { // it can't be odd, so, round... up? dimensionRight++; } } else { // The matrix is square int dimension = std::min(dimensionRight, dimensionTop); // correct top right point to match the white module correctedTopRight = CorrectTopRight(image, *bottomLeft, *bottomRight, *topLeft, *topRight, dimension); // Redetermine the dimension using the corrected top right point int dimensionCorrected = std::max(TransitionsBetween(image, *topLeft, correctedTopRight).transitions, TransitionsBetween(image, *bottomRight, correctedTopRight).transitions); dimensionCorrected++; if ((dimensionCorrected & 0x01) == 1) { dimensionCorrected++; } dimensionTop = dimensionRight = dimension; } auto bits = SampleGrid(image, *topLeft, *bottomLeft, *bottomRight, correctedTopRight, dimensionTop, dimensionRight); if (bits.empty()) return {}; return {std::move(bits), {*topLeft, *bottomLeft, *bottomRight, correctedTopRight}}; } /** * The following code is the 'new' one implemented by Axel Waggershauser and is working completely different. * It is performing something like a (back) trace search along edges through the bit matrix, first looking for * the 'L'-pattern, then tracing the black/white borders at the top/right. Advantages over the old code are: * * works with lower resolution scans (around 2 pixel per module), due to sub-pixel precision grid placement * * works with real-world codes that have just one module wide quite-zone (which is perfectly in spec) */ template struct PointT { T x = 0, y = 0; PointT() = default; PointT(T x, T y) : x(x), y(y) {} template explicit PointT(const PointT& p) : x((T)p.x), y((T)p.y) {} explicit PointT(const ResultPoint& p) : x(p.x()), y(p.y()) {} operator ResultPoint() const { return {static_cast(x), static_cast(y)}; } }; template bool operator == (const PointT& a, const PointT& b) { return a.x == b.x && a.y == b.y; } template bool operator != (const PointT& a, const PointT& b) { return !(a == b); } template auto operator + (const PointT& a, const PointT& b) -> PointT { return {a.x + b.x, a.y + b.y}; } template auto operator - (const PointT& a, const PointT& b) -> PointT { return {a.x - b.x, a.y - b.y}; } template PointT operator * (U s, const PointT& a) { return {s * a.x, s * a.y}; } template PointT operator / (const PointT& a, U d) { return {a.x / d, a.y / d}; } template double operator * (const PointT& a, const PointT& b) { return double(a.x) * b.x + a.y * b.y; } template double distance(PointT a, PointT b) { auto d = a - b; return std::sqrt(d * d); } using PointI = PointT; using PointF = PointT; template PointF normalized(PointT a) { return PointF(a) / distance(a, {}); } PointI round(PointF p) { return PointI(::lround(p.x), ::lround(p.y)); } class RegressionLine { std::vector _points; PointF _directionInward; double a = NAN, b = NAN, c = NAN; friend PointF intersect(const RegressionLine& l1, const RegressionLine& l2); bool evaluate(const std::vector& ps) { auto mean = std::accumulate(ps.begin(), ps.end(), PointF()) / ps.size(); double sumXX = 0, sumYY = 0, sumXY = 0; for (auto& p : ps) { sumXX += (p.x - mean.x) * (p.x - mean.x); sumYY += (p.y - mean.y) * (p.y - mean.y); sumXY += (p.x - mean.x) * (p.y - mean.y); } if (sumYY >= sumXX) { a = +sumYY / std::sqrt(sumYY * sumYY + sumXY * sumXY); b = -sumXY / std::sqrt(sumYY * sumYY + sumXY * sumXY); } else { a = +sumXY / std::sqrt(sumXX * sumXX + sumXY * sumXY); b = -sumXX / std::sqrt(sumXX * sumXX + sumXY * sumXY); } if (_directionInward * normal() < 0) { a = -a; b = -b; } c = normal() * mean; // (a*mean.x + b*mean.y); return _directionInward * normal() > 0.5; // angle between original and new direction is at most 60 degree } template static double average(const Container& c, Filter f) { double sum = 0; int num = 0; for (const auto& v : c) if (f(v)) { sum += v; ++num; } return sum / num; } public: const std::vector& points() const { return _points; } int length() const { return _points.size() >= 2 ? int(distance(_points.front(), _points.back())) : 0; } bool isValid() const { return !std::isnan(a); } PointF normal() const { return isValid() ? PointF(a, b) : _directionInward; } double signedDistance(PointI p) const { return normal() * p - c; } PointF project(PointI p) const { return p - signedDistance(p) * normal(); } void reverse() { std::reverse(_points.begin(), _points.end()); } void add(PointI p) { assert(_directionInward != PointF()); _points.push_back(p); if (_points.size() == 1) c = normal() * p; } void pop_back() { _points.pop_back(); } void setDirectionInward(PointF d) { _directionInward = normalized(d); } bool evaluate(double maxDist = -1) { auto ps = _points; bool ret = evaluate(ps); if (maxDist > 0) { size_t old_points_size; while (true) { old_points_size = _points.size(); _points.erase(std::remove_if(_points.begin(), _points.end(), [this, maxDist](PointI p) { return this->signedDistance(p) > maxDist; }), _points.end()); if (old_points_size == _points.size()) break; #ifdef PRINT_DEBUG printf("removed %zu points\n", old_points_size - _points.size()); #endif ret = evaluate(_points); } } return ret; } double modules(PointF beg, PointF end) const { assert(_points.size() > 3); std::vector gapSizes; gapSizes.reserve(_points.size()); // calculate the distance between the points projected onto the regression line for (size_t i = 1; i < _points.size(); ++i) gapSizes.push_back(distance(project(_points[i]), project(_points[i - 1]))); // calculate the (average) distance of two adjacent pixels auto unitPixelDist = average(gapSizes, [](double dist){ return 0.75 < dist && dist < 1.5; }); // calculate the width of 2 modules (first black pixel to first black pixel) double sum = distance(beg, project(_points.front())) - unitPixelDist; auto i = gapSizes.begin(); for (auto dist : gapSizes) { sum += dist; if (dist > 1.9 * unitPixelDist) { // c++14: *i++ = std::exchange(sum, 0.0); *i++ = sum; sum = 0.0; } } *i++ = sum + distance(end, project(_points.back())); gapSizes.erase(i, gapSizes.end()); auto lineLength = distance(beg, end) - unitPixelDist; auto meanGapSize = lineLength / gapSizes.size(); #ifdef PRINT_DEBUG printf("unit pixel dist: %f\n", unitPixelDist); printf("lineLength: %f, meanGapSize: %f, gaps: %lu\n", lineLength, meanGapSize, gapSizes.size()); #endif meanGapSize = average(gapSizes, [&](double dist){ return std::abs(dist - meanGapSize) < meanGapSize/2; }); #ifdef PRINT_DEBUG printf("lineLength: %f, meanGapSize: %f, gaps: %lu\n", lineLength, meanGapSize, gapSizes.size()); #endif return lineLength / meanGapSize; } }; PointF intersect(const RegressionLine& l1, const RegressionLine& l2) { assert(l1.isValid() && l2.isValid()); double x, y, d; d = l1.a * l2.b - l1.b * l2.a; x = (l1.c * l2.b - l1.b * l2.c) / d; y = (l1.a * l2.c - l1.c * l2.a) / d; return {x, y}; } class EdgeTracer { const BitMatrix& image; PointI p; // current position PointF d; // current direction static PointF mainDirection(PointF d) { assert(std::abs(d.x) != std::abs(d.y)); return std::abs(d.x) > std::abs(d.y) ? PointF(d.x, 0) : PointF(0, d.y); } enum class StepResult { FOUND, OPEN_END, CLOSED_END }; bool isIn(PointI p) const { const int b = 0; return b <= p.x && p.x < image.width()-b && b <= p.y && p.y < image.height()-b; } bool isIn(PointF p) const { return isIn(round(p)); } bool isIn() const { return isIn(p); } class Value { enum { INVALID, WHITE, BLACK }; int v = INVALID; public: Value() = default; Value(bool isBlack) : v(isBlack ? BLACK : WHITE) {} bool isValid() const { return v != INVALID; } bool isWhite() const { return v == WHITE; } bool isBlack() const { return v == BLACK; } }; Value getAt(PointF p) const { auto q = round(p); if (!isIn(q)) return {}; return {image.get(q.x, q.y)}; } bool blackAt(PointF p) const { return getAt(p).isBlack(); } bool whiteAt(PointF p) const { return getAt(p).isWhite(); } bool isEdge(PointF pos, PointF dir) const { return whiteAt(pos) && blackAt(pos + dir); } StepResult traceStep(PointF dEdge, int maxStepSize, bool goodDirection) { dEdge = mainDirection(dEdge); for (int breadth = 1; breadth <= (goodDirection ? 1 : (maxStepSize == 1 ? 2 : 3)); ++breadth) for (int step = 1; step <= maxStepSize; ++step) for (int i = 0; i <= 2*(step/4+1) * breadth; ++i) { auto pEdge = p + step * d + (i&1 ? (i+1)/2 : -i/2) * dEdge; log(round(pEdge)); if (!blackAt(pEdge + dEdge)) continue; // found black pixel -> go 'outward' until we hit the b/w border for (int j = 0; j < std::max(maxStepSize, 3) && isIn(pEdge); ++j) { if (whiteAt(pEdge)) { // if we are not making any progress, we still have another endless loop bug assert(p != round(pEdge)); p = round(pEdge); return StepResult::FOUND; } pEdge = pEdge - dEdge; if (blackAt(pEdge - d)) pEdge = pEdge - d; log(round(pEdge)); } // no valid b/w border found within reasonable range return StepResult::CLOSED_END; } return StepResult::OPEN_END; } public: #ifdef PRINT_DEBUG static ByteMatrix _log; void log(const PointI& p) const { if (_log.height() != image.height() || _log.width() != image.width()) _log = ByteMatrix(image.width(), image.height()); if (isIn(p)) _log.set(p.x, p.y, 1); } #else void log(const PointI&) const {} #endif EdgeTracer(const BitMatrix& img, PointF p, PointF d) : image(img), p(p), d(d) {} EdgeTracer& operator=(const EdgeTracer& other) { assert(&image == &other.image); p = other.p; d = other.d; return *this; } EdgeTracer(const EdgeTracer&) = default; ~EdgeTracer() = default; EdgeTracer(EdgeTracer&&) noexcept(true) = default; EdgeTracer& operator=(EdgeTracer&&) = default; bool step(int s = 1) { p = round(p + s * d); log(p); return isIn(p); } void setDirection(PointF dir) { d = dir / std::max(std::abs(dir.x), std::abs(dir.y)); } bool updateDirectionFromOrigin(PointF origin) { auto old_d = d; setDirection(p - origin); // if the new direction is pointing "backward", i.e. angle(new, old) > 90 deg -> break if (d * old_d < 0) return false; // make sure d stays in the same quadrant to prevent an infinite loop if (std::abs(d.x) == std::abs(d.y)) d = mainDirection(old_d) + 0.99 * (d - mainDirection(old_d)); else if (mainDirection(d) != mainDirection(old_d)) d = mainDirection(old_d) + 0.99 * mainDirection(d); return true; } PointF front() const { return d; } PointF back() const { return {-d.x, -d.y}; } PointF right() const { return {-d.y, d.x}; } PointF left() const { return {d.y, -d.x}; } bool isEdgeBehind() const { return isEdge(PointF(p), back()); } bool traceLine(PointF dEdge, RegressionLine& line) { line.setDirectionInward(dEdge); do { log(p); line.add(p); if (line.points().size() % 30 == 10) { if (!line.evaluate()) return false; if (!updateDirectionFromOrigin(p - line.project(p) + line.points().front())) return false; } auto stepResult = traceStep(dEdge, 1, line.isValid()); if (stepResult != StepResult::FOUND) return stepResult == StepResult::OPEN_END && line.points().size() > 1; } while (true); } bool traceGaps(PointF dEdge, RegressionLine& line, int maxStepSize, const RegressionLine& finishLine) { line.setDirectionInward(dEdge); int gaps = 0; do { assert(line.points().empty() || p != line.points().back()); log(p); // if we drifted too far outside of the code, break if (line.isValid() && line.signedDistance(p) < -5 && (!line.evaluate() || line.signedDistance(p) < -5)) return false; // if we are drifting towards the inside of the code, pull the current position back out onto the line if (line.isValid() && line.signedDistance(p) > 3) { // The current direction d and the line we are tracing are supposed to be roughly parallel. // In case the 'go outward' step in traceStep lead us astray, we might end up with a line // that is almost perpendicular to d. Then the back-projection below can result in an // endless loop. Break if the angle between d and line is greater than 45 deg. if (std::abs(normalized(d) * line.normal()) > 0.7) // thresh is approx. sin(45 deg) return false; auto np = line.project(p); // make sure we are making progress even when back-projecting: // consider a 90deg corner, rotated 45deg. we step away perpendicular from the line and get // back projected where we left off the line. if (distance(np, line.project(line.points().back())) < 1) np = np + d; p = round(np); } else { auto stepLengthInMainDir = line.points().empty() ? 0.0 : mainDirection(d) * (p - line.points().back()); line.add(p); if (stepLengthInMainDir > 1) { ++gaps; if (gaps >= 2 || line.points().size() > 5) { if (!line.evaluate(1.5)) return false; if (!updateDirectionFromOrigin(p - line.project(p) + line.points().front())) return false; // check if the first half of the top-line trace is complete. // the minimum code size is 10x10 -> every code has at least 4 gaps //TODO: maybe switch to termination condition based on bottom line length to get a better // finishLine for the right line trace if (!finishLine.isValid() && gaps == 4) { // undo the last insert, it will be inserted again after the restart line.pop_back(); --gaps; return true; } } } else if (gaps == 0 && line.points().size() >= 2u * maxStepSize) return false; // no point in following a line that has no gaps } if (finishLine.isValid()) maxStepSize = std::min(maxStepSize, static_cast(finishLine.signedDistance(p))); auto stepResult = traceStep(dEdge, maxStepSize, line.isValid()); if (stepResult != StepResult::FOUND) // we are successful iff we found an open end across a valid finishLine return stepResult == StepResult::OPEN_END && finishLine.isValid() && static_cast(finishLine.signedDistance(p)) <= maxStepSize + 1; } while (true); } bool traceCorner(PointF dir, PointF& corner) { step(); corner = PointF(p); std::swap(d, dir); traceStep(-1 * dir, 2, false); #ifdef PRINT_DEBUG printf("turn: %d x %d -> %.2f, %.2f\n", p.x, p.y, d.x, d.y); #endif return isIn(corner) && isIn(p); } }; #ifdef PRINT_DEBUG ByteMatrix EdgeTracer::_log; static void log(const std::vector& points, int color = 2) { for (auto p : points) EdgeTracer::_log.set(p.x, p.y, color); } static void dumpDebugPPM(const BitMatrix& image, const char* fn ) { FILE *f = fopen(fn, "wb"); // Write PPM header, P5 == grey, P6 == rgb fprintf(f, "P6\n%d %d\n255\n", image.width(), image.height()); // Write pixels for (int y = 0; y < image.height(); ++y) for (int x = 0; x < image.width(); ++x) { unsigned char r, g, b; r = g = b = image.get(x, y) ? 0 : 255; switch (EdgeTracer::_log.get(x, y)) { case 1: r = g = b = r ? 230 : 50; break; case 2: r = b = 50, g = 220; break; case 3: g = r = 100, b = 250; break; } fwrite(&r, 1, 1, f); fwrite(&g, 1, 1, f); fwrite(&b, 1, 1, f); } fclose(f); } static void printBitMatrix(const BitMatrix& matrix) { for (int y = 0; y < matrix.height(); ++y) { for (int x = 0; x < matrix.width(); ++x) printf("%c ", matrix.get(x, y) ? '+' : '.'); printf("\n"); } } #endif static BitMatrix SampleGrid(const BitMatrix& image, PointF tl, PointF bl, PointF br, PointF tr, int dimensionX, int dimensionY) { auto moveTowardsBy = [](PointF& a, const PointF& b, double d) { auto a2b = normalized(b - a); a = a + d * a2b; }; // shrink shape by half a pixel to go from center of white pixel outside of code to the edge between white and black moveTowardsBy(tl, br, 0.5); moveTowardsBy(br, tl, 0.5); moveTowardsBy(bl, tr, 0.5); // move the tr point a little less because the jagged top and right line tend to be statistically slightly // inclined toward the center anyway. moveTowardsBy(tr, bl, 0.3); // work around a missing 'round' in GridSampler. // TODO: the correct location for the rounding is after the transformation in GridSampler // but that would currently break other 2D encoders for (auto* p : {&tl, &bl, &br, &tr}) *p = *p + PointF(0.5, 0.5); auto border = 0.f; return GridSampler::Instance()->sampleGrid( image, dimensionX, dimensionY, border, border, dimensionX - border, border, dimensionX - border, dimensionY - border, border, dimensionY - border, (float)tl.x, (float)tl.y, (float)tr.x, (float)tr.y, (float)br.x, (float)br.y, (float)bl.x, (float)bl.y); } static DetectorResult DetectNew(const BitMatrix& image, bool tryRotate) { // walk to the left at first for (auto startDirection : {PointF(-1, 0), PointF(1, 0), PointF(0, -1), PointF(0, 1)}) { EdgeTracer startTracer(image, PointF(image.width()/2, image.height()/2), startDirection); while (startTracer.step()) { // go forward until we reach a white/black border if (!startTracer.isEdgeBehind()) continue; #ifdef PRINT_DEBUG #define continue { \ printf("broke at %d\n", __LINE__); \ for (auto* l : {&lineL, &lineB, &lineT, &lineR}) log(l->points()); \ continue; \ } #endif PointF tl, bl, br, tr; RegressionLine lineL, lineB, lineR, lineT; auto t = startTracer; // follow left leg upwards t.setDirection(t.right()); if (!t.traceLine(t.right(), lineL)) continue; if (!t.traceCorner(t.right(), tl)) continue; lineL.reverse(); auto tlTracer = t; // follow left leg downwards t = startTracer; t.setDirection(tlTracer.right()); if (!t.traceLine(t.left(), lineL)) continue; if (!lineL.isValid()) t.updateDirectionFromOrigin(tl); auto up = t.back(); if (!t.traceCorner(t.left(), bl)) continue; // follow bottom leg right if (!t.traceLine(t.left(), lineB)) continue; if (!lineB.isValid()) t.updateDirectionFromOrigin(bl); auto right = t.front(); if (!t.traceCorner(t.left(), br)) continue; auto lenL = distance(tl, bl) - 1; auto lenB = distance(bl, br) - 1; if (lenL < 10 || lenB < 10 || lenB < lenL / 4 || lenB > lenL * 8) continue; auto maxStepSize = static_cast(lenB / 5 + 1); // datamatrix dim is at least 10x10 // at this point we found a plausible L-shape and are now looking for the b/w pattern at the top and right: // follow top row right 'half way' (4 gaps), see traceGaps break condition with 'invalid' line tlTracer.setDirection(right); if (!tlTracer.traceGaps(tlTracer.right(), lineT, maxStepSize, RegressionLine())) continue; maxStepSize = std::min(lineT.length() / 3, static_cast(lenL / 5)) * 2; // follow up until we reach the top line t.setDirection(up); if (!t.traceGaps(t.left(), lineR, maxStepSize, lineT)) continue; if (!t.traceCorner(t.left(), tr)) continue; auto lenT = distance(tl, tr) - 1; auto lenR = distance(tr, br) - 1; if (std::abs(lenT - lenB) / lenB > 0.5 || std::abs(lenR - lenL) / lenL > 0.5 || lineT.points().size() < 5 || lineR.points().size() < 5) continue; // continue top row right until we cross the right line if (!tlTracer.traceGaps(tlTracer.right(), lineT, maxStepSize, lineR)) continue; #ifdef PRINT_DEBUG printf("L: %f, %f ^ %f, %f > %f, %f (%d : %d : %d : %d)\n", bl.x, bl.y, tl.x - bl.x, tl.y - bl.y, br.x - bl.x, br.y - bl.y, (int)lenL, (int)lenB, (int)lenT, (int)lenR); #endif for (RegressionLine* l : {&lineL, &lineB, &lineT, &lineR}) l->evaluate(1.0); // find the bounding box corners of the code with sub-pixel precision by intersecting the 4 border lines bl = intersect(lineB, lineL); tl = intersect(lineT, lineL); tr = intersect(lineT, lineR); br = intersect(lineB, lineR); int dimT, dimR; double fracT, fracR; auto splitDouble = [](double d, int* i, double* f) { *i = std::isnormal(d) ? static_cast(d + 0.5) : 0; *f = std::isnormal(d) ? std::abs(d - *i) : INFINITY; }; splitDouble(lineT.modules(tl, tr), &dimT, &fracT); splitDouble(lineR.modules(br, tr), &dimR, &fracR); #ifdef PRINT_DEBUG printf("L: %f, %f ^ %f, %f > %f, %f ^> %f, %f\n", bl.x, bl.y, tl.x - bl.x, tl.y - bl.y, br.x - bl.x, br.y - bl.y, tr.x, tr.y); printf("dim: %d x %d\n", dimT, dimR); #endif // if we have an invalid rectangular data matrix dimension, we try to parse it by assuming a square // we use the dimension that is closer to an integral value if (dimT < 2 * dimR || dimT > 4 * dimR) dimT = dimR = fracR < fracT ? dimR : dimT; // the dimension is 2x the number of black/white transitions dimT *= 2; dimR *= 2; if (dimT < 10 || dimT > 144 || dimR < 8 || dimR > 144 ) continue; auto bits = SampleGrid(image, tl, bl, br, tr, dimT, dimR); #ifdef PRINT_DEBUG printf("modules top: %d, right: %d\n", dimT, dimR); printBitMatrix(bits); for (RegressionLine* l : {&lineL, &lineB, &lineT, &lineR}) log(l->points()); dumpDebugPPM(image, "binary.pnm"); #endif if (bits.empty()) continue; return {std::move(bits), {tl, bl, br, tr}}; } // reached border of image -> try next scan direction #ifndef PRINT_DEBUG if (!tryRotate) #endif break; // only test left direction } #ifdef PRINT_DEBUG dumpDebugPPM(image, "binary.pnm"); #endif return {}; } DetectorResult Detector::Detect(const BitMatrix& image, bool tryHarder, bool tryRotate) { auto result = DetectNew(image, tryRotate); if (!result.isValid() && tryHarder) result = DetectOld(image); return result; } } // DataMatrix } // ZXing zxing-cpp-1.0.8+ds2/core/src/datamatrix/DMDetector.h000066400000000000000000000023661361167020700221550ustar00rootroot00000000000000#pragma once /* * Copyright 2016 Nu-book Inc. * Copyright 2016 ZXing authors * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ namespace ZXing { class BitMatrix; class DetectorResult; namespace DataMatrix { /** *

Encapsulates logic that can detect a Data Matrix Code in an image, even if the Data Matrix Code * is rotated or skewed, or partially obscured.

* * @author Sean Owen, Axel Waggershauser */ class Detector { public: /** *

Detects a Data Matrix Code in an image.

* * @return {@link DetectorResult} encapsulating results of detecting a Data Matrix Code * @throws NotFoundException if no Data Matrix Code can be found */ static DetectorResult Detect(const BitMatrix& image, bool tryHarder, bool tryRotate); }; } // DataMatrix } // ZXing zxing-cpp-1.0.8+ds2/core/src/datamatrix/DMECB.h000066400000000000000000000035011361167020700207650ustar00rootroot00000000000000#pragma once /* * Copyright 2016 Nu-book Inc. * Copyright 2016 ZXing authors * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #include namespace ZXing { namespace DataMatrix { /** *

Encapsualtes the parameters for one error-correction block in one symbol version. * This includes the number of data codewords, and the number of times a block with these * parameters is used consecutively in the Data Matrix code version's format.

*/ struct ECB { int count; int dataCodewords; }; /** *

Encapsulates a set of error-correction blocks in one symbol version. Most versions will * use blocks of differing sizes within one version, so, this encapsulates the parameters for * each set of blocks. It also holds the number of error-correction codewords per block since it * will be the same across all blocks within one version.

*/ struct ECBlocks { int codewordsPerBlock; std::array blocks; int numBlocks() const { return blocks[0].count + blocks[1].count; } //int totalCodewords() const { // return codewordsPerBlock * numBlocks(); //} int totalDataCodewords() const { return blocks[0].count * (blocks[0].dataCodewords + codewordsPerBlock) + blocks[1].count * (blocks[1].dataCodewords + codewordsPerBlock); } const std::array& blockArray() const { return blocks; } }; } // DataMatrix } // ZXing zxing-cpp-1.0.8+ds2/core/src/datamatrix/DMECEncoder.cpp000066400000000000000000000175041361167020700225260ustar00rootroot00000000000000/* * Copyright 2016 Huy Cuong Nguyen * Copyright 2006 Jeremias Maerki. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #include "DMECEncoder.h" #include "DMSymbolInfo.h" #include "ByteArray.h" #include "ZXStrConvWorkaround.h" #include #include #include #include namespace ZXing { namespace DataMatrix { /** * Precomputed polynomial factors for ECC 200. */ static std::array FACTORS = {{ /*set 1*/ {228, 48, 15, 111, 62}, /*set 2*/ {23, 68, 144, 134, 240, 92, 254}, /*set 3*/ {28, 24, 185, 166, 223, 248, 116, 255, 110, 61}, /*set 4*/ {175, 138, 205, 12, 194, 168, 39, 245, 60, 97, 120}, /*set 5*/ {41, 153, 158, 91, 61, 42, 142, 213, 97, 178, 100, 242}, /*set 6*/ {156, 97, 192, 252, 95, 9, 157, 119, 138, 45, 18, 186, 83, 185}, /*set 7*/ {83, 195, 100, 39, 188, 75, 66, 61, 241, 213, 109, 129, 94, 254, 225, 48, 90, 188}, /*set 8*/ {15, 195, 244, 9, 233, 71, 168, 2, 188, 160, 153, 145, 253, 79, 108, 82, 27, 174, 186, 172}, /*set 9*/ {52, 190, 88, 205, 109, 39, 176, 21, 155, 197, 251, 223, 155, 21, 5, 172, 254, 124, 12, 181, 184, 96, 50, 193}, /*set 10*/ {211, 231, 43, 97, 71, 96, 103, 174, 37, 151, 170, 53, 75, 34, 249, 121, 17, 138, 110, 213, 141, 136, 120, 151, 233, 168, 93, 255}, /*set 11*/ {245, 127, 242, 218, 130, 250, 162, 181, 102, 120, 84, 179, 220, 251, 80, 182, 229, 18, 2, 4, 68, 33, 101, 137, 95, 119, 115, 44, 175, 184, 59, 25, 225, 98, 81, 112}, /*set 12*/ {77, 193, 137, 31, 19, 38, 22, 153, 247, 105, 122, 2, 245, 133, 242, 8, 175, 95, 100, 9, 167, 105, 214, 111, 57, 121, 21, 1, 253, 57, 54, 101, 248, 202, 69, 50, 150, 177, 226, 5, 9, 5}, /*set 13*/ {245, 132, 172, 223, 96, 32, 117, 22, 238, 133, 238, 231, 205, 188, 237, 87, 191, 106, 16, 147, 118, 23, 37, 90, 170, 205, 131, 88, 120, 100, 66, 138, 186, 240, 82, 44, 176, 87, 187, 147, 160, 175, 69, 213, 92, 253, 225, 19}, /*set 14*/ {175, 9, 223, 238, 12, 17, 220, 208, 100, 29, 175, 170, 230, 192, 215, 235, 150, 159, 36, 223, 38, 200, 132, 54, 228, 146, 218, 234, 117, 203, 29, 232, 144, 238, 22, 150, 201, 117, 62, 207, 164, 13, 137, 245, 127, 67, 247, 28, 155, 43, 203, 107, 233, 53, 143, 46}, /*set 15*/ {242, 93, 169, 50, 144, 210, 39, 118, 202, 188, 201, 189, 143, 108, 196, 37, 185, 112, 134, 230, 245, 63, 197, 190, 250, 106, 185, 221, 175, 64, 114, 71, 161, 44, 147, 6, 27, 218, 51, 63, 87, 10, 40, 130, 188, 17, 163, 31, 176, 170, 4, 107, 232, 7, 94, 166, 224, 124, 86, 47, 11, 204}, /*set 16*/ {220, 228, 173, 89, 251, 149, 159, 56, 89, 33, 147, 244, 154, 36, 73, 127, 213, 136, 248, 180, 234, 197, 158, 177, 68, 122, 93, 213, 15, 160, 227, 236, 66, 139, 153, 185, 202, 167, 179, 25, 220, 232, 96, 210, 231, 136, 223, 239, 181, 241, 59, 52, 172, 25, 49, 232, 211, 189, 64, 54, 108, 153, 132, 63, 96, 103, 82, 186}, }}; static const uint8_t LOG[] = { 0, 255, 1, 240, 2, 225, 241, 53, 3, 38, 226, 133, 242, 43, 54, 210, 4, 195, 39, 114, 227, 106, 134, 28, 243, 140, 44, 23, 55, 118, 211, 234, 5, 219, 196, 96, 40, 222, 115, 103, 228, 78, 107, 125, 135, 8, 29, 162, 244, 186, 141, 180, 45, 99, 24, 49, 56, 13, 119, 153, 212, 199, 235, 91, 6, 76, 220, 217, 197, 11, 97, 184, 41, 36, 223, 253, 116, 138, 104, 193, 229, 86, 79, 171, 108, 165, 126, 145, 136, 34, 9, 74, 30, 32, 163, 84, 245, 173, 187, 204, 142, 81, 181, 190, 46, 88, 100, 159, 25, 231, 50, 207, 57, 147, 14, 67, 120, 128, 154, 248, 213, 167, 200, 63, 236, 110, 92, 176, 7, 161, 77, 124, 221, 102, 218, 95, 198, 90, 12, 152, 98, 48, 185, 179, 42, 209, 37, 132, 224, 52, 254, 239, 117, 233, 139, 22, 105, 27, 194, 113, 230, 206, 87, 158, 80, 189, 172, 203, 109, 175, 166, 62, 127, 247, 146, 66, 137, 192, 35, 252, 10, 183, 75, 216, 31, 83, 33, 73, 164, 144, 85, 170, 246, 65, 174, 61, 188, 202, 205, 157, 143, 169, 82, 72, 182, 215, 191, 251, 47, 178, 89, 151, 101, 94, 160, 123, 26, 112, 232, 21, 51, 238, 208, 131, 58, 69, 148, 18, 15, 16, 68, 17, 121, 149, 129, 19, 155, 59, 249, 70, 214, 250, 168, 71, 201, 156, 64, 60, 237, 130, 111, 20, 93, 122, 177, 150, }; static const uint8_t ALOG[] = { 1, 2, 4, 8, 16, 32, 64, 128, 45, 90, 180, 69, 138, 57, 114, 228, 229, 231, 227, 235, 251, 219, 155, 27, 54, 108, 216, 157, 23, 46, 92, 184, 93, 186, 89, 178, 73, 146, 9, 18, 36, 72, 144, 13, 26, 52, 104, 208, 141, 55, 110, 220, 149, 7, 14, 28, 56, 112, 224, 237, 247, 195, 171, 123, 246, 193, 175, 115, 230, 225, 239, 243, 203, 187, 91, 182, 65, 130, 41, 82, 164, 101, 202, 185, 95, 190, 81, 162, 105, 210, 137, 63, 126, 252, 213, 135, 35, 70, 140, 53, 106, 212, 133, 39, 78, 156, 21, 42, 84, 168, 125, 250, 217, 159, 19, 38, 76, 152, 29, 58, 116, 232, 253, 215, 131, 43, 86, 172, 117, 234, 249, 223, 147, 11, 22, 44, 88, 176, 77, 154, 25, 50, 100, 200, 189, 87, 174, 113, 226, 233, 255, 211, 139, 59, 118, 236, 245, 199, 163, 107, 214, 129, 47, 94, 188, 85, 170, 121, 242, 201, 191, 83, 166, 97, 194, 169, 127, 254, 209, 143, 51, 102, 204, 181, 71, 142, 49, 98, 196, 165, 103, 206, 177, 79, 158, 17, 34, 68, 136, 61, 122, 244, 197, 167, 99, 198, 161, 111, 222, 145, 15, 30, 60, 120, 240, 205, 183, 67, 134, 33, 66, 132, 37, 74, 148, 5, 10, 20, 40, 80, 160, 109, 218, 153, 31, 62, 124, 248, 221, 151, 3, 6, 12, 24, 48, 96, 192, 173, 119, 238, 241, 207, 179, 75, 150, 1, }; static inline uint8_t mult(uint8_t a, uint8_t b) { if(a == 0 || b == 0) return 0; return ALOG[(LOG[a] + LOG[b]) % 255]; } static void CreateECCBlock(ByteArray& data, int codeOffset, int codeLength, int eccOffset, int eccLength, int stride) { // binary search for the poly vector with length numECWords auto iter = std::lower_bound(FACTORS.begin(), FACTORS.end(), eccLength, [](const ByteArray& vec, size_t size) { return vec.size() < size; }); if (iter == FACTORS.end()) throw std::invalid_argument("Illegal number of error correction codewords specified: " + std::to_string(eccLength)); auto& poly = *iter; ByteArray ecc(eccLength); for (int i = 0; i < codeLength; ++i) { const auto m = ecc.back() ^ data[codeOffset + i * stride]; for (size_t k = ecc.size() - 1; k > 0; k--) ecc[k] = ecc[k - 1] ^ mult(m, poly[k]); ecc[0] = mult(m, poly[0]); } for (int i = 0; i < eccLength; ++i) data[eccOffset + i * stride] = ecc[eccLength - 1 - i]; } /** * Creates the ECC200 error correction for an encoded message. * * @param codewords the codewords * @param symbolInfo information about the symbol to be encoded * @return the codewords with interleaved error correction. */ void ECEncoder::EncodeECC200(ByteArray& codewords, const SymbolInfo& symbolInfo) { if (codewords.size() != (size_t)symbolInfo.dataCapacity()) { throw std::invalid_argument("The number of codewords does not match the selected symbol"); } codewords.resize(symbolInfo.codewordCount(), 0); int blockCount = symbolInfo.interleavedBlockCount(); if (blockCount == 1) { CreateECCBlock(codewords, 0, symbolInfo.dataCapacity(), symbolInfo.dataCapacity(), symbolInfo.errorCodewords(), 1); } else { for (int block = 0; block < blockCount; block++) CreateECCBlock(codewords, block, symbolInfo.dataLengthForInterleavedBlock(block + 1), symbolInfo.dataCapacity() + block, symbolInfo.errorLengthForInterleavedBlock(), blockCount); } } } // DataMatrix } // ZXing zxing-cpp-1.0.8+ds2/core/src/datamatrix/DMECEncoder.h000066400000000000000000000021471361167020700221700ustar00rootroot00000000000000#pragma once /* * Copyright 2016 Huy Cuong Nguyen * Copyright 2006 Jeremias Maerki. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ namespace ZXing { class ByteArray; namespace DataMatrix { class SymbolInfo; /** * Error Correction Code for ECC200. */ class ECEncoder { public: /** * Creates the ECC200 error correction for an encoded message. * * @param codewords the codewords * @param symbolInfo information about the symbol to be encoded * @return the codewords with interleaved error correction. */ static void EncodeECC200(ByteArray& codewords, const SymbolInfo& symbolInfo); }; } // DataMatrix } // ZXing zxing-cpp-1.0.8+ds2/core/src/datamatrix/DMEncoderContext.h000066400000000000000000000061051361167020700233230ustar00rootroot00000000000000#pragma once /* * Copyright 2016 Huy Cuong Nguyen * Copyright 2006-2007 Jeremias Maerki. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #include #include #include #include "ByteArray.h" #include "DMSymbolShape.h" #include "DMSymbolInfo.h" #include "ZXStrConvWorkaround.h" namespace ZXing { namespace DataMatrix { class SymbolInfo; class EncoderContext { std::string _msg; SymbolShape _shape = SymbolShape::NONE; int _minWidth = -1; int _minHeight = -1; int _maxWidth = -1; int _maxHeight = -1; ByteArray _codewords; int _pos = 0; int _newEncoding = -1; const SymbolInfo* _symbolInfo = nullptr; int _skipAtEnd = 0; public: explicit EncoderContext(std::string&& msg) : _msg(std::move(msg)) { _codewords.reserve(_msg.length()); } EncoderContext(const EncoderContext &) = delete; // avoid copy by mistake void setSymbolShape(SymbolShape shape) { _shape = shape; } void setSizeConstraints(int minWidth, int minHeight, int maxWidth, int maxHeight) { _minWidth = minWidth; _minHeight = minHeight; _maxWidth = maxWidth; _maxHeight = maxHeight; } const std::string& message() const { return _msg; } void setSkipAtEnd(int count) { _skipAtEnd = count; } int currentPos() const { return _pos; } void setCurrentPos(int pos) { _pos = pos; } int currentChar() const { return _msg.at(_pos) & 0xff; } int nextChar() const { return _msg.at(_pos + 1) & 0xff; } const ByteArray& codewords() const { return _codewords; } int codewordCount() const { return (int)_codewords.size(); } void addCodeword(uint8_t codeword) { _codewords.push_back(codeword); } void setNewEncoding(int encoding) { _newEncoding = encoding; } void clearNewEncoding() { _newEncoding = -1; } int newEncoding() const { return _newEncoding; } bool hasMoreCharacters() const { return _pos < totalMessageCharCount(); } int totalMessageCharCount() const { return static_cast(_msg.length() - _skipAtEnd); } int remainingCharacters() const { return totalMessageCharCount() - _pos; } const SymbolInfo* updateSymbolInfo(int len) { if (_symbolInfo == nullptr || len > _symbolInfo->dataCapacity()) { _symbolInfo = SymbolInfo::Lookup(len, _shape, _minWidth, _minHeight, _maxWidth, _maxHeight); if (_symbolInfo == nullptr) { throw std::invalid_argument("Can't find a symbol arrangement that matches the message. Data codewords: " + std::to_string(len)); } } return _symbolInfo; } void resetSymbolInfo() { _symbolInfo = nullptr; } const SymbolInfo* symbolInfo() const { return _symbolInfo; } }; } // DataMatrix } // ZXing zxing-cpp-1.0.8+ds2/core/src/datamatrix/DMHighLevelEncoder.cpp000066400000000000000000000641371361167020700241120ustar00rootroot00000000000000/* * Copyright 2016 Huy Cuong Nguyen * Copyright 2016 ZXing authors * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #include "DMHighLevelEncoder.h" #include "DMEncoderContext.h" #include "TextEncoder.h" #include "CharacterSet.h" #include "ByteArray.h" #include "ZXStrConvWorkaround.h" #include #include #include #include #include #include #include #include namespace ZXing { namespace DataMatrix { static const uint8_t PAD = 129; static const uint8_t UPPER_SHIFT = 235; static const uint8_t MACRO_05 = 236; static const uint8_t MACRO_06 = 237; static const uint8_t C40_UNLATCH = 254; static const uint8_t X12_UNLATCH = 254; static const std::wstring MACRO_05_HEADER = L"[)>\x1E""05\x1D"; static const std::wstring MACRO_06_HEADER = L"[)>\x1E""06\x1D"; static const std::wstring MACRO_TRAILER = L"\x1E\x04"; enum { ASCII_ENCODATION, C40_ENCODATION, TEXT_ENCODATION, X12_ENCODATION, EDIFACT_ENCODATION, BASE256_ENCODATION, }; static const uint8_t LATCHES[] = { 0, // ASCII mode, no latch needed 230, // LATCH_TO_C40 239, // LATCH_TO_TEXT 238, // LATCH_TO_ANSIX12 240, // LATCH_TO_EDIFACT 231, // LATCH_TO_BASE256, }; static inline bool IsDigit(int ch) { return ch >= '0' && ch <= '9'; } static inline bool IsExtendedASCII(int ch) { return ch >= 128 && ch <= 255; } static inline bool IsNativeC40(int ch) { return (ch == ' ') || (ch >= '0' && ch <= '9') || (ch >= 'A' && ch <= 'Z'); } static inline bool IsNativeText(int ch) { return (ch == ' ') || (ch >= '0' && ch <= '9') || (ch >= 'a' && ch <= 'z'); } static inline bool IsX12TermSep(int ch) { return (ch == '\r') //CR || (ch == '*') || (ch == '>'); } static inline bool IsNativeX12(int ch) { return IsX12TermSep(ch) || (ch == ' ') || (ch >= '0' && ch <= '9') || (ch >= 'A' && ch <= 'Z'); } static inline bool IsNativeEDIFACT(int ch) { return ch >= ' ' && ch <= '^'; } static inline bool IsSpecialB256(int /*ch*/) { return false; //TODO NOT IMPLEMENTED YET!!! } /* * Converts the message to a byte array using the default encoding (cp437) as defined by the * specification * * @param msg the message * @return the byte array of the message */ /* public static byte[] getBytesForMessage(String msg) { return msg.getBytes(Charset.forName("cp437")); //See 4.4.3 and annex B of ISO/IEC 15438:2001(E) } */ static uint8_t Randomize253State(uint8_t ch, int codewordPosition) { int pseudoRandom = ((149 * codewordPosition) % 253) + 1; int tempVariable = ch + pseudoRandom; return static_cast(tempVariable <= 254 ? tempVariable : (tempVariable - 254)); } static int FindMinimums(const std::array& intCharCounts, int min, std::array& mins) { mins.fill(0); for (int i = 0; i < 6; i++) { int current = intCharCounts[i]; if (min > current) { min = current; mins.fill(0); } if (min == current) { mins[i]++; } } return min; } static int LookAheadTest(const std::string& msg, size_t startpos, int currentMode) { if (startpos >= msg.length()) { return currentMode; } std::array charCounts; //step J if (currentMode == ASCII_ENCODATION) { charCounts = { 0, 1, 1, 1, 1, 1.25f }; } else { charCounts = { 1, 2, 2, 2, 2, 2.25f }; charCounts[currentMode] = 0; } std::array mins; std::array intCharCounts; int charsProcessed = 0; while (true) { //step K if ((startpos + charsProcessed) == msg.length()) { int min = std::numeric_limits::max(); std::transform(charCounts.begin(), charCounts.end(), intCharCounts.begin(), [](float x) { return static_cast(std::ceil(x)); }); min = FindMinimums(intCharCounts, min, mins); int minCount = std::accumulate(mins.begin(), mins.end(), 0); if (intCharCounts[ASCII_ENCODATION] == min) { return ASCII_ENCODATION; } if (minCount == 1 && mins[BASE256_ENCODATION] > 0) { return BASE256_ENCODATION; } if (minCount == 1 && mins[EDIFACT_ENCODATION] > 0) { return EDIFACT_ENCODATION; } if (minCount == 1 && mins[TEXT_ENCODATION] > 0) { return TEXT_ENCODATION; } if (minCount == 1 && mins[X12_ENCODATION] > 0) { return X12_ENCODATION; } return C40_ENCODATION; } int c = (uint8_t)msg.at(startpos + charsProcessed); charsProcessed++; //step L if (IsDigit(c)) { charCounts[ASCII_ENCODATION] += 0.5f; } else if (IsExtendedASCII(c)) { charCounts[ASCII_ENCODATION] = std::ceil(charCounts[ASCII_ENCODATION]); charCounts[ASCII_ENCODATION] += 2.0f; } else { charCounts[ASCII_ENCODATION] = std::ceil(charCounts[ASCII_ENCODATION]); charCounts[ASCII_ENCODATION] += 1.0f; } //step M if (IsNativeC40(c)) { charCounts[C40_ENCODATION] += 2.0f / 3.0f; } else if (IsExtendedASCII(c)) { charCounts[C40_ENCODATION] += 8.0f / 3.0f; } else { charCounts[C40_ENCODATION] += 4.0f / 3.0f; } //step N if (IsNativeText(c)) { charCounts[TEXT_ENCODATION] += 2.0f / 3.0f; } else if (IsExtendedASCII(c)) { charCounts[TEXT_ENCODATION] += 8.0f / 3.0f; } else { charCounts[TEXT_ENCODATION] += 4.0f / 3.0f; } //step O if (IsNativeX12(c)) { charCounts[X12_ENCODATION] += 2.0f / 3.0f; } else if (IsExtendedASCII(c)) { charCounts[X12_ENCODATION] += 13.0f / 3.0f; } else { charCounts[X12_ENCODATION] += 10.0f / 3.0f; } //step P if (IsNativeEDIFACT(c)) { charCounts[EDIFACT_ENCODATION] += 3.0f / 4.0f; } else if (IsExtendedASCII(c)) { charCounts[EDIFACT_ENCODATION] += 17.0f / 4.0f; } else { charCounts[EDIFACT_ENCODATION] += 13.0f / 4.0f; } // step Q if (IsSpecialB256(c)) { charCounts[BASE256_ENCODATION] += 4.0f; } else { charCounts[BASE256_ENCODATION] += 1.0f; } //step R if (charsProcessed >= 4) { std::transform(charCounts.begin(), charCounts.end(), intCharCounts.begin(), [](float x) { return static_cast(std::ceil(x)); }); FindMinimums(intCharCounts, std::numeric_limits::max(), mins); int minCount = std::accumulate(mins.begin(), mins.end(), 0); if (intCharCounts[ASCII_ENCODATION] < intCharCounts[BASE256_ENCODATION] && intCharCounts[ASCII_ENCODATION] < intCharCounts[C40_ENCODATION] && intCharCounts[ASCII_ENCODATION] < intCharCounts[TEXT_ENCODATION] && intCharCounts[ASCII_ENCODATION] < intCharCounts[X12_ENCODATION] && intCharCounts[ASCII_ENCODATION] < intCharCounts[EDIFACT_ENCODATION]) { return ASCII_ENCODATION; } if (intCharCounts[BASE256_ENCODATION] < intCharCounts[ASCII_ENCODATION] || (mins[C40_ENCODATION] + mins[TEXT_ENCODATION] + mins[X12_ENCODATION] + mins[EDIFACT_ENCODATION]) == 0) { return BASE256_ENCODATION; } if (minCount == 1 && mins[EDIFACT_ENCODATION] > 0) { return EDIFACT_ENCODATION; } if (minCount == 1 && mins[TEXT_ENCODATION] > 0) { return TEXT_ENCODATION; } if (minCount == 1 && mins[X12_ENCODATION] > 0) { return X12_ENCODATION; } if (intCharCounts[C40_ENCODATION] + 1 < intCharCounts[ASCII_ENCODATION] && intCharCounts[C40_ENCODATION] + 1 < intCharCounts[BASE256_ENCODATION] && intCharCounts[C40_ENCODATION] + 1 < intCharCounts[EDIFACT_ENCODATION] && intCharCounts[C40_ENCODATION] + 1 < intCharCounts[TEXT_ENCODATION]) { if (intCharCounts[C40_ENCODATION] < intCharCounts[X12_ENCODATION]) { return C40_ENCODATION; } if (intCharCounts[C40_ENCODATION] == intCharCounts[X12_ENCODATION]) { size_t p = startpos + charsProcessed + 1; while (p < msg.length()) { int tc = msg.at(p); if (IsX12TermSep(tc)) { return X12_ENCODATION; } if (!IsNativeX12(tc)) { break; } p++; } return C40_ENCODATION; } } } } } static std::string ToHexString(int c) { const char* digits = "0123456789abcdef"; std::string val(4, '0'); val[1] = 'x'; val[2] = digits[(c >> 4) & 0xf]; val[3] = digits[c & 0xf]; return val; } namespace ASCIIEncoder { /** * Determines the number of consecutive characters that are encodable using numeric compaction. * * @param msg the message * @param startpos the start position within the message * @return the requested character count */ static int DetermineConsecutiveDigitCount(const std::string& msg, int startpos) { auto begin = msg.begin() + startpos; return static_cast(std::find_if_not(begin, msg.end(), IsDigit) - begin); } static uint8_t EncodeASCIIDigits(int digit1, int digit2) { if (IsDigit(digit1) && IsDigit(digit2)) { int num = (digit1 - '0') * 10 + (digit2 - '0'); return static_cast(num + 130); } return '?'; } static void EncodeASCII(EncoderContext& context) { //step B int n = DetermineConsecutiveDigitCount(context.message(), context.currentPos()); if (n >= 2) { context.addCodeword(EncodeASCIIDigits(context.currentChar(), context.nextChar())); context.setCurrentPos(context.currentPos() + 2); } else { int c = context.currentChar(); int newMode = LookAheadTest(context.message(), context.currentPos(), ASCII_ENCODATION); if (newMode != ASCII_ENCODATION) { // the order here is the same as ENCODATION; context.addCodeword(LATCHES[newMode]); context.setNewEncoding(newMode); } else if (IsExtendedASCII(c)) { context.addCodeword(UPPER_SHIFT); context.addCodeword(static_cast(c - 128 + 1)); context.setCurrentPos(context.currentPos() + 1); } else { context.addCodeword(static_cast(c + 1)); context.setCurrentPos(context.currentPos() + 1); } } } } // ASCIIEncoder namespace C40Encoder { static int EncodeChar(int c, std::string& sb) { if (c == ' ') { sb.push_back('\3'); return 1; } if (c >= '0' && c <= '9') { sb.push_back((char)(c - 48 + 4)); return 1; } if (c >= 'A' && c <= 'Z') { sb.push_back((char)(c - 65 + 14)); return 1; } if (c >= '\0' && c <= '\x1f') { sb.push_back('\0'); //Shift 1 Set sb.push_back(c); return 2; } if (c <= '/') { sb.push_back('\1'); //Shift 2 Set sb.push_back((char)(c - 33)); return 2; } if (c <= '@') { sb.push_back('\1'); //Shift 2 Set sb.push_back((char)(c - 58 + 15)); return 2; } if (c <= '_') { sb.push_back('\1'); //Shift 2 Set sb.push_back((char)(c - 91 + 22)); return 2; } if (c <= '\x7f') { sb.push_back('\2'); //Shift 3 Set sb.push_back((char)(c - 96)); return 2; } sb.append("\1\x1e"); //Shift 2, Upper Shift int len = 2; len += EncodeChar((char)(c - 0x80), sb); return len; } static int BacktrackOneCharacter(EncoderContext& context, std::string& buffer, std::string& removed, int lastCharSize, std::function encodeChar) { buffer.resize(buffer.size() - lastCharSize); context.setCurrentPos(context.currentPos() - 1); int c = context.currentChar(); lastCharSize = encodeChar(c, removed); context.resetSymbolInfo(); //Deal with possible reduction in symbol size return lastCharSize; } static void EncodeToCodewords(EncoderContext& context, const std::string& sb, int startPos) { int c1 = sb.at(startPos); int c2 = sb.at(startPos + 1); int c3 = sb.at(startPos + 2); int v = (1600 * c1) + (40 * c2) + c3 + 1; context.addCodeword(static_cast(v / 256)); context.addCodeword(static_cast(v % 256)); } static void WriteNextTriplet(EncoderContext& context, std::string& buffer) { EncodeToCodewords(context, buffer, 0); buffer.erase(0, 3); } /** * Handle "end of data" situations * * @param context the encoder context * @param buffer the buffer with the remaining encoded characters */ static void HandleEOD(EncoderContext& context, std::string& buffer) { int unwritten = (static_cast(buffer.length()) / 3) * 2; int rest = static_cast(buffer.length()) % 3; int curCodewordCount = context.codewordCount() + unwritten; auto symbolInfo = context.updateSymbolInfo(curCodewordCount); int available = symbolInfo->dataCapacity() - curCodewordCount; if (rest == 2) { buffer.push_back('\0'); //Shift 1 while (buffer.length() >= 3) { WriteNextTriplet(context, buffer); } if (context.hasMoreCharacters()) { context.addCodeword(C40_UNLATCH); } } else if (available == 1 && rest == 1) { while (buffer.length() >= 3) { WriteNextTriplet(context, buffer); } if (context.hasMoreCharacters()) { context.addCodeword(C40_UNLATCH); } // else no unlatch context.setCurrentPos(context.currentPos() - 1); } else if (rest == 0) { while (buffer.length() >= 3) { WriteNextTriplet(context, buffer); } if (available > 0 || context.hasMoreCharacters()) { context.addCodeword(C40_UNLATCH); } } else { throw std::logic_error("Unexpected case. Please report!"); } context.setNewEncoding(ASCII_ENCODATION); } static void EncodeC40(EncoderContext& context, std::function encodeChar, int encodingMode) { //step C std::string buffer; while (context.hasMoreCharacters()) { int c = context.currentChar(); context.setCurrentPos(context.currentPos() + 1); int lastCharSize = encodeChar(c, buffer); int unwritten = static_cast(buffer.length() / 3) * 2; int curCodewordCount = context.codewordCount() + unwritten; auto symbolInfo = context.updateSymbolInfo(curCodewordCount); int available = symbolInfo->dataCapacity() - curCodewordCount; if (!context.hasMoreCharacters()) { //Avoid having a single C40 value in the last triplet std::string removed; if ((buffer.length() % 3) == 2 && available != 2) { lastCharSize = BacktrackOneCharacter(context, buffer, removed, lastCharSize, encodeChar); } while ((buffer.length() % 3) == 1 && ((lastCharSize <= 3 && available != 1) || lastCharSize > 3)) { lastCharSize = BacktrackOneCharacter(context, buffer, removed, lastCharSize, encodeChar); } break; } if ((buffer.length() % 3) == 0) { int newMode = LookAheadTest(context.message(), context.currentPos(), encodingMode); if (newMode != encodingMode) { // Return to ASCII encodation, which will actually handle latch to new mode context.setNewEncoding(ASCII_ENCODATION); break; } } } return HandleEOD(context, buffer); } static void EncodeC40(EncoderContext& context) { EncodeC40(context, EncodeChar, C40_ENCODATION); } } // C40Encoder namespace DMTextEncoder { static int EncodeChar(int c, std::string& sb) { if (c == ' ') { sb.push_back('\3'); return 1; } if (c >= '0' && c <= '9') { sb.push_back((char)(c - 48 + 4)); return 1; } if (c >= 'a' && c <= 'z') { sb.push_back((char)(c - 97 + 14)); return 1; } if (c >= '\0' && c <= '\x1f') { sb.push_back('\0'); //Shift 1 Set sb.push_back(c); return 2; } if (c <= '/') { sb.push_back('\1'); //Shift 2 Set sb.push_back((char)(c - 33)); return 2; } if (c <= '@') { sb.push_back('\1'); //Shift 2 Set sb.push_back((char)(c - 58 + 15)); return 2; } if (c >= '[' && c <= '_') { sb.push_back('\1'); //Shift 2 Set sb.push_back((char)(c - 91 + 22)); return 2; } if (c == '\x60') { sb.push_back('\2'); //Shift 3 Set sb.push_back((char)(c - 96)); return 2; } if (c <= 'Z') { sb.push_back('\2'); //Shift 3 Set sb.push_back((char)(c - 65 + 1)); return 2; } if (c <= '\x7f') { sb.push_back('\2'); //Shift 3 Set sb.push_back((char)(c - 123 + 27)); return 2; } sb.append("\1\x1e"); //Shift 2, Upper Shift int len = 2; len += EncodeChar(c - 128, sb); return len; } static void EncodeText(EncoderContext& context) { C40Encoder::EncodeC40(context, EncodeChar, TEXT_ENCODATION); } } // DMTextEncoder namespace X12Encoder { static int EncodeChar(int c, std::string& sb) { switch (c) { case '\r': sb.push_back('\0'); break; case '*': sb.push_back('\1'); break; case '>': sb.push_back('\2'); break; case ' ': sb.push_back('\3'); break; default: if (c >= '0' && c <= '9') { sb.push_back((char)(c - 48 + 4)); } else if (c >= 'A' && c <= 'Z') { sb.push_back((char)(c - 65 + 14)); } else { throw std::invalid_argument("Illegal character: " + ToHexString(c)); } break; } return 1; } static void HandleEOD(EncoderContext& context, std::string& buffer) { int codewordCount = context.codewordCount(); auto symbolInfo = context.updateSymbolInfo(codewordCount); int available = symbolInfo->dataCapacity() - codewordCount; context.setCurrentPos(context.currentPos() - static_cast(buffer.length())); if (context.remainingCharacters() > 1 || available > 1 || context.remainingCharacters() != available) { context.addCodeword(X12_UNLATCH); } if (context.newEncoding() < 0) { context.setNewEncoding(ASCII_ENCODATION); } } static void EncodeX12(EncoderContext& context) { //step C std::string buffer; while (context.hasMoreCharacters()) { int c = context.currentChar(); context.setCurrentPos(context.currentPos() + 1); EncodeChar(c, buffer); size_t count = buffer.length(); if ((count % 3) == 0) { C40Encoder::WriteNextTriplet(context, buffer); int newMode = LookAheadTest(context.message(), context.currentPos(), X12_ENCODATION); if (newMode != X12_ENCODATION) { // Return to ASCII encodation, which will actually handle latch to new mode context.setNewEncoding(ASCII_ENCODATION); break; } } } HandleEOD(context, buffer); } } // X12Encoder namespace EdifactEncoder { static void EncodeChar(int c, std::string& sb) { if (c >= ' ' && c <= '?') { sb.push_back(c); } else if (c >= '@' && c <= '^') { sb.push_back((char)(c - 64)); } else { throw std::invalid_argument("Illegal character: " + ToHexString(c)); } } static ByteArray EncodeToCodewords(const std::string& sb, int startPos) { int len = static_cast(sb.length()) - startPos; if (len == 0) { throw std::invalid_argument("buffer must not be empty"); } int c1 = sb.at(startPos); int c2 = len >= 2 ? sb.at(startPos + 1) : 0; int c3 = len >= 3 ? sb.at(startPos + 2) : 0; int c4 = len >= 4 ? sb.at(startPos + 3) : 0; int v = (c1 << 18) + (c2 << 12) + (c3 << 6) + c4; int cw1 = (v >> 16) & 255; int cw2 = (v >> 8) & 255; int cw3 = v & 255; ByteArray res; res.reserve(3); res.push_back(static_cast(cw1)); if (len >= 2) { res.push_back(static_cast(cw2)); } if (len >= 3) { res.push_back(static_cast(cw3)); } return res; } /** * Handle "end of data" situations * * @param context the encoder context * @param buffer the buffer with the remaining encoded characters */ static void HandleEOD(EncoderContext& context, std::string& buffer) { try { size_t count = buffer.length(); if (count == 0) { return; //Already finished } if (count == 1) { //Only an unlatch at the end int codewordCount = context.codewordCount(); auto symbolInfo = context.updateSymbolInfo(codewordCount); int available = symbolInfo->dataCapacity() - codewordCount; int remaining = context.remainingCharacters(); // The following two lines are a hack inspired by the 'fix' from https://sourceforge.net/p/barcode4j/svn/221/ if (remaining > available) available = context.updateSymbolInfo(codewordCount+1)->dataCapacity() - codewordCount; if (remaining <= available && available <= 2) { return; //No unlatch } } if (count > 4) { throw std::invalid_argument("Count must not exceed 4"); } int restChars = static_cast(count - 1); auto encoded = EncodeToCodewords(buffer, 0); bool endOfSymbolReached = !context.hasMoreCharacters(); bool restInAscii = endOfSymbolReached && restChars <= 2; if (restChars <= 2) { int codewordCount = context.codewordCount(); auto symbolInfo = context.updateSymbolInfo(codewordCount + restChars); int available = symbolInfo->dataCapacity() - codewordCount; if (available >= 3) { restInAscii = false; context.updateSymbolInfo(codewordCount + static_cast(encoded.size())); //available = context.symbolInfo.dataCapacity - context.getCodewordCount(); } } if (restInAscii) { context.resetSymbolInfo(); context.setCurrentPos(context.currentPos() - restChars); } else { for (uint8_t cw : encoded) { context.addCodeword(cw); } } } catch (...) { context.setNewEncoding(ASCII_ENCODATION); throw; } context.setNewEncoding(ASCII_ENCODATION); } static void EncodeEdifact(EncoderContext& context) { //step F std::string buffer; while (context.hasMoreCharacters()) { int c = context.currentChar(); EncodeChar(c, buffer); context.setCurrentPos(context.currentPos() + 1); if (buffer.length() >= 4) { auto codewords = EncodeToCodewords(buffer, 0); for (uint8_t cw : codewords) { context.addCodeword(cw); } buffer.erase(0, 4); int newMode = LookAheadTest(context.message(), context.currentPos(), EDIFACT_ENCODATION); if (newMode != EDIFACT_ENCODATION) { // Return to ASCII encodation, which will actually handle latch to new mode context.setNewEncoding(ASCII_ENCODATION); break; } } } buffer.push_back(31); //Unlatch HandleEOD(context, buffer); } } // EdifactEncoder namespace Base256Encoder { static int Randomize255State(int ch, int codewordPosition) { int pseudoRandom = ((149 * codewordPosition) % 255) + 1; int tempVariable = ch + pseudoRandom; if (tempVariable <= 255) { return tempVariable; } else { return tempVariable - 256; } } static void EncodeBase256(EncoderContext& context) { std::string buffer; buffer.push_back('\0'); //Initialize length field while (context.hasMoreCharacters()) { int c = context.currentChar(); buffer.push_back(c); context.setCurrentPos(context.currentPos() + 1); int newMode = LookAheadTest(context.message(), context.currentPos(), BASE256_ENCODATION); if (newMode != BASE256_ENCODATION) { // Return to ASCII encodation, which will actually handle latch to new mode context.setNewEncoding(ASCII_ENCODATION); break; } } int dataCount = static_cast(buffer.length()) - 1; int lengthFieldSize = 1; int currentSize = context.codewordCount() + dataCount + lengthFieldSize; auto symbolInfo = context.updateSymbolInfo(currentSize); bool mustPad = (symbolInfo->dataCapacity() - currentSize) > 0; if (context.hasMoreCharacters() || mustPad) { if (dataCount <= 249) { buffer.at(0) = (char)dataCount; } else if (dataCount <= 1555) { buffer.at(0) = (char)((dataCount / 250) + 249); buffer.insert(1, 1, (char)(dataCount % 250)); } else { throw std::invalid_argument("Message length not in valid ranges: " + std::to_string(dataCount)); } } for (char c : buffer) { context.addCodeword(Randomize255State(c, context.codewordCount() + 1)); } } } // Base256Encoder static bool StartsWith(const std::wstring& s, const std::wstring& ss) { return s.length() > ss.length() && s.compare(0, ss.length(), ss) == 0; } static bool EndsWith(const std::wstring& s, const std::wstring& ss) { return s.length() > ss.length() && s.compare(s.length() - ss.length(), ss.length(), ss) == 0; } ByteArray HighLevelEncoder::Encode(const std::wstring& msg) { return Encode(msg, SymbolShape::NONE, -1, -1, -1, -1); } /** * Performs message encoding of a DataMatrix message using the algorithm described in annex P * of ISO/IEC 16022:2000(E). * * @param msg the message * @param shape requested shape. May be {@code SymbolShapeHint.FORCE_NONE}, * {@code SymbolShapeHint.FORCE_SQUARE} or {@code SymbolShapeHint.FORCE_RECTANGLE}. * @param minSize the minimum symbol size constraint or null for no constraint * @param maxSize the maximum symbol size constraint or null for no constraint * @return the encoded message (the char values range from 0 to 255) */ ByteArray HighLevelEncoder::Encode(const std::wstring& msg, SymbolShape shape, int minWdith, int minHeight, int maxWidth, int maxHeight) { //the codewords 0..255 are encoded as Unicode characters //Encoder[] encoders = { // new ASCIIEncoder(), new C40Encoder(), new TextEncoder(), // new X12Encoder(), new EdifactEncoder(), new Base256Encoder() //}; EncoderContext context(TextEncoder::FromUnicode(msg, CharacterSet::ISO8859_1)); context.setSymbolShape(shape); context.setSizeConstraints(minWdith, minHeight, maxWidth, maxHeight); if (StartsWith(msg, MACRO_05_HEADER) && EndsWith(msg, MACRO_TRAILER)) { context.addCodeword(MACRO_05); context.setSkipAtEnd(2); context.setCurrentPos(static_cast(MACRO_05_HEADER.length())); } else if (StartsWith(msg, MACRO_06_HEADER) && EndsWith(msg, MACRO_TRAILER)) { context.addCodeword(MACRO_06); context.setSkipAtEnd(2); context.setCurrentPos(static_cast(MACRO_06_HEADER.length())); } int encodingMode = ASCII_ENCODATION; //Default mode while (context.hasMoreCharacters()) { switch (encodingMode) { case ASCII_ENCODATION: ASCIIEncoder::EncodeASCII(context); break; case C40_ENCODATION: C40Encoder::EncodeC40(context); break; case TEXT_ENCODATION: DMTextEncoder::EncodeText(context); break; case X12_ENCODATION: X12Encoder::EncodeX12(context); break; case EDIFACT_ENCODATION: EdifactEncoder::EncodeEdifact(context); break; case BASE256_ENCODATION: Base256Encoder::EncodeBase256(context); break; } if (context.newEncoding() >= 0) { encodingMode = context.newEncoding(); context.clearNewEncoding(); } } int len = context.codewordCount(); auto symbolInfo = context.updateSymbolInfo(len); int capacity = symbolInfo->dataCapacity(); if (len < capacity) { if (encodingMode != ASCII_ENCODATION && encodingMode != BASE256_ENCODATION && encodingMode != EDIFACT_ENCODATION) { context.addCodeword('\xfe'); //Unlatch (254) } } //Padding if (context.codewordCount() < capacity) { context.addCodeword(PAD); } while (context.codewordCount() < capacity) { context.addCodeword(Randomize253State(PAD, context.codewordCount() + 1)); } return context.codewords(); } } // DataMatrix } // ZXing zxing-cpp-1.0.8+ds2/core/src/datamatrix/DMHighLevelEncoder.h000066400000000000000000000021361361167020700235460ustar00rootroot00000000000000#pragma once /* * Copyright 2016 Huy Cuong Nguyen * Copyright 2006-2007 Jeremias Maerki. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #include #include namespace ZXing { class ByteArray; namespace DataMatrix { enum class SymbolShape; /** * DataMatrix ECC 200 data encoder following the algorithm described in ISO/IEC 16022:200(E) in * annex S. */ class HighLevelEncoder { public: static ByteArray Encode(const std::wstring& msg); static ByteArray Encode(const std::wstring& msg, SymbolShape shape, int minWdith, int minHeight, int maxWidth, int maxHeight); }; } // DataMatrix } // ZXing zxing-cpp-1.0.8+ds2/core/src/datamatrix/DMReader.cpp000066400000000000000000000065751361167020700221470ustar00rootroot00000000000000/* * Copyright 2016 Nu-book Inc. * Copyright 2016 ZXing authors * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #include "DMReader.h" #include "DMDecoder.h" #include "DMDetector.h" #include "Result.h" #include "BitMatrix.h" #include "BinaryBitmap.h" #include "DecodeHints.h" #include "DecoderResult.h" #include "DetectorResult.h" namespace ZXing { namespace DataMatrix { static int GetModuleSize(int x, int y, const BitMatrix& image) { int oldX = x; int width = image.width(); while (x < width && image.get(x, y)) { x++; } if (x == width) { return 0; } return x - oldX; } /** * This method detects a code in a "pure" image -- that is, pure monochrome image * which contains only an unrotated, unskewed, image of a code, with some white border * around it. This is a specialized method that works exceptionally fast in this special * case. * * @see com.google.zxing.qrcode.QRCodeReader#extractPureBits(BitMatrix) */ static BitMatrix ExtractPureBits(const BitMatrix& image) { int left, top, right, bottom; if (!image.getTopLeftOnBit(left, top) || !image.getBottomRightOnBit(right, bottom)) { return {}; } int moduleSize = GetModuleSize(left, top, image); int matrixWidth = (right - left + 1) / moduleSize; int matrixHeight = (bottom - top + 1) / moduleSize; if (matrixWidth <= 0 || matrixHeight <= 0) { return {}; } // Push in the "border" by half the module width so that we start // sampling in the middle of the module. Just in case the image is a // little off, this will help recover. int nudge = moduleSize / 2; top += nudge; left += nudge; // Now just read off the bits (this is a crop + subsample) return Deflate(image, matrixWidth, matrixHeight, top, left, moduleSize); } Reader::Reader(const DecodeHints& hints) : _tryRotate(hints.tryRotate()), _tryHarder(hints.tryHarder()) { } /** * Locates and decodes a Data Matrix code in an image. * * @return a string representing the content encoded by the Data Matrix code * @throws NotFoundException if a Data Matrix code cannot be found * @throws FormatException if a Data Matrix code cannot be decoded * @throws ChecksumException if error correction fails */ Result Reader::decode(const BinaryBitmap& image) const { auto binImg = image.getBlackMatrix(); if (binImg == nullptr) { return Result(DecodeStatus::NotFound); } DecoderResult decoderResult; std::vector points; if (image.isPureBarcode()) { BitMatrix bits = ExtractPureBits(*binImg); if (bits.empty()) return Result(DecodeStatus::NotFound); decoderResult = Decoder::Decode(bits); } else { DetectorResult detectorResult = Detector::Detect(*binImg, _tryHarder, _tryRotate); if (!detectorResult.isValid()) return Result(DecodeStatus::NotFound); decoderResult = Decoder::Decode(detectorResult.bits()); points = detectorResult.points(); } return Result(std::move(decoderResult), std::move(points), BarcodeFormat::DATA_MATRIX); } } // DataMatrix } // ZXing zxing-cpp-1.0.8+ds2/core/src/datamatrix/DMReader.h000066400000000000000000000020271361167020700216000ustar00rootroot00000000000000#pragma once /* * Copyright 2016 Nu-book Inc. * Copyright 2016 ZXing authors * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #include "Reader.h" namespace ZXing { class DecodeHints; namespace DataMatrix { /** * This implementation can detect and decode Data Matrix codes in an image. * * @author bbrown@google.com (Brian Brown) */ class Reader : public ZXing::Reader { bool _tryRotate, _tryHarder; public: explicit Reader(const DecodeHints& hints); Result decode(const BinaryBitmap& image) const override; }; } // DataMatrix } // ZXing zxing-cpp-1.0.8+ds2/core/src/datamatrix/DMSymbolInfo.cpp000066400000000000000000000077321361167020700230220ustar00rootroot00000000000000/* * Copyright 2016 Huy Cuong Nguyen * Copyright 2016 ZXing authors * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #include "DMSymbolInfo.h" #include "DMSymbolShape.h" #include "ZXContainerAlgorithms.h" #include "ZXTestSupport.h" #include #include namespace ZXing { namespace DataMatrix { static const SymbolInfo PROD_SYMBOLS[] = { { false, 3, 5, 8, 8, 1 }, { false, 5, 7, 10, 10, 1 }, { true, 5, 7, 16, 6, 1 }, { false, 8, 10, 12, 12, 1 }, { true, 10, 11, 14, 6, 2 }, { false, 12, 12, 14, 14, 1 }, { true, 16, 14, 24, 10, 1 }, { false, 18, 14, 16, 16, 1 }, { false, 22, 18, 18, 18, 1 }, { true, 22, 18, 16, 10, 2 }, { false, 30, 20, 20, 20, 1 }, { true, 32, 24, 16, 14, 2 }, { false, 36, 24, 22, 22, 1 }, { false, 44, 28, 24, 24, 1 }, { true, 49, 28, 22, 14, 2 }, { false, 62, 36, 14, 14, 4 }, { false, 86, 42, 16, 16, 4 }, { false, 114, 48, 18, 18, 4 }, { false, 144, 56, 20, 20, 4 }, { false, 174, 68, 22, 22, 4 }, { false, 204, 84, 24, 24, 4, 102, 42 }, { false, 280, 112, 14, 14, 16, 140, 56 }, { false, 368, 144, 16, 16, 16, 92, 36 }, { false, 456, 192, 18, 18, 16, 114, 48 }, { false, 576, 224, 20, 20, 16, 144, 56 }, { false, 696, 272, 22, 22, 16, 174, 68 }, { false, 816, 336, 24, 24, 16, 136, 56 }, { false, 1050, 408, 18, 18, 36, 175, 68 }, { false, 1304, 496, 20, 20, 36, 163, 62 }, { false, 1558, 620, 22, 22, 36, -1, 62 }, }; static const SymbolInfo* s_symbols = PROD_SYMBOLS; static size_t s_symbolCount = Length(PROD_SYMBOLS); #if ZXING_BUILD_FOR_TEST ZXING_EXPORT_TEST_ONLY void OverrideSymbolSet(const SymbolInfo* symbols, size_t count) { s_symbols = symbols; s_symbolCount = count; } ZXING_EXPORT_TEST_ONLY void UseDefaultSymbolSet() { s_symbols = PROD_SYMBOLS; s_symbolCount = Length(PROD_SYMBOLS); } #endif // ZXING_BUILD_FOR_TEST const SymbolInfo * SymbolInfo::Lookup(int dataCodewords) { return Lookup(dataCodewords, SymbolShape::NONE); } const SymbolInfo * SymbolInfo::Lookup(int dataCodewords, SymbolShape shape) { return Lookup(dataCodewords, shape, -1, -1, -1, -1); } const SymbolInfo * SymbolInfo::Lookup(int dataCodewords, bool allowRectangular) { return Lookup(dataCodewords, allowRectangular ? SymbolShape::NONE : SymbolShape::SQUARE, -1, -1, -1, -1); } const SymbolInfo * SymbolInfo::Lookup(int dataCodewords, SymbolShape shape, int minWidth, int minHeight, int maxWidth, int maxHeight) { for (size_t i = 0; i < s_symbolCount; ++i) { auto& symbol = s_symbols[i]; if (shape == SymbolShape::SQUARE && symbol._rectangular) { continue; } if (shape == SymbolShape::RECTANGLE && !symbol._rectangular) { continue; } if (minWidth >= 0 && minHeight >= 0 && (symbol.symbolWidth() < minWidth || symbol.symbolHeight() < minHeight)) { continue; } if (maxWidth >= 0 && maxHeight >= 0 && (symbol.symbolWidth() > maxWidth || symbol.symbolHeight() > maxHeight)) { continue; } if (dataCodewords <= symbol._dataCapacity) { return &symbol; } } return nullptr; } int SymbolInfo::horizontalDataRegions() const { switch (_dataRegions) { case 1: return 1; case 2: return 2; case 4: return 2; case 16: return 4; case 36: return 6; default: throw std::out_of_range("Cannot handle this number of data regions"); } } int SymbolInfo::verticalDataRegions() const { switch (_dataRegions) { case 1: return 1; case 2: return 1; case 4: return 2; case 16: return 4; case 36: return 6; default: throw std::out_of_range("Cannot handle this number of data regions"); } } } // DataMatrix } // ZXing zxing-cpp-1.0.8+ds2/core/src/datamatrix/DMSymbolInfo.h000066400000000000000000000056431361167020700224660ustar00rootroot00000000000000#pragma once /* * Copyright 2016 Huy Cuong Nguyen * Copyright 2016 ZXing authors * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ namespace ZXing { namespace DataMatrix { enum class SymbolShape; class SymbolInfo { bool _rectangular; int _dataCapacity; int _errorCodewords; int _matrixWidth; int _matrixHeight; int _dataRegions; int _rsBlockData; int _rsBlockError; public: SymbolInfo(bool rectangular, int dataCapacity, int errorCodewords, int matrixWidth, int matrixHeight, int dataRegions) : SymbolInfo(rectangular, dataCapacity, errorCodewords, matrixWidth, matrixHeight, dataRegions, dataCapacity, errorCodewords) {} SymbolInfo(bool rectangular, int dataCapacity, int errorCodewords, int matrixWidth, int matrixHeight, int dataRegions, int rsBlockData, int rsBlockError) : _rectangular(rectangular), _dataCapacity(dataCapacity), _errorCodewords(errorCodewords), _matrixWidth(matrixWidth), _matrixHeight(matrixHeight), _dataRegions(dataRegions), _rsBlockData(rsBlockData), _rsBlockError(rsBlockError) { } static const SymbolInfo* Lookup(int dataCodewords); static const SymbolInfo* Lookup(int dataCodewords, SymbolShape shape); static const SymbolInfo* Lookup(int dataCodewords, bool allowRectangular); static const SymbolInfo* Lookup(int dataCodewords, SymbolShape shape, int minWidth, int minHeight, int maxWidth, int maxHeight); int horizontalDataRegions() const; int verticalDataRegions() const; int symbolDataWidth() const { return horizontalDataRegions() * _matrixWidth; } int symbolDataHeight() const { return verticalDataRegions() * _matrixHeight; } int symbolWidth() const { return symbolDataWidth() + (horizontalDataRegions() * 2); } int symbolHeight() const { return symbolDataHeight() + (verticalDataRegions() * 2); } int matrixWidth() const { return _matrixWidth; } int matrixHeight() const { return _matrixHeight; } int codewordCount() const { return _dataCapacity + _errorCodewords; } int interleavedBlockCount() const { if (_rsBlockData > 0) return _dataCapacity / _rsBlockData; return 10; // Symbol 144 } int dataCapacity() const { return _dataCapacity; } int errorCodewords() const { return _errorCodewords; } int dataLengthForInterleavedBlock(int index) const { if (_rsBlockData > 0) return _rsBlockData; return index <= 8 ? 156 : 155; // Symbol 144 } int errorLengthForInterleavedBlock() const { return _rsBlockError; } }; } // DataMatrix } // ZXing zxing-cpp-1.0.8+ds2/core/src/datamatrix/DMSymbolShape.h000066400000000000000000000013661361167020700226310ustar00rootroot00000000000000#pragma once /* * Copyright 2016 Huy Cuong Nguyen * Copyright 2016 ZXing authors * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ namespace ZXing { namespace DataMatrix { enum class SymbolShape { NONE, SQUARE, RECTANGLE, }; } // DataMatrix } // ZXing zxing-cpp-1.0.8+ds2/core/src/datamatrix/DMVersion.cpp000066400000000000000000000063401361167020700223600ustar00rootroot00000000000000/* * Copyright 2016 Nu-book Inc. * Copyright 2016 ZXing authors * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #include "DMVersion.h" #include "ZXContainerAlgorithms.h" namespace ZXing { namespace DataMatrix { Version::Version(int versionNumber, int symbolSizeRows, int symbolSizeColumns, int dataRegionSizeRows, int dataRegionSizeColumns, const ECBlocks& ecBlocks) : _versionNumber(versionNumber), _symbolSizeRows(symbolSizeRows), _symbolSizeColumns(symbolSizeColumns), _dataRegionSizeRows(dataRegionSizeRows), _dataRegionSizeColumns(dataRegionSizeColumns), _ecBlocks(ecBlocks) { } /** *

Deduces version information from Data Matrix dimensions.

* * @param numRows Number of rows in modules * @param numColumns Number of columns in modules * @return Version for a Data Matrix Code of those dimensions * @throws FormatException if dimensions do correspond to a valid Data Matrix size */ const Version * Version::VersionForDimensions(int numRows, int numColumns) { if ((numRows & 0x01) != 0 || (numColumns & 0x01) != 0 || numRows < 8 || numRows > 144) { return nullptr; } /** * See ISO 16022:2006 5.5.1 Table 7 */ static const Version allVersions[] = { {1, 10, 10, 8, 8, {5, 1, 3 , 0, 0}}, {2, 12, 12, 10, 10, {7, 1, 5 , 0, 0}}, {3, 14, 14, 12, 12, {10, 1, 8 , 0, 0}}, {4, 16, 16, 14, 14, {12, 1, 12, 0, 0}}, {5, 18, 18, 16, 16, {14, 1, 18, 0, 0}}, {6, 20, 20, 18, 18, {18, 1, 22, 0, 0}}, {7, 22, 22, 20, 20, {20, 1, 30, 0, 0}}, {8, 24, 24, 22, 22, {24, 1, 36, 0, 0}}, {9, 26, 26, 24, 24, {28, 1, 44, 0, 0}}, {10, 32, 32, 14, 14, {36, 1, 62, 0, 0}}, {11, 36, 36, 16, 16, {42, 1, 86, 0, 0}}, {12, 40, 40, 18, 18, {48, 1, 114, 0, 0}}, {13, 44, 44, 20, 20, {56, 1, 144, 0, 0}}, {14, 48, 48, 22, 22, {68, 1, 174, 0, 0}}, {15, 52, 52, 24, 24, {42, 2, 102, 0, 0}}, {16, 64, 64, 14, 14, {56, 2, 140, 0, 0}}, {17, 72, 72, 16, 16, {36, 4, 92 , 0, 0}}, {18, 80, 80, 18, 18, {48, 4, 114, 0, 0}}, {19, 88, 88, 20, 20, {56, 4, 144, 0, 0}}, {20, 96, 96, 22, 22, {68, 4, 174, 0, 0}}, {21, 104, 104, 24, 24, {56, 6, 136, 0, 0}}, {22, 120, 120, 18, 18, {68, 6, 175, 0, 0}}, {23, 132, 132, 20, 20, {62, 8, 163, 0, 0}}, {24, 144, 144, 22, 22, {62, 8, 156, 2, 155}}, {25, 8, 18, 6, 16, {7, 1, 5 , 0, 0}}, {26, 8, 32, 6, 14, {11, 1, 10 , 0, 0}}, {27, 12, 26, 10, 24, {14, 1, 16 , 0, 0}}, {28, 12, 36, 10, 16, {18, 1, 22 , 0, 0}}, {29, 16, 36, 14, 16, {24, 1, 32 , 0, 0}}, {30, 16, 48, 14, 22, {28, 1, 49 , 0, 0}}, }; for (auto& version : allVersions) { if (version._symbolSizeRows == numRows && version._symbolSizeColumns == numColumns) { return &version; } } return nullptr; } } // DataMatrix } // ZXing zxing-cpp-1.0.8+ds2/core/src/datamatrix/DMVersion.h000066400000000000000000000037721361167020700220330ustar00rootroot00000000000000#pragma once /* * Copyright 2016 Nu-book Inc. * Copyright 2016 ZXing authors * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #include "DMECB.h" namespace ZXing { namespace DataMatrix { /** * The Version object encapsulates attributes about a particular * size Data Matrix Code. * * @author bbrown@google.com (Brian Brown) */ class Version { public: int versionNumber() const { return _versionNumber; } int symbolSizeRows() const { return _symbolSizeRows; } int symbolSizeColumns() const { return _symbolSizeColumns; } int dataRegionSizeRows() const { return _dataRegionSizeRows; } int dataRegionSizeColumns() const { return _dataRegionSizeColumns; } int totalCodewords() const { return _ecBlocks.totalDataCodewords(); } const ECBlocks& ecBlocks() const { return _ecBlocks; } /** *

Deduces version information from Data Matrix dimensions.

* * @param numRows Number of rows in modules * @param numColumns Number of columns in modules * @return Version for a Data Matrix Code of those dimensions * @throws FormatException if dimensions do correspond to a valid Data Matrix size */ static const Version* VersionForDimensions(int numRows, int numColumns); private: int _versionNumber; int _symbolSizeRows; int _symbolSizeColumns; int _dataRegionSizeRows; int _dataRegionSizeColumns; ECBlocks _ecBlocks; Version(int versionNumber, int symbolSizeRows, int symbolSizeColumns, int dataRegionSizeRows, int dataRegionSizeColumns, const ECBlocks& ecBlocks); }; } // DataMatrix } // ZXing zxing-cpp-1.0.8+ds2/core/src/datamatrix/DMWriter.cpp000066400000000000000000000074011361167020700222060ustar00rootroot00000000000000/* * Copyright 2016 Huy Cuong Nguyen * Copyright 2016 ZXing authors * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #include "DMWriter.h" #include "DMSymbolShape.h" #include "DMHighLevelEncoder.h" #include "DMSymbolInfo.h" #include "DMECEncoder.h" #include "DMDefaultPlacement.h" #include "BitMatrix.h" #include "ByteMatrix.h" #include "ByteArray.h" #include "ZXStrConvWorkaround.h" #include #include #include namespace ZXing { namespace DataMatrix { /** * Encode the given symbol info to a bit matrix. * * @param placement The DataMatrix placement. * @param symbolInfo The symbol info to encode. * @return The bit matrix generated. */ static BitMatrix EncodeLowLevel(const ByteMatrix& placement, const SymbolInfo& symbolInfo) { int symbolWidth = symbolInfo.symbolDataWidth(); int symbolHeight = symbolInfo.symbolDataHeight(); ByteMatrix matrix(symbolInfo.symbolWidth(), symbolInfo.symbolHeight()); int matrixY = 0; for (int y = 0; y < symbolHeight; y++) { // Fill the top edge with alternate 0 / 1 int matrixX; if ((y % symbolInfo.matrixHeight()) == 0) { matrixX = 0; for (int x = 0; x < matrix.width(); x++) { matrix.set(matrixX, matrixY, (x % 2) == 0); matrixX++; } matrixY++; } matrixX = 0; for (int x = 0; x < symbolWidth; x++) { // Fill the right edge with full 1 if ((x % symbolInfo.matrixWidth()) == 0) { matrix.set(matrixX, matrixY, true); matrixX++; } matrix.set(matrixX, matrixY, placement.get(x, y) == 1); matrixX++; // Fill the right edge with alternate 0 / 1 if ((x % symbolInfo.matrixWidth()) == symbolInfo.matrixWidth() - 1) { matrix.set(matrixX, matrixY, (y % 2) == 0); matrixX++; } } matrixY++; // Fill the bottom edge with full 1 if ((y % symbolInfo.matrixHeight()) == symbolInfo.matrixHeight() - 1) { matrixX = 0; for (int x = 0; x < matrix.width(); x++) { matrix.set(matrixX, matrixY, true); matrixX++; } matrixY++; } } // Zero is white in the bytematrix return BitMatrix(matrix, 1); } Writer::Writer() : _shapeHint(SymbolShape::NONE) { } BitMatrix Writer::encode(const std::wstring& contents, int width, int height) const { if (contents.empty()) { throw std::invalid_argument("Found empty contents"); } if (width < 0 || height < 0) { throw std::invalid_argument("Requested dimensions are invalid"); } //1. step: Data encodation auto encoded = HighLevelEncoder::Encode(contents, _shapeHint, _minWidth, _minHeight, _maxWidth, _maxHeight); const SymbolInfo* symbolInfo = SymbolInfo::Lookup(static_cast(encoded.size()), _shapeHint, _minWidth, _minHeight, _maxWidth, _maxHeight); if (symbolInfo == nullptr) { throw std::invalid_argument("Can't find a symbol arrangement that matches the message. Data codewords: " + std::to_string(encoded.size())); } //2. step: ECC generation ECEncoder::EncodeECC200(encoded, *symbolInfo); //3. step: Module placement in Matrix ByteMatrix placement = DefaultPlacement::Place(encoded, symbolInfo->symbolDataWidth(), symbolInfo->symbolDataHeight()); //4. step: low-level encoding BitMatrix result = EncodeLowLevel(placement, *symbolInfo); //5. step: scale-up to requested size, minimum required quite zone is 1 return Inflate(std::move(result), width, height, _quiteZone); } } // DataMatrix } // ZXing zxing-cpp-1.0.8+ds2/core/src/datamatrix/DMWriter.h000066400000000000000000000025451361167020700216570ustar00rootroot00000000000000#pragma once /* * Copyright 2016 Huy Cuong Nguyen * Copyright 2016 ZXing authors * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #include namespace ZXing { class BitMatrix; namespace DataMatrix { enum class SymbolShape; class Writer { public: Writer(); Writer& setMargin(int margin) { _quiteZone = margin; return *this; } Writer& setShapeHint(SymbolShape shape) { _shapeHint = shape; return *this; } Writer& setMinSize(int width, int height) { _minWidth = width; _minHeight = height; return *this; } Writer& setMaxSize(int width, int height) { _maxWidth = width; _maxHeight = height; return *this; } BitMatrix encode(const std::wstring& contents, int width, int height) const; private: SymbolShape _shapeHint; int _quiteZone = 1, _minWidth = -1, _minHeight = -1, _maxWidth = -1, _maxHeight = -1; }; } // DataMatrix } // ZXing zxing-cpp-1.0.8+ds2/core/src/maxicode/000077500000000000000000000000001361167020700174365ustar00rootroot00000000000000zxing-cpp-1.0.8+ds2/core/src/maxicode/MCBitMatrixParser.cpp000066400000000000000000000122701361167020700234440ustar00rootroot00000000000000/* * Copyright 2016 Nu-book Inc. * Copyright 2016 ZXing authors * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #include "MCBitMatrixParser.h" #include "ByteArray.h" #include "BitMatrix.h" #include namespace ZXing { namespace MaxiCode { static const std::array, BitMatrixParser::MATRIX_HEIGHT> BITNR = { 121,120,127,126,133,132,139,138,145,144,151,150,157,156,163,162,169,168,175,174,181,180,187,186,193,192,199,198, -2, -2, 123,122,129,128,135,134,141,140,147,146,153,152,159,158,165,164,171,170,177,176,183,182,189,188,195,194,201,200,816, -3, 125,124,131,130,137,136,143,142,149,148,155,154,161,160,167,166,173,172,179,178,185,184,191,190,197,196,203,202,818,817, 283,282,277,276,271,270,265,264,259,258,253,252,247,246,241,240,235,234,229,228,223,222,217,216,211,210,205,204,819, -3, 285,284,279,278,273,272,267,266,261,260,255,254,249,248,243,242,237,236,231,230,225,224,219,218,213,212,207,206,821,820, 287,286,281,280,275,274,269,268,263,262,257,256,251,250,245,244,239,238,233,232,227,226,221,220,215,214,209,208,822, -3, 289,288,295,294,301,300,307,306,313,312,319,318,325,324,331,330,337,336,343,342,349,348,355,354,361,360,367,366,824,823, 291,290,297,296,303,302,309,308,315,314,321,320,327,326,333,332,339,338,345,344,351,350,357,356,363,362,369,368,825, -3, 293,292,299,298,305,304,311,310,317,316,323,322,329,328,335,334,341,340,347,346,353,352,359,358,365,364,371,370,827,826, 409,408,403,402,397,396,391,390, 79, 78, -2, -2, 13, 12, 37, 36, 2, -1, 44, 43,109,108,385,384,379,378,373,372,828, -3, 411,410,405,404,399,398,393,392, 81, 80, 40, -2, 15, 14, 39, 38, 3, -1, -1, 45,111,110,387,386,381,380,375,374,830,829, 413,412,407,406,401,400,395,394, 83, 82, 41, -3, -3, -3, -3, -3, 5, 4, 47, 46,113,112,389,388,383,382,377,376,831, -3, 415,414,421,420,427,426,103,102, 55, 54, 16, -3, -3, -3, -3, -3, -3, -3, 20, 19, 85, 84,433,432,439,438,445,444,833,832, 417,416,423,422,429,428,105,104, 57, 56, -3, -3, -3, -3, -3, -3, -3, -3, 22, 21, 87, 86,435,434,441,440,447,446,834, -3, 419,418,425,424,431,430,107,106, 59, 58, -3, -3, -3, -3, -3, -3, -3, -3, -3, 23, 89, 88,437,436,443,442,449,448,836,835, 481,480,475,474,469,468, 48, -2, 30, -3, -3, -3, -3, -3, -3, -3, -3, -3, -3, 0, 53, 52,463,462,457,456,451,450,837, -3, 483,482,477,476,471,470, 49, -1, -2, -3, -3, -3, -3, -3, -3, -3, -3, -3, -3, -3, -2, -1,465,464,459,458,453,452,839,838, 485,484,479,478,473,472, 51, 50, 31, -3, -3, -3, -3, -3, -3, -3, -3, -3, -3, 1, -2, 42,467,466,461,460,455,454,840, -3, 487,486,493,492,499,498, 97, 96, 61, 60, -3, -3, -3, -3, -3, -3, -3, -3, -3, 26, 91, 90,505,504,511,510,517,516,842,841, 489,488,495,494,501,500, 99, 98, 63, 62, -3, -3, -3, -3, -3, -3, -3, -3, 28, 27, 93, 92,507,506,513,512,519,518,843, -3, 491,490,497,496,503,502,101,100, 65, 64, 17, -3, -3, -3, -3, -3, -3, -3, 18, 29, 95, 94,509,508,515,514,521,520,845,844, 559,558,553,552,547,546,541,540, 73, 72, 32, -3, -3, -3, -3, -3, -3, 10, 67, 66,115,114,535,534,529,528,523,522,846, -3, 561,560,555,554,549,548,543,542, 75, 74, -2, -1, 7, 6, 35, 34, 11, -2, 69, 68,117,116,537,536,531,530,525,524,848,847, 563,562,557,556,551,550,545,544, 77, 76, -2, 33, 9, 8, 25, 24, -1, -2, 71, 70,119,118,539,538,533,532,527,526,849, -3, 565,564,571,570,577,576,583,582,589,588,595,594,601,600,607,606,613,612,619,618,625,624,631,630,637,636,643,642,851,850, 567,566,573,572,579,578,585,584,591,590,597,596,603,602,609,608,615,614,621,620,627,626,633,632,639,638,645,644,852, -3, 569,568,575,574,581,580,587,586,593,592,599,598,605,604,611,610,617,616,623,622,629,628,635,634,641,640,647,646,854,853, 727,726,721,720,715,714,709,708,703,702,697,696,691,690,685,684,679,678,673,672,667,666,661,660,655,654,649,648,855, -3, 729,728,723,722,717,716,711,710,705,704,699,698,693,692,687,686,681,680,675,674,669,668,663,662,657,656,651,650,857,856, 731,730,725,724,719,718,713,712,707,706,701,700,695,694,689,688,683,682,677,676,671,670,665,664,659,658,653,652,858, -3, 733,732,739,738,745,744,751,750,757,756,763,762,769,768,775,774,781,780,787,786,793,792,799,798,805,804,811,810,860,859, 735,734,741,740,747,746,753,752,759,758,765,764,771,770,777,776,783,782,789,788,795,794,801,800,807,806,813,812,861, -3, 737,736,743,742,749,748,755,754,761,760,767,766,773,772,779,778,785,784,791,790,797,796,803,802,809,808,815,814,863,862, }; ByteArray BitMatrixParser::ReadCodewords(const BitMatrix& image) { ByteArray result(144); int height = image.height(); int width = image.width(); for (int y = 0; y < height; y++) { for (int x = 0; x < width; x++) { int bit = BITNR[y][x]; if (bit >= 0 && image.get(x, y)) { result[bit / 6] |= static_cast(1 << (5 - (bit % 6))); } } } return result; } } // MaxiCode } // ZXing zxing-cpp-1.0.8+ds2/core/src/maxicode/MCBitMatrixParser.h000066400000000000000000000016651361167020700231170ustar00rootroot00000000000000#pragma once /* * Copyright 2016 Nu-book Inc. * Copyright 2016 ZXing authors * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ namespace ZXing { class ByteArray; class BitMatrix; namespace MaxiCode { /** * @author mike32767 * @author Manuel Kasten */ class BitMatrixParser { public: static ByteArray ReadCodewords(const BitMatrix& image); static const int MATRIX_WIDTH = 30; static const int MATRIX_HEIGHT = 33; }; } // MaxiCode } // ZXing zxing-cpp-1.0.8+ds2/core/src/maxicode/MCDecoder.cpp000066400000000000000000000244061361167020700217350ustar00rootroot00000000000000/* * Copyright 2016 Nu-book Inc. * Copyright 2016 ZXing authors * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #include "MCDecoder.h" #include "MCBitMatrixParser.h" #include "ByteArray.h" #include "DecoderResult.h" #include "ReedSolomonDecoder.h" #include "GenericGF.h" #include "DecodeStatus.h" #include "TextDecoder.h" #include "ZXStrConvWorkaround.h" #include #include #include #include namespace ZXing { namespace MaxiCode { static const int ALL = 0; static const int EVEN = 1; static const int ODD = 2; static bool CorrectErrors(ByteArray& codewordBytes, int start, int dataCodewords, int ecCodewords, int mode) { int codewords = dataCodewords + ecCodewords; // in EVEN or ODD mode only half the codewords int divisor = mode == ALL ? 1 : 2; // First read into an array of ints std::vector codewordsInts(codewords / divisor, 0); for (int i = 0; i < codewords; i++) { if ((mode == ALL) || (i % 2 == (mode - 1))) { codewordsInts[i / divisor] = codewordBytes[i + start]; } } if (!ReedSolomonDecoder::Decode(GenericGF::MaxiCodeField64(), codewordsInts, ecCodewords / divisor)) return false; // Copy back into array of bytes -- only need to worry about the bytes that were data // We don't care about errors in the error-correction codewords for (int i = 0; i < dataCodewords; i++) { if ((mode == ALL) || (i % 2 == (mode - 1))) { codewordBytes[i + start] = static_cast(codewordsInts[i / divisor]); } } return true; } /** *

MaxiCodes can encode text or structured information as bits in one of several modes, * with multiple character sets in one code. This class decodes the bits back into text.

* * @author mike32767 * @author Manuel Kasten */ namespace DecodedBitStreamParser { static const char SHI0 = 0x40; static const char SHI1 = 0x41; static const char SHI2 = 0x42; static const char SHI3 = 0x43; static const char SHI4 = 0x44; static const char TWSA = 0x45; // two shift A static const char TRSA = 0x46; // three shift A static const char LCHA = 0x47; // latch A static const char LCHB = 0x48; // latch B static const char LOCK = 0x49; static const char ECI = 0x4A; static const char NS = 0x4B; static const char PAD = 0x4C; static const char FS = 0x1C; static const char GS = 0x1D; static const char RS = 0x1E; const static std::array CHARSETS[] = { { // set 0 '\n', 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z', ECI, FS, GS, RS, NS, ' ', PAD, '"', '#', '$', '%', '&', '\'', '(', ')', '*', '+', ',', '-', '.', '/', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', ':', SHI1, SHI2, SHI3, SHI4, LCHB, }, { // set 1 '`', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z', ECI, FS, GS, RS, NS, '{', PAD, '}', '~', 0x7F, ';', '<', '=', '>', '?', '[', '\\', ']', '^', '_', ' ', ',', '.', '/', ':', '@', '!', '|', PAD, TWSA, TRSA, PAD, SHI0, SHI2, SHI3, SHI4, LCHA, }, { // set 2 '\xC0', '\xC1', '\xC2', '\xC3', '\xC4', '\xC5', '\xC6', '\xC7', '\xC8', '\xC9', '\xCA', '\xCB', '\xCC', '\xCD', '\xCE', '\xCF', '\xD0', '\xD1', '\xD2', '\xD3', '\xD4', '\xD5', '\xD6', '\xD7', '\xD8', '\xD9', '\xDA', ECI, FS, GS, RS, NS, // Note that in original code in Java, NS is not there, which seems to be a bug '\xDB', '\xDC', '\xDD', '\xDE', '\xDF', '\xAA', '\xAC', '\xB1', '\xB2', '\xB3', '\xB5', '\xB9', '\xBA', '\xBC', '\xBD', '\xBE', '\x80', '\x81', '\x82', '\x83', '\x84', '\x85', '\x86', '\x87', '\x88', '\x89', LCHA, '\x20', LOCK, SHI3, SHI4, LCHB, }, { // set 3 '\xE0', '\xE1', '\xE2', '\xE3', '\xE4', '\xE5', '\xE6', '\xE7', '\xE8', '\xE9', '\xEA', '\xEB', '\xEC', '\xED', '\xEE', '\xEF', '\xF0', '\xF1', '\xF2', '\xF3', '\xF4', '\xF5', '\xF6', '\xF7', '\xF8', '\xF9', '\xFA', ECI, FS, GS, RS, NS, '\xFB', '\xFC', '\xFD', '\xFE', '\xFF', '\xA1', '\xA8', '\xAB', '\xAF', '\xB0', '\xB4', '\xB7', '\xB8', '\xBB', '\xBF', '\x8A', '\x8B', '\x8C', '\x8D', '\x8E', '\x8F', '\x90', '\x91', '\x92', '\x93', '\x94', LCHA, '\x20', SHI2, LOCK, SHI4, LCHB, }, { // set 4 '\x00', '\x01', '\x02', '\x03', '\x04', '\x05', '\x06', '\x07', '\x08', '\x09', '\x0A', '\x0B', '\x0C', '\x0D', '\x0E', '\x0F', '\x10', '\x11', '\x12', '\x13', '\x14', '\x15', '\x16', '\x17', '\x18', '\x19', '\x1A', ECI, PAD, PAD, '\x1B', NS, FS, GS, RS, '\x1F', '\x9F', '\xA0', '\xA2', '\xA3', '\xA4', '\xA5', '\xA6', '\xA7', '\xA9', '\xAD', '\xAE', '\xB6', '\x95', '\x96', '\x97', '\x98', '\x99', '\x9A', '\x9B', '\x9C', '\x9D', '\x9E', LCHA, '\x20', SHI2, SHI3, LOCK, LCHB, }, { // set 5 '\x00', '\x01', '\x02', '\x03', '\x04', '\x05', '\x06', '\x07', '\x08', '\x09', '\x0A', '\x0B', '\x0C', '\x0D', '\x0E', '\x0F', '\x10', '\x11', '\x12', '\x13', '\x14', '\x15', '\x16', '\x17', '\x18', '\x19', '\x1A', '\x1B', '\x1C', '\x1D', '\x1E', '\x1F', '\x20', '\x21', '\x22', '\x23', '\x24', '\x25', '\x26', '\x27', '\x28', '\x29', '\x2A', '\x2B', '\x2C', '\x2D', '\x2E', '\x2F', '\x30', '\x31', '\x32', '\x33', '\x34', '\x35', '\x36', '\x37', '\x38', '\x39', '\x3A', '\x3B', '\x3C', '\x3D', '\x3E', '\x3F', }, }; static int GetBit(int bit, const ByteArray& bytes) { bit--; return (bytes[bit / 6] & (1 << (5 - (bit % 6)))) == 0 ? 0 : 1; } static int GetInt(const ByteArray& bytes, const ByteArray& x) { int len = x.length(); int val = 0; for (int i = 0; i < len; i++) { val += GetBit(x[i], bytes) << (len - i - 1); } return val; } static int GetPostCode2(const ByteArray& bytes) { return GetInt(bytes, { 33, 34, 35, 36, 25, 26, 27, 28, 29, 30, 19, 20, 21, 22, 23, 24, 13, 14, 15, 16, 17, 18, 7, 8, 9, 10, 11, 12, 1, 2 }); } static int GetPostCode2Length(const ByteArray& bytes) { return GetInt(bytes, { 39, 40, 41, 42, 31, 32 }); } static std::string GetPostCode3(const ByteArray& bytes) { return { CHARSETS[0].at(GetInt(bytes, { 39, 40, 41, 42, 31, 32 })), CHARSETS[0].at(GetInt(bytes, { 33, 34, 35, 36, 25, 26 })), CHARSETS[0].at(GetInt(bytes, { 27, 28, 29, 30, 19, 20 })), CHARSETS[0].at(GetInt(bytes, { 21, 22, 23, 24, 13, 14 })), CHARSETS[0].at(GetInt(bytes, { 15, 16, 17, 18, 7, 8 })), CHARSETS[0].at(GetInt(bytes, { 9, 10, 11, 12, 1, 2 })), }; } static std::string ToString(int x, int width) { std::stringstream buf; buf << std::setw(width) << std::setfill('0') << x; return buf.str(); } static int GetCountry(const ByteArray& bytes) { return GetInt(bytes, { 53, 54, 43, 44, 45, 46, 47, 48, 37, 38 }); } static int GetServiceClass(const ByteArray& bytes) { return GetInt(bytes, { 55, 56, 57, 58, 59, 60, 49, 50, 51, 52 }); } static std::string GetMessage(const ByteArray& bytes, int start, int len) { std::string sb; int shift = -1; int set = 0; int lastset = 0; for (int i = start; i < start + len; i++) { char c = CHARSETS[set].at(bytes[i]); switch (c) { case LCHA: set = 0; shift = -1; break; case LCHB: set = 1; shift = -1; break; case SHI0: case SHI1: case SHI2: case SHI3: case SHI4: lastset = set; set = c - SHI0; shift = 1; break; case TWSA: lastset = set; set = 0; shift = 2; break; case TRSA: lastset = set; set = 0; shift = 3; break; case NS: sb.append(ToString((bytes[i+1] << 24) + (bytes[i+2] << 18) + (bytes[i+3] << 12) + (bytes[i+4] << 6) + bytes[i+5], 9)); i += 5; break; case LOCK: shift = -1; break; default: sb.push_back(c); } if (shift-- == 0) { set = lastset; } } while (sb.length() > 0 && sb.at(sb.length() - 1) == PAD) { sb.resize(sb.length() - 1); } return sb; } static DecoderResult Decode(ByteArray&& bytes, int mode) { std::string result; result.reserve(144); switch (mode) { case 2: case 3: { auto postcode = mode == 2 ? ToString(GetPostCode2(bytes), GetPostCode2Length(bytes)) : GetPostCode3(bytes); auto country = ToString(GetCountry(bytes), 3); auto service = ToString(GetServiceClass(bytes), 3); result.append(GetMessage(bytes, 10, 84)); if (result.compare(0, 7, std::string("[)>") + RS + std::string("01") + GS) == 0) { result.insert(9, postcode + GS + country + GS + service + GS); } else { result.insert(0, postcode + GS + country + GS + service + GS); } break; } case 4: result.append(GetMessage(bytes, 1, 93)); break; case 5: result.append(GetMessage(bytes, 1, 77)); break; } return DecoderResult(std::move(bytes), TextDecoder::FromLatin1(result)).setEcLevel(std::to_wstring(mode)); // really??? } } // DecodedBitStreamParser DecoderResult Decoder::Decode(const BitMatrix& bits) { ByteArray codewords = BitMatrixParser::ReadCodewords(bits); if (!CorrectErrors(codewords, 0, 10, 10, ALL)) { return DecodeStatus::ChecksumError; } int mode = codewords[0] & 0x0F; ByteArray datawords; switch (mode) { case 2: case 3: case 4: if (CorrectErrors(codewords, 20, 84, 40, EVEN) && CorrectErrors(codewords, 20, 84, 40, ODD)) { datawords.resize(94, 0); } else { return DecodeStatus::ChecksumError; } break; case 5: if (CorrectErrors(codewords, 20, 68, 56, EVEN) && CorrectErrors(codewords, 20, 68, 56, ODD)) { datawords.resize(78, 0); } else { return DecodeStatus::ChecksumError; } break; default: return DecodeStatus::FormatError; } std::copy_n(codewords.begin(), 10, datawords.begin()); std::copy_n(codewords.begin() + 20, datawords.size() - 10, datawords.begin() + 10); return DecodedBitStreamParser::Decode(std::move(datawords), mode); } } // MaxiCode } // ZXing zxing-cpp-1.0.8+ds2/core/src/maxicode/MCDecoder.h000066400000000000000000000017211361167020700213750ustar00rootroot00000000000000#pragma once /* * Copyright 2016 Nu-book Inc. * Copyright 2016 ZXing authors * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ namespace ZXing { class DecoderResult; class BitMatrix; namespace MaxiCode { /** *

The main class which implements MaxiCode decoding -- as opposed to locating and extracting * the MaxiCode from an image.

* * @author Manuel Kasten */ class Decoder { public: static DecoderResult Decode(const BitMatrix& bits); }; } // MaxiCode } // ZXing zxing-cpp-1.0.8+ds2/core/src/maxicode/MCReader.cpp000066400000000000000000000045241361167020700215710ustar00rootroot00000000000000/* * Copyright 2016 Nu-book Inc. * Copyright 2016 ZXing authors * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #include "MCReader.h" #include "MCDecoder.h" #include "MCBitMatrixParser.h" #include "DecodeHints.h" #include "Result.h" #include "DecoderResult.h" #include "BinaryBitmap.h" #include "BitMatrix.h" namespace ZXing { namespace MaxiCode { /** * This method detects a code in a "pure" image -- that is, pure monochrome image * which contains only an unrotated, unskewed, image of a code, with some white border * around it. This is a specialized method that works exceptionally fast in this special * case. * * @see com.google.zxing.datamatrix.DataMatrixReader#extractPureBits(BitMatrix) * @see com.google.zxing.qrcode.QRCodeReader#extractPureBits(BitMatrix) */ static BitMatrix ExtractPureBits(const BitMatrix& image) { int left, top, width, height; if (!image.getEnclosingRectangle(left, top, width, height)) { return {}; } // Now just read off the bits BitMatrix result(BitMatrixParser::MATRIX_WIDTH, BitMatrixParser::MATRIX_HEIGHT); for (int y = 0; y < BitMatrixParser::MATRIX_HEIGHT; y++) { int iy = top + (y * height + height / 2) / BitMatrixParser::MATRIX_HEIGHT; for (int x = 0; x < BitMatrixParser::MATRIX_WIDTH; x++) { int ix = left + (x * width + width / 2 + (y & 0x01) * width / 2) / BitMatrixParser::MATRIX_WIDTH; if (image.get(ix, iy)) { result.set(x, y); } } } return result; } Result Reader::decode(const BinaryBitmap& image) const { if (!image.isPureBarcode()) { return Result(DecodeStatus::NotFound); } auto binImg = image.getBlackMatrix(); if (binImg == nullptr) { return Result(DecodeStatus::NotFound); } BitMatrix bits = ExtractPureBits(*binImg); if (bits.empty()) { return Result(DecodeStatus::NotFound); } return Result(Decoder::Decode(bits), {}, BarcodeFormat::MAXICODE); } } // MaxiCode } // ZXing zxing-cpp-1.0.8+ds2/core/src/maxicode/MCReader.h000066400000000000000000000014661361167020700212400ustar00rootroot00000000000000#pragma once /* * Copyright 2016 Nu-book Inc. * Copyright 2016 ZXing authors * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #include "Reader.h" namespace ZXing { namespace MaxiCode { class Reader : public ZXing::Reader { public: Result decode(const BinaryBitmap& image) const override; }; } // MaxiCode } // ZXing zxing-cpp-1.0.8+ds2/core/src/oned/000077500000000000000000000000001361167020700165725ustar00rootroot00000000000000zxing-cpp-1.0.8+ds2/core/src/oned/ODCodabarReader.cpp000066400000000000000000000230771361167020700222100ustar00rootroot00000000000000/* * Copyright 2016 Nu-book Inc. * Copyright 2016 ZXing authors * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #include "ODCodabarReader.h" #include "Result.h" #include "BitArray.h" #include "DecodeHints.h" #include "ZXContainerAlgorithms.h" #include namespace ZXing { namespace OneD { // These values are critical for determining how permissive the decoding // will be. All stripe sizes must be within the window these define, as // compared to the average stripe size. static const float MAX_ACCEPTABLE = 2.0f; static const float PADDING = 1.5f; static const char ALPHABET[] = "0123456789-$:/.+ABCD"; /** * These represent the encodings of characters, as patterns of wide and narrow bars. The 7 least-significant bits of * each int correspond to the pattern of wide and narrow, with 1s representing "wide" and 0s representing narrow. */ static const int CHARACTER_ENCODINGS[] = { 0x003, 0x006, 0x009, 0x060, 0x012, 0x042, 0x021, 0x024, 0x030, 0x048, // 0-9 0x00c, 0x018, 0x045, 0x051, 0x054, 0x015, 0x01A, 0x029, 0x00B, 0x00E, // -$:/.+ABCD }; static_assert(Length(ALPHABET) - 1 == Length(CHARACTER_ENCODINGS), "table size mismatch"); // minimal number of characters that should be present (inclusing start and stop characters) // under normal circumstances this should be set to 3, but can be set higher // as a last-ditch attempt to reduce false positives. static const int MIN_CHARACTER_LENGTH = 3; // official start and end patterns static const char* STARTEND_ENCODING = "ABCD"; // some codabar generator allow the codabar string to be closed by every // character. This will cause lots of false positives! // some industries use a checksum standard but this is not part of the original codabar standard // for more information see : http://www.mecsw.com/specs/codabar.html /** * Records the size of all runs of white and black pixels, starting with white. * This is just like recordPattern, except it records all the counters, and * uses our builtin "counters" member for storage. * @param row row to count from */ static bool InitCounters(const BitArray& row, std::vector& counters) { // Start from the first white bit. auto i = row.getNextUnset(row.begin()); if (i == row.end()) return false; auto li = i; while ((i = row.getNextSetTo(i, !*i)) != row.end()) { counters.push_back(static_cast(i - li)); li = i; } counters.push_back(static_cast(i - li)); return true; } // Assumes that counters[position] is a bar. static int ToNarrowWidePattern(const std::vector& counters, int position) { int counterLength = static_cast(counters.size()); int end = position + 7; if (end >= counterLength) { return -1; } int maxBar = 0; int minBar = std::numeric_limits::max(); for (int j = position; j < end; j += 2) { int currentCounter = counters[j]; if (currentCounter < minBar) { minBar = currentCounter; } if (currentCounter > maxBar) { maxBar = currentCounter; } } int thresholdBar = (minBar + maxBar) / 2; int maxSpace = 0; int minSpace = std::numeric_limits::max(); for (int j = position + 1; j < end; j += 2) { int currentCounter = counters[j]; if (currentCounter < minSpace) { minSpace = currentCounter; } if (currentCounter > maxSpace) { maxSpace = currentCounter; } } int thresholdSpace = (minSpace + maxSpace) / 2; int bitmask = 1 << 7; int pattern = 0; for (int i = 0; i < 7; i++) { int threshold = (i & 1) == 0 ? thresholdBar : thresholdSpace; bitmask >>= 1; if (counters[position + i] > threshold) { pattern |= bitmask; } } return IndexOf(CHARACTER_ENCODINGS, pattern); } static int FindStartPattern(const std::vector& counters) { int counterLength = static_cast(counters.size()); for (int i = 1; i < counterLength; i += 2) { int charOffset = ToNarrowWidePattern(counters, i); if (charOffset >= 0 && IndexOf(STARTEND_ENCODING, ALPHABET[charOffset]) >= 0) { // Look for whitespace before start pattern, >= 50% of width of start pattern // We make an exception if the whitespace is the first element. int patternSize = 0; for (int j = i; j < i + 7; j++) { patternSize += counters[j]; } if (i == 1 || counters[i - 1] >= patternSize / 2) { return i; } } } return -1; } static bool ValidatePattern(const std::vector& charOffsets, const std::vector& counters, int start) { // First, sum up the total size of our four categories of stripe sizes; std::array sizes = {}; std::array counts = {}; // We break out of this loop in the middle, in order to handle // inter-character spaces properly. int pos = start; for (int index : charOffsets) { int pattern = CHARACTER_ENCODINGS[index]; for (int j = 6; j >= 0; j--) { // Even j = bars, while odd j = spaces. Categories 2 and 3 are for // long stripes, while 0 and 1 are for short stripes. int category = (j & 1) + (pattern & 1) * 2; sizes[category] += counters[pos + j]; counts[category]++; pattern >>= 1; } // We ignore the inter-character space - it could be of any size. pos += 8; } // Calculate our allowable size thresholds using fixed-point math. float maxes[4]; float mins[4]; // Define the threshold of acceptability to be the midpoint between the // average small stripe and the average large stripe. No stripe lengths // should be on the "wrong" side of that line. for (int i = 0; i < 2; i++) { mins[i] = 0.0f; // Accept arbitrarily small "short" stripes. mins[i + 2] = ((float)sizes[i] / counts[i] + (float)sizes[i + 2] / counts[i + 2]) / 2.0f; maxes[i] = mins[i + 2]; maxes[i + 2] = (sizes[i + 2] * MAX_ACCEPTABLE + PADDING) / counts[i + 2]; } // Now verify that all of the stripes are within the thresholds. pos = start; for (int index : charOffsets) { int pattern = CHARACTER_ENCODINGS[index]; for (int j = 6; j >= 0; j--) { // Even j = bars, while odd j = spaces. Categories 2 and 3 are for // long stripes, while 0 and 1 are for short stripes. int category = (j & 1) + (pattern & 1) * 2; int size = counters[pos + j]; if (size < mins[category] || size > maxes[category]) { return false; } pattern >>= 1; } pos += 8; } return true; } CodabarReader::CodabarReader(const DecodeHints& hints) { _returnStartEnd = hints.returnCodabarStartEnd(); } Result CodabarReader::decodeRow(int rowNumber, const BitArray& row, std::unique_ptr&) const { std::vector counters; counters.reserve(80); if (!InitCounters(row, counters)) { return Result(DecodeStatus::NotFound); } int startOffset = FindStartPattern(counters); if (startOffset < 0) { return Result(DecodeStatus::NotFound); } int nextStart = startOffset; std::vector charOffsets; charOffsets.reserve(20); do { int charOffset = ToNarrowWidePattern(counters, nextStart); if (charOffset < 0) { return Result(DecodeStatus::NotFound); } // Hack: We store the position in the alphabet table into a // StringBuilder, so that we can access the decoded patterns in // validatePattern. We'll translate to the actual characters later. charOffsets.push_back(charOffset); nextStart += 8; // Stop as soon as we see the end character. if (charOffsets.size() > 1 && IndexOf(STARTEND_ENCODING, ALPHABET[charOffset]) >= 0) { break; } } while (nextStart < static_cast(counters.size())); // no fixed end pattern so keep on reading while data is available // Look for whitespace after pattern: int trailingWhitespace = counters[nextStart - 1]; int lastPatternSize = 0; for (int i = -8; i < -1; i++) { lastPatternSize += counters[nextStart + i]; } // We need to see whitespace equal to 50% of the last pattern size, // otherwise this is probably a false positive. The exception is if we are // at the end of the row. (I.e. the barcode barely fits.) if (nextStart < static_cast(counters.size()) && trailingWhitespace < lastPatternSize / 2) { return Result(DecodeStatus::NotFound); } if (!ValidatePattern(charOffsets, counters, startOffset)) { return Result(DecodeStatus::NotFound); } // Translate character table offsets to actual characters. std::string decodeRowResult; decodeRowResult.reserve(charOffsets.size()); for (int index : charOffsets) { decodeRowResult += ALPHABET[index]; } // Ensure a valid start and end character if (IndexOf(STARTEND_ENCODING, decodeRowResult.front()) < 0) { return Result(DecodeStatus::NotFound); } if (IndexOf(STARTEND_ENCODING, decodeRowResult.back()) < 0) { return Result(DecodeStatus::NotFound); } // remove stop/start characters character and check if a long enough string is contained if (static_cast(decodeRowResult.length()) <= MIN_CHARACTER_LENGTH) { // Almost surely a false positive ( start + stop + at least 1 character) return Result(DecodeStatus::NotFound); } if (!_returnStartEnd) { decodeRowResult = decodeRowResult.substr(1, decodeRowResult.size() - 2); } int runningCount = 0; for (int i = 0; i < startOffset; i++) { runningCount += counters[i]; } int xStart = runningCount; for (int i = startOffset; i < nextStart - 1; i++) { runningCount += counters[i]; } int xStop = runningCount; return Result(decodeRowResult, rowNumber, xStart, xStop, BarcodeFormat::CODABAR); } } // OneD } // ZXing zxing-cpp-1.0.8+ds2/core/src/oned/ODCodabarReader.h000066400000000000000000000020561361167020700216470ustar00rootroot00000000000000#pragma once /* * Copyright 2016 Nu-book Inc. * Copyright 2016 ZXing authors * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #include "ODRowReader.h" namespace ZXing { class DecodeHints; namespace OneD { /** *

Decodes Codabar barcodes.

* * @author Bas Vijfwinkel * @author David Walker */ class CodabarReader : public RowReader { public: explicit CodabarReader(const DecodeHints& hints); Result decodeRow(int rowNumber, const BitArray& row, std::unique_ptr& state) const override; private: bool _returnStartEnd; }; } // OneD } // ZXing zxing-cpp-1.0.8+ds2/core/src/oned/ODCodabarWriter.cpp000066400000000000000000000112511361167020700222510ustar00rootroot00000000000000/* * Copyright 2016 Huy Cuong Nguyen * Copyright 2016 ZXing authors * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #include "ODCodabarWriter.h" #include "ODWriterHelper.h" #include "ZXContainerAlgorithms.h" #include #include namespace ZXing { namespace OneD { static constexpr wchar_t START_END_CHARS[] = L"ABCD"; static constexpr wchar_t ALT_START_END_CHARS[] = L"TN*E"; static constexpr wchar_t CHARS_WHICH_ARE_TEN_LENGTH_EACH_AFTER_DECODED[] = L"/:+."; static constexpr wchar_t DEFAULT_GUARD = START_END_CHARS[0]; static constexpr wchar_t ALPHABET[] = L"0123456789-$:/.+ABCD"; static constexpr int WIDE_TO_NARROW_BAR_RATIO = 2; //TODO: spec says 2.25 to 3 is the valid range. So this is technically illformed. /** * These represent the encodings of characters, as patterns of wide and narrow bars. The 7 least-significant bits of * each int correspond to the pattern of wide and narrow, with 1s representing "wide" and 0s representing narrow. */ static const int CHARACTER_ENCODINGS[] = { 0x003, 0x006, 0x009, 0x060, 0x012, 0x042, 0x021, 0x024, 0x030, 0x048, // 0-9 0x00c, 0x018, 0x045, 0x051, 0x054, 0x015, 0x01A, 0x029, 0x00B, 0x00E, // -$:/.+ABCD }; static_assert(Length(ALPHABET) - 1 == Length(CHARACTER_ENCODINGS), "table size mismatch"); BitMatrix CodabarWriter::encode(const std::wstring& contents_, int width, int height) const { std::wstring contents = contents_; if (contents.empty()) { throw std::invalid_argument("Found empty contents"); } if (contents.length() < 2) { // Can't have a start/end guard, so tentatively add default guards contents = DEFAULT_GUARD + contents + DEFAULT_GUARD; } else { // Verify input and calculate decoded length. bool startsNormal = Contains(START_END_CHARS, contents.front()); bool endsNormal = Contains(START_END_CHARS, contents.back()); bool startsAlt = Contains(ALT_START_END_CHARS, contents.front()); bool endsAlt = Contains(ALT_START_END_CHARS, contents.back()); if (startsNormal) { if (!endsNormal) { throw std::invalid_argument("Invalid start/end guards"); } // else already has valid start/end } else if (startsAlt) { if (!endsAlt) { throw std::invalid_argument("Invalid start/end guards"); } // else already has valid start/end // map alt characters to normal once so they are found in the ALPHABET auto map_alt_guard_char = [](wchar_t& c) { switch (c) { case 'T': c = 'A'; break; case 'N': c = 'B'; break; case '*': c = 'C'; break; case 'E': c = 'D'; break; } }; map_alt_guard_char(contents.front()); map_alt_guard_char(contents.back()); } else { // Doesn't start with a guard if (endsNormal || endsAlt) { throw std::invalid_argument("Invalid start/end guards"); } // else doesn't end with guard either, so add a default contents = DEFAULT_GUARD + contents + DEFAULT_GUARD; } } // The start character and the end character are decoded to 10 length each. size_t resultLength = 20; for (size_t i = 1; i + 1 < contents.length(); ++i) { auto c = contents[i]; if ((c >= '0' && c <= '9') || c == '-' || c == '$') { resultLength += 9; } else if (Contains(CHARS_WHICH_ARE_TEN_LENGTH_EACH_AFTER_DECODED, c)) { resultLength += 10; } else { throw std::invalid_argument(std::string("Cannot encode : '") + static_cast(c) + std::string("'")); } } // A blank is placed between each character. resultLength += contents.length() - 1; std::vector result(resultLength, false); auto position = result.begin(); for (wchar_t c : contents) { int code = CHARACTER_ENCODINGS[IndexOf(ALPHABET, c)]; // c is checked above to be in ALPHABET bool isBlack = true; int counter = 0; // count the width of the current bar int bit = 0; while (bit < 7) { // A character consists of 7 digit. *position++ = isBlack; ++counter; if (((code >> (6 - bit)) & 1) == 0 || counter == WIDE_TO_NARROW_BAR_RATIO) { // if current bar is short or we isBlack = !isBlack; // Flip the color. bit++; counter = 0; } } if (position != result.end()) { *position++ = false; // inter character whitespace } } return WriterHelper::RenderResult(result, width, height, _sidesMargin >= 0 ? _sidesMargin : 10); } } // OneD } // ZXing zxing-cpp-1.0.8+ds2/core/src/oned/ODCodabarWriter.h000066400000000000000000000020541361167020700217170ustar00rootroot00000000000000#pragma once /* * Copyright 2016 Huy Cuong Nguyen * Copyright 2016 ZXing authors * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #include namespace ZXing { class BitMatrix; namespace OneD { /** * This class renders CodaBar as {@code boolean[]}. * * @author dsbnatut@gmail.com (Kazuki Nishiura) */ class CodabarWriter { public: CodabarWriter& setMargin(int sidesMargin) { _sidesMargin = sidesMargin; return *this; } BitMatrix encode(const std::wstring& contents, int width, int height) const; private: int _sidesMargin = -1; }; } // OneD } // ZXing zxing-cpp-1.0.8+ds2/core/src/oned/ODCode128Patterns.cpp000066400000000000000000000065061361167020700223560ustar00rootroot00000000000000/* * Copyright 2016 Nu-book Inc. * Copyright 2016 ZXing authors * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #include "ODCode128Patterns.h" namespace ZXing { namespace OneD { namespace Code128 { const std::array, 107> CODE_PATTERNS = { { { 2, 1, 2, 2, 2, 2 }, // 0 { 2, 2, 2, 1, 2, 2 }, { 2, 2, 2, 2, 2, 1 }, { 1, 2, 1, 2, 2, 3 }, { 1, 2, 1, 3, 2, 2 }, { 1, 3, 1, 2, 2, 2 }, // 5 { 1, 2, 2, 2, 1, 3 }, { 1, 2, 2, 3, 1, 2 }, { 1, 3, 2, 2, 1, 2 }, { 2, 2, 1, 2, 1, 3 }, { 2, 2, 1, 3, 1, 2 }, // 10 { 2, 3, 1, 2, 1, 2 }, { 1, 1, 2, 2, 3, 2 }, { 1, 2, 2, 1, 3, 2 }, { 1, 2, 2, 2, 3, 1 }, { 1, 1, 3, 2, 2, 2 }, // 15 { 1, 2, 3, 1, 2, 2 }, { 1, 2, 3, 2, 2, 1 }, { 2, 2, 3, 2, 1, 1 }, { 2, 2, 1, 1, 3, 2 }, { 2, 2, 1, 2, 3, 1 }, // 20 { 2, 1, 3, 2, 1, 2 }, { 2, 2, 3, 1, 1, 2 }, { 3, 1, 2, 1, 3, 1 }, { 3, 1, 1, 2, 2, 2 }, { 3, 2, 1, 1, 2, 2 }, // 25 { 3, 2, 1, 2, 2, 1 }, { 3, 1, 2, 2, 1, 2 }, { 3, 2, 2, 1, 1, 2 }, { 3, 2, 2, 2, 1, 1 }, { 2, 1, 2, 1, 2, 3 }, // 30 { 2, 1, 2, 3, 2, 1 }, { 2, 3, 2, 1, 2, 1 }, { 1, 1, 1, 3, 2, 3 }, { 1, 3, 1, 1, 2, 3 }, { 1, 3, 1, 3, 2, 1 }, // 35 { 1, 1, 2, 3, 1, 3 }, { 1, 3, 2, 1, 1, 3 }, { 1, 3, 2, 3, 1, 1 }, { 2, 1, 1, 3, 1, 3 }, { 2, 3, 1, 1, 1, 3 }, // 40 { 2, 3, 1, 3, 1, 1 }, { 1, 1, 2, 1, 3, 3 }, { 1, 1, 2, 3, 3, 1 }, { 1, 3, 2, 1, 3, 1 }, { 1, 1, 3, 1, 2, 3 }, // 45 { 1, 1, 3, 3, 2, 1 }, { 1, 3, 3, 1, 2, 1 }, { 3, 1, 3, 1, 2, 1 }, { 2, 1, 1, 3, 3, 1 }, { 2, 3, 1, 1, 3, 1 }, // 50 { 2, 1, 3, 1, 1, 3 }, { 2, 1, 3, 3, 1, 1 }, { 2, 1, 3, 1, 3, 1 }, { 3, 1, 1, 1, 2, 3 }, { 3, 1, 1, 3, 2, 1 }, // 55 { 3, 3, 1, 1, 2, 1 }, { 3, 1, 2, 1, 1, 3 }, { 3, 1, 2, 3, 1, 1 }, { 3, 3, 2, 1, 1, 1 }, { 3, 1, 4, 1, 1, 1 }, // 60 { 2, 2, 1, 4, 1, 1 }, { 4, 3, 1, 1, 1, 1 }, { 1, 1, 1, 2, 2, 4 }, { 1, 1, 1, 4, 2, 2 }, { 1, 2, 1, 1, 2, 4 }, // 65 { 1, 2, 1, 4, 2, 1 }, { 1, 4, 1, 1, 2, 2 }, { 1, 4, 1, 2, 2, 1 }, { 1, 1, 2, 2, 1, 4 }, { 1, 1, 2, 4, 1, 2 }, // 70 { 1, 2, 2, 1, 1, 4 }, { 1, 2, 2, 4, 1, 1 }, { 1, 4, 2, 1, 1, 2 }, { 1, 4, 2, 2, 1, 1 }, { 2, 4, 1, 2, 1, 1 }, // 75 { 2, 2, 1, 1, 1, 4 }, { 4, 1, 3, 1, 1, 1 }, { 2, 4, 1, 1, 1, 2 }, { 1, 3, 4, 1, 1, 1 }, { 1, 1, 1, 2, 4, 2 }, // 80 { 1, 2, 1, 1, 4, 2 }, { 1, 2, 1, 2, 4, 1 }, { 1, 1, 4, 2, 1, 2 }, { 1, 2, 4, 1, 1, 2 }, { 1, 2, 4, 2, 1, 1 }, // 85 { 4, 1, 1, 2, 1, 2 }, { 4, 2, 1, 1, 1, 2 }, { 4, 2, 1, 2, 1, 1 }, { 2, 1, 2, 1, 4, 1 }, { 2, 1, 4, 1, 2, 1 }, // 90 { 4, 1, 2, 1, 2, 1 }, { 1, 1, 1, 1, 4, 3 }, { 1, 1, 1, 3, 4, 1 }, { 1, 3, 1, 1, 4, 1 }, { 1, 1, 4, 1, 1, 3 }, // 95 { 1, 1, 4, 3, 1, 1 }, { 4, 1, 1, 1, 1, 3 }, { 4, 1, 1, 3, 1, 1 }, { 1, 1, 3, 1, 4, 1 }, { 1, 1, 4, 1, 3, 1 }, // 100 { 3, 1, 1, 1, 4, 1 }, { 4, 1, 1, 1, 3, 1 }, { 2, 1, 1, 4, 1, 2 }, { 2, 1, 1, 2, 1, 4 }, { 2, 1, 1, 2, 3, 2 }, // 105 { 2, 3, 3, 1, 1, 1, 2 } } }; } // Code128 } // OneD } // ZXing zxing-cpp-1.0.8+ds2/core/src/oned/ODCode128Patterns.h000066400000000000000000000014601361167020700220150ustar00rootroot00000000000000#pragma once /* * Copyright 2016 Nu-book Inc. * Copyright 2016 ZXing authors * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #include #include namespace ZXing { namespace OneD { namespace Code128 { extern const std::array, 107> CODE_PATTERNS; } // Code128 } // OneD } // ZXing zxing-cpp-1.0.8+ds2/core/src/oned/ODCode128Reader.cpp000066400000000000000000000143671361167020700217640ustar00rootroot00000000000000/* * Copyright 2016 Nu-book Inc. * Copyright 2016 ZXing authors * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #include "ODCode128Reader.h" #include "ODCode128Patterns.h" #include "Result.h" #include "BitArray.h" #include "DecodeHints.h" #include "ZXContainerAlgorithms.h" #include "ZXStrConvWorkaround.h" #include #include #include namespace ZXing { namespace OneD { static const float MAX_AVG_VARIANCE = 0.25f; static const float MAX_INDIVIDUAL_VARIANCE = 0.7f; static const int CODE_SHIFT = 98; static const int CODE_CODE_C = 99; static const int CODE_CODE_B = 100; static const int CODE_CODE_A = 101; static const int CODE_FNC_1 = 102; static const int CODE_FNC_2 = 97; static const int CODE_FNC_3 = 96; static const int CODE_START_A = 103; static const int CODE_START_B = 104; static const int CODE_START_C = 105; static const int CODE_STOP = 106; static BitArray::Range FindStartPattern(const BitArray& row, int* startCode) { assert(startCode != nullptr); using Counters = std::vector; Counters counters(Code128::CODE_PATTERNS[CODE_START_A].size()); return RowReader::FindPattern( row.getNextSet(row.begin()), row.end(), counters, [&row, startCode](BitArray::Iterator begin, BitArray::Iterator end, const Counters& counters) { // Look for whitespace before start pattern, >= 50% of width of start pattern if (!row.hasQuiteZone(begin, static_cast(-(end-begin)/2))) return false; float bestVariance = MAX_AVG_VARIANCE; for (int code : {CODE_START_A, CODE_START_B, CODE_START_C}) { float variance = RowReader::PatternMatchVariance(counters, Code128::CODE_PATTERNS[code], MAX_INDIVIDUAL_VARIANCE); if (variance < bestVariance) { bestVariance = variance; *startCode = code; } } return bestVariance < MAX_AVG_VARIANCE; }); } Code128Reader::Code128Reader(const DecodeHints& hints) : _convertFNC1(hints.assumeGS1()) { } Result Code128Reader::decodeRow(int rowNumber, const BitArray& row, std::unique_ptr&) const { int startCode = 0; auto range = FindStartPattern(row, &startCode); if (!range) { return Result(DecodeStatus::NotFound); } int xStart = static_cast(range.begin - row.begin()); ByteArray rawCodes; rawCodes.reserve(20); std::string result; result.reserve(20); std::vector counters(6, 0); rawCodes.push_back(static_cast(startCode)); int codeSet = 204 - startCode; size_t lastResultSize = 0; bool fnc4All = false; bool fnc4Next = false; bool shift = false; auto fnc1 = [&] { if (_convertFNC1) { if (result.empty()) { // GS1 specification 5.4.3.7. and 5.4.6.4. If the first char after the start code // is FNC1 then this is GS1-128. We add the symbology identifier. result.append("]C1"); } else { // GS1 specification 5.4.7.5. Every subsequent FNC1 is returned as ASCII 29 (GS) result.push_back((char)29); } } }; while (true) { range = RecordPattern(range.end, row.end(), counters); if (!range) return Result(DecodeStatus::NotFound); // Decode another code from image int code = RowReader::DecodeDigit(counters, Code128::CODE_PATTERNS, MAX_AVG_VARIANCE, MAX_INDIVIDUAL_VARIANCE); if (code == -1) return Result(DecodeStatus::NotFound); if (code == CODE_STOP) break; if (code >= CODE_START_A) return Result(DecodeStatus::FormatError); rawCodes.push_back(static_cast(code)); lastResultSize = result.size(); if (codeSet == CODE_CODE_C) { if (code < 100) { if (code < 10) result.push_back('0'); result.append(std::to_string(code)); } else if (code == CODE_FNC_1) { fnc1(); } else { codeSet = code; // CODE_A / CODE_B } } else { // codeSet A or B bool unshift = shift; switch (code) { case CODE_FNC_1: fnc1(); break; case CODE_FNC_2: case CODE_FNC_3: // do nothing? break; case CODE_SHIFT: if (shift) return Result(DecodeStatus::FormatError); // two shifts in a row make no sense shift = true; codeSet = codeSet == CODE_CODE_A ? CODE_CODE_B : CODE_CODE_A; break; case CODE_CODE_A: case CODE_CODE_B: if (codeSet == code) { // FNC4 if (fnc4Next) fnc4All = !fnc4All; fnc4Next = !fnc4Next; } else { codeSet = code; } break; case CODE_CODE_C: codeSet = CODE_CODE_C; break; default: { // code < 96 at this point int offset; if (codeSet == CODE_CODE_A && code >= 64) offset = fnc4All == fnc4Next ? -64 : +64; else offset = fnc4All == fnc4Next ? ' ' : ' ' + 128; result.push_back((char)(code + offset)); fnc4Next = false; break; } } // Unshift back to another code set if we were shifted if (unshift) { codeSet = codeSet == CODE_CODE_A ? CODE_CODE_B : CODE_CODE_A; shift = false; } } } // Check for ample whitespace following pattern, but, to do this we first need to remember that // we fudged decoding CODE_STOP since it actually has 7 bars, not 6. There is a black bar left // to read off. Would be slightly better to properly read. Here we just skip it: range.end = row.getNextUnset(range.end); if (result.empty() || !row.hasQuiteZone(range.end, range.size() / 2)) return Result(DecodeStatus::NotFound); int checksum = rawCodes.front(); for (int i = 1; i < static_cast(rawCodes.size()) - 1; ++i) checksum += i * rawCodes[i]; // the last code is the checksum: if (checksum % 103 != rawCodes.back()) { return Result(DecodeStatus::ChecksumError); } // Need to pull out the check digit(s) from string (if the checksum code happened to // be a printable character). result.resize(lastResultSize); int xStop = static_cast(range.end - row.begin() - 1); return Result(result, rowNumber, xStart, xStop, BarcodeFormat::CODE_128, std::move(rawCodes)); } } // OneD } // ZXing zxing-cpp-1.0.8+ds2/core/src/oned/ODCode128Reader.h000066400000000000000000000020201361167020700214100ustar00rootroot00000000000000#pragma once /* * Copyright 2016 Nu-book Inc. * Copyright 2016 ZXing authors * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #include "ODRowReader.h" namespace ZXing { class DecodeHints; namespace OneD { /** *

Decodes Code 128 barcodes.

* * @author Sean Owen */ class Code128Reader : public RowReader { public: explicit Code128Reader(const DecodeHints& hints); Result decodeRow(int rowNumber, const BitArray& row, std::unique_ptr& state) const override; private: bool _convertFNC1; }; } // OneD } // ZXing zxing-cpp-1.0.8+ds2/core/src/oned/ODCode128Writer.cpp000066400000000000000000000171031361167020700220250ustar00rootroot00000000000000/* * Copyright 2016 Huy Cuong Nguyen * Copyright 2016 ZXing authors * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #include "ODCode128Writer.h" #include "ODWriterHelper.h" #include "ODCode128Patterns.h" #include #include #include namespace ZXing { namespace OneD { static const int CODE_START_A = 103; static const int CODE_START_B = 104; static const int CODE_START_C = 105; static const int CODE_CODE_A = 101; static const int CODE_CODE_B = 100; static const int CODE_CODE_C = 99; static const int CODE_STOP = 106; // Dummy characters used to specify control characters in input static const auto ESCAPE_FNC_1 = L'\u00f1'; static const auto ESCAPE_FNC_2 = L'\u00f2'; static const auto ESCAPE_FNC_3 = L'\u00f3'; static const auto ESCAPE_FNC_4 = L'\u00f4'; static const int CODE_FNC_1 = 102; // Code A, Code B, Code C static const int CODE_FNC_2 = 97; // Code A, Code B static const int CODE_FNC_3 = 96; // Code A, Code B static const int CODE_FNC_4_A = 101; // Code A static const int CODE_FNC_4_B = 100; // Code B // Results of minimal lookahead for code C enum class CType { UNCODABLE, ONE_DIGIT, TWO_DIGITS, FNC_1 }; static CType FindCType(const std::wstring& value, int start) { int last = static_cast(value.length()); if (start >= last) { return CType::UNCODABLE; } wchar_t c = value[start]; if (c == ESCAPE_FNC_1) { return CType::FNC_1; } if (c < '0' || c > '9') { return CType::UNCODABLE; } if (start + 1 >= last) { return CType::ONE_DIGIT; } c = value[start + 1]; if (c < '0' || c > '9') { return CType::ONE_DIGIT; } return CType::TWO_DIGITS; } static int ChooseCode(const std::wstring& value, int start, int oldCode) { CType lookahead = FindCType(value, start); if (lookahead == CType::ONE_DIGIT) { if (oldCode == CODE_CODE_A) { return CODE_CODE_A; } return CODE_CODE_B; } if (lookahead == CType::UNCODABLE) { if (start < (int)value.length()) { int c = value[start]; if (c < ' ' || (oldCode == CODE_CODE_A && (c < '`' || (c >= ESCAPE_FNC_1 && c <= ESCAPE_FNC_4)))) { // can continue in code A, encodes ASCII 0 to 95 or FNC1 to FNC4 return CODE_CODE_A; } } return CODE_CODE_B; // no choice } if (oldCode == CODE_CODE_A && lookahead == CType::FNC_1) { return CODE_CODE_A; } if (oldCode == CODE_CODE_C) { // can continue in code C return CODE_CODE_C; } if (oldCode == CODE_CODE_B) { if (lookahead == CType::FNC_1) { return CODE_CODE_B; // can continue in code B } // Seen two consecutive digits, see what follows lookahead = FindCType(value, start + 2); if (lookahead == CType::UNCODABLE || lookahead == CType::ONE_DIGIT) { return CODE_CODE_B; // not worth switching now } if (lookahead == CType::FNC_1) { // two digits, then FNC_1... lookahead = FindCType(value, start + 3); if (lookahead == CType::TWO_DIGITS) { // then two more digits, switch return CODE_CODE_C; } else { return CODE_CODE_B; // otherwise not worth switching } } // At this point, there are at least 4 consecutive digits. // Look ahead to choose whether to switch now or on the next round. int index = start + 4; while ((lookahead = FindCType(value, index)) == CType::TWO_DIGITS) { index += 2; } if (lookahead == CType::ONE_DIGIT) { // odd number of digits, switch later return CODE_CODE_B; } return CODE_CODE_C; // even number of digits, switch now } // Here oldCode == 0, which means we are choosing the initial code if (lookahead == CType::FNC_1) { // ignore FNC_1 lookahead = FindCType(value, start + 1); } if (lookahead == CType::TWO_DIGITS) { // at least two digits, start in code C return CODE_CODE_C; } return CODE_CODE_B; } BitMatrix Code128Writer::encode(const std::wstring& contents, int width, int height) const { // Check length int length = static_cast(contents.length()); if (length < 1 || length > 80) { throw std::invalid_argument("Contents length should be between 1 and 80 characters"); } // Check content for (int i = 0; i < length; ++i) { int c = contents[i]; switch (c) { case ESCAPE_FNC_1: case ESCAPE_FNC_2: case ESCAPE_FNC_3: case ESCAPE_FNC_4: break; default: if (c > 127) { // support for FNC4 isn't implemented, no full Latin-1 character set available at the moment throw std::invalid_argument(std::string("Bad character in input: ") + static_cast(c)); } } } std::list> patterns; // temporary storage for patterns int checkSum = 0; int checkWeight = 1; int codeSet = 0; // selected code (CODE_CODE_B or CODE_CODE_C) int position = 0; // position in contents while (position < length) { //Select code to use int newCodeSet = ChooseCode(contents, position, codeSet); //Get the pattern index int patternIndex; if (newCodeSet == codeSet) { // Encode the current character // First handle escapes switch (contents[position]) { case ESCAPE_FNC_1: patternIndex = CODE_FNC_1; break; case ESCAPE_FNC_2: patternIndex = CODE_FNC_2; break; case ESCAPE_FNC_3: patternIndex = CODE_FNC_3; break; case ESCAPE_FNC_4: if (codeSet == CODE_CODE_A) { patternIndex = CODE_FNC_4_A; } else { patternIndex = CODE_FNC_4_B; } break; default: // Then handle normal characters otherwise if (codeSet == CODE_CODE_A) { patternIndex = contents[position] - ' '; if (patternIndex < 0) { // everything below a space character comes behind the underscore in the code patterns table patternIndex += '`'; } } else if (codeSet == CODE_CODE_B) { patternIndex = contents[position] - ' '; } else { // CODE_CODE_C patternIndex = (contents[position] - '0') * 10 + (position+1 < length ? contents[position+1] - '0' : 0); position++; // Also incremented below } } position++; } else { // Should we change the current code? // Do we have a code set? if (codeSet == 0) { // No, we don't have a code set if (newCodeSet == CODE_CODE_A) { patternIndex = CODE_START_A; } else if (newCodeSet == CODE_CODE_B) { patternIndex = CODE_START_B; } else { // CODE_CODE_C patternIndex = CODE_START_C; } } else { // Yes, we have a code set patternIndex = newCodeSet; } codeSet = newCodeSet; } // Get the pattern patterns.push_back(Code128::CODE_PATTERNS[patternIndex]); // Compute checksum checkSum += patternIndex * checkWeight; if (position != 0) { checkWeight++; } } // Compute and append checksum checkSum %= 103; patterns.push_back(Code128::CODE_PATTERNS[checkSum]); // Append stop code patterns.push_back(Code128::CODE_PATTERNS[CODE_STOP]); // Compute code width int codeWidth = 0; for (const std::vector& pattern : patterns) { codeWidth += std::accumulate(pattern.begin(), pattern.end(), 0); } // Compute result std::vector result(codeWidth, false); int pos = 0; for (const std::vector& pattern : patterns) { pos += WriterHelper::AppendPattern(result, pos, pattern, true); } return WriterHelper::RenderResult(result, width, height, _sidesMargin >= 0 ? _sidesMargin : 10); } } // OneD } // ZXing zxing-cpp-1.0.8+ds2/core/src/oned/ODCode128Writer.h000066400000000000000000000020671361167020700214750ustar00rootroot00000000000000#pragma once /* * Copyright 2016 Huy Cuong Nguyen * Copyright 2016 ZXing authors * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #include namespace ZXing { class BitMatrix; namespace OneD { /** * This object renders a CODE128 code as a {@link BitMatrix}. * * @author erik.barbara@gmail.com (Erik Barbara) */ class Code128Writer { public: Code128Writer& setMargin(int sidesMargin) { _sidesMargin = sidesMargin; return *this; } BitMatrix encode(const std::wstring& contents, int width, int height) const; private: int _sidesMargin = -1; }; } // OneD } // ZXing zxing-cpp-1.0.8+ds2/core/src/oned/ODCode39Reader.cpp000066400000000000000000000155071361167020700217020ustar00rootroot00000000000000/* * Copyright 2016 Nu-book Inc. * Copyright 2016 ZXing authors * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #include "ODCode39Reader.h" #include "Result.h" #include "BitArray.h" #include "DecodeHints.h" #include "ZXContainerAlgorithms.h" #include #include namespace ZXing { namespace OneD { static const char ALPHABET_STRING[] = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ-. $/+%*"; /** * Each character consists of 5 bars and 4 spaces, 3 of which are wide (i.e. 6 are narrow). * Each character is followed by a narrow space. The narrow to wide ratio is between 1:2 and 1:3. * These represent the encodings of characters, as patterns of wide and narrow bars. * The 9 least-significant bits of each int correspond to the pattern of wide and narrow, * with 1s representing "wide" and 0s representing "narrow". */ static const int CHARACTER_ENCODINGS[] = { 0x034, 0x121, 0x061, 0x160, 0x031, 0x130, 0x070, 0x025, 0x124, 0x064, // 0-9 0x109, 0x049, 0x148, 0x019, 0x118, 0x058, 0x00D, 0x10C, 0x04C, 0x01C, // A-J 0x103, 0x043, 0x142, 0x013, 0x112, 0x052, 0x007, 0x106, 0x046, 0x016, // K-T 0x181, 0x0C1, 0x1C0, 0x091, 0x190, 0x0D0, 0x085, 0x184, 0x0C4, 0x0A8, // U-$ 0x0A2, 0x08A, 0x02A, 0x094 // /-% , * }; static_assert(Length(ALPHABET_STRING) - 1 == Length(CHARACTER_ENCODINGS), "table size mismatch"); static const int ASTERISK_ENCODING = 0x094; static const char PERCENTAGE_MAPPING[26] = { 'A' - 38, 'B' - 38, 'C' - 38, 'D' - 38, 'E' - 38, // %A to %E map to control codes ESC to USep 'F' - 11, 'G' - 11, 'H' - 11, 'I' - 11, 'J' - 11, // %F to %J map to ; < = > ? 'K' + 16, 'L' + 16, 'M' + 16, 'N' + 16, 'O' + 16, // %K to %O map to [ \ ] ^ _ 'P' + 43, 'Q' + 43, 'R' + 43, 'S' + 43, 'T' + 43, // %P to %T map to { | } ~ DEL '\0', '@', '`', // %U map to NUL, %V map to @, %W map to ` 127, 127, 127 // %X to %Z all map to DEL (127) }; using CounterContainer = std::array; // For efficiency, returns -1 on failure. Not throwing here saved as many as 700 exceptions // per image when using some of our blackbox images. static int ToNarrowWidePattern(const CounterContainer& counters) { int numCounters = static_cast(counters.size()); int maxNarrowCounter = 0; int wideCounters; do { int minCounter = std::numeric_limits::max(); for (int i = 0; i < numCounters; ++i) { if (counters[i] < minCounter && counters[i] > maxNarrowCounter) { minCounter = counters[i]; } } maxNarrowCounter = minCounter; wideCounters = 0; int totalWideCountersWidth = 0; int pattern = 0; for (int i = 0; i < numCounters; ++i) { if (counters[i] > maxNarrowCounter) { pattern |= 1 << (numCounters - 1 - i); wideCounters++; totalWideCountersWidth += counters[i]; } } if (wideCounters == 3) { // Found 3 wide counters, but are they close enough in width? // We can perform a cheap, conservative check to see if any individual // counter is more than 1.5 times the average: for (int i = 0; i < numCounters && wideCounters > 0; ++i) { if (counters[i] > maxNarrowCounter) { wideCounters--; // totalWideCountersWidth = 3 * average, so this checks if counter >= 3/2 * average if ((counters[i] * 2) >= totalWideCountersWidth) { return -1; } } } return pattern; } } while (wideCounters > 3); return -1; } static BitArray::Range FindAsteriskPattern(const BitArray& row) { CounterContainer counters; return RowReader::FindPattern( row.getNextSet(row.begin()), row.end(), counters, [&row](BitArray::Iterator begin, BitArray::Iterator end, const CounterContainer& counters) { // Look for whitespace before start pattern, >= 50% of width of start pattern return row.hasQuiteZone(begin, static_cast(-(end-begin)/2)) && ToNarrowWidePattern(counters) == ASTERISK_ENCODING; }); } /** Decode the extended string in place. Return false if FormatError occured. * ctrl is either "$%/+" for code39 or "abcd" for code93. */ bool DecodeExtendedCode39AndCode93(std::string& encoded, const char ctrl[4]) { auto out = encoded.begin(); for (auto in = encoded.cbegin(); in != encoded.cend(); ++in) { char c = *in; if (Contains(ctrl, c)) { char next = *++in; // if in is one short of cend(), then next == 0 if (next < 'A' || next > 'Z') return false; if (c == ctrl[0]) c = next - 64; // $A to $Z map to control codes SH to SB else if (c == ctrl[1]) c = PERCENTAGE_MAPPING[next - 'A']; else if (c == ctrl[2]) c = next - 32; // /A to /O map to ! to , and /Z maps to : else c = next + 32; // +A to +Z map to a to z } *out++ = c; } encoded.erase(out, encoded.end()); return true; } Code39Reader::Code39Reader(const DecodeHints& hints) : _extendedMode(hints.tryCode39ExtendedMode()), _usingCheckDigit(hints.assumeCode39CheckDigit()) { } Result Code39Reader::decodeRow(int rowNumber, const BitArray& row, std::unique_ptr&) const { auto range = FindAsteriskPattern(row); if (!range) return Result(DecodeStatus::NotFound); int xStart = static_cast(range.begin - row.begin()); CounterContainer theCounters = {}; std::string result; result.reserve(20); do { // Read off white space range = RecordPattern(row.getNextSet(range.end), row.end(), theCounters); if (!range) return Result(DecodeStatus::NotFound); int pattern = ToNarrowWidePattern(theCounters); if (pattern < 0) return Result(DecodeStatus::NotFound); int i = IndexOf(CHARACTER_ENCODINGS, pattern); if (i < 0) return Result(DecodeStatus::NotFound); result += ALPHABET_STRING[i]; } while (result.back() != '*'); result.pop_back(); // remove asterisk // Require at least one payload character and a quite zone of half the last pattern size. if (result.size() < (_usingCheckDigit ? 2u : 1u) || !row.hasQuiteZone(range.end, range.size() / 2)) { return Result(DecodeStatus::NotFound); } if (_usingCheckDigit) { auto checkDigit = result.back(); result.pop_back(); int checksum = TransformReduce(result, 0, [](char c) { return IndexOf(ALPHABET_STRING, c); }); if (checkDigit != ALPHABET_STRING[checksum % 43]) { return Result(DecodeStatus::ChecksumError); } } if (_extendedMode && !DecodeExtendedCode39AndCode93(result, "$%/+")) return Result(DecodeStatus::FormatError); int xStop = static_cast(range.end - row.begin() - 1); return Result(result, rowNumber, xStart, xStop, BarcodeFormat::CODE_39); } } // OneD } // ZXing zxing-cpp-1.0.8+ds2/core/src/oned/ODCode39Reader.h000066400000000000000000000030701361167020700213370ustar00rootroot00000000000000#pragma once /* * Copyright 2016 Nu-book Inc. * Copyright 2016 ZXing authors * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #include "ODRowReader.h" namespace ZXing { class DecodeHints; namespace OneD { /** *

Decodes Code 39 barcodes. Supports "Full ASCII Code 39" if extendedMode is true.

* * @author Sean Owen * @see Code93Reader */ class Code39Reader : public RowReader { public: /** * Creates a reader that can be configured to check the last character as a check digit, * or optionally attempt to decode "extended Code 39" sequences that are used to encode * the full ASCII character set. * * @param usingCheckDigit if true, treat the last data character as a check digit, not * data, and verify that the checksum passes. * @param extendedMode if true, will attempt to decode extended Code 39 sequences in the * text. */ explicit Code39Reader(const DecodeHints& hints); Result decodeRow(int rowNumber, const BitArray& row, std::unique_ptr& state) const override; private: bool _extendedMode; bool _usingCheckDigit; }; } // OneD } // ZXing zxing-cpp-1.0.8+ds2/core/src/oned/ODCode39Writer.cpp000066400000000000000000000136121361167020700217470ustar00rootroot00000000000000/* * Copyright 2016 Huy Cuong Nguyen * Copyright 2016 ZXing authors * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #include "ODCode39Writer.h" #include "ODWriterHelper.h" #include "ZXContainerAlgorithms.h" #include "TextEncoder.h" #include "CharacterSet.h" #include "ZXStrConvWorkaround.h" #include #include namespace ZXing { namespace OneD { static const char ALPHABET_STRING[] = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ-. *$/+%"; /** * These represent the encodings of characters, as patterns of wide and narrow bars. * The 9 least-significant bits of each int correspond to the pattern of wide and narrow, * with 1s representing "wide" and 0s representing narrow. */ static const int CHARACTER_ENCODINGS[] = { 0x034, 0x121, 0x061, 0x160, 0x031, 0x130, 0x070, 0x025, 0x124, 0x064, // 0-9 0x109, 0x049, 0x148, 0x019, 0x118, 0x058, 0x00D, 0x10C, 0x04C, 0x01C, // A-J 0x103, 0x043, 0x142, 0x013, 0x112, 0x052, 0x007, 0x106, 0x046, 0x016, // K-T 0x181, 0x0C1, 0x1C0, 0x091, 0x190, 0x0D0, 0x085, 0x184, 0x0C4, 0x094, // U-* 0x0A8, 0x0A2, 0x08A, 0x02A // $-% }; static_assert(Length(ALPHABET_STRING) - 1 == Length(CHARACTER_ENCODINGS), "table size mismatch"); static const int ASTERISK_ENCODING = CHARACTER_ENCODINGS[39]; static void ToIntArray(int a, std::array& toReturn) { for (int i = 0; i < 9; ++i) { toReturn[i] = (a & (1 << (8 - i))) == 0 ? 1 : 2; } } static std::string ToHexString(int c) { const char* digits = "0123456789abcdef"; std::string val(4, '0'); val[1] = 'x'; val[2] = digits[(c >> 4) & 0xf]; val[3] = digits[c & 0xf]; return val; } static std::string TryToConvertToExtendedMode(const std::wstring& contents) { size_t length = contents.length(); std::string extendedContent; extendedContent.reserve(length * 2); for (size_t i = 0; i < length; i++) { int character = contents[i]; switch (character) { case '\0': extendedContent.append("%U"); break; case ' ': case '-': case '.': extendedContent.push_back((char)character); break; case '@': extendedContent.append("%V"); break; case '`': extendedContent.append("%W"); break; default: if (character > 0 && character < 27) { extendedContent.push_back('$'); extendedContent.push_back((char)('A' + (character - 1))); } else if (character > 26 && character < ' ') { extendedContent.push_back('%'); extendedContent.push_back((char)('A' + (character - 27))); } else if ((character > ' ' && character < '-') || character == '/' || character == ':') { extendedContent.push_back('/'); extendedContent.push_back((char)('A' + (character - 33))); } else if (character > '/' && character < ':') { extendedContent.push_back((char)('0' + (character - 48))); } else if (character > ':' && character < '@') { extendedContent.push_back('%'); extendedContent.push_back((char)('F' + (character - 59))); } else if (character > '@' && character < '[') { extendedContent.push_back((char)('A' + (character - 65))); } else if (character > 'Z' && character < '`') { extendedContent.push_back('%'); extendedContent.push_back((char)('K' + (character - 91))); } else if (character > '`' && character < '{') { extendedContent.push_back('+'); extendedContent.push_back((char)('A' + (character - 97))); } else if (character > 'z' && character < 128) { extendedContent.push_back('%'); extendedContent.push_back((char)('P' + (character - 123))); } else { throw std::invalid_argument("Requested content contains a non-encodable character: '" + ToHexString(character) + "'"); } break; } } return extendedContent; } BitMatrix Code39Writer::encode(const std::wstring& contents, int width, int height) const { size_t length = contents.length(); if (length == 0) { throw std::invalid_argument("Found empty contents"); } if (length > 80) { throw std::invalid_argument("Requested contents should be less than 80 digits long"); } std::string extendedContent; for (size_t i = 0; i < length; i++) { int indexInString = IndexOf(ALPHABET_STRING, contents[i]); if (indexInString < 0) { extendedContent = TryToConvertToExtendedMode(contents); length = extendedContent.length(); if (length > 80) { throw std::invalid_argument("Requested contents should be less than 80 digits long, but got " + std::to_string(length) + " (extended full ASCII mode)"); } break; } } if (extendedContent.empty()) { extendedContent = TextEncoder::FromUnicode(contents, CharacterSet::ISO8859_1); } std::array widths = {}; size_t codeWidth = 24 + 1 + (13 * length); std::vector result(codeWidth, false); ToIntArray(ASTERISK_ENCODING, widths); int pos = WriterHelper::AppendPattern(result, 0, widths, true); std::array narrowWhite = { 1 }; pos += WriterHelper::AppendPattern(result, pos, narrowWhite, false); //append next character to byte matrix for (size_t i = 0; i < length; ++i) { int indexInString = IndexOf(ALPHABET_STRING, extendedContent[i]); ToIntArray(CHARACTER_ENCODINGS[indexInString], widths); pos += WriterHelper::AppendPattern(result, pos, widths, true); pos += WriterHelper::AppendPattern(result, pos, narrowWhite, false); } ToIntArray(ASTERISK_ENCODING, widths); WriterHelper::AppendPattern(result, pos, widths, true); return WriterHelper::RenderResult(result, width, height, _sidesMargin >= 0 ? _sidesMargin : 10); } } // OneD } // ZXing zxing-cpp-1.0.8+ds2/core/src/oned/ODCode39Writer.h000066400000000000000000000020651361167020700214140ustar00rootroot00000000000000#pragma once /* * Copyright 2016 Huy Cuong Nguyen * Copyright 2016 ZXing authors * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #include namespace ZXing { class BitMatrix; namespace OneD { /** * This object renders a CODE39 code as a {@link BitMatrix}. * * @author erik.barbara@gmail.com (Erik Barbara) */ class Code39Writer { public: Code39Writer& setMargin(int sidesMargin) { _sidesMargin = sidesMargin; return *this; } BitMatrix encode(const std::wstring& contents, int width, int height) const; private: int _sidesMargin = -1; }; } // OneD } // ZXing zxing-cpp-1.0.8+ds2/core/src/oned/ODCode93Reader.cpp000066400000000000000000000117001361167020700216710ustar00rootroot00000000000000/* * Copyright 2016 Nu-book Inc. * Copyright 2016 ZXing authors * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #include "ODCode93Reader.h" #include "Result.h" #include "BitArray.h" #include "ZXNumeric.h" #include "ZXContainerAlgorithms.h" #include namespace ZXing { namespace OneD { // Note that 'abcd' are dummy characters in place of control characters. static const char ALPHABET_STRING[] = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ-. $/+%abcd*"; /** * Each character consist of 3 bars and 3 spaces and is 9 modules wide in total. * Each bar and space is from 1 to 4 modules wide. * These represent the encodings of characters. Each module is asigned 1 bit. * The 9 least-significant bits of each int correspond to the 9 modules in a symbol. * Note: bit 9 (the first) is always 1, bit 1 (the last) is always 0. */ static const int CHARACTER_ENCODINGS[] = { 0x114, 0x148, 0x144, 0x142, 0x128, 0x124, 0x122, 0x150, 0x112, 0x10A, // 0-9 0x1A8, 0x1A4, 0x1A2, 0x194, 0x192, 0x18A, 0x168, 0x164, 0x162, 0x134, // A-J 0x11A, 0x158, 0x14C, 0x146, 0x12C, 0x116, 0x1B4, 0x1B2, 0x1AC, 0x1A6, // K-T 0x196, 0x19A, 0x16C, 0x166, 0x136, 0x13A, // U-Z 0x12E, 0x1D4, 0x1D2, 0x1CA, 0x16E, 0x176, 0x1AE, // - - % 0x126, 0x1DA, 0x1D6, 0x132, 0x15E, // Control chars ($)==a, (%)==b, (/)==c, (+)==d, * }; static_assert(Length(ALPHABET_STRING) - 1 == Length(CHARACTER_ENCODINGS), "table size mismatch"); static const int ASTERISK_ENCODING = 0x15E; using CounterContainer = std::array; static int ToPattern(const CounterContainer& counters) { // each bar/space is 1-4 modules wide, the sum of all is 9 modules wide int sum = Accumulate(counters, 0); int pattern = 0; for (int i = 0, count = (int)counters.size(); i < count; ++i) { int scaled = (counters[i] * 9 + (sum/2)) / sum; // non-float version of RoundToNearest(counters[i] * 9.0f / sum); if (scaled < 1 || scaled > 4) { return -1; } pattern <<= scaled; pattern |= ~(0xffffffff << scaled) * (~i & 1); } return pattern; } static BitArray::Range FindAsteriskPattern(const BitArray& row) { CounterContainer counters; return RowReader::FindPattern( row.getNextSet(row.begin()), row.end(), counters, [](BitArray::Iterator, BitArray::Iterator, const CounterContainer& counters) { return ToPattern(counters) == ASTERISK_ENCODING; }); } static bool CheckOneChecksum(const std::string& result, int checkPosition, int weightMax) { int weight = 1; int checkSum = 0; for (int i = checkPosition - 1; i >= 0; i--) { checkSum += weight * IndexOf(ALPHABET_STRING, result[i]); if (++weight > weightMax) { weight = 1; } } return result[checkPosition] == ALPHABET_STRING[checkSum % 47]; } static bool CheckChecksums(const std::string& result) { int length = static_cast(result.length()); return CheckOneChecksum(result, length - 2, 20) && CheckOneChecksum(result, length - 1, 15); } // forward declare here. see ODCode39Reader.cpp. Not put in header to not pollute the public facing API bool DecodeExtendedCode39AndCode93(std::string& encoded, const char ctrl[4]); Result Code93Reader::decodeRow(int rowNumber, const BitArray& row, std::unique_ptr&) const { auto range = FindAsteriskPattern(row); if (!range) return Result(DecodeStatus::NotFound); int xStart = static_cast(range.begin - row.begin()); CounterContainer theCounters = {}; std::string result; result.reserve(20); do { // Read off white space range = RecordPattern(row.getNextSet(range.end), row.end(), theCounters); if (!range) return Result(DecodeStatus::NotFound); int pattern = ToPattern(theCounters); if (pattern < 0) return Result(DecodeStatus::NotFound); int i = IndexOf(CHARACTER_ENCODINGS, pattern); if (i < 0) return Result(DecodeStatus::NotFound); result += ALPHABET_STRING[i]; } while (result.back() != '*'); result.pop_back(); // remove asterisk // Should be at least one more black module if (range.end == row.end() || !*range.end) { return Result(DecodeStatus::NotFound); } // Need at least 2 checksum + 1 payload characters if (result.length() < 3) return Result(DecodeStatus::NotFound); if (!CheckChecksums(result)) return Result(DecodeStatus::ChecksumError); // Remove checksum digits result.resize(result.length() - 2); if (!DecodeExtendedCode39AndCode93(result, "abcd")) return Result(DecodeStatus::FormatError); int xStop = static_cast(range.end - row.begin() - 1); return Result(result, rowNumber, xStart, xStop, BarcodeFormat::CODE_93); } } // OneD } // ZXing zxing-cpp-1.0.8+ds2/core/src/oned/ODCode93Reader.h000066400000000000000000000016741361167020700213470ustar00rootroot00000000000000#pragma once /* * Copyright 2016 Nu-book Inc. * Copyright 2016 ZXing authors * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #include "ODRowReader.h" namespace ZXing { namespace OneD { /** *

Decodes Code 93 barcodes.

* * @author Sean Owen * @see Code39Reader */ class Code93Reader : public RowReader { public: Result decodeRow(int rowNumber, const BitArray& row, std::unique_ptr& state) const override; }; } // OneD } // ZXing zxing-cpp-1.0.8+ds2/core/src/oned/ODCode93Writer.cpp000066400000000000000000000135521361167020700217520ustar00rootroot00000000000000/* * Copyright 2016 Huy Cuong Nguyen * Copyright 2016 ZXing authors * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #include "ODCode93Writer.h" #include "ODWriterHelper.h" #include "ZXContainerAlgorithms.h" #include "ZXTestSupport.h" #include #include namespace ZXing { namespace OneD { static const char ALPHABET_STRING[] = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ-. $/+%abcd*"; /** * These represent the encodings of characters, as patterns of wide and narrow bars. * The 9 least-significant bits of each int correspond to the pattern of wide and narrow. */ static const int CHARACTER_ENCODINGS[] = { 0x114, 0x148, 0x144, 0x142, 0x128, 0x124, 0x122, 0x150, 0x112, 0x10A, // 0-9 0x1A8, 0x1A4, 0x1A2, 0x194, 0x192, 0x18A, 0x168, 0x164, 0x162, 0x134, // A-J 0x11A, 0x158, 0x14C, 0x146, 0x12C, 0x116, 0x1B4, 0x1B2, 0x1AC, 0x1A6, // K-T 0x196, 0x19A, 0x16C, 0x166, 0x136, 0x13A, // U-Z 0x12E, 0x1D4, 0x1D2, 0x1CA, 0x16E, 0x176, 0x1AE, // - - % 0x126, 0x1DA, 0x1D6, 0x132, 0x15E, // Control chars? $-* }; static_assert(Length(ALPHABET_STRING) - 1 == Length(CHARACTER_ENCODINGS), "table size mismatch"); static const int ASTERISK_ENCODING = CHARACTER_ENCODINGS[47]; static int AppendPattern(std::vector& target, int pos, int a) { for (int i = 0; i < 9; i++) { int temp = a & (1 << (8 - i)); target[pos + i] = temp != 0; } return 9; } static int ComputeChecksumIndex(const std::string& contents, int maxWeight) { int weight = 1; int total = 0; for (int i = static_cast(contents.length()) - 1; i >= 0; i--) { int indexInString = IndexOf(ALPHABET_STRING, contents[i]); total += indexInString * weight; if (++weight > maxWeight) { weight = 1; } } return total % 47; } ZXING_EXPORT_TEST_ONLY std::string Code93ConvertToExtended(const std::wstring& contents) { size_t length = contents.length(); std::string extendedContent; extendedContent.reserve(length * 2); for (size_t i = 0; i < length; i++) { int character = contents[i]; // ($)=a, (%)=b, (/)=c, (+)=d. see Code93Reader.ALPHABET_STRING if (character == 0) { // NUL: (%)U extendedContent.append("bU"); } else if (character <= 26) { // SOH - SUB: ($)A - ($)Z extendedContent.push_back('a'); extendedContent.push_back((char)('A' + character - 1)); } else if (character <= 31) { // ESC - US: (%)A - (%)E extendedContent.push_back('b'); extendedContent.push_back((char)('A' + character - 27)); } else if (character == ' ' || character == '$' || character == '%' || character == '+') { // space $ % + extendedContent.push_back(character); } else if (character <= ',') { // ! " # & ' ( ) * ,: (/)A - (/)L extendedContent.push_back('c'); extendedContent.push_back((char)('A' + character - '!')); } else if (character <= '9') { extendedContent.push_back(character); } else if (character == ':') { // :: (/)Z extendedContent.append("cZ"); } else if (character <= '?') { // ; - ?: (%)F - (%)J extendedContent.push_back('b'); extendedContent.push_back((char)('F' + character - ';')); } else if (character == '@') { // @: (%)V extendedContent.append("bV"); } else if (character <= 'Z') { // A - Z extendedContent.push_back(character); } else if (character <= '_') { // [ - _: (%)K - (%)O extendedContent.push_back('b'); extendedContent.push_back((char)('K' + character - '[')); } else if (character == '`') { // `: (%)W extendedContent.append("bW"); } else if (character <= 'z') { // a - z: (*)A - (*)Z extendedContent.push_back('d'); extendedContent.push_back((char)('A' + character - 'a')); } else if (character <= 127) { // { - DEL: (%)P - (%)T extendedContent.push_back('b'); extendedContent.push_back((char)('P' + character - '{')); } else { throw std::invalid_argument(std::string("Requested content contains a non-encodable character: '") + (char)character + "'"); } } return extendedContent; } BitMatrix Code93Writer::encode(const std::wstring& contents_, int width, int height) const { std::string contents = Code93ConvertToExtended(contents_); size_t length = contents.length(); if (length == 0) { throw std::invalid_argument("Found empty contents"); } if (length > 80) { throw std::invalid_argument("Requested contents should be less than 80 digits long after converting to extended encoding"); } //lenght of code + 2 start/stop characters + 2 checksums, each of 9 bits, plus a termination bar size_t codeWidth = (contents.length() + 2 + 2) * 9 + 1; std::vector result(codeWidth, false); //start character (*) int pos = AppendPattern(result, 0, ASTERISK_ENCODING); for (size_t i = 0; i < length; i++) { int indexInString = IndexOf(ALPHABET_STRING, contents[i]); pos += AppendPattern(result, pos, CHARACTER_ENCODINGS[indexInString]); } //add two checksums int check1 = ComputeChecksumIndex(contents, 20); pos += AppendPattern(result, pos, CHARACTER_ENCODINGS[check1]); //append the contents to reflect the first checksum added contents += static_cast(ALPHABET_STRING[check1]); int check2 = ComputeChecksumIndex(contents, 15); pos += AppendPattern(result, pos, CHARACTER_ENCODINGS[check2]); //end character (*) pos += AppendPattern(result, pos, ASTERISK_ENCODING); //termination bar (single black bar) result[pos] = true; return WriterHelper::RenderResult(result, width, height, _sidesMargin >= 0 ? _sidesMargin : 10); } } // OneD } // ZXing zxing-cpp-1.0.8+ds2/core/src/oned/ODCode93Writer.h000066400000000000000000000017711361167020700214170ustar00rootroot00000000000000#pragma once /* * Copyright 2016 Huy Cuong Nguyen * Copyright 2016 ZXing authors * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #include namespace ZXing { class BitMatrix; namespace OneD { /** * This object renders a CODE93 code as a BitMatrix */ class Code93Writer { public: Code93Writer& setMargin(int sidesMargin) { _sidesMargin = sidesMargin; return *this; } BitMatrix encode(const std::wstring& contents, int width, int height) const; private: int _sidesMargin = -1; }; } // OneD } // ZXing zxing-cpp-1.0.8+ds2/core/src/oned/ODEAN13Reader.cpp000066400000000000000000000066231361167020700214220ustar00rootroot00000000000000/* * Copyright 2016 Nu-book Inc. * Copyright 2016 ZXing authors * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #include "ODEAN13Reader.h" #include "ODUPCEANCommon.h" #include "BarcodeFormat.h" #include "BitArray.h" #include "DecodeStatus.h" #include "ZXContainerAlgorithms.h" namespace ZXing { namespace OneD { // For an EAN-13 barcode, the first digit is represented by the parities used // to encode the next six digits, according to the table below. For example, // if the barcode is 5 123456 789012 then the value of the first digit is // signified by using odd for '1', even for '2', even for '3', odd for '4', // odd for '5', and even for '6'. See http://en.wikipedia.org/wiki/EAN-13 // // Parity of next 6 digits // Digit 0 1 2 3 4 5 // 0 Odd Odd Odd Odd Odd Odd // 1 Odd Odd Even Odd Even Even // 2 Odd Odd Even Even Odd Even // 3 Odd Odd Even Even Even Odd // 4 Odd Even Odd Odd Even Even // 5 Odd Even Even Odd Odd Even // 6 Odd Even Even Even Odd Odd // 7 Odd Even Odd Even Odd Even // 8 Odd Even Odd Even Even Odd // 9 Odd Even Even Odd Even Odd // // Note that the encoding for '0' uses the same parity as a UPC barcode. Hence // a UPC barcode can be converted to an EAN-13 barcode by prepending a 0. // // The encoding is represented by the following array, which is a bit pattern // using Odd = 0 and Even = 1. For example, 5 is represented by: // // Odd Even Even Odd Odd Even // in binary: // 0 1 1 0 0 1 == 0x19 // static const int FIRST_DIGIT_ENCODINGS[] = { 0x00, 0x0B, 0x0D, 0xE, 0x13, 0x19, 0x1C, 0x15, 0x16, 0x1A }; BarcodeFormat EAN13Reader::expectedFormat() const { return BarcodeFormat::EAN_13; } BitArray::Range EAN13Reader::decodeMiddle(const BitArray& row, BitArray::Iterator begin, std::string& resultString) const { int lgPatternFound = 0; BitArray::Range next = {begin, row.end()}; const BitArray::Range notFound = {begin, begin}; for (int x = 0; x < 6; x++) { int bestMatch = DecodeDigit(&next, UPCEANCommon::L_AND_G_PATTERNS, &resultString); if (bestMatch == -1) return notFound; if (bestMatch >= 10) { lgPatternFound |= 1 << (5 - x); } } /** * Based on pattern of odd-even ('L' and 'G') patterns used to encoded the explicitly-encoded * digits in a barcode, determines the implicitly encoded first digit and adds it to the * result string. */ int index = IndexOf(FIRST_DIGIT_ENCODINGS, lgPatternFound); if (index == -1) return notFound; resultString.insert(0, 1, (char)('0' + index)); if (!ReadGuardPattern(&next, UPCEANCommon::MIDDLE_PATTERN)) return notFound; for (int x = 0; x < 6; x++) { if (DecodeDigit(&next, UPCEANCommon::L_PATTERNS, &resultString) == -1) return notFound; } return {begin, next.begin}; } } // OneD } // ZXing zxing-cpp-1.0.8+ds2/core/src/oned/ODEAN13Reader.h000066400000000000000000000022451361167020700210630ustar00rootroot00000000000000#pragma once /* * Copyright 2016 Nu-book Inc. * Copyright 2016 ZXing authors * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #include "ODUPCEANReader.h" namespace ZXing { namespace OneD { /** *

Implements decoding of the EAN-13 format.

* * @author dswitkin@google.com (Daniel Switkin) * @author Sean Owen * @author alasdair@google.com (Alasdair Mackintosh) */ class EAN13Reader : public UPCEANReader { public: explicit EAN13Reader(const DecodeHints& hints) : UPCEANReader(hints) {} BarcodeFormat expectedFormat() const override; BitArray::Range decodeMiddle(const BitArray& row, BitArray::Iterator begin, std::string& resultString) const override; }; } // OneD } // ZXing zxing-cpp-1.0.8+ds2/core/src/oned/ODEAN13Writer.cpp000066400000000000000000000042401361167020700214650ustar00rootroot00000000000000/* * Copyright 2016 Huy Cuong Nguyen * Copyright 2016 ZXing authors * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #include "ODEAN13Writer.h" #include "ODUPCEANCommon.h" #include "ODWriterHelper.h" #include namespace ZXing { namespace OneD { static const int FIRST_DIGIT_ENCODINGS[] = { 0x00, 0x0B, 0x0D, 0xE, 0x13, 0x19, 0x1C, 0x15, 0x16, 0x1A }; static const int CODE_WIDTH = 3 + // start guard (7 * 6) + // left bars 5 + // middle guard (7 * 6) + // right bars 3; // end guard BitMatrix EAN13Writer::encode(const std::wstring& contents, int width, int height) const { auto digits = UPCEANCommon::DigitString2IntArray<13>(contents); int parities = FIRST_DIGIT_ENCODINGS[digits[0]]; std::vector result(CODE_WIDTH, false); int pos = 0; pos += WriterHelper::AppendPattern(result, pos, UPCEANCommon::START_END_PATTERN, true); // See {@link #EAN13Reader} for a description of how the first digit & left bars are encoded for (int i = 1; i <= 6; i++) { int digit = digits[i]; if ((parities >> (6 - i) & 1) == 1) { digit += 10; } pos += WriterHelper::AppendPattern(result, pos, UPCEANCommon::L_AND_G_PATTERNS[digit], false); } pos += WriterHelper::AppendPattern(result, pos, UPCEANCommon::MIDDLE_PATTERN, false); for (int i = 7; i <= 12; i++) { pos += WriterHelper::AppendPattern(result, pos, UPCEANCommon::L_PATTERNS[digits[i]], true); } WriterHelper::AppendPattern(result, pos, UPCEANCommon::START_END_PATTERN, true); return WriterHelper::RenderResult(result, width, height, _sidesMargin >= 0 ? _sidesMargin : 9); } } // OneD } // ZXing zxing-cpp-1.0.8+ds2/core/src/oned/ODEAN13Writer.h000066400000000000000000000020541361167020700211330ustar00rootroot00000000000000#pragma once /* * Copyright 2016 Huy Cuong Nguyen * Copyright 2016 ZXing authors * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #include namespace ZXing { class BitMatrix; namespace OneD { /** * This object renders an EAN8 code as a {@link BitMatrix}. * * @author aripollak@gmail.com (Ari Pollak) */ class EAN13Writer { public: EAN13Writer& setMargin(int sidesMargin) { _sidesMargin = sidesMargin; return *this; } BitMatrix encode(const std::wstring& contents, int width, int height) const; private: int _sidesMargin = -1; }; } // OneD } // ZXing zxing-cpp-1.0.8+ds2/core/src/oned/ODEAN8Reader.cpp000066400000000000000000000027431361167020700213450ustar00rootroot00000000000000/* * Copyright 2016 Nu-book Inc. * Copyright 2016 ZXing authors * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #include "ODEAN8Reader.h" #include "ODUPCEANCommon.h" #include "BitArray.h" #include "BarcodeFormat.h" #include "DecodeStatus.h" #include "ZXContainerAlgorithms.h" namespace ZXing { namespace OneD { BarcodeFormat EAN8Reader::expectedFormat() const { return BarcodeFormat::EAN_8; } BitArray::Range EAN8Reader::decodeMiddle(const BitArray& row, BitArray::Iterator begin, std::string& resultString) const { BitArray::Range next = {begin, row.end()}; const BitArray::Range notFound = {begin, begin}; for (int x = 0; x < 4; x++) { if (DecodeDigit(&next, UPCEANCommon::L_PATTERNS, &resultString) == -1) return notFound; } if (!ReadGuardPattern(&next, UPCEANCommon::MIDDLE_PATTERN)) return notFound; for (int x = 0; x < 4; x++) { if (DecodeDigit(&next, UPCEANCommon::L_PATTERNS, &resultString) == -1) return notFound; } return {begin, next.begin}; } } // OneD } // ZXing zxing-cpp-1.0.8+ds2/core/src/oned/ODEAN8Reader.h000066400000000000000000000021121361167020700210000ustar00rootroot00000000000000#pragma once /* * Copyright 2016 Nu-book Inc. * Copyright 2016 ZXing authors * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #include "ODUPCEANReader.h" namespace ZXing { namespace OneD { /** *

Implements decoding of the EAN-8 format.

* * @author Sean Owen */ class EAN8Reader : public UPCEANReader { public: explicit EAN8Reader(const DecodeHints& hints) : UPCEANReader(hints) {} protected: BarcodeFormat expectedFormat() const override; BitArray::Range decodeMiddle(const BitArray& row, BitArray::Iterator begin, std::string& resultString) const override; }; } // OneD } // ZXing zxing-cpp-1.0.8+ds2/core/src/oned/ODEAN8Writer.cpp000066400000000000000000000035131361167020700214130ustar00rootroot00000000000000/* * Copyright 2016 Huy Cuong Nguyen * Copyright 2016 ZXing authors * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #include "ODEAN8Writer.h" #include "ODUPCEANCommon.h" #include "ODWriterHelper.h" #include namespace ZXing { namespace OneD { static const int CODE_WIDTH = 3 + // start guard (7 * 4) + // left bars 5 + // middle guard (7 * 4) + // right bars 3; // end guard BitMatrix EAN8Writer::encode(const std::wstring& contents, int width, int height) const { auto digits = UPCEANCommon::DigitString2IntArray<8>(contents); std::vector result(CODE_WIDTH, false); int pos = 0; pos += WriterHelper::AppendPattern(result, pos, UPCEANCommon::START_END_PATTERN, true); for (int i = 0; i <= 3; i++) { pos += WriterHelper::AppendPattern(result, pos, UPCEANCommon::L_PATTERNS[digits[i]], false); } pos += WriterHelper::AppendPattern(result, pos, UPCEANCommon::MIDDLE_PATTERN, false); for (int i = 4; i <= 7; i++) { pos += WriterHelper::AppendPattern(result, pos, UPCEANCommon::L_PATTERNS[digits[i]], true); } WriterHelper::AppendPattern(result, pos, UPCEANCommon::START_END_PATTERN, true); return WriterHelper::RenderResult(result, width, height, _sidesMargin >= 0 ? _sidesMargin : 9); } } // OneD } // ZXing zxing-cpp-1.0.8+ds2/core/src/oned/ODEAN8Writer.h000066400000000000000000000020521361167020700210550ustar00rootroot00000000000000#pragma once /* * Copyright 2016 Huy Cuong Nguyen * Copyright 2016 ZXing authors * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #include namespace ZXing { class BitMatrix; namespace OneD { /** * This object renders an EAN8 code as a {@link BitMatrix}. * * @author aripollak@gmail.com (Ari Pollak) */ class EAN8Writer { public: EAN8Writer& setMargin(int sidesMargin) { _sidesMargin = sidesMargin; return *this; } BitMatrix encode(const std::wstring& contents, int width, int height) const; private: int _sidesMargin = -1; }; } // OneD } // ZXing zxing-cpp-1.0.8+ds2/core/src/oned/ODEANManufacturerOrgSupport.cpp000066400000000000000000000064761361167020700245630ustar00rootroot00000000000000/* * Copyright 2016 Nu-book Inc. * Copyright 2016 ZXing authors * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #include "ODEANManufacturerOrgSupport.h" #include "ZXStrConvWorkaround.h" #include #include #include namespace ZXing { namespace OneD { struct CountryId { int first; int last; const char *id; bool operator<(const CountryId &other) const { return first < other.first; } }; static const CountryId COUNTRIES[] = { {0, 19, "US/CA"}, {30, 39, "US"}, {60, 139, "US/CA"}, {300, 379, "FR"}, {380, 380, "BG"}, {383, 383, "SI"}, {385, 385, "HR"}, {387, 387, "BA"}, {400, 440, "DE"}, {450, 459, "JP"}, {460, 469, "RU"}, {471, 471, "TW"}, {474, 474, "EE"}, {475, 475, "LV"}, {476, 476, "AZ"}, {477, 477, "LT"}, {478, 478, "UZ"}, {479, 479, "LK"}, {480, 480, "PH"}, {481, 481, "BY"}, {482, 482, "UA"}, {484, 484, "MD"}, {485, 485, "AM"}, {486, 486, "GE"}, {487, 487, "KZ"}, {489, 489, "HK"}, {490, 499, "JP"}, {500, 509, "GB"}, {520, 520, "GR"}, {528, 528, "LB"}, {529, 529, "CY"}, {531, 531, "MK"}, {535, 535, "MT"}, {539, 539, "IE"}, {540, 549, "BE/LU"}, {560, 560, "PT"}, {569, 569, "IS"}, {570, 579, "DK"}, {590, 590, "PL"}, {594, 594, "RO"}, {599, 599, "HU"}, {600, 601, "ZA"}, {603, 603, "GH"}, {608, 608, "BH"}, {609, 609, "MU"}, {611, 611, "MA"}, {613, 613, "DZ"}, {616, 616, "KE"}, {618, 618, "CI"}, {619, 619, "TN"}, {621, 621, "SY"}, {622, 622, "EG"}, {624, 624, "LY"}, {625, 625, "JO"}, {626, 626, "IR"}, {627, 627, "KW"}, {628, 628, "SA"}, {629, 629, "AE"}, {640, 649, "FI"}, {690, 695, "CN"}, {700, 709, "NO"}, {729, 729, "IL"}, {730, 739, "SE"}, {740, 740, "GT"}, {741, 741, "SV"}, {742, 742, "HN"}, {743, 743, "NI"}, {744, 744, "CR"}, {745, 745, "PA"}, {746, 746, "DO"}, {750, 750, "MX"}, {754, 755, "CA"}, {759, 759, "VE"}, {760, 769, "CH"}, {770, 770, "CO"}, {773, 773, "UY"}, {775, 775, "PE"}, {777, 777, "BO"}, {779, 779, "AR"}, {780, 780, "CL"}, {784, 784, "PY"}, {785, 785, "PE"}, {786, 786, "EC"}, {789, 790, "BR"}, {800, 839, "IT"}, {840, 849, "ES"}, {850, 850, "CU"}, {858, 858, "SK"}, {859, 859, "CZ"}, {860, 860, "YU"}, {865, 865, "MN"}, {867, 867, "KP"}, {868, 869, "TR"}, {870, 879, "NL"}, {880, 880, "KR"}, {885, 885, "TH"}, {888, 888, "SG"}, {890, 890, "IN"}, {893, 893, "VN"}, {896, 896, "PK"}, {899, 899, "ID"}, {900, 919, "AT"}, {930, 939, "AU"}, {940, 949, "AZ"}, {955, 955, "MY"}, {958, 958, "MO"}, }; std::string EANManufacturerOrgSupport::LookupCountryIdentifier(const std::string& productCode) { int prefix = std::stoi(productCode.substr(0, 3)); auto it = std::lower_bound(std::begin(COUNTRIES), std::end(COUNTRIES), CountryId{ prefix, 0, nullptr }); if (it != std::end(COUNTRIES)) { if (prefix >= it->first && it->last) return it->id; } return std::string(); } } // OneD } // ZXing zxing-cpp-1.0.8+ds2/core/src/oned/ODEANManufacturerOrgSupport.h000066400000000000000000000022771361167020700242230ustar00rootroot00000000000000#pragma once /* * Copyright 2016 Nu-book Inc. * Copyright 2016 ZXing authors * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #include #include namespace ZXing { namespace OneD { /** * Records EAN prefix to GS1 Member Organization, where the member organization * correlates strongly with a country. This is an imperfect means of identifying * a country of origin by EAN-13 barcode value. See * * http://en.wikipedia.org/wiki/List_of_GS1_country_codes. * * @author Sean Owen */ class EANManufacturerOrgSupport { public: static std::string LookupCountryIdentifier(const std::string& productCode); }; } // OneD } // ZXing zxing-cpp-1.0.8+ds2/core/src/oned/ODITFReader.cpp000066400000000000000000000167751361167020700213060ustar00rootroot00000000000000/* * Copyright 2016 Nu-book Inc. * Copyright 2016 ZXing authors * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #include "ODITFReader.h" #include "Result.h" #include "BitArray.h" #include "DecodeHints.h" #include "ZXContainerAlgorithms.h" #include namespace ZXing { namespace OneD { static const float MAX_AVG_VARIANCE = 0.38f; static const float MAX_INDIVIDUAL_VARIANCE = 0.5f; static const int W = 3; // Pixel width of a 3x wide line static const int w = 2; // Pixel width of a 2x wide line static const int N = 1; // Pixed width of a narrow line /** Valid ITF lengths. Anything longer than the largest value is also allowed. */ static const std::array DEFAULT_ALLOWED_LENGTHS = { 6, 8, 10, 12, 14 }; /** * Start/end guard pattern. * * Note: The end pattern is reversed because the row is reversed before * searching for the END_PATTERN */ static const std::array START_PATTERN = { N, N, N, N }; static const std::array, 2> END_PATTERN_REVERSED = { N, N, w, // 2x N, N, W, // 3x }; /** * Patterns of Wide / Narrow lines to indicate each digit */ static const std::array, 20> PATTERNS = { N, N, w, w, N, // 0 w, N, N, N, w, // 1 N, w, N, N, w, // 2 w, w, N, N, N, // 3 N, N, w, N, w, // 4 w, N, w, N, N, // 5 N, w, w, N, N, // 6 N, N, N, w, w, // 7 w, N, N, w, N, // 8 N, w, N, w, N, // 9 N, N, W, W, N, // 0 W, N, N, N, W, // 1 N, W, N, N, W, // 2 W, W, N, N, N, // 3 N, N, W, N, W, // 4 W, N, W, N, N, // 5 N, W, W, N, N, // 6 N, N, N, W, W, // 7 W, N, N, W, N, // 8 N, W, N, W, N, // 9 }; /** * @param row row of black/white values to search * @param payloadStart offset of start pattern * @param resultString {@link StringBuilder} to append decoded chars to * @throws NotFoundException if decoding could not complete successfully */ static std::string DecodeMiddle(BitArray::Iterator begin, BitArray::Iterator end) { std::string resultString; resultString.reserve(20); // Digits are interleaved in pairs - 5 black lines for one digit, and the 5 // interleaved white lines for the second digit. // Therefore, need to scan 10 lines and then // split these into two arrays std::array counterDigitPair = {}; std::array counterBlack = {}; std::array counterWhite = {}; while (begin != end) { // Get 10 runs of black/white. auto range = RowReader::RecordPattern(begin, end, counterDigitPair); if (!range) return {}; // Split them into each array for (int k = 0; k < 5; k++) { counterBlack[k] = counterDigitPair[2 * k]; counterWhite[k] = counterDigitPair[2 * k + 1]; } int bestMatch = RowReader::DecodeDigit(counterBlack, PATTERNS, MAX_AVG_VARIANCE, MAX_INDIVIDUAL_VARIANCE); if (bestMatch == -1) return {}; resultString.push_back((char)('0' + bestMatch % 10)); bestMatch = RowReader::DecodeDigit(counterWhite, PATTERNS, MAX_AVG_VARIANCE, MAX_INDIVIDUAL_VARIANCE); if (bestMatch == -1) return {}; resultString.push_back((char)('0' + bestMatch % 10)); begin = range.end; } return resultString; } /** * @param row row of black/white values to search * @param pattern pattern of counts of number of black and white pixels that are * being searched for as a pattern * @return start/end horizontal offset of guard pattern, as an array of two * ints * @throws NotFoundException if pattern is not found */ template static BitArray::Range FindGuardPattern(const BitArray& row, const Container& pattern) { Container counters = {}; auto pat_sum = Accumulate(pattern, 0); return RowReader::FindPattern( row.getNextSet(row.begin()), row.end(), counters, [&row, &pattern, pat_sum](BitArray::Iterator begin, BitArray::Iterator end, const Container& counters) { // The start & end patterns must be pre/post fixed by a quiet zone. This // zone must be at least 10 times the width of a narrow line. Scan back until // we either get to the start of the barcode or match the necessary number of // quiet zone pixels. // ref: http://www.barcode-1.net/i25code.html // Determine the width of a narrow line in pixels. See definition of START and END patterns above int quietZoneWidth = 10 * static_cast(end - begin) / pat_sum; // 10 * narrowLineWidth; return row.hasQuiteZone(begin, -quietZoneWidth) && RowReader::PatternMatchVariance(counters, pattern, MAX_INDIVIDUAL_VARIANCE) < MAX_AVG_VARIANCE; }); } /** * Identify where the start of the middle / payload section starts. * * @param row row of black/white values to search * @return Array, containing index of start of 'start block' and end of * 'start block' * @throws NotFoundException */ static BitArray::Range DecodeStart(const BitArray& row) { return FindGuardPattern(row, START_PATTERN); } /** * Identify where the end of the middle / payload section ends. * * @param row row of black/white values to search * @return Array, containing index of start of 'end block' and end of 'end * block' * @throws NotFoundException */ static BitArray::Range DecodeEnd(const BitArray& row) { BitArray revRow = row.copy(); // For convenience, reverse the row and then // search from 'the start' for the end block revRow.reverse(); auto range = FindGuardPattern(revRow, END_PATTERN_REVERSED[0]); if (!range) range = FindGuardPattern(revRow, END_PATTERN_REVERSED[1]); // Now recalculate the indices of where the 'endblock' starts & stops to accommodate // the reversed nature of the search auto rowSize = static_cast(row.size()); return {row.iterAt(rowSize - static_cast(range.end - revRow.begin())), row.iterAt(rowSize - static_cast(range.begin - revRow.begin()))}; } ITFReader::ITFReader(const DecodeHints& hints) : _allowedLengths(hints.allowedLengths()) { if (_allowedLengths.empty()) { _allowedLengths.assign(DEFAULT_ALLOWED_LENGTHS.begin(), DEFAULT_ALLOWED_LENGTHS.end()); } } Result ITFReader::decodeRow(int rowNumber, const BitArray& row, std::unique_ptr&) const { // Find out where the Middle section (payload) starts & ends auto startRange = DecodeStart(row); if (!startRange) return Result(DecodeStatus::NotFound); auto endRange = DecodeEnd(row); if (!endRange || !(startRange.end < endRange.begin)) return Result(DecodeStatus::NotFound); std::string result = DecodeMiddle(startRange.end, endRange.begin); if (result.empty()) return Result(DecodeStatus::NotFound); // To avoid false positives with 2D barcodes (and other patterns), make // an assumption that the decoded string must be a 'standard' length if it's short int length = static_cast(result.length()); if (!_allowedLengths.empty() && !Contains(_allowedLengths, length)) { int maxAllowedLength = *std::max_element(_allowedLengths.begin(), _allowedLengths.end()); if (length < maxAllowedLength) return Result(DecodeStatus::FormatError); } int xStart = static_cast(startRange.begin - row.begin()); int xStop = static_cast(endRange.end - row.begin() - 1); return Result(result, rowNumber, xStart, xStop, BarcodeFormat::ITF); } } // OneD } // ZXing zxing-cpp-1.0.8+ds2/core/src/oned/ODITFReader.h000066400000000000000000000033761361167020700207440ustar00rootroot00000000000000#pragma once /* * Copyright 2016 Nu-book Inc. * Copyright 2016 ZXing authors * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #include "ODRowReader.h" #include namespace ZXing { class DecodeHints; namespace OneD { /** *

Implements decoding of the ITF format, or Interleaved Two of Five.

* *

This Reader will scan ITF barcodes of certain lengths only. * At the moment it reads length 6, 8, 10, 12, 14, 16, 18, 20, 24, and 44 as these have appeared "in the wild". Not all * lengths are scanned, especially shorter ones, to avoid false positives. This in turn is due to a lack of * required checksum function.

* *

The checksum is optional and is not applied by this Reader. The consumer of the decoded * value will have to apply a checksum if required.

* *

http://en.wikipedia.org/wiki/Interleaved_2_of_5 * is a great reference for Interleaved 2 of 5 information.

* * @author kevin.osullivan@sita.aero, SITA Lab. */ class ITFReader : public RowReader { public: explicit ITFReader(const DecodeHints& hints); Result decodeRow(int rowNumber, const BitArray& row, std::unique_ptr& state) const override; private: std::vector _allowedLengths; }; } // OneD } // ZXing zxing-cpp-1.0.8+ds2/core/src/oned/ODITFWriter.cpp000066400000000000000000000047121361167020700213440ustar00rootroot00000000000000/* * Copyright 2016 Huy Cuong Nguyen * Copyright 2016 ZXing authors * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #include "ODITFWriter.h" #include "ODWriterHelper.h" #include #include namespace ZXing { namespace OneD { static const std::array START_PATTERN = { 1, 1, 1, 1 }; static const std::array END_PATTERN = { 3, 1, 1 }; static const int W = 3; // Pixel width of a wide line static const int N = 1; // Pixed width of a narrow line /** * Patterns of Wide / Narrow lines to indicate each digit */ static const std::array, 10> PATTERNS = { N, N, W, W, N, // 0 W, N, N, N, W, // 1 N, W, N, N, W, // 2 W, W, N, N, N, // 3 N, N, W, N, W, // 4 W, N, W, N, N, // 5 N, W, W, N, N, // 6 N, N, N, W, W, // 7 W, N, N, W, N, // 8 N, W, N, W, N, // 9 }; BitMatrix ITFWriter::encode(const std::wstring& contents, int width, int height) const { size_t length = contents.length(); if (length == 0) { throw std::invalid_argument("Found empty contents"); } if (length % 2 != 0) { throw std::invalid_argument("The length of the input should be even"); } if (length > 80) { throw std::invalid_argument("Requested contents should be less than 80 digits long"); } std::vector result(9 + 9 * length, false); int pos = WriterHelper::AppendPattern(result, 0, START_PATTERN, true); for (size_t i = 0; i < length; i += 2) { int one = contents[i] - '0'; int two = contents[i + 1] - '0'; if (one < 0 || one > 9 || two < 0 || two > 9) { throw std::invalid_argument("Contents should contain only digits: 0-9"); } std::array encoding = {}; for (int j = 0; j < 5; j++) { encoding[2 * j] = PATTERNS[one][j]; encoding[2 * j + 1] = PATTERNS[two][j]; } pos += WriterHelper::AppendPattern(result, pos, encoding, true); } WriterHelper::AppendPattern(result, pos, END_PATTERN, true); return WriterHelper::RenderResult(result, width, height, _sidesMargin >= 0 ? _sidesMargin : 10); } } // OneD } // ZXing zxing-cpp-1.0.8+ds2/core/src/oned/ODITFWriter.h000066400000000000000000000020531361167020700210050ustar00rootroot00000000000000#pragma once /* * Copyright 2016 Huy Cuong Nguyen * Copyright 2016 ZXing authors * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #include namespace ZXing { class BitMatrix; namespace OneD { /** * This object renders a ITF code as a {@link BitMatrix}. * * @author erik.barbara@gmail.com (Erik Barbara) */ class ITFWriter { public: ITFWriter& setMargin(int sidesMargin) { _sidesMargin = sidesMargin; return *this; } BitMatrix encode(const std::wstring& contents, int width, int height) const; private: int _sidesMargin = -1; }; } // OneD } // ZXing zxing-cpp-1.0.8+ds2/core/src/oned/ODMultiUPCEANReader.cpp000066400000000000000000000062151361167020700226360ustar00rootroot00000000000000/* * Copyright 2016 Nu-book Inc. * Copyright 2016 ZXing authors * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #include "ODMultiUPCEANReader.h" #include "ODUPCEANReader.h" #include "ODEAN13Reader.h" #include "ODEAN8Reader.h" #include "ODUPCAReader.h" #include "ODUPCEReader.h" #include "DecodeHints.h" #include "BarcodeFormat.h" #include "Result.h" namespace ZXing { namespace OneD { MultiUPCEANReader::MultiUPCEANReader(const DecodeHints& hints) { _canReturnUPCA = hints.hasNoFormat() || hints.hasFormat(BarcodeFormat::UPC_A); DecodeHints _hints = hints; if (_hints.hasNoFormat()) { _hints.setPossibleFormats({BarcodeFormat::EAN_13, BarcodeFormat::EAN_8, BarcodeFormat::UPC_E}); // UPC-A is covered by EAN-13 } if (_hints.hasFormat(BarcodeFormat::EAN_13)) { _readers.emplace_back(new EAN13Reader(hints)); } else if (_hints.hasFormat(BarcodeFormat::UPC_A)) { _readers.emplace_back(new UPCAReader(hints)); } if (_hints.hasFormat(BarcodeFormat::EAN_8)) { _readers.emplace_back(new EAN8Reader(hints)); } if (_hints.hasFormat(BarcodeFormat::UPC_E)) { _readers.emplace_back(new UPCEReader(hints)); } } MultiUPCEANReader::~MultiUPCEANReader() = default; Result MultiUPCEANReader::decodeRow(int rowNumber, const BitArray& row, std::unique_ptr&) const { // Compute this location once and reuse it on multiple implementations auto range = UPCEANReader::FindStartGuardPattern(row); if (!range) return Result(DecodeStatus::NotFound); for (auto& reader : _readers) { Result result = reader->decodeRow(rowNumber, row, range); if (!result.isValid()) continue; // Special case: a 12-digit code encoded in UPC-A is identical to a "0" // followed by those 12 digits encoded as EAN-13. Each will recognize such a code, // UPC-A as a 12-digit string and EAN-13 as a 13-digit string starting with "0". // Individually these are correct and their readers will both read such a code // and correctly call it EAN-13, or UPC-A, respectively. // // In this case, if we've been looking for both types, we'd like to call it // a UPC-A code. But for efficiency we only run the EAN-13 decoder to also read // UPC-A. So we special case it here, and convert an EAN-13 result to a UPC-A // result if appropriate. // // But, don't return UPC-A if UPC-A was not a requested format! const std::wstring& resultText = result.text(); bool ean13MayBeUPCA = result.format() == BarcodeFormat::EAN_13 && !resultText.empty() && resultText[0] == '0'; if (ean13MayBeUPCA && _canReturnUPCA) { result.setText(resultText.substr(1)); result.setFormat(BarcodeFormat::UPC_A); } return result; } return Result(DecodeStatus::NotFound); } } // OneD } // ZXing zxing-cpp-1.0.8+ds2/core/src/oned/ODMultiUPCEANReader.h000066400000000000000000000026271361167020700223060ustar00rootroot00000000000000#pragma once /* * Copyright 2016 Nu-book Inc. * Copyright 2016 ZXing authors * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #include "ODRowReader.h" #include "BarcodeFormat.h" #include #include namespace ZXing { class DecodeHints; enum class BarcodeFormat; namespace OneD { class UPCEANReader; /** *

A reader that can read all available UPC/EAN formats. If a caller wants to try to * read all such formats, it is most efficient to use this implementation rather than invoke * individual readers.

* * @author Sean Owen */ class MultiUPCEANReader : public RowReader { public: explicit MultiUPCEANReader(const DecodeHints& hints); ~MultiUPCEANReader() override; Result decodeRow(int rowNumber, const BitArray& row, std::unique_ptr& state) const override; private: std::vector> _readers; bool _canReturnUPCA = false; }; } // OneD } // ZXing zxing-cpp-1.0.8+ds2/core/src/oned/ODRSS14Reader.cpp000066400000000000000000000307521361167020700214670ustar00rootroot00000000000000/* * Copyright 2016 Nu-book Inc. * Copyright 2016 ZXing authors * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #include "ODRSS14Reader.h" #include "rss/ODRSSReaderHelper.h" #include "rss/ODRSSPair.h" #include "BitArray.h" #include "Result.h" #include "DecodeHints.h" #include "ZXConfig.h" #include "ZXContainerAlgorithms.h" #include #include #include #include #include #include namespace ZXing { namespace OneD { static const int OUTSIDE_EVEN_TOTAL_SUBSET[] = { 1,10,34,70,126 }; static const int INSIDE_ODD_TOTAL_SUBSET[] = { 4,20,48,81 }; static const int OUTSIDE_GSUM[] = { 0,161,961,2015,2715 }; static const int INSIDE_GSUM[] = { 0,336,1036,1516 }; static const int OUTSIDE_ODD_WIDEST[] = { 8,6,4,3,1 }; static const int INSIDE_ODD_WIDEST[] = { 2,4,6,8 }; using namespace RSS; static const std::array FINDER_PATTERNS = { 3,8,2,1, 3,5,5,1, 3,3,7,1, 3,1,9,1, 2,7,4,1, 2,5,6,1, 2,3,8,1, 1,5,7,1, 1,3,9,1, }; struct RSS14DecodingState : public RowReader::DecodingState { std::list possibleLeftPairs; std::list possibleRightPairs; }; //private final List possibleLeftPairs; //private final List possibleRightPairs; // //public RSS14Reader() { // possibleLeftPairs = new ArrayList<>(); // possibleRightPairs = new ArrayList<>(); //} static BitArray::Range FindFinderPattern(const BitArray& row, bool rightFinderPattern, FinderCounters& counters) { if (row.size() < 2 * 18 + 14) return {row.end(), row.end()}; return RowReader::FindPattern( // Will encounter white first when searching for right finder pattern // The finder pattern is inside the code, i.e. there must be at least 18 pixels on both sides row.getNextSetTo(row.iterAt(18), !rightFinderPattern), row.end(), counters, [&](BitArray::Iterator b, BitArray::Iterator e, const FinderCounters& counters) { // The finder pattern must have more pixels left and right that it is wide. return ReaderHelper::IsFinderPattern(counters) && (b - row.begin()) > (e - b) && (row.end() - e) > (e-b); }); } static RSS::FinderPattern ParseFoundFinderPattern(const BitArray& row, int rowNumber, bool right, BitArray::Range range, FinderCounters& finderCounters) { if (!range || range.begin == row.begin()) return {}; // Actually we found elements 2-5 -> Locate element 1 auto i = std::find(BitArray::ReverseIterator(range.begin), row.rend(), *range.begin); int firstCounter = static_cast(range.begin - i.base()); range.begin = i.base(); // Make 'counters' hold 1-4 std::copy_backward(finderCounters.begin(), finderCounters.end() - 1, finderCounters.end()); finderCounters[0] = firstCounter; int value = RSS::ReaderHelper::ParseFinderValue(finderCounters, FINDER_PATTERNS); if (value < 0) return {}; int start = static_cast(range.begin - row.begin()); int end = static_cast(range.end - row.begin()); if (right) { // row is actually reversed start = row.size() - 1 - start; end = row.size() - 1 - end; } return {value, static_cast(range.begin - row.begin()), static_cast(range.end - row.begin()), {ResultPoint(start, rowNumber), ResultPoint(end, rowNumber)}}; } static bool AdjustOddEvenCounts(bool outsideChar, int numModules, std::array& oddCounts, std::array& evenCounts, const std::array& oddRoundingErrors, const std::array& evenRoundingErrors) { int oddSum = std::accumulate(oddCounts.begin(), oddCounts.end(), 0); int evenSum = std::accumulate(evenCounts.begin(), evenCounts.end(), 0); int mismatch = oddSum + evenSum - numModules; bool oddParityBad = (oddSum & 0x01) == (outsideChar ? 1 : 0); bool evenParityBad = (evenSum & 0x01) == 1; bool incrementOdd = false; bool decrementOdd = false; bool incrementEven = false; bool decrementEven = false; if (outsideChar) { if (oddSum > 12) { decrementOdd = true; } else if (oddSum < 4) { incrementOdd = true; } if (evenSum > 12) { decrementEven = true; } else if (evenSum < 4) { incrementEven = true; } } else { if (oddSum > 11) { decrementOdd = true; } else if (oddSum < 5) { incrementOdd = true; } if (evenSum > 10) { decrementEven = true; } else if (evenSum < 4) { incrementEven = true; } } /*if (mismatch == 2) { if (!(oddParityBad && evenParityBad)) { throw ReaderException.getInstance(); } decrementOdd = true; decrementEven = true; } else if (mismatch == -2) { if (!(oddParityBad && evenParityBad)) { throw ReaderException.getInstance(); } incrementOdd = true; incrementEven = true; } else */ if (mismatch == 1) { if (oddParityBad) { if (evenParityBad) { return false; } decrementOdd = true; } else { if (!evenParityBad) { return false; } decrementEven = true; } } else if (mismatch == -1) { if (oddParityBad) { if (evenParityBad) { return false; } incrementOdd = true; } else { if (!evenParityBad) { return false; } incrementEven = true; } } else if (mismatch == 0) { if (oddParityBad) { if (!evenParityBad) { return false; } // Both bad if (oddSum < evenSum) { incrementOdd = true; decrementEven = true; } else { decrementOdd = true; incrementEven = true; } } else { if (evenParityBad) { return false; } // Nothing to do! } } else { return false; } if (incrementOdd) { if (decrementOdd) { return false; } oddCounts[std::max_element(oddRoundingErrors.begin(), oddRoundingErrors.end()) - oddRoundingErrors.begin()] += 1; } if (decrementOdd) { oddCounts[std::min_element(oddRoundingErrors.begin(), oddRoundingErrors.end()) - oddRoundingErrors.begin()] -= 1; } if (incrementEven) { if (decrementEven) { return false; } evenCounts[std::max_element(evenRoundingErrors.begin(), evenRoundingErrors.end()) - evenRoundingErrors.begin()] += 1; } if (decrementEven) { evenCounts[std::min_element(evenRoundingErrors.begin(), evenRoundingErrors.end()) - evenRoundingErrors.begin()] -= 1; } return true; } static RSS::DataCharacter DecodeDataCharacter(const BitArray& row, const RSS::FinderPattern& pattern, bool outsideChar) { std::array counters = {}; if (outsideChar) { if (!RowReader::RecordPatternInReverse(row.begin(), row.iterAt(pattern.startPos()), counters)) return {}; } else { if (!RowReader::RecordPattern(row.iterAt(pattern.endPos()), row.end(), counters)) return {}; std::reverse(counters.begin(), counters.end()); } int numModules = outsideChar ? 16 : 15; float elementWidth = static_cast(std::accumulate(counters.begin(), counters.end(), 0)) / static_cast(numModules); std::array oddCounts; std::array evenCounts; std::array oddRoundingErrors; std::array evenRoundingErrors; for (int i = 0; i < 8; i++) { float value = (float)counters[i] / elementWidth; int count = (int)(value + 0.5f); // Round //TODO: C++17: count = std::clamp((int)(value + 0.5f), 1, 8); if (count < 1) { count = 1; } else if (count > 8) { count = 8; } int offset = i / 2; if ((i & 0x01) == 0) { oddCounts[offset] = count; oddRoundingErrors[offset] = value - count; } else { evenCounts[offset] = count; evenRoundingErrors[offset] = value - count; } } if (!AdjustOddEvenCounts(outsideChar, numModules, oddCounts, evenCounts, oddRoundingErrors, evenRoundingErrors)) { return {}; } auto calcChecksumPortion = [](const std::array& counts) { int res = 0; for (auto it = counts.rbegin(); it != counts.rend(); ++it) { res = 9 * res + *it; } return res; }; int checksumPortion = calcChecksumPortion(oddCounts) + 3 * calcChecksumPortion(evenCounts); int oddSum = Accumulate(oddCounts, 0); int evenSum = Accumulate(evenCounts, 0); if (outsideChar) { if ((oddSum & 0x01) != 0 || oddSum > 12 || oddSum < 4) { return {}; } int group = (12 - oddSum) / 2; int oddWidest = OUTSIDE_ODD_WIDEST[group]; int evenWidest = 9 - oddWidest; int vOdd = RSS::ReaderHelper::GetRSSvalue(oddCounts, oddWidest, false); int vEven = RSS::ReaderHelper::GetRSSvalue(evenCounts, evenWidest, true); int tEven = OUTSIDE_EVEN_TOTAL_SUBSET[group]; int gSum = OUTSIDE_GSUM[group]; return {vOdd * tEven + vEven + gSum, checksumPortion}; } else { if ((evenSum & 0x01) != 0 || evenSum > 10 || evenSum < 4) { return {}; } int group = (10 - evenSum) / 2; int oddWidest = INSIDE_ODD_WIDEST[group]; int evenWidest = 9 - oddWidest; int vOdd = RSS::ReaderHelper::GetRSSvalue(oddCounts, oddWidest, true); int vEven = RSS::ReaderHelper::GetRSSvalue(evenCounts, evenWidest, false); int tOdd = INSIDE_ODD_TOTAL_SUBSET[group]; int gSum = INSIDE_GSUM[group]; return {vEven * tOdd + vOdd + gSum, checksumPortion}; } } static RSS::Pair DecodePair(const BitArray& row, bool right, int rowNumber) { FinderCounters finderCounters = {}; auto range = FindFinderPattern(row, right, finderCounters); auto pattern = ParseFoundFinderPattern(row, rowNumber, right, range, finderCounters); if (pattern.isValid()) { auto outside = DecodeDataCharacter(row, pattern, true); if (outside.isValid()) { auto inside = DecodeDataCharacter(row, pattern, false); if (inside.isValid()) { return {1597 * outside.value() + inside.value(), outside.checksumPortion() + 4 * inside.checksumPortion(), pattern}; } } } return {}; } static void AddOrTally(std::list& possiblePairs, const RSS::Pair& pair) { if (!pair.isValid()) { return; } for (RSS::Pair& other : possiblePairs) { if (other == pair) { other.incrementCount(); return; } } // printf("found new pair\n"); fflush(stdout); possiblePairs.push_back(pair); } static bool CheckChecksum(const RSS::Pair& leftPair, const RSS::Pair& rightPair) { //int leftFPValue = leftPair.getFinderPattern().getValue(); //int rightFPValue = rightPair.getFinderPattern().getValue(); //if ((leftFPValue == 0 && rightFPValue == 8) || // (leftFPValue == 8 && rightFPValue == 0)) { //} int checkValue = (leftPair.checksumPortion() + 16 * rightPair.checksumPortion()) % 79; int targetCheckValue = 9 * leftPair.finderPattern().value() + rightPair.finderPattern().value(); if (targetCheckValue > 72) { targetCheckValue--; } if (targetCheckValue > 8) { targetCheckValue--; } return checkValue == targetCheckValue; } static Result ConstructResult(const RSS::Pair& leftPair, const RSS::Pair& rightPair) { int64_t symbolValue = 4537077 * static_cast(leftPair.value()) + rightPair.value(); std::wstringstream buffer; buffer << std::setw(13) << std::setfill(L'0') << symbolValue; int checkDigit = 0; for (int i = 0; i < 13; i++) { int digit = buffer.get() - '0'; checkDigit += (i & 0x01) == 0 ? 3 * digit : digit; } checkDigit = 10 - (checkDigit % 10); if (checkDigit == 10) { checkDigit = 0; } buffer.put((wchar_t)(checkDigit + '0')); auto& leftPoints = leftPair.finderPattern().points(); auto& rightPoints = rightPair.finderPattern().points(); return Result(buffer.str(), { leftPoints[0], leftPoints[1], rightPoints[0], rightPoints[1] }, BarcodeFormat::RSS_14); } Result RSS14Reader::decodeRow(int rowNumber, const BitArray& row_, std::unique_ptr& state) const { if (!state) { state.reset(new RSS14DecodingState); } auto* prevState = static_cast(state.get()); BitArray row = row_.copy(); AddOrTally(prevState->possibleLeftPairs, DecodePair(row, false, rowNumber)); row.reverse(); AddOrTally(prevState->possibleRightPairs, DecodePair(row, true, rowNumber)); // row.reverse(); // To be able to detect "stacked" RSS codes (split over multiple lines) // we need to store the parts we found and try all possible left/right // combinations. To prevent lots of false positives, we require each // pair to have been seen in at least two lines. for (const auto& left : prevState->possibleLeftPairs) { if (left.count() > 1) { for (const auto& right : prevState->possibleRightPairs) { if (right.count() > 1) { if (CheckChecksum(left, right)) { return ConstructResult(left, right); } } } } } return Result(DecodeStatus::NotFound); } } // OneD } // ZXing zxing-cpp-1.0.8+ds2/core/src/oned/ODRSS14Reader.h000066400000000000000000000017021361167020700211250ustar00rootroot00000000000000#pragma once /* * Copyright 2016 Nu-book Inc. * Copyright 2016 ZXing authors * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #include "ODRowReader.h" namespace ZXing { namespace OneD { /** * Decodes RSS-14, including truncated and stacked variants. See ISO/IEC 24724:2006. */ class RSS14Reader : public RowReader { public: Result decodeRow(int rowNumber, const BitArray& row, std::unique_ptr& state) const override; }; } // OneD } // ZXing zxing-cpp-1.0.8+ds2/core/src/oned/ODRSSExpandedReader.cpp000066400000000000000000000507221361167020700227720ustar00rootroot00000000000000/* * Copyright 2016 Nu-book Inc. * Copyright 2016 ZXing authors * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #include "ODRSSExpandedReader.h" #include "rss/ODRSSReaderHelper.h" #include "rss/ODRSSExpandedBinaryDecoder.h" #include "rss/ODRSSExpandedRow.h" #include "Result.h" #include "BitArray.h" #include "TextDecoder.h" #include "ZXConfig.h" #include #include #include #include #include #include namespace ZXing { namespace OneD { static const int SYMBOL_WIDEST[] = { 7, 5, 4, 3, 1 }; static const int EVEN_TOTAL_SUBSET[] = { 4, 20, 52, 104, 204 }; static const int GSUM[] = { 0, 348, 1388, 2948, 3988 }; static const std::array, 6> FINDER_PATTERNS = { 1,8,4,1, // A 3,6,4,1, // B 3,4,6,1, // C 3,2,8,1, // D 2,6,5,1, // E 2,2,9,1, // F }; static const std::array, 23> WEIGHTS = { 1, 3, 9, 27, 81, 32, 96, 77, 20, 60, 180, 118, 143, 7, 21, 63, 189, 145, 13, 39, 117, 140, 209, 205, 193, 157, 49, 147, 19, 57, 171, 91, 62, 186, 136, 197, 169, 85, 44, 132, 185, 133, 188, 142, 4, 12, 36, 108, 113, 128, 173, 97, 80, 29, 87, 50, 150, 28, 84, 41, 123, 158, 52, 156, 46, 138, 203, 187, 139, 206, 196, 166, 76, 17, 51, 153, 37, 111, 122, 155, 43, 129, 176, 106, 107, 110, 119, 146, 16, 48, 144, 10, 30, 90, 59, 177, 109, 116, 137, 200, 178, 112, 125, 164, 70, 210, 208, 202, 184, 130, 179, 115, 134, 191, 151, 31, 93, 68, 204, 190, 148, 22, 66, 198, 172, 94, 71, 2, 6, 18, 54, 162, 64, 192, 154, 40, 120, 149, 25, 75, 14, 42, 126, 167, 79, 26, 78, 23, 69, 207, 199, 175, 103, 98, 83, 38, 114, 131, 182, 124, 161, 61, 183, 127, 170, 88, 53, 159, 55, 165, 73, 8, 24, 72, 5, 15, 45, 135, 194, 160, 58, 174, 100, 89, }; static const int FINDER_PAT_A = 0; static const int FINDER_PAT_B = 1; static const int FINDER_PAT_C = 2; static const int FINDER_PAT_D = 3; static const int FINDER_PAT_E = 4; static const int FINDER_PAT_F = 5; static const std::array, 10> FINDER_PATTERN_SEQUENCES = { { { FINDER_PAT_A, FINDER_PAT_A }, { FINDER_PAT_A, FINDER_PAT_B, FINDER_PAT_B }, { FINDER_PAT_A, FINDER_PAT_C, FINDER_PAT_B, FINDER_PAT_D }, { FINDER_PAT_A, FINDER_PAT_E, FINDER_PAT_B, FINDER_PAT_D, FINDER_PAT_C }, { FINDER_PAT_A, FINDER_PAT_E, FINDER_PAT_B, FINDER_PAT_D, FINDER_PAT_D, FINDER_PAT_F }, { FINDER_PAT_A, FINDER_PAT_E, FINDER_PAT_B, FINDER_PAT_D, FINDER_PAT_E, FINDER_PAT_F, FINDER_PAT_F }, { FINDER_PAT_A, FINDER_PAT_A, FINDER_PAT_B, FINDER_PAT_B, FINDER_PAT_C, FINDER_PAT_C, FINDER_PAT_D, FINDER_PAT_D }, { FINDER_PAT_A, FINDER_PAT_A, FINDER_PAT_B, FINDER_PAT_B, FINDER_PAT_C, FINDER_PAT_C, FINDER_PAT_D, FINDER_PAT_E, FINDER_PAT_E }, { FINDER_PAT_A, FINDER_PAT_A, FINDER_PAT_B, FINDER_PAT_B, FINDER_PAT_C, FINDER_PAT_C, FINDER_PAT_D, FINDER_PAT_E, FINDER_PAT_F, FINDER_PAT_F }, { FINDER_PAT_A, FINDER_PAT_A, FINDER_PAT_B, FINDER_PAT_B, FINDER_PAT_C, FINDER_PAT_D, FINDER_PAT_D, FINDER_PAT_E, FINDER_PAT_E, FINDER_PAT_F, FINDER_PAT_F }, } }; struct RSSExpandedDecodingState : public RowReader::DecodingState { std::list rows; }; using namespace RSS; static BitArray::Range FindNextPair(const BitArray& row, const std::list& previousPairs, int forcedOffset, bool startFromEven, FinderCounters& counters) { int rowOffset; if (forcedOffset >= 0) { rowOffset = forcedOffset; } else if (previousPairs.empty()) { rowOffset = 0; } else { rowOffset = previousPairs.back().finderPattern().endPos(); } bool searchingEvenPair = previousPairs.size() % 2 != 0; if (startFromEven) { searchingEvenPair = !searchingEvenPair; } return RowReader::FindPattern( // find row.getNextSet(row.iterAt(rowOffset)), row.end(), counters, [searchingEvenPair](BitArray::Iterator, BitArray::Iterator, FinderCounters& counters) { if (ReaderHelper::IsFinderPatternExtended(counters, searchingEvenPair)) { if (searchingEvenPair) std::reverse(counters.begin(), counters.end()); return true; } return false; }); } static FinderPattern ParseFoundFinderPattern(const BitArray& row, int rowNumber, bool oddPattern, BitArray::Range range, FinderCounters& counters) { // Actually we found elements 2-5. int firstCounter; if (oddPattern) { // If pattern number is odd, we need to locate element 1 *before* the current block. auto i = std::find(BitArray::ReverseIterator(range.begin), row.rend(), *range.begin); firstCounter = static_cast(range.begin - i.base()); range.begin = i.base(); } else { // If pattern number is even, the pattern is reversed, so we need to locate element 1 *after* the current block. auto i = row.getNextUnset(std::next(range.end)); // +1? firstCounter = static_cast(i - range.end); range.end = i; } int start = static_cast(range.begin - row.begin()); int end = static_cast(range.end - row.begin()); // Make 'counters' hold 1-4 std::copy_backward(counters.begin(), counters.end() - 1, counters.end()); counters[0] = firstCounter; int value = ReaderHelper::ParseFinderValue(counters, FINDER_PATTERNS); if (value < 0) return {}; return {value, start, end, {ResultPoint(start, rowNumber), ResultPoint(end, rowNumber)}}; } static bool IsNotA1left(FinderPattern pattern, bool isOddPattern, bool leftChar) { // A1: pattern.getValue is 0 (A), and it's an oddPattern, and it is a left char return !(pattern.value() == 0 && isOddPattern && leftChar); } static bool AdjustOddEvenCounts(int numModules, std::array& oddCounts, std::array& evenCounts, const std::array& oddRoundingErrors, const std::array& evenRoundingErrors) { int oddSum = std::accumulate(oddCounts.begin(), oddCounts.end(), 0); int evenSum = std::accumulate(evenCounts.begin(), evenCounts.end(), 0); int mismatch = oddSum + evenSum - numModules; bool oddParityBad = (oddSum & 0x01) == 1; bool evenParityBad = (evenSum & 0x01) == 0; bool incrementOdd = false; bool decrementOdd = false; if (oddSum > 13) { decrementOdd = true; } else if (oddSum < 4) { incrementOdd = true; } bool incrementEven = false; bool decrementEven = false; if (evenSum > 13) { decrementEven = true; } else if (evenSum < 4) { incrementEven = true; } if (mismatch == 1) { if (oddParityBad) { if (evenParityBad) { return false; } decrementOdd = true; } else { if (!evenParityBad) { return false; } decrementEven = true; } } else if (mismatch == -1) { if (oddParityBad) { if (evenParityBad) { return false; } incrementOdd = true; } else { if (!evenParityBad) { return false; } incrementEven = true; } } else if (mismatch == 0) { if (oddParityBad) { if (!evenParityBad) { return false; } // Both bad if (oddSum < evenSum) { incrementOdd = true; decrementEven = true; } else { decrementOdd = true; incrementEven = true; } } else { if (evenParityBad) { return false; } // Nothing to do! } } else { return false; } if (incrementOdd) { if (decrementOdd) { return false; } oddCounts[std::max_element(oddRoundingErrors.begin(), oddRoundingErrors.end()) - oddRoundingErrors.begin()] += 1; } if (decrementOdd) { oddCounts[std::min_element(oddRoundingErrors.begin(), oddRoundingErrors.end()) - oddRoundingErrors.begin()] -= 1; } if (incrementEven) { if (decrementEven) { return false; } //evenCounts[std::max_element(oddRoundingErrors.begin(), oddRoundingErrors.end()) - oddRoundingErrors.begin()] += 1; // This is according to Java's code, but likely a bug! evenCounts[std::max_element(evenRoundingErrors.begin(), evenRoundingErrors.end()) - evenRoundingErrors.begin()] += 1; } if (decrementEven) { evenCounts[std::min_element(evenRoundingErrors.begin(), evenRoundingErrors.end()) - evenRoundingErrors.begin()] -= 1; } return true; } static DataCharacter DecodeDataCharacter(const BitArray& row, const FinderPattern& pattern, bool isOddPattern, bool leftChar) { std::array counters = {}; if (leftChar) { if (!RowReader::RecordPatternInReverse(row.begin(), row.iterAt(pattern.startPos()), counters)) return {}; } else { if (!RowReader::RecordPattern(row.iterAt(pattern.endPos()), row.end(), counters)) return {}; std::reverse(counters.begin(), counters.end()); } int numModules = 17; //left and right data characters have all the same length float elementWidth = static_cast(std::accumulate(counters.begin(), counters.end(), 0)) / static_cast(numModules); // Sanity check: element width for pattern and the character should match float expectedElementWidth = static_cast(pattern.endPos() - pattern.startPos()) / 15.0f; if (std::abs(elementWidth - expectedElementWidth) / expectedElementWidth > 0.3f) { return {}; } std::array oddCounts; std::array evenCounts; std::array oddRoundingErrors; std::array evenRoundingErrors; for (int i = 0; i < 8; i++) { float value = 1.0f * counters[i] / elementWidth; int count = (int)(value + 0.5f); // Round if (count < 1) { if (value < 0.3f) { return {}; } count = 1; } else if (count > 8) { if (value > 8.7f) { return {}; } count = 8; } int offset = i / 2; if ((i & 0x01) == 0) { oddCounts[offset] = count; oddRoundingErrors[offset] = value - count; } else { evenCounts[offset] = count; evenRoundingErrors[offset] = value - count; } } if (!AdjustOddEvenCounts(numModules, oddCounts, evenCounts, oddRoundingErrors, evenRoundingErrors)) { return {}; } int weightRowNumber = 4 * pattern.value() + (isOddPattern ? 0 : 2) + (leftChar ? 0 : 1) - 1; int oddSum = 0; int oddChecksumPortion = 0; for (int i = 3; i >= 0; i--) { if (IsNotA1left(pattern, isOddPattern, leftChar)) { int weight = WEIGHTS[weightRowNumber][2 * i]; oddChecksumPortion += oddCounts[i] * weight; } oddSum += oddCounts[i]; } int evenChecksumPortion = 0; //int evenSum = 0; for (int i = 3; i >= 0; i--) { if (IsNotA1left(pattern, isOddPattern, leftChar)) { int weight = WEIGHTS[weightRowNumber][2 * i + 1]; evenChecksumPortion += evenCounts[i] * weight; } //evenSum += evenCounts[i]; } int checksumPortion = oddChecksumPortion + evenChecksumPortion; if ((oddSum & 0x01) != 0 || oddSum > 13 || oddSum < 4) { return {}; } int group = (13 - oddSum) / 2; int oddWidest = SYMBOL_WIDEST[group]; int evenWidest = 9 - oddWidest; int vOdd = ReaderHelper::GetRSSvalue(oddCounts, oddWidest, true); int vEven = ReaderHelper::GetRSSvalue(evenCounts, evenWidest, false); int tEven = EVEN_TOTAL_SUBSET[group]; int gSum = GSUM[group]; int value = vOdd * tEven + vEven + gSum; return {value, checksumPortion}; } // not private for testing static bool RetrieveNextPair(const BitArray& row, const std::list& previousPairs, int rowNumber, bool startFromEven, ExpandedPair& outPair) { bool isOddPattern = previousPairs.size() % 2 == 0; if (startFromEven) { isOddPattern = !isOddPattern; } FinderPattern pattern; bool keepFinding = true; int forcedOffset = -1; do { FinderCounters counters = {}; auto range = FindNextPair(row, previousPairs, forcedOffset, startFromEven, counters); if (!range) return false; pattern = ParseFoundFinderPattern(row, rowNumber, isOddPattern, range, counters); if (!pattern.isValid()) { // goto next bar of same color than current position range.begin = row.getNextSetTo(range.begin, !*range.begin); range.begin = row.getNextSetTo(range.begin, !*range.begin); forcedOffset = static_cast(range.begin - row.begin()); } else { keepFinding = false; } } while (keepFinding); // When stacked symbol is split over multiple rows, there's no way to guess if this pair can be last or not. // boolean mayBeLast = checkPairSequence(previousPairs, pattern); DataCharacter leftChar = DecodeDataCharacter(row, pattern, isOddPattern, true); if (!leftChar.isValid() || (!previousPairs.empty() && previousPairs.back().mustBeLast())) { return false; } DataCharacter rightChar = DecodeDataCharacter(row, pattern, isOddPattern, false); bool mayBeLast = true; outPair = ExpandedPair(leftChar, rightChar, pattern, mayBeLast); return true; } static bool CheckChecksum(const std::list& myPairs) { if (myPairs.empty()) return false; auto& firstPair = myPairs.front(); if (firstPair.mustBeLast()) { return false; } int checksum = firstPair.rightChar().checksumPortion(); int s = 2; for (auto it = ++myPairs.begin(); it != myPairs.end(); ++it) { checksum += it->leftChar().checksumPortion(); s++; auto& currentRightChar = it->rightChar(); if (currentRightChar.isValid()) { checksum += currentRightChar.checksumPortion(); s++; } } checksum %= 211; int checkCharacterValue = 211 * (s - 4) + checksum; return checkCharacterValue == firstPair.leftChar().value(); } // Returns true when one of the rows already contains all the pairs static bool IsPartialRow(const std::list& pairs, const std::list& rows) { for (const ExpandedRow& r : rows) { bool allFound = true; for (const ExpandedPair& p : pairs) { bool found = false; for (const ExpandedPair& pp : r.pairs()) { if (p == pp) { found = true; break; } } if (!found) { allFound = false; break; } } if (allFound) { // the row 'r' contain all the pairs from 'pairs' return true; } } return false; } // Remove all the rows that contains only specified pairs static void RemovePartialRows(std::list& rows, const std::list& pairs) { auto it = rows.begin(); while (it != rows.end()) { //ExpandedRow r = iterator.next(); if (it->pairs().size() == pairs.size()) { ++it; continue; } bool allFound = true; for (const ExpandedPair& p : it->pairs()) { bool found = false; for (const ExpandedPair& pp : pairs) { if (p == pp) { found = true; break; } } if (!found) { allFound = false; break; } } if (allFound) { // 'pairs' contains all the pairs from the row 'r' auto remPos = it; ++it; rows.erase(remPos); } else { ++it; } } } static void StoreRow(std::list& rows, const std::list& pairs, int rowNumber, bool wasReversed) { // Discard if duplicate above or below; otherwise insert in order by row number. bool prevIsSame = false; bool nextIsSame = false; auto insertPos = rows.begin(); for (; insertPos != rows.end(); ++insertPos) { if (insertPos->rowNumber() > rowNumber) { nextIsSame = insertPos->isEquivalent(pairs); break; } prevIsSame = insertPos->isEquivalent(pairs); } if (nextIsSame || prevIsSame) { return; } // When the row was partially decoded (e.g. 2 pairs found instead of 3), // it will prevent us from detecting the barcode. // Try to merge partial rows // Check whether the row is part of an allready detected row if (IsPartialRow(pairs, rows)) { return; } rows.insert(insertPos, ExpandedRow(pairs, rowNumber, wasReversed)); RemovePartialRows(rows, pairs); } // Whether the pairs form a valid find pattern seqience, // either complete or a prefix static bool IsValidSequence(const std::list& pairs) { for (auto& sequence : FINDER_PATTERN_SEQUENCES) { if (pairs.size() <= sequence.size() && std::equal(pairs.begin(), pairs.end(), sequence.begin(), [](const ExpandedPair& p, int seq) { return p.finderPattern().value() == seq; })) { return true; } } return false; } // Try to construct a valid rows sequence // Recursion is used to implement backtracking template static std::list CheckRows(RowIterator currentRow, RowIterator endRow, const std::list& collectedRows) { std::list collectedPairs; for (const auto& collectedRow : collectedRows) { auto &p = collectedRow.pairs(); collectedPairs.insert(collectedPairs.end(), p.begin(), p.end()); } for (; currentRow != endRow; ++currentRow) { //ExpandedRow row = rows.get(i); std::list result = collectedPairs; auto &p = currentRow->pairs(); result.insert(result.end(), p.begin(), p.end()); if (!IsValidSequence(result)) { continue; } if (CheckChecksum(result)) { return result; } std::list rs = collectedRows; rs.push_back(*currentRow); auto nextRow = currentRow; result = CheckRows(++nextRow, endRow, rs); if (!result.empty()) { return result; } } return std::list(); } static std::list CheckRows(std::list& rows, bool reverse) { // Limit number of rows we are checking // We use recursive algorithm with pure complexity and don't want it to take forever // Stacked barcode can have up to 11 rows, so 25 seems reasonable enough if (rows.size() > 25) { rows.clear(); // We will never have a chance to get result, so clear it return std::list(); } return reverse ? CheckRows(rows.rbegin(), rows.rend(), std::list()) : CheckRows(rows.begin(), rows.end(), std::list()); } // Not private for testing static std::list DecodeRow2Pairs(int rowNumber, const BitArray& row, bool startFromEven, std::list& rows) { std::list pairs; ExpandedPair nextPair; while (RetrieveNextPair(row, pairs, rowNumber, startFromEven, nextPair)) { pairs.push_back(nextPair); } if (pairs.empty()) { return pairs; } // TODO: verify sequence of finder patterns as in checkPairSequence() if (CheckChecksum(pairs)) { return pairs; } bool tryStackedDecode = !rows.empty(); bool wasReversed = false; // TODO: deal with reversed rows StoreRow(rows, pairs, rowNumber, wasReversed); if (tryStackedDecode) { // When the image is 180-rotated, then rows are sorted in wrong direction. // Try twice with both the directions. auto ps = CheckRows(rows, false); if (!ps.empty()) { return ps; } ps = CheckRows(rows, true); if (!ps.empty()) { return ps; } } return std::list(); } /** * @author Pablo Orduña, University of Deusto (pablo.orduna@deusto.es) * @author Eduardo Castillejo, University of Deusto (eduardo.castillejo@deusto.es) */ static BitArray BuildBitArray(const std::list& pairs) { int charNumber = (static_cast(pairs.size()) * 2) - 1; if (pairs.back().mustBeLast()) { charNumber -= 1; } BitArray result(12 * charNumber); int accPos = 0; auto it = pairs.begin(); int firstValue = it->rightChar().value(); for (int i = 11; i >= 0; --i) { if ((firstValue & (1 << i)) != 0) { result.set(accPos); } accPos++; } for (++it; it != pairs.end(); ++it) { int leftValue = it->leftChar().value(); for (int j = 11; j >= 0; --j) { if ((leftValue & (1 << j)) != 0) { result.set(accPos); } accPos++; } if (it->rightChar().isValid()) { int rightValue = it->rightChar().value(); for (int j = 11; j >= 0; --j) { if ((rightValue & (1 << j)) != 0) { result.set(accPos); } accPos++; } } } return result; } // Not private for unit testing static Result ConstructResult(const std::list& pairs) { if (pairs.empty()) { return Result(DecodeStatus::NotFound); } BitArray binary = BuildBitArray(pairs); auto resultString = ExpandedBinaryDecoder::Decode(binary); if (resultString.empty()) { return Result(DecodeStatus::NotFound); } auto& firstPoints = pairs.front().finderPattern().points(); auto& lastPoints = pairs.back().finderPattern().points(); return Result(TextDecoder::FromLatin1(resultString), { firstPoints[0], firstPoints[1], lastPoints[0], lastPoints[1] }, BarcodeFormat::RSS_EXPANDED); } Result RSSExpandedReader::decodeRow(int rowNumber, const BitArray& row, std::unique_ptr& state) const { if (!state) { state.reset(new RSSExpandedDecodingState); } auto* prevState = static_cast(state.get()); // Rows can start with even pattern in case in prev rows there where odd number of patters. // So lets try twice Result r = ConstructResult(DecodeRow2Pairs(rowNumber, row, false, prevState->rows)); if (!r.isValid()) { r = ConstructResult(DecodeRow2Pairs(rowNumber, row, true, prevState->rows)); } return r; } } // OneD } // ZXing zxing-cpp-1.0.8+ds2/core/src/oned/ODRSSExpandedReader.h000066400000000000000000000020131361167020700224250ustar00rootroot00000000000000#pragma once /* * Copyright 2016 Nu-book Inc. * Copyright 2016 ZXing authors * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #include "ODRowReader.h" namespace ZXing { namespace OneD { /** * @author Pablo Orduña, University of Deusto(pablo.orduna@deusto.es) * @author Eduardo Castillejo, University of Deusto(eduardo.castillejo@deusto.es) */ class RSSExpandedReader : public RowReader { public: Result decodeRow(int rowNumber, const BitArray& row, std::unique_ptr& state) const override; }; } // OneD } // ZXing zxing-cpp-1.0.8+ds2/core/src/oned/ODReader.cpp000066400000000000000000000150151361167020700207250ustar00rootroot00000000000000/* * Copyright 2016 Nu-book Inc. * Copyright 2016 ZXing authors * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #include "ODReader.h" #include "ODMultiUPCEANReader.h" #include "ODCode39Reader.h" #include "ODCode93Reader.h" #include "ODCode128Reader.h" #include "ODITFReader.h" #include "ODCodabarReader.h" #include "ODRSS14Reader.h" #include "ODRSSExpandedReader.h" #include "Result.h" #include "BitArray.h" #include "BinaryBitmap.h" #include "DecodeHints.h" #include namespace ZXing { namespace OneD { Reader::Reader(const DecodeHints& hints) : _tryHarder(hints.tryHarder()), _tryRotate(hints.tryRotate()) { _readers.reserve(8); if (hints.hasNoFormat()) { _readers.emplace_back(new MultiUPCEANReader(hints)); _readers.emplace_back(new Code39Reader(hints)); _readers.emplace_back(new CodabarReader(hints)); _readers.emplace_back(new Code93Reader()); _readers.emplace_back(new Code128Reader(hints)); _readers.emplace_back(new ITFReader(hints)); _readers.emplace_back(new RSS14Reader()); _readers.emplace_back(new RSSExpandedReader()); } else { if (hints.hasFormat(BarcodeFormat::EAN_13) || hints.hasFormat(BarcodeFormat::UPC_A) || hints.hasFormat(BarcodeFormat::EAN_8) || hints.hasFormat(BarcodeFormat::UPC_E)) { _readers.emplace_back(new MultiUPCEANReader(hints)); } if (hints.hasFormat(BarcodeFormat::CODE_39)) { _readers.emplace_back(new Code39Reader(hints)); } if (hints.hasFormat(BarcodeFormat::CODE_93)) { _readers.emplace_back(new Code93Reader()); } if (hints.hasFormat(BarcodeFormat::CODE_128)) { _readers.emplace_back(new Code128Reader(hints)); } if (hints.hasFormat(BarcodeFormat::ITF)) { _readers.emplace_back(new ITFReader(hints)); } if (hints.hasFormat(BarcodeFormat::CODABAR)) { _readers.emplace_back(new CodabarReader(hints)); } if (hints.hasFormat(BarcodeFormat::RSS_14)) { _readers.emplace_back(new RSS14Reader()); } if (hints.hasFormat(BarcodeFormat::RSS_EXPANDED)) { _readers.emplace_back(new RSSExpandedReader()); } } } Reader::~Reader() = default; /** * We're going to examine rows from the middle outward, searching alternately above and below the * middle, and farther out each time. rowStep is the number of rows between each successive * attempt above and below the middle. So we'd scan row middle, then middle - rowStep, then * middle + rowStep, then middle - (2 * rowStep), etc. * rowStep is bigger as the image is taller, but is always at least 1. We've somewhat arbitrarily * decided that moving up and down by about 1/16 of the image is pretty good; we try more of the * image if "trying harder". * * @param image The image to decode * @param hints Any hints that were requested * @return The contents of the decoded barcode * @throws NotFoundException Any spontaneous errors which occur */ static Result DoDecode(const std::vector>& readers, const BinaryBitmap& image, bool tryHarder) { std::vector> decodingState(readers.size()); int width = image.width(); int height = image.height(); int middle = height >> 1; int rowStep = std::max(1, height >> (tryHarder ? 8 : 5)); int maxLines = tryHarder ? height : // Look at the whole image, not just the center 15; // 15 rows spaced 1/32 apart is roughly the middle half of the image BitArray row(width); for (int x = 0; x < maxLines; x++) { // Scanning from the middle out. Determine which row we're looking at next: int rowStepsAboveOrBelow = (x + 1) / 2; bool isAbove = (x & 0x01) == 0; // i.e. is x even? int rowNumber = middle + rowStep * (isAbove ? rowStepsAboveOrBelow : -rowStepsAboveOrBelow); if (rowNumber < 0 || rowNumber >= height) { // Oops, if we run off the top or bottom, stop break; } // Estimate black point for this row and load it: if (!image.getBlackRow(rowNumber, row)) { continue; } // While we have the image data in a BitArray, it's fairly cheap to reverse it in place to // handle decoding upside down barcodes. // Note: the RSSExpanded decoder depends on seeing each line from both directions. This // 'surprising' and inconsistent. It also requires the decoderState to be shared between // normal and reversed scans, which makes no sense in general because it would mix partial // detetection data from two codes of the same type next to each other. TODO.. // See also https://github.com/nu-book/zxing-cpp/issues/87 for (bool upsideDown : {false, true}) { // trying again? if (upsideDown) { // reverse the row and continue row.reverse(); } // Look for a barcode for (size_t r = 0; r < readers.size(); ++r) { Result result = readers[r]->decodeRow(rowNumber, row, decodingState[r]); if (result.isValid()) { // We found our barcode if (upsideDown) { // But it was upside down, so note that result.metadata().put(ResultMetadata::ORIENTATION, 180); // And remember to flip the result points horizontally. auto points = result.resultPoints(); for (auto& p : points) { p.set(width - p.x() - 1, p.y()); } result.setResultPoints(std::move(points)); } return result; } } } } return Result(DecodeStatus::NotFound); } // Note that we don't try rotation without the try harder flag, even if rotation was supported. Result Reader::decode(const BinaryBitmap& image) const { Result result = DoDecode(_readers, image, _tryHarder); if (result.isValid()) { return result; } if (_tryRotate && image.canRotate()) { auto rotatedImage = image.rotated(270); result = DoDecode(_readers, *rotatedImage, _tryHarder); if (result.isValid()) { // Record that we found it rotated 90 degrees CCW / 270 degrees CW auto& metadata = result.metadata(); metadata.put(ResultMetadata::ORIENTATION, (270 + metadata.getInt(ResultMetadata::ORIENTATION)) % 360); // Update result points auto points = result.resultPoints(); int height = rotatedImage->height(); for (auto& p : points) { p.set(height - p.y() - 1, p.x()); } result.setResultPoints(std::move(points)); } } return result; } } // OneD } // ZXing zxing-cpp-1.0.8+ds2/core/src/oned/ODReader.h000066400000000000000000000023251361167020700203720ustar00rootroot00000000000000#pragma once /* * Copyright 2016 Nu-book Inc. * Copyright 2016 ZXing authors * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #include "Reader.h" #include #include namespace ZXing { enum class BarcodeFormat; class DecodeHints; namespace OneD { class RowReader; /** * @author dswitkin@google.com (Daniel Switkin) * @author Sean Owen */ class Reader : public ZXing::Reader { public: // Only POSSIBLE_FORMATS is read here, and the same hint is ignored in decode(). explicit Reader(const DecodeHints& hints); ~Reader() override; Result decode(const BinaryBitmap& image) const override; private: std::vector> _readers; bool _tryHarder; bool _tryRotate; }; } // OneD } // ZXing zxing-cpp-1.0.8+ds2/core/src/oned/ODRowReader.cpp000066400000000000000000000044121361167020700214140ustar00rootroot00000000000000/* * Copyright 2016 Nu-book Inc. * Copyright 2016 ZXing authors * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #include "ODRowReader.h" #include "Result.h" #include "BitArray.h" #include #include #include namespace ZXing { namespace OneD { Result RowReader::decodeSingleRow(int rowNumber, const BitArray& row) const { std::unique_ptr state; return decodeRow(rowNumber, row, state); } /** * Determines how closely a set of observed counts of runs of black/white values matches a given * target pattern. This is reported as the ratio of the total variance from the expected pattern * proportions across all pattern elements, to the length of the pattern. * * @param counters observed counters * @param pattern expected pattern * @param maxIndividualVariance The most any counter can differ before we give up * @return ratio of total variance between counters and pattern compared to total pattern size */ float RowReader::PatternMatchVariance(const int *counters, const int* pattern, size_t length, float maxIndividualVariance) { int total = std::accumulate(counters, counters+length, 0); int patternLength = std::accumulate(pattern, pattern+length, 0); if (total < patternLength) { // If we don't even have one pixel per unit of bar width, assume this is too small // to reliably match, so fail: return std::numeric_limits::max(); } float unitBarWidth = (float)total / patternLength; maxIndividualVariance *= unitBarWidth; float totalVariance = 0.0f; for (size_t x = 0; x < length; ++x) { float variance = std::abs(counters[x] - pattern[x] * unitBarWidth); if (variance > maxIndividualVariance) { return std::numeric_limits::max(); } totalVariance += variance; } return totalVariance / total; } } // OneD } // ZXing zxing-cpp-1.0.8+ds2/core/src/oned/ODRowReader.h000066400000000000000000000160471361167020700210700ustar00rootroot00000000000000#pragma once /* * Copyright 2016 Nu-book Inc. * Copyright 2016 ZXing authors * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #include "BitArray.h" #include "DecodeStatus.h" #include #include #include namespace ZXing { class Result; namespace OneD { /** * Encapsulates functionality and implementation that is common to all families * of one-dimensional barcodes. * * @author dswitkin@google.com (Daniel Switkin) * @author Sean Owen */ class RowReader { public: struct DecodingState { virtual ~DecodingState() = default; }; Result decodeSingleRow(int rowNumber, const BitArray& row) const; virtual ~RowReader() {} /** *

Attempts to decode a one-dimensional barcode format given a single row of * an image.

* * @param rowNumber row number from top of the row * @param row the black/white pixel data of the row * @param hints decode hints * @return {@link Result} containing encoded string and start/end of barcode * @throws NotFoundException if no potential barcode is found * @throws ChecksumException if a potential barcode is found but does not pass its checksum * @throws FormatException if a potential barcode is found but format is invalid */ virtual Result decodeRow(int rowNumber, const BitArray& row, std::unique_ptr& state) const = 0; /** * Scans the given bit range for a pattern identified by evaluating the function object match for each * successive run of counters.size() bars. If the pattern is found, it returns the bit range with the * pattern. Otherwise an empty range is returned. * * @param begin/end bit range to scan for pattern * @param counters array into which to record counts * @param match predicate that gets evaluated to identify the pattern * @throws NotFoundException if counters cannot be filled entirely from row before running out * of pixels */ template static Range FindPattern(Iterator begin, Iterator end, Container& counters, Predicate match) { if (begin == end) return {end, end}; Iterator li = begin, i = begin; auto currentCounter = counters.begin(); typedef typename std::decay::type CounterValue; while ((i = BitArray::getNextSetTo(i, end, !*i)) != end) { *currentCounter = static_cast(i - li); if (++currentCounter == counters.end()) { if (match(begin, i, counters)) { return {begin, i}; } std::advance(begin, counters[0] + counters[1]); std::copy(counters.begin() + 2, counters.end(), counters.begin()); std::advance(currentCounter, -2); } li = i; } // if we ran into the end, still set the currentCounter. see RecordPattern. *currentCounter = static_cast(i - li); return {end, end}; } /** * Records the size of successive runs of white and black pixels in a row, starting at a given point. * The values are recorded in the given array, and the number of runs recorded is equal to the size * of the array. If the row starts on a white pixel at the given start point, then the first count * recorded is the run of white pixels starting from that point; likewise it is the count of a run * of black pixels if the row begin on a black pixels at that point. * * @param row row to count from * @param start offset into row to start at * @param counters array into which to record counts * @throws NotFoundException if counters cannot be filled entirely from row before running out * of pixels */ template static Range RecordPattern(Iterator begin, Iterator end, Container& counters) { // mark the last counter-slot as empty counters.back() = 0; auto range = FindPattern(begin, end, counters, [](Iterator, Iterator, Container&) { return true; }); // If we reached the end iterator but touched the last counter-slot, we accept the result. if (range.end == end && counters.back() != 0) return {begin, end}; else return range; } template static Range RecordPatternInReverse(Iterator begin, Iterator end, Container& counters) { std::reverse_iterator rbegin(end), rend(begin); auto range = RecordPattern(rbegin, rend, counters); std::reverse(counters.begin(), counters.end()); return {range.end.base(), range.begin.base()}; } /** * Determines how closely a set of observed counts of runs of black/white values matches a given * target pattern. This is reported as the ratio of the total variance from the expected pattern * proportions across all pattern elements, to the length of the pattern. * * @param counters observed counters * @param pattern expected pattern * @param maxIndividualVariance The most any counter can differ before we give up * @return ratio of total variance between counters and pattern compared to total pattern size */ template static float PatternMatchVariance(const Container& counters, const Container& pattern, float maxIndividualVariance) { assert(counters.size() <= pattern.size()); //TODO: this should test for equality, see ODCode128Reader.cpp:93 return PatternMatchVariance(counters.data(), pattern.data(), counters.size(), maxIndividualVariance); } /** * Attempts to decode a sequence of black/white lines into single * digit. * * @param counters the counts of runs of observed black/white/black/... values * @param patterns the list of patterns to compare the contens of counters to * @param requireUnambiguousMatch the 'best match' must be better than all other matches * @return The decoded digit index, -1 if no pattern matched */ template static int DecodeDigit(const Counters& counters, const Patterns& patterns, float maxAvgVariance, float maxIndividualVariance, bool requireUnambiguousMatch = true) { float bestVariance = maxAvgVariance; // worst variance we'll accept constexpr int INVALID_MATCH = -1; int bestMatch = INVALID_MATCH; for (size_t i = 0; i < patterns.size(); i++) { float variance = PatternMatchVariance(counters, patterns[i], maxIndividualVariance); if (variance < bestVariance) { bestVariance = variance; bestMatch = static_cast(i); } else if (requireUnambiguousMatch && variance == bestVariance) { // if we find a second 'best match' with the same variance, we can not reliably report to have a suitable match bestMatch = INVALID_MATCH; } } return bestMatch; } public: static float PatternMatchVariance(const int *counters, const int* pattern, size_t length, float maxIndividualVariance); }; } // OneD } // ZXing zxing-cpp-1.0.8+ds2/core/src/oned/ODUPCAReader.cpp000066400000000000000000000031431361167020700213750ustar00rootroot00000000000000/* * Copyright 2016 Nu-book Inc. * Copyright 2016 ZXing authors * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #include "ODUPCAReader.h" #include "Result.h" namespace ZXing { namespace OneD { static Result MaybeReturnResult(Result&& result) { const std::wstring& text = result.text(); if (!text.empty() && text[0] == '0') { result.setText(text.substr(1)); result.setFormat(BarcodeFormat::UPC_A); return result; } else { return Result(DecodeStatus::FormatError); } } Result UPCAReader::decodeRow(int rowNumber, const BitArray& row, std::unique_ptr& state) const { return MaybeReturnResult(_reader.decodeRow(rowNumber, row, state)); } Result UPCAReader::decodeRow(int rowNumber, const BitArray& row, BitArray::Range startGuard) const { return MaybeReturnResult(_reader.decodeRow(rowNumber, row, startGuard)); } BarcodeFormat UPCAReader::expectedFormat() const { return BarcodeFormat::UPC_A; } BitArray::Range UPCAReader::decodeMiddle(const BitArray& row, BitArray::Iterator begin, std::string& resultString) const { return _reader.decodeMiddle(row, begin, resultString); } } // OneD } // ZXing zxing-cpp-1.0.8+ds2/core/src/oned/ODUPCAReader.h000066400000000000000000000025701361167020700210450ustar00rootroot00000000000000#pragma once /* * Copyright 2016 Nu-book Inc. * Copyright 2016 ZXing authors * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #include "ODEAN13Reader.h" namespace ZXing { namespace OneD { /** *

Implements decoding of the UPC-A format.

* * @author dswitkin@google.com (Daniel Switkin) * @author Sean Owen */ class UPCAReader : public UPCEANReader { public: explicit UPCAReader(const DecodeHints& hints) : UPCEANReader(hints), _reader(hints) {} Result decodeRow(int rowNumber, const BitArray& row, std::unique_ptr& state) const override; Result decodeRow(int rowNumber, const BitArray& row, BitArray::Range startGuard) const override; protected: BarcodeFormat expectedFormat() const override; BitArray::Range decodeMiddle(const BitArray& row, BitArray::Iterator begin, std::string& resultString) const override; private: EAN13Reader _reader; }; } // OneD } // ZXing zxing-cpp-1.0.8+ds2/core/src/oned/ODUPCAWriter.cpp000066400000000000000000000023121361167020700214440ustar00rootroot00000000000000/* * Copyright 2016 Huy Cuong Nguyen * Copyright 2016 ZXing authors * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #include "BitMatrix.h" #include "ODUPCAWriter.h" #include "ODEAN13Writer.h" #include namespace ZXing { namespace OneD { BitMatrix UPCAWriter::encode(const std::wstring& contents, int width, int height) const { // Transform a UPC-A code into the equivalent EAN-13 code, and add a check digit if it is not already present. size_t length = contents.length(); if (length != 11 && length != 12) { throw std::invalid_argument("Requested contents should be 11 or 12 digits long"); } return EAN13Writer().setMargin(_sidesMargin).encode(L'0' + contents, width, height); } } // OneD } // ZXing zxing-cpp-1.0.8+ds2/core/src/oned/ODUPCAWriter.h000066400000000000000000000020551361167020700211150ustar00rootroot00000000000000#pragma once /* * Copyright 2016 Huy Cuong Nguyen * Copyright 2016 ZXing authors * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #include namespace ZXing { class BitMatrix; namespace OneD { /** * This object renders a UPC-A code as a {@link BitMatrix}. * * @author qwandor@google.com (Andrew Walbran) */ class UPCAWriter { public: UPCAWriter& setMargin(int sidesMargin) { _sidesMargin = sidesMargin; return *this; } BitMatrix encode(const std::wstring& contents, int width, int height) const; private: int _sidesMargin = -1; }; } // OneD } // ZXing zxing-cpp-1.0.8+ds2/core/src/oned/ODUPCEANCommon.cpp000066400000000000000000000054071361167020700216530ustar00rootroot00000000000000/* * Copyright 2016 Huy Cuong Nguyen * Copyright 2016 ZXing authors * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #include "ODUPCEANCommon.h" namespace ZXing { namespace OneD { const std::array UPCEANCommon::START_END_PATTERN = { 1, 1, 1 }; const std::array UPCEANCommon::MIDDLE_PATTERN = { 1, 1, 1, 1, 1 }; const std::array UPCEANCommon::UPCE_END_PATTERN = { 1, 1, 1, 1, 1, 1 }; const std::array, 10> UPCEANCommon::L_PATTERNS = { 3, 2, 1, 1, // 0 2, 2, 2, 1, // 1 2, 1, 2, 2, // 2 1, 4, 1, 1, // 3 1, 1, 3, 2, // 4 1, 2, 3, 1, // 5 1, 1, 1, 4, // 6 1, 3, 1, 2, // 7 1, 2, 1, 3, // 8 3, 1, 1, 2, // 9 }; const std::array, 20> UPCEANCommon::L_AND_G_PATTERNS = { 3, 2, 1, 1, // 0 2, 2, 2, 1, // 1 2, 1, 2, 2, // 2 1, 4, 1, 1, // 3 1, 1, 3, 2, // 4 1, 2, 3, 1, // 5 1, 1, 1, 4, // 6 1, 3, 1, 2, // 7 1, 2, 1, 3, // 8 3, 1, 1, 2, // 9 // reversed 1, 1, 2, 3, // 10 1, 2, 2, 2, // 11 2, 2, 1, 2, // 12 1, 1, 4, 1, // 13 2, 3, 1, 1, // 14 1, 3, 2, 1, // 15 4, 1, 1, 1, // 16 2, 1, 3, 1, // 17 3, 1, 2, 1, // 18 2, 1, 1, 3, // 19 }; // For an UPC-E barcode, the final digit is represented by the parities used // to encode the middle six digits, according to the table below. // // Parity of next 6 digits // Digit 0 1 2 3 4 5 // 0 Even Even Even Odd Odd Odd // 1 Even Even Odd Even Odd Odd // 2 Even Even Odd Odd Even Odd // 3 Even Even Odd Odd Odd Even // 4 Even Odd Even Even Odd Odd // 5 Even Odd Odd Even Even Odd // 6 Even Odd Odd Odd Even Even // 7 Even Odd Even Odd Even Odd // 8 Even Odd Even Odd Odd Even // 9 Even Odd Odd Even Odd Even // // The encoding is represented by the following array, which is a bit pattern // using Odd = 0 and Even = 1. For example, 5 is represented by: // // Odd Even Even Odd Odd Even // in binary: // 0 1 1 0 0 1 == 0x19 // const std::array UPCEANCommon::NUMSYS_AND_CHECK_DIGIT_PATTERNS = { 0x38, 0x34, 0x32, 0x31, 0x2C, 0x26, 0x23, 0x2A, 0x29, 0x25, 0x07, 0x0B, 0x0D, 0x0E, 0x13, 0x19, 0x1C, 0x15, 0x16, 0x1A, }; } // OneD } // ZXing zxing-cpp-1.0.8+ds2/core/src/oned/ODUPCEANCommon.h000066400000000000000000000076051361167020700213220ustar00rootroot00000000000000#pragma once /* * Copyright 2016 Huy Cuong Nguyen * Copyright 2016 ZXing authors * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #include "ODUPCEANReader.h" #include namespace ZXing { namespace OneD { class UPCEANCommon { public: /** * Start/end guard pattern. */ static const std::array START_END_PATTERN; /** * "Odd", or "L" patterns used to encode UPC/EAN digits. */ static const std::array L_PATTERNS; /** * Pattern marking the middle of a UPC/EAN pattern, separating the two halves. */ static const std::array MIDDLE_PATTERN; /** * As above but also including the "even", or "G" patterns used to encode UPC/EAN digits. */ static const std::array L_AND_G_PATTERNS; /** * UPCE end guard pattern (== MIDDLE_PATTERN + single module black bar) */ static const std::array UPCE_END_PATTERN; /** * See {@link #L_AND_G_PATTERNS}; these values similarly represent patterns of * even-odd parity encodings of digits that imply both the number system (0 or 1) * used (index / 10), and the check digit (index % 10). */ static const std::array NUMSYS_AND_CHECK_DIGIT_PATTERNS; template static int ComputeChecksum(const std::basic_string& digits, bool skipTail = false) { int sum = 0, N = static_cast(digits.size()); for (int i = N - 1 - skipTail; i >= 0; i -= 2) { sum += digits[i] - '0'; } sum *= 3; for (int i = N - 2 - skipTail; i >= 0; i -= 2) { sum += digits[i] - '0'; } return (10 - (sum % 10)) % 10; } template static std::array DigitString2IntArray(const std::basic_string& in, int checksum = -1) { static_assert(N == 8 || N == 13, "invalid UPC/EAN length"); if (in.size() != N && in.size() != N-1) throw std::invalid_argument("Invalid input string length"); std::array out = {}; for (size_t i = 0; i < in.size(); ++i) { out[i] = in[i] - '0'; if (out[i] < 0 || out[i] > 9) throw std::invalid_argument("Contents must contain only digits: 0-9"); } if (checksum == -1) checksum = ComputeChecksum(in, N == in.size()); if (in.size() == N-1) out.back() = checksum; else if (out.back() != checksum) throw std::invalid_argument("Checksum error"); return out; } /** * Expands a UPC-E value back into its full, equivalent UPC-A code value. * * @param upce UPC-E code as string of digits * @return equivalent UPC-A code as string of digits */ template static StringT ConvertUPCEtoUPCA(const StringT& upce) { if (upce.length() < 7) return upce; auto upceChars = upce.substr(1, 6); StringT result; result.reserve(12); result += upce[0]; auto lastChar = upceChars[5]; switch (lastChar) { case '0': case '1': case '2': result += upceChars.substr(0, 2); result += lastChar; result += StringT(4, '0'); result += upceChars.substr(2, 3); break; case '3': result += upceChars.substr(0, 3); result += StringT(5, '0'); result += upceChars.substr(3, 2); break; case '4': result += upceChars.substr(0, 4); result += StringT(5, '0');; result += upceChars[4]; break; default: result += upceChars.substr(0, 5); result += StringT(4, '0'); result += lastChar; break; } // Only append check digit in conversion if supplied if (upce.length() >= 8) { result += upce[7]; } return result; } }; } // OneD } // ZXing zxing-cpp-1.0.8+ds2/core/src/oned/ODUPCEANExtensionSupport.cpp000066400000000000000000000101111361167020700237600ustar00rootroot00000000000000/* * Copyright 2016 Nu-book Inc. * Copyright 2016 ZXing authors * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #include "ODUPCEANExtensionSupport.h" #include "ODUPCEANReader.h" #include "ODUPCEANCommon.h" #include "Result.h" #include "BitArray.h" #include "TextDecoder.h" #include "ZXContainerAlgorithms.h" #include "ZXStrConvWorkaround.h" #include #include #include namespace ZXing { namespace OneD { namespace UPCEANExtension5Support { static int ExtensionChecksum(const std::string& s) { int length = static_cast(s.length()); int sum = 0; for (int i = length - 2; i >= 0; i -= 2) { sum += (int)s[i] - (int) '0'; } sum *= 3; for (int i = length - 1; i >= 0; i -= 2) { sum += (int)s[i] - (int) '0'; } sum *= 3; return sum % 10; } static std::string ParseExtension5String(const std::string& raw) { std::string currency; switch (raw.front()) { case '0': case '1': currency = "\xa3"; break; case '3': // AUS case '4': // NZ case '5': // US case '6': // CA currency = "$"; break; case '9': // Reference: http://www.jollytech.com if (raw == "90000") { // No suggested retail price return std::string(); } if (raw == "99991") { // Complementary return "0.00"; } if (raw == "99990") { return "Used"; } // Otherwise... unknown currency? currency = ""; break; default: currency = ""; break; } int rawAmount = std::stoi(raw.substr(1)); std::stringstream buf; buf << currency << std::fixed << std::setprecision(2) << (float(rawAmount) / 100); return buf.str(); } } // UPCEANExtension5Support static std::string DecodeMiddle(BitArray::Range* next_, int N) { assert(N == 2 || N == 5); int lgPatternFound = 0; auto next = *next_; std::string resultString; for (int x = 0; x < N; x++) { int bestMatch = UPCEANReader::DecodeDigit(&next, UPCEANCommon::L_AND_G_PATTERNS, &resultString); if (bestMatch == -1) return {}; // Read off separator if not last if (x != N - 1 && !UPCEANReader::ReadGuardPattern(&next, std::array{1, 1})) return {}; if (bestMatch >= 10) lgPatternFound |= 1 << (N - 1 - x); } if (N == 2) { if (std::stoi(resultString) % 4 != lgPatternFound) return {}; } else { constexpr int CHECK_DIGIT_ENCODINGS[] = {0x18, 0x14, 0x12, 0x11, 0x0C, 0x06, 0x03, 0x0A, 0x09, 0x05}; if (UPCEANExtension5Support::ExtensionChecksum(resultString) != IndexOf(CHECK_DIGIT_ENCODINGS, lgPatternFound)) return {}; } *next_ = next; return resultString; } static const std::array EXTENSION_START_PATTERN = { 1,1,2 }; Result UPCEANExtensionSupport::DecodeRow(int rowNumber, const BitArray& row, BitArray::Iterator begin) { BitArray::Range next = {row.getNextSet(begin), row.end()}; int xStart = static_cast(next.begin - row.begin()); if (!UPCEANReader::ReadGuardPattern(&next, EXTENSION_START_PATTERN)) return Result(DecodeStatus::NotFound); auto resultString = DecodeMiddle(&next, 5); if (resultString.empty()) resultString = DecodeMiddle(&next, 2); if (resultString.empty()) return Result(DecodeStatus::NotFound); int xStop = static_cast(next.begin - row.begin() - 1); Result result(resultString, rowNumber, xStart, xStop, BarcodeFormat::UPC_EAN_EXTENSION); if (resultString.size() == 2) { result.metadata().put(ResultMetadata::ISSUE_NUMBER, std::stoi(resultString)); } else { std::string price = UPCEANExtension5Support::ParseExtension5String(resultString); if (!price.empty()) result.metadata().put(ResultMetadata::SUGGESTED_PRICE, TextDecoder::FromLatin1(price)); } return result; } } // OneD } // ZXing zxing-cpp-1.0.8+ds2/core/src/oned/ODUPCEANExtensionSupport.h000066400000000000000000000015301361167020700234320ustar00rootroot00000000000000#pragma once /* * Copyright 2016 Nu-book Inc. * Copyright 2016 ZXing authors * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #include "BitArray.h" namespace ZXing { class Result; namespace OneD { class UPCEANExtensionSupport { public: static Result DecodeRow(int rowNumber, const BitArray& row, BitArray::Iterator begin); }; } // OneD } // ZXing zxing-cpp-1.0.8+ds2/core/src/oned/ODUPCEANReader.cpp000066400000000000000000000127021361167020700216210ustar00rootroot00000000000000/* * Copyright 2016 Nu-book Inc. * Copyright 2016 ZXing authors * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #include "ODUPCEANReader.h" #include "ODUPCEANExtensionSupport.h" #include "ODEANManufacturerOrgSupport.h" #include "ODUPCEANCommon.h" #include "Result.h" #include "BitArray.h" #include "DecodeHints.h" #include "TextDecoder.h" #include "ZXContainerAlgorithms.h" #include namespace ZXing { namespace OneD { UPCEANReader::UPCEANReader(const DecodeHints& hints) : _allowedExtensions(hints.allowedEanExtensions()) { } BitArray::Range UPCEANReader::FindStartGuardPattern(const BitArray& row) { #if 0 // this is the way the upstream JAVA project implemented it: scan for a // pattern 111 and look for a quite-zone of 3 after the fact. If there is no // quite zone, then skip the whole pattern und start over. This fails to identify // the valid start guard given the input: 49333... (falsepositives-2/14.png // line 471) BitArray::Range range{row.begin(), row.begin()}; while(range.end != row.end()) { range = FindGuardPattern(row, range.end, false, UPCEANCommon::START_END_PATTERN.data(), UPCEANCommon::START_END_PATTERN.size()); // Make sure there is a quiet zone at least as big as the start pattern before the barcode. // If this check would run off the left edge of the image, do not accept this barcode, // as it is very likely to be a false positive. if (row.hasQuiteZone(range.begin, -range.size(), false)) return range; } return {row.end(), row.end()}; #else // this is the 'right' way to do it: scan for a pattern of the form 3111, where 3 is the quitezone const auto& pattern = UPCEANCommon::START_END_PATTERN; using Counters = std::decay::type; Counters counters{}; return RowReader::FindPattern( row.getNextSet(row.begin()), row.end(), counters, [&row, &pattern](BitArray::Iterator begin, BitArray::Iterator end, const Counters& cntrs) { // Make sure there is a quiet zone at least as big as the start pattern before the barcode. // If this check would run off the left edge of the image, do not accept this barcode, // as it is very likely to be a false positive. return row.hasQuiteZone(begin, static_cast(-(end-begin)), false) && RowReader::PatternMatchVariance(cntrs, pattern, MAX_INDIVIDUAL_VARIANCE) < MAX_AVG_VARIANCE; }); #endif } Result UPCEANReader::decodeRow(int rowNumber, const BitArray& row, std::unique_ptr&) const { auto range = FindStartGuardPattern(row); if (!range) return Result(DecodeStatus::NotFound); return decodeRow(rowNumber, row, range); } BitArray::Range UPCEANReader::decodeEnd(const BitArray& row, BitArray::Iterator begin) const { BitArray::Range next = {begin, row.end()}; ReadGuardPattern(&next, UPCEANCommon::START_END_PATTERN); return {begin, next.begin}; } Result UPCEANReader::decodeRow(int rowNumber, const BitArray& row, BitArray::Range startGuard) const { std::string result; result.reserve(20); auto range = decodeMiddle(row, startGuard.end, result); if (!range) return Result(DecodeStatus::NotFound); auto stopGuard = decodeEnd(row, range.end); if (!stopGuard) return Result(DecodeStatus::NotFound); // Make sure there is a quiet zone at least as big as the end pattern after the barcode. The // spec might want more whitespace, but in practice this is the maximum we can count on. if (!row.hasQuiteZone(stopGuard.end, stopGuard.size(), false)) return Result(DecodeStatus::NotFound); if (!checkChecksum(result)) return Result(DecodeStatus::ChecksumError); BarcodeFormat format = expectedFormat(); int xStart = static_cast(startGuard.begin - row.begin()); int xStop = static_cast(stopGuard.end - row.begin() - 1); Result decodeResult(result, rowNumber, xStart, xStop, format); Result extensionResult = UPCEANExtensionSupport::DecodeRow(rowNumber, row, stopGuard.end); if (extensionResult.isValid()) { decodeResult.metadata().put(ResultMetadata::UPC_EAN_EXTENSION, extensionResult.text()); decodeResult.metadata().putAll(extensionResult.metadata()); decodeResult.addResultPoints(extensionResult.resultPoints()); } if (!_allowedExtensions.empty() && !Contains(_allowedExtensions, extensionResult.text().size())) { return Result(DecodeStatus::NotFound); } if (format == BarcodeFormat::EAN_13 || format == BarcodeFormat::UPC_A) { std::string countryID = EANManufacturerOrgSupport::LookupCountryIdentifier(result); if (!countryID.empty()) { decodeResult.metadata().put(ResultMetadata::POSSIBLE_COUNTRY, TextDecoder::FromLatin1(countryID)); } } return decodeResult; } /** * Computes the UPC/EAN checksum on a string of digits, and reports * whether the checksum is correct or not. * * @param s string of digits to check * @return true iff string of digits passes the UPC/EAN checksum algorithm * @throws FormatException if the string does not contain only digits */ bool UPCEANReader::checkChecksum(const std::string& s) const { return UPCEANCommon::ComputeChecksum(s, 1) == s.back() - '0'; } } // OneD } // ZXing zxing-cpp-1.0.8+ds2/core/src/oned/ODUPCEANReader.h000066400000000000000000000121631361167020700212670ustar00rootroot00000000000000#pragma once /* * Copyright 2016 Nu-book Inc. * Copyright 2016 ZXing authors * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #include "ODRowReader.h" #include #include #include namespace ZXing { class DecodeHints; enum class BarcodeFormat; enum class DecodeStatus; namespace OneD { /** *

Encapsulates functionality and implementation that is common to UPC and EAN families * of one-dimensional barcodes.

* * @author dswitkin@google.com (Daniel Switkin) * @author Sean Owen * @author alasdair@google.com (Alasdair Mackintosh) */ class UPCEANReader : public RowReader { public: Result decodeRow(int rowNumber, const BitArray& row, std::unique_ptr& state) const override; /** *

Like {@link #decodeRow(int, BitArray, java.util.Map)}, but * allows caller to inform method about where the UPC/EAN start pattern is * found. This allows this to be computed once and reused across many implementations.

* * @param rowNumber row index into the image * @param row encoding of the row of the barcode image * @param startGuardRange start/end column where the opening start pattern was found * @param hints optional hints that influence decoding * @return {@link Result} encapsulating the result of decoding a barcode in the row * @throws NotFoundException if no potential barcode is found * @throws ChecksumException if a potential barcode is found but does not pass its checksum * @throws FormatException if a potential barcode is found but format is invalid */ virtual Result decodeRow(int rowNumber, const BitArray& row, BitArray::Range startGuard) const; using Digit = std::array; protected: // These two values are critical for determining how permissive the decoding will be. // We've arrived at these values through a lot of trial and error. Setting them any higher // lets false positives creep in quickly. static constexpr float MAX_AVG_VARIANCE = 0.48f; static constexpr float MAX_INDIVIDUAL_VARIANCE = 0.7f; explicit UPCEANReader(const DecodeHints& hints); /** * Get the format of this decoder. */ virtual BarcodeFormat expectedFormat() const = 0; /** * Subclasses override this to decode the portion of a barcode between the start * and end guard patterns. * * @param row row of black/white values to search * @param rowOffset on input, end offset of start guard pattern, and on output: horizontal offset of first pixel after the "middle" that was decoded * @param resultString {@link StringBuilder} to append decoded chars to * @throws NotFoundException if decoding could not complete successfully */ virtual BitArray::Range decodeMiddle(const BitArray& row, BitArray::Iterator begin, std::string& resultString) const = 0; /** * @param s string of digits to check * @return {@link #checkStandardUPCEANChecksum(CharSequence)} * @throws FormatException if the string does not contain only digits */ virtual bool checkChecksum(const std::string& s) const; virtual BitArray::Range decodeEnd(const BitArray& row, BitArray::Iterator begin) const; public: static BitArray::Range FindStartGuardPattern(const BitArray& row); /** * Attempts to read and decode a single UPC/EAN-encoded digit. * * @param counters the counts of runs of observed black/white/black/... values * @param patterns the set of patterns to use to decode -- sometimes different encodings * for the digits 0-9 are used, and this indicates the encodings for 0 to 9 that should * be used * @return index best matching pattern, -1 if counters could not be matched * @throws NotFoundException if digit cannot be decoded */ template static int DecodeDigit(BitArray::Range* next, const std::array& patterns, std::string* resultString) { assert(next && resultString); Digit counters = {}; auto range = RowReader::RecordPattern(next->begin, next->end, counters); if (!range) return -1; next->begin = range.end; int bestMatch = RowReader::DecodeDigit(counters, patterns, MAX_AVG_VARIANCE, MAX_INDIVIDUAL_VARIANCE, false); if (bestMatch != -1) resultString->push_back((char)('0' + bestMatch % 10)); return bestMatch; } /** * Similar to DecodeDigit. Detects a single guard pattern instead of a digit. * */ template static bool ReadGuardPattern(BitArray::Range* next, const std::array& pattern) { assert(next); std::array counters = {}; auto range = RowReader::RecordPattern(next->begin, next->end, counters); if (!range || RowReader::PatternMatchVariance(counters, pattern, MAX_INDIVIDUAL_VARIANCE) >= MAX_AVG_VARIANCE) return false; next->begin = range.end; return true; } private: std::vector _allowedExtensions; }; } // OneD } // ZXing zxing-cpp-1.0.8+ds2/core/src/oned/ODUPCEReader.cpp000066400000000000000000000037171361167020700214100ustar00rootroot00000000000000/* * Copyright 2016 Nu-book Inc. * Copyright 2016 ZXing authors * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #include "ODUPCEReader.h" #include "ODUPCEANCommon.h" #include "BarcodeFormat.h" #include "BitArray.h" #include "DecodeStatus.h" #include "ZXContainerAlgorithms.h" #include namespace ZXing { namespace OneD { BarcodeFormat UPCEReader::expectedFormat() const { return BarcodeFormat::UPC_E; } BitArray::Range UPCEReader::decodeMiddle(const BitArray& row, BitArray::Iterator begin, std::string& resultString) const { BitArray::Range next = {begin, row.end()}; const BitArray::Range notFound = {begin, begin}; int lgPatternFound = 0; for (int x = 0; x < 6; x++) { int bestMatch = DecodeDigit(&next, UPCEANCommon::L_AND_G_PATTERNS, &resultString); if (bestMatch == -1) return notFound; if (bestMatch >= 10) { lgPatternFound |= 1 << (5 - x); } } int i = IndexOf(UPCEANCommon::NUMSYS_AND_CHECK_DIGIT_PATTERNS, lgPatternFound); if (i == -1) return notFound; resultString = std::to_string(i/10) + resultString + std::to_string(i % 10); return {begin, next.begin}; } bool UPCEReader::checkChecksum(const std::string& s) const { return UPCEANReader::checkChecksum(UPCEANCommon::ConvertUPCEtoUPCA(s)); } BitArray::Range UPCEReader::decodeEnd(const BitArray& row, BitArray::Iterator begin) const { BitArray::Range next = {begin, row.end()}; ReadGuardPattern(&next, UPCEANCommon::UPCE_END_PATTERN); return {begin, next.begin}; } } // OneD } // ZXing zxing-cpp-1.0.8+ds2/core/src/oned/ODUPCEReader.h000066400000000000000000000025121361167020700210450ustar00rootroot00000000000000#pragma once /* * Copyright 2016 Nu-book Inc. * Copyright 2016 ZXing authors * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #include "ODUPCEANReader.h" namespace ZXing { namespace OneD { /** *

Implements decoding of the UPC-E format.

*

This is a great reference for * UPC-E information.

* * @author Sean Owen */ class UPCEReader : public UPCEANReader { public: explicit UPCEReader(const DecodeHints& hints) : UPCEANReader(hints) {} protected: BarcodeFormat expectedFormat() const override; BitArray::Range decodeMiddle(const BitArray& row, BitArray::Iterator, std::string& resultString) const override; bool checkChecksum(const std::string& s) const override; BitArray::Range decodeEnd(const BitArray& row, BitArray::Iterator begin) const override; }; } // OneD } // ZXing zxing-cpp-1.0.8+ds2/core/src/oned/ODUPCEWriter.cpp000066400000000000000000000036461361167020700214630ustar00rootroot00000000000000/* * Copyright 2016 Huy Cuong Nguyen * Copyright 2016 ZXing authors * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #include "ODUPCEWriter.h" #include "ODUPCEANCommon.h" #include "ODWriterHelper.h" #include namespace ZXing { namespace OneD { static const int CODE_WIDTH = 3 + // start guard (7 * 6) + // bars 6; // end guard BitMatrix UPCEWriter::encode(const std::wstring& contents, int width, int height) const { auto digits = UPCEANCommon::DigitString2IntArray<8>( contents, UPCEANCommon::ComputeChecksum(UPCEANCommon::ConvertUPCEtoUPCA(contents), contents.size() == 8)); int firstDigit = digits[0]; if (firstDigit != 0 && firstDigit != 1) { throw std::invalid_argument("Number system must be 0 or 1"); } int parities = UPCEANCommon::NUMSYS_AND_CHECK_DIGIT_PATTERNS[firstDigit * 10 + digits[7]]; std::vector result(CODE_WIDTH, false); int pos = 0; pos += WriterHelper::AppendPattern(result, pos, UPCEANCommon::START_END_PATTERN, true); for (int i = 1; i <= 6; i++) { int digit = digits[i]; if ((parities >> (6 - i) & 1) == 1) { digit += 10; } pos += WriterHelper::AppendPattern(result, pos, UPCEANCommon::L_AND_G_PATTERNS[digit], false); } WriterHelper::AppendPattern(result, pos, UPCEANCommon::UPCE_END_PATTERN, false); return WriterHelper::RenderResult(result, width, height, _sidesMargin >= 0 ? _sidesMargin : 9); } } // OneD } // ZXing zxing-cpp-1.0.8+ds2/core/src/oned/ODUPCEWriter.h000066400000000000000000000020451361167020700211200ustar00rootroot00000000000000#pragma once /* * Copyright 2016 Huy Cuong Nguyen * Copyright 2016 ZXing authors * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #include namespace ZXing { class BitMatrix; namespace OneD { /** * This object renders an UPC-E code as a {@link BitMatrix}. * * @author 0979097955s@gmail.com (RX) */ class UPCEWriter { public: UPCEWriter& setMargin(int sidesMargin) { _sidesMargin = sidesMargin; return *this; } BitMatrix encode(const std::wstring& contents, int width, int height) const; private: int _sidesMargin = -1; }; } // OneD } // ZXing zxing-cpp-1.0.8+ds2/core/src/oned/ODWriterHelper.cpp000066400000000000000000000042271361167020700221420ustar00rootroot00000000000000/* * Copyright 2016 Huy Cuong Nguyen * Copyright 2016 ZXing authors * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #include "ODWriterHelper.h" #include "BitMatrix.h" #include namespace ZXing { namespace OneD { /** * @return a byte array of horizontal pixels (0 = white, 1 = black) */ BitMatrix WriterHelper::RenderResult(const std::vector& code, int width, int height, int sidesMargin) { int inputWidth = static_cast(code.size()); // Add quiet zone on both sides. int fullWidth = inputWidth + sidesMargin; int outputWidth = std::max(width, fullWidth); int outputHeight = std::max(1, height); int multiple = outputWidth / fullWidth; int leftPadding = (outputWidth - (inputWidth * multiple)) / 2; BitMatrix result(outputWidth, outputHeight); for (int inputX = 0, outputX = leftPadding; inputX < inputWidth; inputX++, outputX += multiple) { if (code[inputX]) { result.setRegion(outputX, 0, multiple, outputHeight); } } return result; } /** * @param target encode black/white pattern into this array * @param pos position to start encoding at in {@code target} * @param pattern lengths of black/white runs to encode * @param startColor starting color - false for white, true for black * @return the number of elements added to target. */ int WriterHelper::AppendPattern(std::vector& target, int pos, const int* pattern, size_t patternCount, bool startColor) { bool color = startColor; int numAdded = 0; for (size_t i = 0; i < patternCount; ++i) { int s = pattern[i]; for (int j = 0; j < s; j++) { target[pos++] = color; } numAdded += s; color = !color; // flip color after each segment } return numAdded; } } // OneD } // ZXing zxing-cpp-1.0.8+ds2/core/src/oned/ODWriterHelper.h000066400000000000000000000033521361167020700216050ustar00rootroot00000000000000#pragma once /* * Copyright 2016 Huy Cuong Nguyen * Copyright 2016 ZXing authors * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #include "BitMatrix.h" #include #include namespace ZXing { namespace OneD { /** *

Encapsulates functionality and implementation that is common to one-dimensional barcodes.

* * @author dsbnatut@gmail.com (Kazuki Nishiura) */ class WriterHelper { static int AppendPattern(std::vector& target, int pos, const int* pattern, size_t patternCount, bool startColor); public: /** * @return a byte array of horizontal pixels (0 = white, 1 = black) */ static BitMatrix RenderResult(const std::vector& code, int width, int height, int sidesMargin); /** * @param target encode black/white pattern into this array * @param pos position to start encoding at in {@code target} * @param pattern lengths of black/white runs to encode * @param startColor starting color - false for white, true for black * @return the number of elements added to target. */ template static int AppendPattern(std::vector& target, int pos, const Container& pattern, bool startColor) { return AppendPattern(target, pos, pattern.data(), pattern.size(), startColor); } }; } // OneD } // ZXing zxing-cpp-1.0.8+ds2/core/src/oned/rss/000077500000000000000000000000001361167020700174015ustar00rootroot00000000000000zxing-cpp-1.0.8+ds2/core/src/oned/rss/ODRSSDataCharacter.h000066400000000000000000000025361361167020700230610ustar00rootroot00000000000000#pragma once /* * Copyright 2016 Nu-book Inc. * Copyright 2016 ZXing authors * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #include namespace ZXing { namespace OneD { namespace RSS { class DataCharacter { int _value = std::numeric_limits::max(); int _checksumPortion = 0; public: DataCharacter() = default; DataCharacter(int value, int checksumPortion) : _value(value), _checksumPortion(checksumPortion) {} bool isValid() const { return _value != std::numeric_limits::max(); } int value() const { return _value; } int checksumPortion() const { return _checksumPortion; } bool operator==(const DataCharacter& other) const { return _value == other._value && _checksumPortion == other._checksumPortion; } bool operator!=(const DataCharacter& other) const { return !(*this == other); } }; } // RSS } // OneD } // ZXing zxing-cpp-1.0.8+ds2/core/src/oned/rss/ODRSSExpandedBinaryDecoder.cpp000066400000000000000000000231001361167020700250770ustar00rootroot00000000000000/* * Copyright 2016 Nu-book Inc. * Copyright 2016 ZXing authors * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ /* * These authors would like to acknowledge the Spanish Ministry of Industry, * Tourism and Trade, for the support in the project TSI020301-2008-2 * "PIRAmIDE: Personalizable Interactions with Resources on AmI-enabled * Mobile Dynamic Environments", led by Treelogic * ( http://www.treelogic.com/ ): * * http://www.piramidepse.com/ */ #include "ODRSSExpandedBinaryDecoder.h" #include "ODRSSGenericAppIdDecoder.h" #include "BitArray.h" #include "DecodeStatus.h" #include "ZXStrConvWorkaround.h" #include namespace ZXing { namespace OneD { namespace RSS { static const int AI01_GTIN_SIZE = 40; static void AI01AppendCheckDigit(std::string& buffer, int currentPos) { int checkDigit = 0; for (int i = 0; i < 13; i++) { int digit = buffer[i + currentPos] - '0'; checkDigit += (i & 0x01) == 0 ? 3 * digit : digit; } checkDigit = 10 - (checkDigit % 10); if (checkDigit == 10) { checkDigit = 0; } buffer.append(std::to_string(checkDigit)); } static void AI01EncodeCompressedGtinWithoutAI(std::string& buffer, const BitArray& bits, int currentPos, int initialBufferPosition) { for (int i = 0; i < 4; ++i) { int currentBlock = GenericAppIdDecoder::ExtractNumeric(bits, currentPos + 10 * i, 10); if (currentBlock / 100 == 0) { buffer.push_back('0'); } if (currentBlock / 10 == 0) { buffer.push_back('0'); } buffer.append(std::to_string(currentBlock)); } AI01AppendCheckDigit(buffer, initialBufferPosition); } static void AI01EncodeCompressedGtin(std::string& buffer, const BitArray& bits, int currentPos) { buffer.append("(01)"); int initialPosition = static_cast(buffer.length()); buffer.push_back('9'); AI01EncodeCompressedGtinWithoutAI(buffer, bits, currentPos, initialPosition); } using AddWeightCodeFunc = const std::function; using CheckWeightFunc = const std::function; static void AI01EncodeCompressedWeight(std::string& buffer, const BitArray& bits, int currentPos, int weightSize, const AddWeightCodeFunc& addWeightCode, const CheckWeightFunc& checkWeight) { int originalWeightNumeric = GenericAppIdDecoder::ExtractNumeric(bits, currentPos, weightSize); addWeightCode(buffer, originalWeightNumeric); int weightNumeric = checkWeight(originalWeightNumeric); int currentDivisor = 100000; for (int i = 0; i < 5; ++i) { if (weightNumeric / currentDivisor == 0) { buffer.push_back('0'); } currentDivisor /= 10; } buffer.append(std::to_string(weightNumeric)); } /** * @author Pablo Orduña, University of Deusto (pablo.orduna@deusto.es) * @author Eduardo Castillejo, University of Deusto (eduardo.castillejo@deusto.es) */ static std::string DecodeAI01AndOtherAIs(const BitArray& bits) { static const int HEADER_SIZE = 1 + 1 + 2; //first bit encodes the linkage flag, //the second one is the encodation method, and the other two are for the variable length std::string buffer; buffer.append("(01)"); int initialGtinPosition = static_cast(buffer.length()); int firstGtinDigit = GenericAppIdDecoder::ExtractNumeric(bits, HEADER_SIZE, 4); buffer.append(std::to_string(firstGtinDigit)); AI01EncodeCompressedGtinWithoutAI(buffer, bits, HEADER_SIZE + 4, initialGtinPosition); if (StatusIsOK(GenericAppIdDecoder::DecodeAllCodes(bits, HEADER_SIZE + 44, buffer))) { return buffer; } return std::string(); } static std::string DecodeAnyAI(const BitArray& bits) { static const int HEADER_SIZE = 2 + 1 + 2; std::string buffer; if (StatusIsOK(GenericAppIdDecoder::DecodeAllCodes(bits, HEADER_SIZE, buffer))) { return buffer; } return std::string(); } static std::string DecodeAI013103(const BitArray& bits) { static const int HEADER_SIZE = 4 + 1; static const int WEIGHT_SIZE = 15; if (bits.size() != HEADER_SIZE + AI01_GTIN_SIZE + WEIGHT_SIZE) { return std::string(); } std::string buffer; AI01EncodeCompressedGtin(buffer, bits, HEADER_SIZE); AI01EncodeCompressedWeight(buffer, bits, HEADER_SIZE + AI01_GTIN_SIZE, WEIGHT_SIZE, // addWeightCode [](std::string& buf, int) { buf.append("(3103)"); }, // checkWeight [](int weight) { return weight; }); return buffer; } static std::string DecodeAI01320x(const BitArray& bits) { static const int HEADER_SIZE = 4 + 1; static const int WEIGHT_SIZE = 15; if (bits.size() != HEADER_SIZE + AI01_GTIN_SIZE + WEIGHT_SIZE) { return std::string(); } std::string buffer; AI01EncodeCompressedGtin(buffer, bits, HEADER_SIZE); AI01EncodeCompressedWeight(buffer, bits, HEADER_SIZE + AI01_GTIN_SIZE, WEIGHT_SIZE, // addWeightCode [](std::string& buf, int weight) { buf.append(weight < 10000 ? "(3202)" : "(3203)"); }, // checkWeight [](int weight) { return weight < 10000 ? weight : weight - 10000; }); return buffer; } static std::string DecodeAI01392x(const BitArray& bits) { static const int HEADER_SIZE = 5 + 1 + 2; static const int LAST_DIGIT_SIZE = 2; if (bits.size() < HEADER_SIZE + AI01_GTIN_SIZE) { return std::string(); } std::string buffer; AI01EncodeCompressedGtin(buffer, bits, HEADER_SIZE); int lastAIdigit = GenericAppIdDecoder::ExtractNumeric(bits, HEADER_SIZE + AI01_GTIN_SIZE, LAST_DIGIT_SIZE); buffer.append("(392"); buffer.append(std::to_string(lastAIdigit)); buffer.push_back(')'); if (StatusIsOK(GenericAppIdDecoder::DecodeGeneralPurposeField(bits, HEADER_SIZE + AI01_GTIN_SIZE + LAST_DIGIT_SIZE, buffer))) { return buffer; } return std::string(); } static std::string DecodeAI01393x(const BitArray& bits) { static const int HEADER_SIZE = 5 + 1 + 2; static const int LAST_DIGIT_SIZE = 2; static const int FIRST_THREE_DIGITS_SIZE = 10; if (bits.size() < HEADER_SIZE + AI01_GTIN_SIZE) { return std::string(); } std::string buffer; AI01EncodeCompressedGtin(buffer, bits, HEADER_SIZE); int lastAIdigit = GenericAppIdDecoder::ExtractNumeric(bits, HEADER_SIZE + AI01_GTIN_SIZE, LAST_DIGIT_SIZE); buffer.append("(393"); buffer.append(std::to_string(lastAIdigit)); buffer.push_back(')'); int firstThreeDigits = GenericAppIdDecoder::ExtractNumeric(bits, HEADER_SIZE + AI01_GTIN_SIZE + LAST_DIGIT_SIZE, FIRST_THREE_DIGITS_SIZE); if (firstThreeDigits / 100 == 0) { buffer.push_back('0'); } if (firstThreeDigits / 10 == 0) { buffer.push_back('0'); } buffer.append(std::to_string(firstThreeDigits)); if (StatusIsOK(GenericAppIdDecoder::DecodeGeneralPurposeField(bits, HEADER_SIZE + AI01_GTIN_SIZE + LAST_DIGIT_SIZE + FIRST_THREE_DIGITS_SIZE, buffer))) { return buffer; } return std::string(); } static std::string DecodeAI013x0x1x(const BitArray& bits, const char* firstAIdigits, const char* dateCode) { static const int HEADER_SIZE = 7 + 1; static const int WEIGHT_SIZE = 20; static const int DATE_SIZE = 16; if (bits.size() != HEADER_SIZE + AI01_GTIN_SIZE + WEIGHT_SIZE + DATE_SIZE) { return std::string(); } std::string buffer; AI01EncodeCompressedGtin(buffer, bits, HEADER_SIZE); AI01EncodeCompressedWeight(buffer, bits, HEADER_SIZE + AI01_GTIN_SIZE, WEIGHT_SIZE, // addWeightCode [firstAIdigits](std::string& buf, int weight) { buf.push_back('('); buf.append(firstAIdigits); buf.append(std::to_string(weight / 100000)); buf.push_back(')'); }, // checkWeight [](int weight) { return weight % 100000; }); // encode compressed date int numericDate = GenericAppIdDecoder::ExtractNumeric(bits, HEADER_SIZE + AI01_GTIN_SIZE + WEIGHT_SIZE, DATE_SIZE); if (numericDate != 38400) { buffer.push_back('('); buffer.append(dateCode); buffer.push_back(')'); int day = numericDate % 32; numericDate /= 32; int month = numericDate % 12 + 1; numericDate /= 12; int year = numericDate; if (year / 10 == 0) { buffer.push_back('0'); } buffer.append(std::to_string(year)); if (month / 10 == 0) { buffer.push_back('0'); } buffer.append(std::to_string(month)); if (day / 10 == 0) { buffer.push_back('0'); } buffer.append(std::to_string(day)); } return buffer; } std::string ExpandedBinaryDecoder::Decode(const BitArray& bits) { if (bits.get(1)) { return DecodeAI01AndOtherAIs(bits); } if (!bits.get(2)) { return DecodeAnyAI(bits); } int fourBitEncodationMethod = GenericAppIdDecoder::ExtractNumeric(bits, 1, 4); switch (fourBitEncodationMethod) { case 4: return DecodeAI013103(bits); case 5: return DecodeAI01320x(bits); } int fiveBitEncodationMethod = GenericAppIdDecoder::ExtractNumeric(bits, 1, 5); switch (fiveBitEncodationMethod) { case 12: return DecodeAI01392x(bits); case 13: return DecodeAI01393x(bits); } int sevenBitEncodationMethod = GenericAppIdDecoder::ExtractNumeric(bits, 1, 7); switch (sevenBitEncodationMethod) { case 56: return DecodeAI013x0x1x(bits, "310", "11"); case 57: return DecodeAI013x0x1x(bits, "320", "11"); case 58: return DecodeAI013x0x1x(bits, "310", "13"); case 59: return DecodeAI013x0x1x(bits, "320", "13"); case 60: return DecodeAI013x0x1x(bits, "310", "15"); case 61: return DecodeAI013x0x1x(bits, "320", "15"); case 62: return DecodeAI013x0x1x(bits, "310", "17"); case 63: return DecodeAI013x0x1x(bits, "320", "17"); } return std::string(); //throw new IllegalStateException("unknown decoder: " + information); } } // RSS } // OneD } // ZXing zxing-cpp-1.0.8+ds2/core/src/oned/rss/ODRSSExpandedBinaryDecoder.h000066400000000000000000000017721361167020700245570ustar00rootroot00000000000000#pragma once /* * Copyright 2016 Nu-book Inc. * Copyright 2016 ZXing authors * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #include #include namespace ZXing { class BitArray; namespace OneD { namespace RSS { /** * @author Pablo Orduña, University of Deusto (pablo.orduna@deusto.es) * @author Eduardo Castillejo, University of Deusto (eduardo.castillejo@deusto.es) */ class ExpandedBinaryDecoder { public: static std::string Decode(const BitArray& bits); }; } // RSS } // OneD } // ZXing zxing-cpp-1.0.8+ds2/core/src/oned/rss/ODRSSExpandedPair.h000066400000000000000000000035011361167020700227300ustar00rootroot00000000000000#pragma once /* * Copyright 2016 Nu-book Inc. * Copyright 2016 ZXing authors * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #include "ODRSSDataCharacter.h" #include "ODRSSFinderPattern.h" namespace ZXing { namespace OneD { namespace RSS { /** * @author Pablo Orduña, University of Deusto (pablo.orduna@deusto.es) */ class ExpandedPair { DataCharacter _leftChar; DataCharacter _rightChar; FinderPattern _finderPattern; bool _mayBeLast = false; public: ExpandedPair() = default; ExpandedPair(const DataCharacter& leftChar, const DataCharacter& rightChar, const FinderPattern& finderPattern, bool mayBeLast) : _leftChar(leftChar), _rightChar(rightChar), _finderPattern(finderPattern), _mayBeLast(mayBeLast) {} bool mayBeLast() const { return _mayBeLast; } const DataCharacter& leftChar() const { return _leftChar; } const DataCharacter& rightChar() const { return _rightChar; } const FinderPattern& finderPattern() const { return _finderPattern; } bool mustBeLast() const { return !_rightChar.isValid(); } bool operator==(const ExpandedPair& other) const { return _leftChar == other._leftChar && _rightChar == other._rightChar && _finderPattern.value() == other._finderPattern.value(); } bool operator!=(const ExpandedPair& other) const { return !(*this == other); } }; } // RSS } // OneD } // ZXing zxing-cpp-1.0.8+ds2/core/src/oned/rss/ODRSSExpandedRow.h000066400000000000000000000031001361167020700225770ustar00rootroot00000000000000#pragma once /* * Copyright 2016 Nu-book Inc. * Copyright 2016 ZXing authors * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #include "ODRSSExpandedPair.h" #include namespace ZXing { namespace OneD { namespace RSS { /** * One row of an RSS Expanded Stacked symbol, consisting of 1+ expanded pairs. */ class ExpandedRow { std::vector _pairs; int _rowNumber; /** Did this row of the image have to be reversed (mirrored) to recognize the pairs? */ bool _wasReversed; public: template ExpandedRow(const U& pairs, int rowNumber, bool wasReversed) : _rowNumber(rowNumber), _wasReversed(wasReversed) { _pairs.reserve(pairs.size()); _pairs.assign(pairs.begin(), pairs.end()); } const std::vector& pairs() const { return _pairs; } int rowNumber() const { return _rowNumber; } bool wasReversed() const { return _wasReversed; } template bool isEquivalent(const U& list) const { return _pairs.size() == list.size() && std::equal(_pairs.begin(), _pairs.end(), list.begin()); } }; } // RSS } // OneD } // ZXing zxing-cpp-1.0.8+ds2/core/src/oned/rss/ODRSSFieldParser.cpp000066400000000000000000000106761361167020700231320ustar00rootroot00000000000000/* * Copyright 2016 Nu-book Inc. * Copyright 2016 ZXing authors * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #include "ODRSSFieldParser.h" #include "DecodeStatus.h" #include "ZXContainerAlgorithms.h" #include #include namespace ZXing { namespace OneD { namespace RSS { //private static final Object VARIABLE_LENGTH = new Object(); struct AiInfo { const char* aiPrefix; int fieldSize; // if negative, the length is variable and abs(length) give the max size }; static const AiInfo aiInfos[] = { // TWO_DIGIT_DATA_LENGTH { "00", 18 }, { "01", 14 }, { "02", 14 }, { "10", -20 }, { "11", 6 }, { "12", 6 }, { "13", 6 }, { "15", 6 }, { "17", 6 }, { "20", 2 }, { "21", -20 }, { "22", -29 }, { "30", -8 }, { "37", -8 }, //internal company codes { "90", -30 }, { "91", -30 }, { "92", -30 }, { "93", -30 }, { "94", -30 }, { "95", -30 }, { "96", -30 }, { "97", -30 }, { "98", -30 }, { "99", -30 }, //THREE_DIGIT_DATA_LENGTH { "240", -30 }, { "241", -30 }, { "242", -6 }, { "250", -30 }, { "251", -30 }, { "253", -17 }, { "254", -20 }, { "400", -30 }, { "401", -30 }, { "402", 17 }, { "403", -30 }, { "410", 13 }, { "411", 13 }, { "412", 13 }, { "413", 13 }, { "414", 13 }, { "420", -20 }, { "421", -15 }, { "422", 3 }, { "423", -15 }, { "424", 3 }, { "425", 3 }, { "426", 3 }, //THREE_DIGIT_PLUS_DIGIT_DATA_LENGTH { "310", 6 }, { "311", 6 }, { "312", 6 }, { "313", 6 }, { "314", 6 }, { "315", 6 }, { "316", 6 }, { "320", 6 }, { "321", 6 }, { "322", 6 }, { "323", 6 }, { "324", 6 }, { "325", 6 }, { "326", 6 }, { "327", 6 }, { "328", 6 }, { "329", 6 }, { "330", 6 }, { "331", 6 }, { "332", 6 }, { "333", 6 }, { "334", 6 }, { "335", 6 }, { "336", 6 }, { "340", 6 }, { "341", 6 }, { "342", 6 }, { "343", 6 }, { "344", 6 }, { "345", 6 }, { "346", 6 }, { "347", 6 }, { "348", 6 }, { "349", 6 }, { "350", 6 }, { "351", 6 }, { "352", 6 }, { "353", 6 }, { "354", 6 }, { "355", 6 }, { "356", 6 }, { "357", 6 }, { "360", 6 }, { "361", 6 }, { "362", 6 }, { "363", 6 }, { "364", 6 }, { "365", 6 }, { "366", 6 }, { "367", 6 }, { "368", 6 }, { "369", 6 }, { "390", -15 }, { "391", -18 }, { "392", -15 }, { "393", -18 }, { "703", -30 }, //FOUR_DIGIT_DATA_LENGTH { "7001", 13 }, { "7002", -30 }, { "7003", 10 }, { "8001", 14 }, { "8002", -20 }, { "8003", -30 }, { "8004", -30 }, { "8005", 6 }, { "8006", 18 }, { "8007", -30 }, { "8008", -12 }, { "8018", 18 }, { "8020", -25 }, { "8100", 6 }, { "8101", 10 }, { "8102", 2 }, { "8110", -70 }, { "8200", -70 }, }; static size_t AiSize(const char* aiPrefix) { if ((aiPrefix[0] == '3' && Contains("1234569", aiPrefix[1])) || std::string(aiPrefix) == "703") return 4; else return strlen(aiPrefix); } DecodeStatus FieldParser::ParseFieldsInGeneralPurpose(const std::string &rawInfo, std::string& result) { if (rawInfo.empty()) { return DecodeStatus::NoError; } auto starts_with = [](const std::string& str, const char* pre) { return strncmp(pre, str.data(), strlen(pre)) == 0; }; const AiInfo* aiInfo = FindIf(aiInfos, [&](const AiInfo& i) { return starts_with(rawInfo, i.aiPrefix); }); if (aiInfo == std::end(aiInfos)) return DecodeStatus::NotFound; size_t aiSize = AiSize(aiInfo->aiPrefix); // require at least one character in the variable field size case if (rawInfo.length() < aiSize + std::max(1, aiInfo->fieldSize)) return DecodeStatus::NotFound; size_t fieldSize = aiInfo->fieldSize >= 0 ? size_t(aiInfo->fieldSize) // fixed : std::min(rawInfo.length() - aiSize, size_t(-aiInfo->fieldSize)); // variable auto ai = rawInfo.substr(0, aiSize); auto field = rawInfo.substr(aiSize, fieldSize); auto remaining = rawInfo.substr(aiSize + fieldSize); std::string parsedRemaining; auto status = FieldParser::ParseFieldsInGeneralPurpose(remaining, parsedRemaining); result = '(' + ai + ')' + field + parsedRemaining; return status; } } // RSS } // OneD } // ZXing zxing-cpp-1.0.8+ds2/core/src/oned/rss/ODRSSFieldParser.h000066400000000000000000000016121361167020700225650ustar00rootroot00000000000000#pragma once /* * Copyright 2016 Nu-book Inc. * Copyright 2016 ZXing authors * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #include #include namespace ZXing { enum class DecodeStatus; namespace OneD { namespace RSS { class FieldParser { public: static DecodeStatus ParseFieldsInGeneralPurpose(const std::string &rawInfo, std::string& result); }; } // RSS } // OneD } // ZXing zxing-cpp-1.0.8+ds2/core/src/oned/rss/ODRSSFinderPattern.h000066400000000000000000000024361361167020700231370ustar00rootroot00000000000000#pragma once /* * Copyright 2016 Nu-book Inc. * Copyright 2016 ZXing authors * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #include "ResultPoint.h" #include namespace ZXing { namespace OneD { namespace RSS { class FinderPattern { int _value = -1; int _start = -1; int _end = -1; std::array _points; public: FinderPattern() = default; FinderPattern(int value, int start, int end, const std::array& points) : _value(value), _start(start), _end(end), _points(points) {} bool isValid() const { return _value >= 0; } int value() const { return _value; } int startPos() const { return _start; } int endPos() const { return _end; } const std::array& points() const { return _points; } }; } // RSS } // OneD } // ZXing zxing-cpp-1.0.8+ds2/core/src/oned/rss/ODRSSGenericAppIdDecoder.cpp000066400000000000000000000302661361167020700245070ustar00rootroot00000000000000/* * Copyright 2016 Nu-book Inc. * Copyright 2016 ZXing authors * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #include "ODRSSGenericAppIdDecoder.h" #include "ODRSSFieldParser.h" #include "BitArray.h" #include "DecodeStatus.h" #include "ZXStrConvWorkaround.h" #include #include namespace ZXing { namespace OneD { namespace RSS { int GenericAppIdDecoder::ExtractNumeric(const BitArray& bits, int pos, int count) { int value = 0; auto bitIter = bits.iterAt(pos); for (int i = 0; i < count; ++i, ++bitIter) { value = (value << 1) | static_cast(*bitIter); } return value; } struct DecodedValue { int newPosition = std::numeric_limits::max(); DecodedValue() = default; explicit DecodedValue(int np) : newPosition(np) {} bool isValid() const { return newPosition != std::numeric_limits::max(); } }; /** * @author Pablo Orduña, University of Deusto (pablo.orduna@deusto.es) * @author Eduardo Castillejo, University of Deusto (eduardo.castillejo@deusto.es) */ struct DecodedChar : public DecodedValue { static const char FNC1 = '$'; // It's not in Alphanumeric neither in ISO/IEC 646 charset char value = '\0'; DecodedChar() = default; DecodedChar(int np, char c) : DecodedValue(np), value(c) {} bool isFNC1() const { return value == FNC1; } }; /** * @author Pablo Orduña, University of Deusto (pablo.orduna@deusto.es) * @author Eduardo Castillejo, University of Deusto (eduardo.castillejo@deusto.es) */ struct DecodedInformation : public DecodedValue { std::string newString; int remainingValue = -1; DecodedInformation() = default; DecodedInformation(int np, std::string s) : DecodedValue(np), newString(std::move(s)) {} DecodedInformation(int np, std::string s, int r) : DecodedValue(np), newString(std::move(s)), remainingValue(r) {} bool isRemaining() const { return remainingValue >= 0; } }; /** * @author Pablo Orduña, University of Deusto (pablo.orduna@deusto.es) * @author Eduardo Castillejo, University of Deusto (eduardo.castillejo@deusto.es) */ struct DecodedNumeric : public DecodedValue { static const int FNC1 = 10; int firstDigit = 0; int secondDigit = 0; DecodedNumeric() = default; DecodedNumeric(int newPosition, int first, int second) : DecodedValue(newPosition), firstDigit(first), secondDigit(second) { if (firstDigit < 0 || firstDigit > 10 || secondDigit < 0 || secondDigit > 10) { *this = DecodedNumeric(); } } int value() const { return firstDigit * 10 + secondDigit; } bool isFirstDigitFNC1() const { return firstDigit == FNC1; } bool isSecondDigitFNC1() const { return secondDigit == FNC1; } bool isAnyFNC1() const { return firstDigit == FNC1 || secondDigit == FNC1; } private: }; struct ParsingState { enum State { NUMERIC, ALPHA, ISO_IEC_646 }; int position = 0; State encoding = NUMERIC; }; #define ExtractNumeric GenericAppIdDecoder::ExtractNumeric static bool IsStillAlpha(const BitArray& bits, int pos) { if (pos + 5 > bits.size()) { return false; } // We now check if it's a valid 5-bit value (0..9 and FNC1) int fiveBitValue = ExtractNumeric(bits, pos, 5); if (fiveBitValue >= 5 && fiveBitValue < 16) { return true; } if (pos + 6 > bits.size()) { return false; } int sixBitValue = ExtractNumeric(bits, pos, 6); return sixBitValue >= 16 && sixBitValue < 63; // 63 not included } static bool IsStillIsoIec646(const BitArray& bits, int pos) { if (pos + 5 > bits.size()) { return false; } int fiveBitValue = ExtractNumeric(bits, pos, 5); if (fiveBitValue >= 5 && fiveBitValue < 16) { return true; } if (pos + 7 > bits.size()) { return false; } int sevenBitValue = ExtractNumeric(bits, pos, 7); if (sevenBitValue >= 64 && sevenBitValue < 116) { return true; } if (pos + 8 > bits.size()) { return false; } int eightBitValue = ExtractNumeric(bits, pos, 8); return eightBitValue >= 232 && eightBitValue < 253; } static bool IsStillNumeric(const BitArray& bits, int pos) { // It's numeric if it still has 7 positions // and one of the first 4 bits is "1". if (pos + 7 > bits.size()) { return pos + 4 <= bits.size(); } auto bitIter = bits.iterAt(pos); for (int i = 0; i < 4; ++i, ++bitIter) { if (*bitIter) { return true; } } return false; } static DecodedChar DecodeAlphanumeric(const BitArray& bits, int pos) { int fiveBitValue = ExtractNumeric(bits, pos, 5); if (fiveBitValue == 15) { return DecodedChar(pos + 5, DecodedChar::FNC1); } if (fiveBitValue >= 5 && fiveBitValue < 15) { return DecodedChar(pos + 5, (char)('0' + fiveBitValue - 5)); } int sixBitValue = ExtractNumeric(bits, pos, 6); if (sixBitValue >= 32 && sixBitValue < 58) { return DecodedChar(pos + 6, (char)(sixBitValue + 33)); } if (sixBitValue < 58 || sixBitValue > 62) throw std::runtime_error("Decoding invalid alphanumeric value"); constexpr char const* lut58to62 = R"(*,-./)"; char c = lut58to62[sixBitValue - 58]; return DecodedChar(pos + 6, c); } static bool IsAlphaTo646ToAlphaLatch(const BitArray& bits, int pos) { if (pos + 1 > bits.size()) { return false; } for (int i = 0; i < 5 && i + pos < bits.size(); ++i) { if (i == 2) { if (!bits.get(pos + 2)) { return false; } } else if (bits.get(pos + i)) { return false; } } return true; } static bool IsAlphaOr646ToNumericLatch(const BitArray& bits, int pos) { // Next is alphanumeric if there are 3 positions and they are all zeros if (pos + 3 > bits.size()) { return false; } auto bitIter = bits.iterAt(pos); for (int i = 0; i < 3; ++i, ++bitIter) { if (*bitIter) { return false; } } return true; } static bool IsNumericToAlphaNumericLatch(const BitArray& bits, int pos) { // Next is alphanumeric if there are 4 positions and they are all zeros, or // if there is a subset of this just before the end of the symbol if (pos + 1 > bits.size()) { return false; } auto bitIter = bits.iterAt(pos); for (int i = 0; i < 4 && i + pos < bits.size(); ++i, ++bitIter) { if (*bitIter) { return false; } } return true; } static DecodedInformation ParseAlphaBlock(const BitArray& bits, ParsingState& state, std::string& buffer) { while (IsStillAlpha(bits, state.position)) { DecodedChar alpha = DecodeAlphanumeric(bits, state.position); state.position = alpha.newPosition; if (alpha.isFNC1()) { return DecodedInformation(state.position, buffer); //end of the char block } buffer.push_back(alpha.value); } if (IsAlphaOr646ToNumericLatch(bits, state.position)) { state.position += 3; state.encoding = ParsingState::NUMERIC; } else if (IsAlphaTo646ToAlphaLatch(bits, state.position)) { if (state.position + 5 < bits.size()) { state.position += 5; } else { state.position = bits.size(); } state.encoding = ParsingState::ISO_IEC_646; } return DecodedInformation(); } static DecodedChar DecodeIsoIec646(const BitArray& bits, int pos) { int fiveBitValue = ExtractNumeric(bits,pos, 5); if (fiveBitValue == 15) { return DecodedChar(pos + 5, DecodedChar::FNC1); } if (fiveBitValue >= 5 && fiveBitValue < 15) { return DecodedChar(pos + 5, (char)('0' + fiveBitValue - 5)); } int sevenBitValue = ExtractNumeric(bits, pos, 7); if (sevenBitValue >= 64 && sevenBitValue < 90) { return DecodedChar(pos + 7, (char)(sevenBitValue + 1)); } if (sevenBitValue >= 90 && sevenBitValue < 116) { return DecodedChar(pos + 7, (char)(sevenBitValue + 7)); } int eightBitValue = ExtractNumeric(bits, pos, 8); if (eightBitValue < 232 || eightBitValue > 252) throw std::runtime_error("Decoding invalid ISO-IEC-646 value"); constexpr char const* lut232to252 = R"(!"%&'()*+,-./:;<=>?_ )"; char c = lut232to252[eightBitValue - 232]; return DecodedChar(pos + 8, c); } static DecodedInformation ParseIsoIec646Block(const BitArray& bits, ParsingState& state, std::string& buffer) { while (IsStillIsoIec646(bits, state.position)) { DecodedChar iso = DecodeIsoIec646(bits, state.position); state.position = iso.newPosition; if (iso.isFNC1()) { return DecodedInformation(state.position, buffer); } buffer.push_back(iso.value); } if (IsAlphaOr646ToNumericLatch(bits, state.position)) { state.position += 3;; state.encoding = ParsingState::NUMERIC; } else if (IsAlphaTo646ToAlphaLatch(bits, state.position)) { if (state.position + 5 < bits.size()) { state.position += 5; } else { state.position = bits.size(); } state.encoding = ParsingState::ALPHA; } return DecodedInformation(); } static DecodedNumeric DecodeNumeric(const BitArray& bits, int pos) { if (pos + 7 > bits.size()) { int numeric = ExtractNumeric(bits, pos, 4); if (numeric == 0) { return DecodedNumeric(bits.size(), DecodedNumeric::FNC1, DecodedNumeric::FNC1); } return DecodedNumeric(bits.size(), numeric - 1, DecodedNumeric::FNC1); } int numeric = ExtractNumeric(bits, pos, 7); int digit1 = (numeric - 8) / 11; int digit2 = (numeric - 8) % 11; return DecodedNumeric(pos + 7, digit1, digit2); } static DecodedInformation ParseNumericBlock(const BitArray& bits, ParsingState& state, std::string& buffer) { while (IsStillNumeric(bits, state.position)) { DecodedNumeric numeric = DecodeNumeric(bits, state.position); state.position = numeric.newPosition; if (numeric.isFirstDigitFNC1()) { DecodedInformation information; if (numeric.isSecondDigitFNC1()) { return DecodedInformation(state.position, buffer); } else { return DecodedInformation(state.position, buffer, numeric.secondDigit); } } buffer.append(std::to_string(numeric.firstDigit)); if (numeric.isSecondDigitFNC1()) { return DecodedInformation(state.position, buffer); } buffer.append(std::to_string(numeric.secondDigit)); } if (IsNumericToAlphaNumericLatch(bits, state.position)) { state.encoding = ParsingState::ALPHA; state.position += 4; } return DecodedInformation(); } static DecodedInformation ParseBlocks(const BitArray& bits, ParsingState& state, std::string& buffer) { while (true) { int initialPosition = state.position; auto result = state.encoding == ParsingState::ALPHA ? ParseAlphaBlock(bits, state, buffer) : (state.encoding == ParsingState::ISO_IEC_646 ? ParseIsoIec646Block(bits, state, buffer) : // else ParseNumericBlock(bits, state, buffer)); if (result.isValid() || initialPosition == state.position) { return result; } } } static DecodedInformation DoDecodeGeneralPurposeField(ParsingState& state, const BitArray& bits, std::string prefix) { DecodedInformation lastDecoded = ParseBlocks(bits, state, prefix); if (lastDecoded.isValid() && lastDecoded.isRemaining()) { return DecodedInformation(state.position, prefix, lastDecoded.remainingValue); } return DecodedInformation(state.position, prefix); } DecodeStatus GenericAppIdDecoder::DecodeGeneralPurposeField(const BitArray& bits, int pos, std::string& result) { try { ParsingState state; state.position = pos; result += DoDecodeGeneralPurposeField(state, bits, std::string()).newString; return DecodeStatus::NoError; } catch (const std::exception &) { } return DecodeStatus::FormatError; } DecodeStatus GenericAppIdDecoder::DecodeAllCodes(const BitArray& bits, int pos, std::string& result) { try { ParsingState state; std::string remaining; while (true) { state.position = pos; DecodedInformation info = DoDecodeGeneralPurposeField(state, bits, remaining); std::string parsedFields; auto status = FieldParser::ParseFieldsInGeneralPurpose(info.newString, parsedFields); if (StatusIsError(status)) { return status; } result += parsedFields; if (info.isRemaining()) { remaining = std::to_string(info.remainingValue); } else { remaining.clear(); } if (pos == info.newPosition) {// No step forward! break; } pos = info.newPosition; }; return DecodeStatus::NoError; } catch (const std::exception &) { } return DecodeStatus::FormatError; } } // RSS } // OneD } // ZXing zxing-cpp-1.0.8+ds2/core/src/oned/rss/ODRSSGenericAppIdDecoder.h000066400000000000000000000023561361167020700241530ustar00rootroot00000000000000#pragma once /* * Copyright 2016 Nu-book Inc. * Copyright 2016 ZXing authors * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #include #include namespace ZXing { class BitArray; enum class DecodeStatus; namespace OneD { namespace RSS { /** * @author Pablo Orduña, University of Deusto (pablo.orduna@deusto.es) * @author Eduardo Castillejo, University of Deusto (eduardo.castillejo@deusto.es) */ class GenericAppIdDecoder { public: static int ExtractNumeric(const BitArray& bits, int pos, int count); static DecodeStatus DecodeGeneralPurposeField(const BitArray& bits, int pos, std::string& result); static DecodeStatus DecodeAllCodes(const BitArray& bits, int initialPosition, std::string& result); }; } // RSS } // OneD } // ZXing zxing-cpp-1.0.8+ds2/core/src/oned/rss/ODRSSPair.h000066400000000000000000000025171361167020700212650ustar00rootroot00000000000000#pragma once /* * Copyright 2016 Nu-book Inc. * Copyright 2016 ZXing authors * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #include "ODRSSDataCharacter.h" #include "ODRSSFinderPattern.h" namespace ZXing { namespace OneD { namespace RSS { class Pair : public DataCharacter { FinderPattern _finderPattern; int _count = 0; public: Pair() = default; Pair(int value, int checksumPortion, const FinderPattern& finderPattern) : DataCharacter(value, checksumPortion), _finderPattern(finderPattern), _count(1) {} const FinderPattern& finderPattern() const { return _finderPattern; } int count() const { return _count; } void incrementCount() { _count++; } bool operator==(const Pair& other) const { return DataCharacter::operator==(other) && other.finderPattern().value() == finderPattern().value(); } }; } // RSS } // OneD } // ZXing zxing-cpp-1.0.8+ds2/core/src/oned/rss/ODRSSReaderHelper.cpp000066400000000000000000000042351361167020700232660ustar00rootroot00000000000000/* * Copyright 2016 Nu-book Inc. * Copyright 2016 ZXing authors * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #include "ODRSSReaderHelper.h" #include "ZXContainerAlgorithms.h" #include namespace ZXing { namespace OneD { namespace RSS { static int combins(int n, int r) { int maxDenom; int minDenom; if (n - r > r) { minDenom = r; maxDenom = n - r; } else { minDenom = n - r; maxDenom = r; } int val = 1; int j = 1; for (int i = n; i > maxDenom; i--) { val *= i; if (j <= minDenom) { val /= j; j++; } } while (j <= minDenom) { val /= j; j++; } return val; } int ReaderHelper::GetRSSvalue(const std::array& widths, int maxWidth, bool noNarrow) { int elements = static_cast(widths.size()); int n = Accumulate(widths, 0); int val = 0; int narrowMask = 0; for (int bar = 0; bar < elements - 1; bar++) { int elmWidth; for (elmWidth = 1, narrowMask |= 1 << bar; elmWidth < widths[bar]; elmWidth++, narrowMask &= ~(1 << bar)) { int subVal = combins(n - elmWidth - 1, elements - bar - 2); if (noNarrow && (narrowMask == 0) && (n - elmWidth - (elements - bar - 1) >= elements - bar - 1)) { subVal -= combins(n - elmWidth - (elements - bar), elements - bar - 2); } if (elements - bar - 1 > 1) { int lessVal = 0; for (int mxwElement = n - elmWidth - (elements - bar - 2); mxwElement > maxWidth; mxwElement--) { lessVal += combins(n - elmWidth - mxwElement - 1, elements - bar - 3); } subVal -= lessVal * (elements - 1 - bar); } else if (n - elmWidth > maxWidth) { subVal--; } val += subVal; } n -= elmWidth; } return val; } } // RSS } // OneD } // ZXing zxing-cpp-1.0.8+ds2/core/src/oned/rss/ODRSSReaderHelper.h000066400000000000000000000050321361167020700227270ustar00rootroot00000000000000#pragma once /* * Copyright 2016 Nu-book Inc. * Copyright 2016 ZXing authors * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #include #include #include "../ODRowReader.h" namespace ZXing { namespace OneD { namespace RSS { using FinderCounters = std::array; class ReaderHelper { static constexpr float MAX_AVG_VARIANCE = 0.2f; static constexpr float MAX_INDIVIDUAL_VARIANCE = 0.45f; static constexpr float MIN_FINDER_PATTERN_RATIO = 9.5f / 12.0f; static constexpr float MAX_FINDER_PATTERN_RATIO = 12.5f / 14.0f; public: template static int ParseFinderValue(const C& counters, const P& finderPatterns) { for (size_t value = 0; value < finderPatterns.size(); ++value) { if (RowReader::PatternMatchVariance(counters, finderPatterns[value], MAX_INDIVIDUAL_VARIANCE) < MAX_AVG_VARIANCE) { return static_cast(value); } } return -1; } static bool IsFinderPatternExtended( const FinderCounters& counters, bool reversed ) { int sumA = counters[0] + counters[1]; int sumB = counters[2] + counters[3]; float sum = static_cast(sumA + sumB); float ratio = (reversed ? sumB : sumA) / sum; if (ratio >= MIN_FINDER_PATTERN_RATIO && ratio <= MAX_FINDER_PATTERN_RATIO) { // passes ratio test in spec, but see if the counts are unreasonable auto minmax = std::minmax_element(counters.begin(), counters.end()); return *minmax.second < 10 * *minmax.first; } return false; } static bool IsFinderPattern( const FinderCounters& counters ) { // Rhe RSS14 finder pattern is 5 counts long, the FINDER_PATTERNS array contains only the first 4 // of those. The 5th is '1' (same as the forth). The 4 counters passed here are 2nd to 5th. // The first 2 of those 4 is 10 to 12 times as wide as both of the last two. int a = counters[0] + counters[1]; int b = counters[2]; int c = counters[3]; return a > 8 * b && a < 14 * b && a > 8 * c && a < 14 * c; } static int GetRSSvalue(const std::array& widths, int maxWidth, bool noNarrow); }; } // RSS } // OneD } // ZXing zxing-cpp-1.0.8+ds2/core/src/pdf417/000077500000000000000000000000001361167020700166525ustar00rootroot00000000000000zxing-cpp-1.0.8+ds2/core/src/pdf417/PDFBarcodeMetadata.h000066400000000000000000000027501361167020700223610ustar00rootroot00000000000000#pragma once /* * Copyright 2016 Nu-book Inc. * Copyright 2016 ZXing authors * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ namespace ZXing { namespace Pdf417 { /** * @author Guenther Grau */ class BarcodeMetadata { int _columnCount = 0; int _errorCorrectionLevel = 0; int _rowCountUpperPart = 0; int _rowCountLowerPart = 0; public: BarcodeMetadata() = default; BarcodeMetadata(int columnCount, int rowCountUpperPart, int rowCountLowerPart, int errorCorrectionLevel) : _columnCount(columnCount), _errorCorrectionLevel(errorCorrectionLevel), _rowCountUpperPart(rowCountUpperPart), _rowCountLowerPart(rowCountLowerPart) { } int columnCount() const { return _columnCount; } int errorCorrectionLevel() const { return _errorCorrectionLevel; } int rowCount() const { return _rowCountUpperPart + _rowCountLowerPart; } int rowCountUpperPart() const { return _rowCountUpperPart; } int rowCountLowerPart() const { return _rowCountLowerPart; } }; } // Pdf417 } // ZXing zxing-cpp-1.0.8+ds2/core/src/pdf417/PDFBarcodeValue.cpp000066400000000000000000000027651361167020700222560ustar00rootroot00000000000000/* * Copyright 2016 Nu-book Inc. * Copyright 2016 ZXing authors * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #include "PDFBarcodeValue.h" namespace ZXing { namespace Pdf417 { /** * Add an occurrence of a value */ void BarcodeValue::setValue(int value) { _values[value] += 1; } /** * Determines the maximum occurrence of a set value and returns all values which were set with this occurrence. * @return an array of int, containing the values with the highest occurrence, or null, if no value was set */ std::vector BarcodeValue::value() const { int maxConfidence = -1; std::vector result; for (auto& entry : _values) { if (entry.second > maxConfidence) { maxConfidence = entry.second; result.clear(); result.push_back(entry.first); } else if (entry.second == maxConfidence) { result.push_back(entry.first); } } return result; } int BarcodeValue::confidence(int value) const { auto it = _values.find(value); return it != _values.end() ? it->second : 0; } } // Pdf417 } // ZXing zxing-cpp-1.0.8+ds2/core/src/pdf417/PDFBarcodeValue.h000066400000000000000000000022371361167020700217150ustar00rootroot00000000000000#pragma once /* * Copyright 2016 Nu-book Inc. * Copyright 2016 ZXing authors * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #include #include namespace ZXing { namespace Pdf417 { /** * @author Guenther Grau */ class BarcodeValue { std::map _values; public: /** * Add an occurrence of a value */ void setValue(int value); /** * Determines the maximum occurrence of a set value and returns all values which were set with this occurrence. * @return an array of int, containing the values with the highest occurrence, or null, if no value was set */ std::vector value() const; int confidence(int value) const; }; } // Pdf417 } // ZXing zxing-cpp-1.0.8+ds2/core/src/pdf417/PDFBoundingBox.cpp000066400000000000000000000075331361167020700221360ustar00rootroot00000000000000/* * Copyright 2016 Nu-book Inc. * Copyright 2016 ZXing authors * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #include "PDFBoundingBox.h" #include namespace ZXing { namespace Pdf417 { BoundingBox::BoundingBox() { _imgWidth = _imgHeight = _minX = _maxX = _minY = _maxY = 0; } bool BoundingBox::Create(int imgWidth, int imgHeight, const Nullable& topLeft, const Nullable& bottomLeft, const Nullable& topRight, const Nullable& bottomRight, BoundingBox& result) { if ((topLeft == nullptr && topRight == nullptr) || (bottomLeft == nullptr && bottomRight == nullptr) || (topLeft != nullptr && bottomLeft == nullptr) || (topRight != nullptr && bottomRight == nullptr)) { return false; } result._imgWidth = imgWidth; result._imgHeight = imgHeight; result._topLeft = topLeft; result._bottomLeft = bottomLeft; result._topRight = topRight; result._bottomRight = bottomRight; result.calculateMinMaxValues(); return true; } void BoundingBox::calculateMinMaxValues() { if (_topLeft == nullptr) { _topLeft = ResultPoint(0.f, _topRight.value().y()); _bottomLeft = ResultPoint(0.f, _bottomRight.value().y()); } else if (_topRight == nullptr) { _topRight = ResultPoint(static_cast(_imgWidth - 1), _topLeft.value().y()); _bottomRight = ResultPoint(static_cast(_imgHeight - 1), _bottomLeft.value().y()); } _minX = static_cast(std::min(_topLeft.value().x(), _bottomLeft.value().x())); _maxX = static_cast(std::max(_topRight.value().x(), _bottomRight.value().x())); _minY = static_cast(std::min(_topLeft.value().y(), _topRight.value().y())); _maxY = static_cast(std::max(_bottomLeft.value().y(), _bottomRight.value().y())); } bool BoundingBox::Merge(const Nullable& leftBox, const Nullable& rightBox, Nullable& result) { if (leftBox == nullptr) { result = rightBox; return true; } if (rightBox == nullptr) { result = leftBox; return true; } BoundingBox box; if (Create(leftBox.value()._imgWidth, leftBox.value()._imgHeight, leftBox.value()._topLeft, leftBox.value()._bottomLeft, rightBox.value()._topRight, rightBox.value()._bottomRight, box)) { result = box; return true; } return false; } bool BoundingBox::AddMissingRows(const BoundingBox& box, int missingStartRows, int missingEndRows, bool isLeft, BoundingBox& result) { auto newTopLeft = box._topLeft; auto newBottomLeft = box._bottomLeft; auto newTopRight = box._topRight; auto newBottomRight = box._bottomRight; if (missingStartRows > 0) { auto top = isLeft ? box._topLeft : box._topRight; int newMinY = static_cast(top.value().y()) - missingStartRows; if (newMinY < 0) { newMinY = 0; } ResultPoint newTop(top.value().x(), static_cast(newMinY)); if (isLeft) { newTopLeft = newTop; } else { newTopRight = newTop; } } if (missingEndRows > 0) { auto bottom = isLeft ? box._bottomLeft : box._bottomRight; int newMaxY = (int)bottom.value().y() + missingEndRows; if (newMaxY >= box._imgHeight) { newMaxY = box._imgHeight - 1; } ResultPoint newBottom(bottom.value().x(), static_cast(newMaxY)); if (isLeft) { newBottomLeft = newBottom; } else { newBottomRight = newBottom; } } return Create(box._imgWidth, box._imgHeight, newTopLeft, newBottomLeft, newTopRight, newBottomRight, result); } } // Pdf417 } // ZXing zxing-cpp-1.0.8+ds2/core/src/pdf417/PDFBoundingBox.h000066400000000000000000000037211361167020700215760ustar00rootroot00000000000000#pragma once /* * Copyright 2016 Nu-book Inc. * Copyright 2016 ZXing authors * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #include "ZXNullable.h" #include "ResultPoint.h" namespace ZXing { namespace Pdf417 { /** * @author Guenther Grau */ class BoundingBox { int _imgWidth; int _imgHeight; Nullable _topLeft; Nullable _bottomLeft; Nullable _topRight; Nullable _bottomRight; int _minX; int _maxX; int _minY; int _maxY; public: BoundingBox(); int minX() const { return _minX; } int maxX() const { return _maxX; } int minY() const { return _minY; } int maxY() const { return _maxY; } Nullable topLeft() const { return _topLeft; } Nullable topRight() const { return _topRight; } Nullable bottomLeft() const { return _bottomLeft; } Nullable bottomRight() const { return _bottomRight; } static bool Create(int imgWidth, int imgHeight, const Nullable& topLeft, const Nullable& bottomLeft, const Nullable& topRight, const Nullable& bottomRight, BoundingBox& result); static bool Merge(const Nullable& leftBox, const Nullable& rightBox, Nullable& result); static bool AddMissingRows(const BoundingBox&box, int missingStartRows, int missingEndRows, bool isLeft, BoundingBox& result); private: void calculateMinMaxValues(); }; } // Pdf417 } // ZXing zxing-cpp-1.0.8+ds2/core/src/pdf417/PDFCodeword.h000066400000000000000000000032131361167020700211220ustar00rootroot00000000000000#pragma once /* * Copyright 2016 Nu-book Inc. * Copyright 2016 ZXing authors * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ namespace ZXing { namespace Pdf417 { /** * @author Guenther Grau */ class Codeword { static const int BARCODE_ROW_UNKNOWN = -1; int _startX = 0; int _endX = 0; int _bucket = 0; int _value = 0; int _rowNumber = BARCODE_ROW_UNKNOWN; public: Codeword() {} Codeword(int startX, int endX, int bucket, int value) : _startX(startX), _endX(endX), _bucket(bucket), _value(value) {} bool hasValidRowNumber() const { return isValidRowNumber(_rowNumber); } bool isValidRowNumber(int rowNumber) const { return rowNumber != BARCODE_ROW_UNKNOWN && _bucket == (rowNumber % 3) * 3; } void setRowNumberAsRowIndicatorColumn() { _rowNumber = (_value / 30) * 3 + _bucket / 3; } int width() const { return _endX - _startX; } int startX() const { return _startX; } int endX() const { return _endX; } int bucket() const { return _bucket; } int value() const { return _value; } int rowNumber() const { return _rowNumber; } void setRowNumber(int rowNumber) { _rowNumber = rowNumber; } }; } // Pdf417 } // ZXing zxing-cpp-1.0.8+ds2/core/src/pdf417/PDFCodewordDecoder.cpp000066400000000000000000001317721361167020700227570ustar00rootroot00000000000000/* * Copyright 2016 Nu-book Inc. * Copyright 2016 ZXing authors * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #include "PDFCodewordDecoder.h" #include #include #include #include namespace ZXing { namespace Pdf417 { static const int SYMBOL_COUNT = 2787; /** * The sorted table of all possible symbols. Extracted from the PDF417 * specification. The index of a symbol in this table corresponds to the * index into the codeword table. */ const std::array SYMBOL_TABLE = { 0x1025e, 0x1027a, 0x1029e, 0x102bc, 0x102f2, 0x102f4, 0x1032e, 0x1034e, 0x1035c, 0x10396, 0x103a6, 0x103ac, 0x10422, 0x10428, 0x10436, 0x10442, 0x10444, 0x10448, 0x10450, 0x1045e, 0x10466, 0x1046c, 0x1047a, 0x10482, 0x1049e, 0x104a0, 0x104bc, 0x104c6, 0x104d8, 0x104ee, 0x104f2, 0x104f4, 0x10504, 0x10508, 0x10510, 0x1051e, 0x10520, 0x1053c, 0x10540, 0x10578, 0x10586, 0x1058c, 0x10598, 0x105b0, 0x105be, 0x105ce, 0x105dc, 0x105e2, 0x105e4, 0x105e8, 0x105f6, 0x1062e, 0x1064e, 0x1065c, 0x1068e, 0x1069c, 0x106b8, 0x106de, 0x106fa, 0x10716, 0x10726, 0x1072c, 0x10746, 0x1074c, 0x10758, 0x1076e, 0x10792, 0x10794, 0x107a2, 0x107a4, 0x107a8, 0x107b6, 0x10822, 0x10828, 0x10842, 0x10848, 0x10850, 0x1085e, 0x10866, 0x1086c, 0x1087a, 0x10882, 0x10884, 0x10890, 0x1089e, 0x108a0, 0x108bc, 0x108c6, 0x108cc, 0x108d8, 0x108ee, 0x108f2, 0x108f4, 0x10902, 0x10908, 0x1091e, 0x10920, 0x1093c, 0x10940, 0x10978, 0x10986, 0x10998, 0x109b0, 0x109be, 0x109ce, 0x109dc, 0x109e2, 0x109e4, 0x109e8, 0x109f6, 0x10a08, 0x10a10, 0x10a1e, 0x10a20, 0x10a3c, 0x10a40, 0x10a78, 0x10af0, 0x10b06, 0x10b0c, 0x10b18, 0x10b30, 0x10b3e, 0x10b60, 0x10b7c, 0x10b8e, 0x10b9c, 0x10bb8, 0x10bc2, 0x10bc4, 0x10bc8, 0x10bd0, 0x10bde, 0x10be6, 0x10bec, 0x10c2e, 0x10c4e, 0x10c5c, 0x10c62, 0x10c64, 0x10c68, 0x10c76, 0x10c8e, 0x10c9c, 0x10cb8, 0x10cc2, 0x10cc4, 0x10cc8, 0x10cd0, 0x10cde, 0x10ce6, 0x10cec, 0x10cfa, 0x10d0e, 0x10d1c, 0x10d38, 0x10d70, 0x10d7e, 0x10d82, 0x10d84, 0x10d88, 0x10d90, 0x10d9e, 0x10da0, 0x10dbc, 0x10dc6, 0x10dcc, 0x10dd8, 0x10dee, 0x10df2, 0x10df4, 0x10e16, 0x10e26, 0x10e2c, 0x10e46, 0x10e58, 0x10e6e, 0x10e86, 0x10e8c, 0x10e98, 0x10eb0, 0x10ebe, 0x10ece, 0x10edc, 0x10f0a, 0x10f12, 0x10f14, 0x10f22, 0x10f28, 0x10f36, 0x10f42, 0x10f44, 0x10f48, 0x10f50, 0x10f5e, 0x10f66, 0x10f6c, 0x10fb2, 0x10fb4, 0x11022, 0x11028, 0x11042, 0x11048, 0x11050, 0x1105e, 0x1107a, 0x11082, 0x11084, 0x11090, 0x1109e, 0x110a0, 0x110bc, 0x110c6, 0x110cc, 0x110d8, 0x110ee, 0x110f2, 0x110f4, 0x11102, 0x1111e, 0x11120, 0x1113c, 0x11140, 0x11178, 0x11186, 0x11198, 0x111b0, 0x111be, 0x111ce, 0x111dc, 0x111e2, 0x111e4, 0x111e8, 0x111f6, 0x11208, 0x1121e, 0x11220, 0x11278, 0x112f0, 0x1130c, 0x11330, 0x1133e, 0x11360, 0x1137c, 0x1138e, 0x1139c, 0x113b8, 0x113c2, 0x113c8, 0x113d0, 0x113de, 0x113e6, 0x113ec, 0x11408, 0x11410, 0x1141e, 0x11420, 0x1143c, 0x11440, 0x11478, 0x114f0, 0x115e0, 0x1160c, 0x11618, 0x11630, 0x1163e, 0x11660, 0x1167c, 0x116c0, 0x116f8, 0x1171c, 0x11738, 0x11770, 0x1177e, 0x11782, 0x11784, 0x11788, 0x11790, 0x1179e, 0x117a0, 0x117bc, 0x117c6, 0x117cc, 0x117d8, 0x117ee, 0x1182e, 0x11834, 0x1184e, 0x1185c, 0x11862, 0x11864, 0x11868, 0x11876, 0x1188e, 0x1189c, 0x118b8, 0x118c2, 0x118c8, 0x118d0, 0x118de, 0x118e6, 0x118ec, 0x118fa, 0x1190e, 0x1191c, 0x11938, 0x11970, 0x1197e, 0x11982, 0x11984, 0x11990, 0x1199e, 0x119a0, 0x119bc, 0x119c6, 0x119cc, 0x119d8, 0x119ee, 0x119f2, 0x119f4, 0x11a0e, 0x11a1c, 0x11a38, 0x11a70, 0x11a7e, 0x11ae0, 0x11afc, 0x11b08, 0x11b10, 0x11b1e, 0x11b20, 0x11b3c, 0x11b40, 0x11b78, 0x11b8c, 0x11b98, 0x11bb0, 0x11bbe, 0x11bce, 0x11bdc, 0x11be2, 0x11be4, 0x11be8, 0x11bf6, 0x11c16, 0x11c26, 0x11c2c, 0x11c46, 0x11c4c, 0x11c58, 0x11c6e, 0x11c86, 0x11c98, 0x11cb0, 0x11cbe, 0x11cce, 0x11cdc, 0x11ce2, 0x11ce4, 0x11ce8, 0x11cf6, 0x11d06, 0x11d0c, 0x11d18, 0x11d30, 0x11d3e, 0x11d60, 0x11d7c, 0x11d8e, 0x11d9c, 0x11db8, 0x11dc4, 0x11dc8, 0x11dd0, 0x11dde, 0x11de6, 0x11dec, 0x11dfa, 0x11e0a, 0x11e12, 0x11e14, 0x11e22, 0x11e24, 0x11e28, 0x11e36, 0x11e42, 0x11e44, 0x11e50, 0x11e5e, 0x11e66, 0x11e6c, 0x11e82, 0x11e84, 0x11e88, 0x11e90, 0x11e9e, 0x11ea0, 0x11ebc, 0x11ec6, 0x11ecc, 0x11ed8, 0x11eee, 0x11f1a, 0x11f2e, 0x11f32, 0x11f34, 0x11f4e, 0x11f5c, 0x11f62, 0x11f64, 0x11f68, 0x11f76, 0x12048, 0x1205e, 0x12082, 0x12084, 0x12090, 0x1209e, 0x120a0, 0x120bc, 0x120d8, 0x120f2, 0x120f4, 0x12108, 0x1211e, 0x12120, 0x1213c, 0x12140, 0x12178, 0x12186, 0x12198, 0x121b0, 0x121be, 0x121e2, 0x121e4, 0x121e8, 0x121f6, 0x12204, 0x12210, 0x1221e, 0x12220, 0x12278, 0x122f0, 0x12306, 0x1230c, 0x12330, 0x1233e, 0x12360, 0x1237c, 0x1238e, 0x1239c, 0x123b8, 0x123c2, 0x123c8, 0x123d0, 0x123e6, 0x123ec, 0x1241e, 0x12420, 0x1243c, 0x124f0, 0x125e0, 0x12618, 0x1263e, 0x12660, 0x1267c, 0x126c0, 0x126f8, 0x12738, 0x12770, 0x1277e, 0x12782, 0x12784, 0x12790, 0x1279e, 0x127a0, 0x127bc, 0x127c6, 0x127cc, 0x127d8, 0x127ee, 0x12820, 0x1283c, 0x12840, 0x12878, 0x128f0, 0x129e0, 0x12bc0, 0x12c18, 0x12c30, 0x12c3e, 0x12c60, 0x12c7c, 0x12cc0, 0x12cf8, 0x12df0, 0x12e1c, 0x12e38, 0x12e70, 0x12e7e, 0x12ee0, 0x12efc, 0x12f04, 0x12f08, 0x12f10, 0x12f20, 0x12f3c, 0x12f40, 0x12f78, 0x12f86, 0x12f8c, 0x12f98, 0x12fb0, 0x12fbe, 0x12fce, 0x12fdc, 0x1302e, 0x1304e, 0x1305c, 0x13062, 0x13068, 0x1308e, 0x1309c, 0x130b8, 0x130c2, 0x130c8, 0x130d0, 0x130de, 0x130ec, 0x130fa, 0x1310e, 0x13138, 0x13170, 0x1317e, 0x13182, 0x13184, 0x13190, 0x1319e, 0x131a0, 0x131bc, 0x131c6, 0x131cc, 0x131d8, 0x131f2, 0x131f4, 0x1320e, 0x1321c, 0x13270, 0x1327e, 0x132e0, 0x132fc, 0x13308, 0x1331e, 0x13320, 0x1333c, 0x13340, 0x13378, 0x13386, 0x13398, 0x133b0, 0x133be, 0x133ce, 0x133dc, 0x133e2, 0x133e4, 0x133e8, 0x133f6, 0x1340e, 0x1341c, 0x13438, 0x13470, 0x1347e, 0x134e0, 0x134fc, 0x135c0, 0x135f8, 0x13608, 0x13610, 0x1361e, 0x13620, 0x1363c, 0x13640, 0x13678, 0x136f0, 0x1370c, 0x13718, 0x13730, 0x1373e, 0x13760, 0x1377c, 0x1379c, 0x137b8, 0x137c2, 0x137c4, 0x137c8, 0x137d0, 0x137de, 0x137e6, 0x137ec, 0x13816, 0x13826, 0x1382c, 0x13846, 0x1384c, 0x13858, 0x1386e, 0x13874, 0x13886, 0x13898, 0x138b0, 0x138be, 0x138ce, 0x138dc, 0x138e2, 0x138e4, 0x138e8, 0x13906, 0x1390c, 0x13930, 0x1393e, 0x13960, 0x1397c, 0x1398e, 0x1399c, 0x139b8, 0x139c8, 0x139d0, 0x139de, 0x139e6, 0x139ec, 0x139fa, 0x13a06, 0x13a0c, 0x13a18, 0x13a30, 0x13a3e, 0x13a60, 0x13a7c, 0x13ac0, 0x13af8, 0x13b0e, 0x13b1c, 0x13b38, 0x13b70, 0x13b7e, 0x13b88, 0x13b90, 0x13b9e, 0x13ba0, 0x13bbc, 0x13bcc, 0x13bd8, 0x13bee, 0x13bf2, 0x13bf4, 0x13c12, 0x13c14, 0x13c22, 0x13c24, 0x13c28, 0x13c36, 0x13c42, 0x13c48, 0x13c50, 0x13c5e, 0x13c66, 0x13c6c, 0x13c82, 0x13c84, 0x13c90, 0x13c9e, 0x13ca0, 0x13cbc, 0x13cc6, 0x13ccc, 0x13cd8, 0x13cee, 0x13d02, 0x13d04, 0x13d08, 0x13d10, 0x13d1e, 0x13d20, 0x13d3c, 0x13d40, 0x13d78, 0x13d86, 0x13d8c, 0x13d98, 0x13db0, 0x13dbe, 0x13dce, 0x13ddc, 0x13de4, 0x13de8, 0x13df6, 0x13e1a, 0x13e2e, 0x13e32, 0x13e34, 0x13e4e, 0x13e5c, 0x13e62, 0x13e64, 0x13e68, 0x13e76, 0x13e8e, 0x13e9c, 0x13eb8, 0x13ec2, 0x13ec4, 0x13ec8, 0x13ed0, 0x13ede, 0x13ee6, 0x13eec, 0x13f26, 0x13f2c, 0x13f3a, 0x13f46, 0x13f4c, 0x13f58, 0x13f6e, 0x13f72, 0x13f74, 0x14082, 0x1409e, 0x140a0, 0x140bc, 0x14104, 0x14108, 0x14110, 0x1411e, 0x14120, 0x1413c, 0x14140, 0x14178, 0x1418c, 0x14198, 0x141b0, 0x141be, 0x141e2, 0x141e4, 0x141e8, 0x14208, 0x14210, 0x1421e, 0x14220, 0x1423c, 0x14240, 0x14278, 0x142f0, 0x14306, 0x1430c, 0x14318, 0x14330, 0x1433e, 0x14360, 0x1437c, 0x1438e, 0x143c2, 0x143c4, 0x143c8, 0x143d0, 0x143e6, 0x143ec, 0x14408, 0x14410, 0x1441e, 0x14420, 0x1443c, 0x14440, 0x14478, 0x144f0, 0x145e0, 0x1460c, 0x14618, 0x14630, 0x1463e, 0x14660, 0x1467c, 0x146c0, 0x146f8, 0x1471c, 0x14738, 0x14770, 0x1477e, 0x14782, 0x14784, 0x14788, 0x14790, 0x147a0, 0x147bc, 0x147c6, 0x147cc, 0x147d8, 0x147ee, 0x14810, 0x14820, 0x1483c, 0x14840, 0x14878, 0x148f0, 0x149e0, 0x14bc0, 0x14c30, 0x14c3e, 0x14c60, 0x14c7c, 0x14cc0, 0x14cf8, 0x14df0, 0x14e38, 0x14e70, 0x14e7e, 0x14ee0, 0x14efc, 0x14f04, 0x14f08, 0x14f10, 0x14f1e, 0x14f20, 0x14f3c, 0x14f40, 0x14f78, 0x14f86, 0x14f8c, 0x14f98, 0x14fb0, 0x14fce, 0x14fdc, 0x15020, 0x15040, 0x15078, 0x150f0, 0x151e0, 0x153c0, 0x15860, 0x1587c, 0x158c0, 0x158f8, 0x159f0, 0x15be0, 0x15c70, 0x15c7e, 0x15ce0, 0x15cfc, 0x15dc0, 0x15df8, 0x15e08, 0x15e10, 0x15e20, 0x15e40, 0x15e78, 0x15ef0, 0x15f0c, 0x15f18, 0x15f30, 0x15f60, 0x15f7c, 0x15f8e, 0x15f9c, 0x15fb8, 0x1604e, 0x1605c, 0x1608e, 0x1609c, 0x160b8, 0x160c2, 0x160c4, 0x160c8, 0x160de, 0x1610e, 0x1611c, 0x16138, 0x16170, 0x1617e, 0x16184, 0x16188, 0x16190, 0x1619e, 0x161a0, 0x161bc, 0x161c6, 0x161cc, 0x161d8, 0x161f2, 0x161f4, 0x1620e, 0x1621c, 0x16238, 0x16270, 0x1627e, 0x162e0, 0x162fc, 0x16304, 0x16308, 0x16310, 0x1631e, 0x16320, 0x1633c, 0x16340, 0x16378, 0x16386, 0x1638c, 0x16398, 0x163b0, 0x163be, 0x163ce, 0x163dc, 0x163e2, 0x163e4, 0x163e8, 0x163f6, 0x1640e, 0x1641c, 0x16438, 0x16470, 0x1647e, 0x164e0, 0x164fc, 0x165c0, 0x165f8, 0x16610, 0x1661e, 0x16620, 0x1663c, 0x16640, 0x16678, 0x166f0, 0x16718, 0x16730, 0x1673e, 0x16760, 0x1677c, 0x1678e, 0x1679c, 0x167b8, 0x167c2, 0x167c4, 0x167c8, 0x167d0, 0x167de, 0x167e6, 0x167ec, 0x1681c, 0x16838, 0x16870, 0x168e0, 0x168fc, 0x169c0, 0x169f8, 0x16bf0, 0x16c10, 0x16c1e, 0x16c20, 0x16c3c, 0x16c40, 0x16c78, 0x16cf0, 0x16de0, 0x16e18, 0x16e30, 0x16e3e, 0x16e60, 0x16e7c, 0x16ec0, 0x16ef8, 0x16f1c, 0x16f38, 0x16f70, 0x16f7e, 0x16f84, 0x16f88, 0x16f90, 0x16f9e, 0x16fa0, 0x16fbc, 0x16fc6, 0x16fcc, 0x16fd8, 0x17026, 0x1702c, 0x17046, 0x1704c, 0x17058, 0x1706e, 0x17086, 0x1708c, 0x17098, 0x170b0, 0x170be, 0x170ce, 0x170dc, 0x170e8, 0x17106, 0x1710c, 0x17118, 0x17130, 0x1713e, 0x17160, 0x1717c, 0x1718e, 0x1719c, 0x171b8, 0x171c2, 0x171c4, 0x171c8, 0x171d0, 0x171de, 0x171e6, 0x171ec, 0x171fa, 0x17206, 0x1720c, 0x17218, 0x17230, 0x1723e, 0x17260, 0x1727c, 0x172c0, 0x172f8, 0x1730e, 0x1731c, 0x17338, 0x17370, 0x1737e, 0x17388, 0x17390, 0x1739e, 0x173a0, 0x173bc, 0x173cc, 0x173d8, 0x173ee, 0x173f2, 0x173f4, 0x1740c, 0x17418, 0x17430, 0x1743e, 0x17460, 0x1747c, 0x174c0, 0x174f8, 0x175f0, 0x1760e, 0x1761c, 0x17638, 0x17670, 0x1767e, 0x176e0, 0x176fc, 0x17708, 0x17710, 0x1771e, 0x17720, 0x1773c, 0x17740, 0x17778, 0x17798, 0x177b0, 0x177be, 0x177dc, 0x177e2, 0x177e4, 0x177e8, 0x17822, 0x17824, 0x17828, 0x17836, 0x17842, 0x17844, 0x17848, 0x17850, 0x1785e, 0x17866, 0x1786c, 0x17882, 0x17884, 0x17888, 0x17890, 0x1789e, 0x178a0, 0x178bc, 0x178c6, 0x178cc, 0x178d8, 0x178ee, 0x178f2, 0x178f4, 0x17902, 0x17904, 0x17908, 0x17910, 0x1791e, 0x17920, 0x1793c, 0x17940, 0x17978, 0x17986, 0x1798c, 0x17998, 0x179b0, 0x179be, 0x179ce, 0x179dc, 0x179e2, 0x179e4, 0x179e8, 0x179f6, 0x17a04, 0x17a08, 0x17a10, 0x17a1e, 0x17a20, 0x17a3c, 0x17a40, 0x17a78, 0x17af0, 0x17b06, 0x17b0c, 0x17b18, 0x17b30, 0x17b3e, 0x17b60, 0x17b7c, 0x17b8e, 0x17b9c, 0x17bb8, 0x17bc4, 0x17bc8, 0x17bd0, 0x17bde, 0x17be6, 0x17bec, 0x17c2e, 0x17c32, 0x17c34, 0x17c4e, 0x17c5c, 0x17c62, 0x17c64, 0x17c68, 0x17c76, 0x17c8e, 0x17c9c, 0x17cb8, 0x17cc2, 0x17cc4, 0x17cc8, 0x17cd0, 0x17cde, 0x17ce6, 0x17cec, 0x17d0e, 0x17d1c, 0x17d38, 0x17d70, 0x17d82, 0x17d84, 0x17d88, 0x17d90, 0x17d9e, 0x17da0, 0x17dbc, 0x17dc6, 0x17dcc, 0x17dd8, 0x17dee, 0x17e26, 0x17e2c, 0x17e3a, 0x17e46, 0x17e4c, 0x17e58, 0x17e6e, 0x17e72, 0x17e74, 0x17e86, 0x17e8c, 0x17e98, 0x17eb0, 0x17ece, 0x17edc, 0x17ee2, 0x17ee4, 0x17ee8, 0x17ef6, 0x1813a, 0x18172, 0x18174, 0x18216, 0x18226, 0x1823a, 0x1824c, 0x18258, 0x1826e, 0x18272, 0x18274, 0x18298, 0x182be, 0x182e2, 0x182e4, 0x182e8, 0x182f6, 0x1835e, 0x1837a, 0x183ae, 0x183d6, 0x18416, 0x18426, 0x1842c, 0x1843a, 0x18446, 0x18458, 0x1846e, 0x18472, 0x18474, 0x18486, 0x184b0, 0x184be, 0x184ce, 0x184dc, 0x184e2, 0x184e4, 0x184e8, 0x184f6, 0x18506, 0x1850c, 0x18518, 0x18530, 0x1853e, 0x18560, 0x1857c, 0x1858e, 0x1859c, 0x185b8, 0x185c2, 0x185c4, 0x185c8, 0x185d0, 0x185de, 0x185e6, 0x185ec, 0x185fa, 0x18612, 0x18614, 0x18622, 0x18628, 0x18636, 0x18642, 0x18650, 0x1865e, 0x1867a, 0x18682, 0x18684, 0x18688, 0x18690, 0x1869e, 0x186a0, 0x186bc, 0x186c6, 0x186cc, 0x186d8, 0x186ee, 0x186f2, 0x186f4, 0x1872e, 0x1874e, 0x1875c, 0x18796, 0x187a6, 0x187ac, 0x187d2, 0x187d4, 0x18826, 0x1882c, 0x1883a, 0x18846, 0x1884c, 0x18858, 0x1886e, 0x18872, 0x18874, 0x18886, 0x18898, 0x188b0, 0x188be, 0x188ce, 0x188dc, 0x188e2, 0x188e4, 0x188e8, 0x188f6, 0x1890c, 0x18930, 0x1893e, 0x18960, 0x1897c, 0x1898e, 0x189b8, 0x189c2, 0x189c8, 0x189d0, 0x189de, 0x189e6, 0x189ec, 0x189fa, 0x18a18, 0x18a30, 0x18a3e, 0x18a60, 0x18a7c, 0x18ac0, 0x18af8, 0x18b1c, 0x18b38, 0x18b70, 0x18b7e, 0x18b82, 0x18b84, 0x18b88, 0x18b90, 0x18b9e, 0x18ba0, 0x18bbc, 0x18bc6, 0x18bcc, 0x18bd8, 0x18bee, 0x18bf2, 0x18bf4, 0x18c22, 0x18c24, 0x18c28, 0x18c36, 0x18c42, 0x18c48, 0x18c50, 0x18c5e, 0x18c66, 0x18c7a, 0x18c82, 0x18c84, 0x18c90, 0x18c9e, 0x18ca0, 0x18cbc, 0x18ccc, 0x18cf2, 0x18cf4, 0x18d04, 0x18d08, 0x18d10, 0x18d1e, 0x18d20, 0x18d3c, 0x18d40, 0x18d78, 0x18d86, 0x18d98, 0x18dce, 0x18de2, 0x18de4, 0x18de8, 0x18e2e, 0x18e32, 0x18e34, 0x18e4e, 0x18e5c, 0x18e62, 0x18e64, 0x18e68, 0x18e8e, 0x18e9c, 0x18eb8, 0x18ec2, 0x18ec4, 0x18ec8, 0x18ed0, 0x18efa, 0x18f16, 0x18f26, 0x18f2c, 0x18f46, 0x18f4c, 0x18f58, 0x18f6e, 0x18f8a, 0x18f92, 0x18f94, 0x18fa2, 0x18fa4, 0x18fa8, 0x18fb6, 0x1902c, 0x1903a, 0x19046, 0x1904c, 0x19058, 0x19072, 0x19074, 0x19086, 0x19098, 0x190b0, 0x190be, 0x190ce, 0x190dc, 0x190e2, 0x190e8, 0x190f6, 0x19106, 0x1910c, 0x19130, 0x1913e, 0x19160, 0x1917c, 0x1918e, 0x1919c, 0x191b8, 0x191c2, 0x191c8, 0x191d0, 0x191de, 0x191e6, 0x191ec, 0x191fa, 0x19218, 0x1923e, 0x19260, 0x1927c, 0x192c0, 0x192f8, 0x19338, 0x19370, 0x1937e, 0x19382, 0x19384, 0x19390, 0x1939e, 0x193a0, 0x193bc, 0x193c6, 0x193cc, 0x193d8, 0x193ee, 0x193f2, 0x193f4, 0x19430, 0x1943e, 0x19460, 0x1947c, 0x194c0, 0x194f8, 0x195f0, 0x19638, 0x19670, 0x1967e, 0x196e0, 0x196fc, 0x19702, 0x19704, 0x19708, 0x19710, 0x19720, 0x1973c, 0x19740, 0x19778, 0x19786, 0x1978c, 0x19798, 0x197b0, 0x197be, 0x197ce, 0x197dc, 0x197e2, 0x197e4, 0x197e8, 0x19822, 0x19824, 0x19842, 0x19848, 0x19850, 0x1985e, 0x19866, 0x1987a, 0x19882, 0x19884, 0x19890, 0x1989e, 0x198a0, 0x198bc, 0x198cc, 0x198f2, 0x198f4, 0x19902, 0x19908, 0x1991e, 0x19920, 0x1993c, 0x19940, 0x19978, 0x19986, 0x19998, 0x199ce, 0x199e2, 0x199e4, 0x199e8, 0x19a08, 0x19a10, 0x19a1e, 0x19a20, 0x19a3c, 0x19a40, 0x19a78, 0x19af0, 0x19b18, 0x19b3e, 0x19b60, 0x19b9c, 0x19bc2, 0x19bc4, 0x19bc8, 0x19bd0, 0x19be6, 0x19c2e, 0x19c34, 0x19c4e, 0x19c5c, 0x19c62, 0x19c64, 0x19c68, 0x19c8e, 0x19c9c, 0x19cb8, 0x19cc2, 0x19cc8, 0x19cd0, 0x19ce6, 0x19cfa, 0x19d0e, 0x19d1c, 0x19d38, 0x19d70, 0x19d7e, 0x19d82, 0x19d84, 0x19d88, 0x19d90, 0x19da0, 0x19dcc, 0x19df2, 0x19df4, 0x19e16, 0x19e26, 0x19e2c, 0x19e46, 0x19e4c, 0x19e58, 0x19e74, 0x19e86, 0x19e8c, 0x19e98, 0x19eb0, 0x19ebe, 0x19ece, 0x19ee2, 0x19ee4, 0x19ee8, 0x19f0a, 0x19f12, 0x19f14, 0x19f22, 0x19f24, 0x19f28, 0x19f42, 0x19f44, 0x19f48, 0x19f50, 0x19f5e, 0x19f6c, 0x19f9a, 0x19fae, 0x19fb2, 0x19fb4, 0x1a046, 0x1a04c, 0x1a072, 0x1a074, 0x1a086, 0x1a08c, 0x1a098, 0x1a0b0, 0x1a0be, 0x1a0e2, 0x1a0e4, 0x1a0e8, 0x1a0f6, 0x1a106, 0x1a10c, 0x1a118, 0x1a130, 0x1a13e, 0x1a160, 0x1a17c, 0x1a18e, 0x1a19c, 0x1a1b8, 0x1a1c2, 0x1a1c4, 0x1a1c8, 0x1a1d0, 0x1a1de, 0x1a1e6, 0x1a1ec, 0x1a218, 0x1a230, 0x1a23e, 0x1a260, 0x1a27c, 0x1a2c0, 0x1a2f8, 0x1a31c, 0x1a338, 0x1a370, 0x1a37e, 0x1a382, 0x1a384, 0x1a388, 0x1a390, 0x1a39e, 0x1a3a0, 0x1a3bc, 0x1a3c6, 0x1a3cc, 0x1a3d8, 0x1a3ee, 0x1a3f2, 0x1a3f4, 0x1a418, 0x1a430, 0x1a43e, 0x1a460, 0x1a47c, 0x1a4c0, 0x1a4f8, 0x1a5f0, 0x1a61c, 0x1a638, 0x1a670, 0x1a67e, 0x1a6e0, 0x1a6fc, 0x1a702, 0x1a704, 0x1a708, 0x1a710, 0x1a71e, 0x1a720, 0x1a73c, 0x1a740, 0x1a778, 0x1a786, 0x1a78c, 0x1a798, 0x1a7b0, 0x1a7be, 0x1a7ce, 0x1a7dc, 0x1a7e2, 0x1a7e4, 0x1a7e8, 0x1a830, 0x1a860, 0x1a87c, 0x1a8c0, 0x1a8f8, 0x1a9f0, 0x1abe0, 0x1ac70, 0x1ac7e, 0x1ace0, 0x1acfc, 0x1adc0, 0x1adf8, 0x1ae04, 0x1ae08, 0x1ae10, 0x1ae20, 0x1ae3c, 0x1ae40, 0x1ae78, 0x1aef0, 0x1af06, 0x1af0c, 0x1af18, 0x1af30, 0x1af3e, 0x1af60, 0x1af7c, 0x1af8e, 0x1af9c, 0x1afb8, 0x1afc4, 0x1afc8, 0x1afd0, 0x1afde, 0x1b042, 0x1b05e, 0x1b07a, 0x1b082, 0x1b084, 0x1b088, 0x1b090, 0x1b09e, 0x1b0a0, 0x1b0bc, 0x1b0cc, 0x1b0f2, 0x1b0f4, 0x1b102, 0x1b104, 0x1b108, 0x1b110, 0x1b11e, 0x1b120, 0x1b13c, 0x1b140, 0x1b178, 0x1b186, 0x1b198, 0x1b1ce, 0x1b1e2, 0x1b1e4, 0x1b1e8, 0x1b204, 0x1b208, 0x1b210, 0x1b21e, 0x1b220, 0x1b23c, 0x1b240, 0x1b278, 0x1b2f0, 0x1b30c, 0x1b33e, 0x1b360, 0x1b39c, 0x1b3c2, 0x1b3c4, 0x1b3c8, 0x1b3d0, 0x1b3e6, 0x1b410, 0x1b41e, 0x1b420, 0x1b43c, 0x1b440, 0x1b478, 0x1b4f0, 0x1b5e0, 0x1b618, 0x1b660, 0x1b67c, 0x1b6c0, 0x1b738, 0x1b782, 0x1b784, 0x1b788, 0x1b790, 0x1b79e, 0x1b7a0, 0x1b7cc, 0x1b82e, 0x1b84e, 0x1b85c, 0x1b88e, 0x1b89c, 0x1b8b8, 0x1b8c2, 0x1b8c4, 0x1b8c8, 0x1b8d0, 0x1b8e6, 0x1b8fa, 0x1b90e, 0x1b91c, 0x1b938, 0x1b970, 0x1b97e, 0x1b982, 0x1b984, 0x1b988, 0x1b990, 0x1b99e, 0x1b9a0, 0x1b9cc, 0x1b9f2, 0x1b9f4, 0x1ba0e, 0x1ba1c, 0x1ba38, 0x1ba70, 0x1ba7e, 0x1bae0, 0x1bafc, 0x1bb08, 0x1bb10, 0x1bb20, 0x1bb3c, 0x1bb40, 0x1bb98, 0x1bbce, 0x1bbe2, 0x1bbe4, 0x1bbe8, 0x1bc16, 0x1bc26, 0x1bc2c, 0x1bc46, 0x1bc4c, 0x1bc58, 0x1bc72, 0x1bc74, 0x1bc86, 0x1bc8c, 0x1bc98, 0x1bcb0, 0x1bcbe, 0x1bcce, 0x1bce2, 0x1bce4, 0x1bce8, 0x1bd06, 0x1bd0c, 0x1bd18, 0x1bd30, 0x1bd3e, 0x1bd60, 0x1bd7c, 0x1bd9c, 0x1bdc2, 0x1bdc4, 0x1bdc8, 0x1bdd0, 0x1bde6, 0x1bdfa, 0x1be12, 0x1be14, 0x1be22, 0x1be24, 0x1be28, 0x1be42, 0x1be44, 0x1be48, 0x1be50, 0x1be5e, 0x1be66, 0x1be82, 0x1be84, 0x1be88, 0x1be90, 0x1be9e, 0x1bea0, 0x1bebc, 0x1becc, 0x1bef4, 0x1bf1a, 0x1bf2e, 0x1bf32, 0x1bf34, 0x1bf4e, 0x1bf5c, 0x1bf62, 0x1bf64, 0x1bf68, 0x1c09a, 0x1c0b2, 0x1c0b4, 0x1c11a, 0x1c132, 0x1c134, 0x1c162, 0x1c164, 0x1c168, 0x1c176, 0x1c1ba, 0x1c21a, 0x1c232, 0x1c234, 0x1c24e, 0x1c25c, 0x1c262, 0x1c264, 0x1c268, 0x1c276, 0x1c28e, 0x1c2c2, 0x1c2c4, 0x1c2c8, 0x1c2d0, 0x1c2de, 0x1c2e6, 0x1c2ec, 0x1c2fa, 0x1c316, 0x1c326, 0x1c33a, 0x1c346, 0x1c34c, 0x1c372, 0x1c374, 0x1c41a, 0x1c42e, 0x1c432, 0x1c434, 0x1c44e, 0x1c45c, 0x1c462, 0x1c464, 0x1c468, 0x1c476, 0x1c48e, 0x1c49c, 0x1c4b8, 0x1c4c2, 0x1c4c8, 0x1c4d0, 0x1c4de, 0x1c4e6, 0x1c4ec, 0x1c4fa, 0x1c51c, 0x1c538, 0x1c570, 0x1c57e, 0x1c582, 0x1c584, 0x1c588, 0x1c590, 0x1c59e, 0x1c5a0, 0x1c5bc, 0x1c5c6, 0x1c5cc, 0x1c5d8, 0x1c5ee, 0x1c5f2, 0x1c5f4, 0x1c616, 0x1c626, 0x1c62c, 0x1c63a, 0x1c646, 0x1c64c, 0x1c658, 0x1c66e, 0x1c672, 0x1c674, 0x1c686, 0x1c68c, 0x1c698, 0x1c6b0, 0x1c6be, 0x1c6ce, 0x1c6dc, 0x1c6e2, 0x1c6e4, 0x1c6e8, 0x1c712, 0x1c714, 0x1c722, 0x1c728, 0x1c736, 0x1c742, 0x1c744, 0x1c748, 0x1c750, 0x1c75e, 0x1c766, 0x1c76c, 0x1c77a, 0x1c7ae, 0x1c7d6, 0x1c7ea, 0x1c81a, 0x1c82e, 0x1c832, 0x1c834, 0x1c84e, 0x1c85c, 0x1c862, 0x1c864, 0x1c868, 0x1c876, 0x1c88e, 0x1c89c, 0x1c8b8, 0x1c8c2, 0x1c8c8, 0x1c8d0, 0x1c8de, 0x1c8e6, 0x1c8ec, 0x1c8fa, 0x1c90e, 0x1c938, 0x1c970, 0x1c97e, 0x1c982, 0x1c984, 0x1c990, 0x1c99e, 0x1c9a0, 0x1c9bc, 0x1c9c6, 0x1c9cc, 0x1c9d8, 0x1c9ee, 0x1c9f2, 0x1c9f4, 0x1ca38, 0x1ca70, 0x1ca7e, 0x1cae0, 0x1cafc, 0x1cb02, 0x1cb04, 0x1cb08, 0x1cb10, 0x1cb20, 0x1cb3c, 0x1cb40, 0x1cb78, 0x1cb86, 0x1cb8c, 0x1cb98, 0x1cbb0, 0x1cbbe, 0x1cbce, 0x1cbdc, 0x1cbe2, 0x1cbe4, 0x1cbe8, 0x1cbf6, 0x1cc16, 0x1cc26, 0x1cc2c, 0x1cc3a, 0x1cc46, 0x1cc58, 0x1cc72, 0x1cc74, 0x1cc86, 0x1ccb0, 0x1ccbe, 0x1ccce, 0x1cce2, 0x1cce4, 0x1cce8, 0x1cd06, 0x1cd0c, 0x1cd18, 0x1cd30, 0x1cd3e, 0x1cd60, 0x1cd7c, 0x1cd9c, 0x1cdc2, 0x1cdc4, 0x1cdc8, 0x1cdd0, 0x1cdde, 0x1cde6, 0x1cdfa, 0x1ce22, 0x1ce28, 0x1ce42, 0x1ce50, 0x1ce5e, 0x1ce66, 0x1ce7a, 0x1ce82, 0x1ce84, 0x1ce88, 0x1ce90, 0x1ce9e, 0x1cea0, 0x1cebc, 0x1cecc, 0x1cef2, 0x1cef4, 0x1cf2e, 0x1cf32, 0x1cf34, 0x1cf4e, 0x1cf5c, 0x1cf62, 0x1cf64, 0x1cf68, 0x1cf96, 0x1cfa6, 0x1cfac, 0x1cfca, 0x1cfd2, 0x1cfd4, 0x1d02e, 0x1d032, 0x1d034, 0x1d04e, 0x1d05c, 0x1d062, 0x1d064, 0x1d068, 0x1d076, 0x1d08e, 0x1d09c, 0x1d0b8, 0x1d0c2, 0x1d0c4, 0x1d0c8, 0x1d0d0, 0x1d0de, 0x1d0e6, 0x1d0ec, 0x1d0fa, 0x1d11c, 0x1d138, 0x1d170, 0x1d17e, 0x1d182, 0x1d184, 0x1d188, 0x1d190, 0x1d19e, 0x1d1a0, 0x1d1bc, 0x1d1c6, 0x1d1cc, 0x1d1d8, 0x1d1ee, 0x1d1f2, 0x1d1f4, 0x1d21c, 0x1d238, 0x1d270, 0x1d27e, 0x1d2e0, 0x1d2fc, 0x1d302, 0x1d304, 0x1d308, 0x1d310, 0x1d31e, 0x1d320, 0x1d33c, 0x1d340, 0x1d378, 0x1d386, 0x1d38c, 0x1d398, 0x1d3b0, 0x1d3be, 0x1d3ce, 0x1d3dc, 0x1d3e2, 0x1d3e4, 0x1d3e8, 0x1d3f6, 0x1d470, 0x1d47e, 0x1d4e0, 0x1d4fc, 0x1d5c0, 0x1d5f8, 0x1d604, 0x1d608, 0x1d610, 0x1d620, 0x1d640, 0x1d678, 0x1d6f0, 0x1d706, 0x1d70c, 0x1d718, 0x1d730, 0x1d73e, 0x1d760, 0x1d77c, 0x1d78e, 0x1d79c, 0x1d7b8, 0x1d7c2, 0x1d7c4, 0x1d7c8, 0x1d7d0, 0x1d7de, 0x1d7e6, 0x1d7ec, 0x1d826, 0x1d82c, 0x1d83a, 0x1d846, 0x1d84c, 0x1d858, 0x1d872, 0x1d874, 0x1d886, 0x1d88c, 0x1d898, 0x1d8b0, 0x1d8be, 0x1d8ce, 0x1d8e2, 0x1d8e4, 0x1d8e8, 0x1d8f6, 0x1d90c, 0x1d918, 0x1d930, 0x1d93e, 0x1d960, 0x1d97c, 0x1d99c, 0x1d9c2, 0x1d9c4, 0x1d9c8, 0x1d9d0, 0x1d9e6, 0x1d9fa, 0x1da0c, 0x1da18, 0x1da30, 0x1da3e, 0x1da60, 0x1da7c, 0x1dac0, 0x1daf8, 0x1db38, 0x1db82, 0x1db84, 0x1db88, 0x1db90, 0x1db9e, 0x1dba0, 0x1dbcc, 0x1dbf2, 0x1dbf4, 0x1dc22, 0x1dc42, 0x1dc44, 0x1dc48, 0x1dc50, 0x1dc5e, 0x1dc66, 0x1dc7a, 0x1dc82, 0x1dc84, 0x1dc88, 0x1dc90, 0x1dc9e, 0x1dca0, 0x1dcbc, 0x1dccc, 0x1dcf2, 0x1dcf4, 0x1dd04, 0x1dd08, 0x1dd10, 0x1dd1e, 0x1dd20, 0x1dd3c, 0x1dd40, 0x1dd78, 0x1dd86, 0x1dd98, 0x1ddce, 0x1dde2, 0x1dde4, 0x1dde8, 0x1de2e, 0x1de32, 0x1de34, 0x1de4e, 0x1de5c, 0x1de62, 0x1de64, 0x1de68, 0x1de8e, 0x1de9c, 0x1deb8, 0x1dec2, 0x1dec4, 0x1dec8, 0x1ded0, 0x1dee6, 0x1defa, 0x1df16, 0x1df26, 0x1df2c, 0x1df46, 0x1df4c, 0x1df58, 0x1df72, 0x1df74, 0x1df8a, 0x1df92, 0x1df94, 0x1dfa2, 0x1dfa4, 0x1dfa8, 0x1e08a, 0x1e092, 0x1e094, 0x1e0a2, 0x1e0a4, 0x1e0a8, 0x1e0b6, 0x1e0da, 0x1e10a, 0x1e112, 0x1e114, 0x1e122, 0x1e124, 0x1e128, 0x1e136, 0x1e142, 0x1e144, 0x1e148, 0x1e150, 0x1e166, 0x1e16c, 0x1e17a, 0x1e19a, 0x1e1b2, 0x1e1b4, 0x1e20a, 0x1e212, 0x1e214, 0x1e222, 0x1e224, 0x1e228, 0x1e236, 0x1e242, 0x1e248, 0x1e250, 0x1e25e, 0x1e266, 0x1e26c, 0x1e27a, 0x1e282, 0x1e284, 0x1e288, 0x1e290, 0x1e2a0, 0x1e2bc, 0x1e2c6, 0x1e2cc, 0x1e2d8, 0x1e2ee, 0x1e2f2, 0x1e2f4, 0x1e31a, 0x1e332, 0x1e334, 0x1e35c, 0x1e362, 0x1e364, 0x1e368, 0x1e3ba, 0x1e40a, 0x1e412, 0x1e414, 0x1e422, 0x1e428, 0x1e436, 0x1e442, 0x1e448, 0x1e450, 0x1e45e, 0x1e466, 0x1e46c, 0x1e47a, 0x1e482, 0x1e484, 0x1e490, 0x1e49e, 0x1e4a0, 0x1e4bc, 0x1e4c6, 0x1e4cc, 0x1e4d8, 0x1e4ee, 0x1e4f2, 0x1e4f4, 0x1e502, 0x1e504, 0x1e508, 0x1e510, 0x1e51e, 0x1e520, 0x1e53c, 0x1e540, 0x1e578, 0x1e586, 0x1e58c, 0x1e598, 0x1e5b0, 0x1e5be, 0x1e5ce, 0x1e5dc, 0x1e5e2, 0x1e5e4, 0x1e5e8, 0x1e5f6, 0x1e61a, 0x1e62e, 0x1e632, 0x1e634, 0x1e64e, 0x1e65c, 0x1e662, 0x1e668, 0x1e68e, 0x1e69c, 0x1e6b8, 0x1e6c2, 0x1e6c4, 0x1e6c8, 0x1e6d0, 0x1e6e6, 0x1e6fa, 0x1e716, 0x1e726, 0x1e72c, 0x1e73a, 0x1e746, 0x1e74c, 0x1e758, 0x1e772, 0x1e774, 0x1e792, 0x1e794, 0x1e7a2, 0x1e7a4, 0x1e7a8, 0x1e7b6, 0x1e812, 0x1e814, 0x1e822, 0x1e824, 0x1e828, 0x1e836, 0x1e842, 0x1e844, 0x1e848, 0x1e850, 0x1e85e, 0x1e866, 0x1e86c, 0x1e87a, 0x1e882, 0x1e884, 0x1e888, 0x1e890, 0x1e89e, 0x1e8a0, 0x1e8bc, 0x1e8c6, 0x1e8cc, 0x1e8d8, 0x1e8ee, 0x1e8f2, 0x1e8f4, 0x1e902, 0x1e904, 0x1e908, 0x1e910, 0x1e920, 0x1e93c, 0x1e940, 0x1e978, 0x1e986, 0x1e98c, 0x1e998, 0x1e9b0, 0x1e9be, 0x1e9ce, 0x1e9dc, 0x1e9e2, 0x1e9e4, 0x1e9e8, 0x1e9f6, 0x1ea04, 0x1ea08, 0x1ea10, 0x1ea20, 0x1ea40, 0x1ea78, 0x1eaf0, 0x1eb06, 0x1eb0c, 0x1eb18, 0x1eb30, 0x1eb3e, 0x1eb60, 0x1eb7c, 0x1eb8e, 0x1eb9c, 0x1ebb8, 0x1ebc2, 0x1ebc4, 0x1ebc8, 0x1ebd0, 0x1ebde, 0x1ebe6, 0x1ebec, 0x1ec1a, 0x1ec2e, 0x1ec32, 0x1ec34, 0x1ec4e, 0x1ec5c, 0x1ec62, 0x1ec64, 0x1ec68, 0x1ec8e, 0x1ec9c, 0x1ecb8, 0x1ecc2, 0x1ecc4, 0x1ecc8, 0x1ecd0, 0x1ece6, 0x1ecfa, 0x1ed0e, 0x1ed1c, 0x1ed38, 0x1ed70, 0x1ed7e, 0x1ed82, 0x1ed84, 0x1ed88, 0x1ed90, 0x1ed9e, 0x1eda0, 0x1edcc, 0x1edf2, 0x1edf4, 0x1ee16, 0x1ee26, 0x1ee2c, 0x1ee3a, 0x1ee46, 0x1ee4c, 0x1ee58, 0x1ee6e, 0x1ee72, 0x1ee74, 0x1ee86, 0x1ee8c, 0x1ee98, 0x1eeb0, 0x1eebe, 0x1eece, 0x1eedc, 0x1eee2, 0x1eee4, 0x1eee8, 0x1ef12, 0x1ef22, 0x1ef24, 0x1ef28, 0x1ef36, 0x1ef42, 0x1ef44, 0x1ef48, 0x1ef50, 0x1ef5e, 0x1ef66, 0x1ef6c, 0x1ef7a, 0x1efae, 0x1efb2, 0x1efb4, 0x1efd6, 0x1f096, 0x1f0a6, 0x1f0ac, 0x1f0ba, 0x1f0ca, 0x1f0d2, 0x1f0d4, 0x1f116, 0x1f126, 0x1f12c, 0x1f13a, 0x1f146, 0x1f14c, 0x1f158, 0x1f16e, 0x1f172, 0x1f174, 0x1f18a, 0x1f192, 0x1f194, 0x1f1a2, 0x1f1a4, 0x1f1a8, 0x1f1da, 0x1f216, 0x1f226, 0x1f22c, 0x1f23a, 0x1f246, 0x1f258, 0x1f26e, 0x1f272, 0x1f274, 0x1f286, 0x1f28c, 0x1f298, 0x1f2b0, 0x1f2be, 0x1f2ce, 0x1f2dc, 0x1f2e2, 0x1f2e4, 0x1f2e8, 0x1f2f6, 0x1f30a, 0x1f312, 0x1f314, 0x1f322, 0x1f328, 0x1f342, 0x1f344, 0x1f348, 0x1f350, 0x1f35e, 0x1f366, 0x1f37a, 0x1f39a, 0x1f3ae, 0x1f3b2, 0x1f3b4, 0x1f416, 0x1f426, 0x1f42c, 0x1f43a, 0x1f446, 0x1f44c, 0x1f458, 0x1f46e, 0x1f472, 0x1f474, 0x1f486, 0x1f48c, 0x1f498, 0x1f4b0, 0x1f4be, 0x1f4ce, 0x1f4dc, 0x1f4e2, 0x1f4e4, 0x1f4e8, 0x1f4f6, 0x1f506, 0x1f50c, 0x1f518, 0x1f530, 0x1f53e, 0x1f560, 0x1f57c, 0x1f58e, 0x1f59c, 0x1f5b8, 0x1f5c2, 0x1f5c4, 0x1f5c8, 0x1f5d0, 0x1f5de, 0x1f5e6, 0x1f5ec, 0x1f5fa, 0x1f60a, 0x1f612, 0x1f614, 0x1f622, 0x1f624, 0x1f628, 0x1f636, 0x1f642, 0x1f644, 0x1f648, 0x1f650, 0x1f65e, 0x1f666, 0x1f67a, 0x1f682, 0x1f684, 0x1f688, 0x1f690, 0x1f69e, 0x1f6a0, 0x1f6bc, 0x1f6cc, 0x1f6f2, 0x1f6f4, 0x1f71a, 0x1f72e, 0x1f732, 0x1f734, 0x1f74e, 0x1f75c, 0x1f762, 0x1f764, 0x1f768, 0x1f776, 0x1f796, 0x1f7a6, 0x1f7ac, 0x1f7ba, 0x1f7d2, 0x1f7d4, 0x1f89a, 0x1f8ae, 0x1f8b2, 0x1f8b4, 0x1f8d6, 0x1f8ea, 0x1f91a, 0x1f92e, 0x1f932, 0x1f934, 0x1f94e, 0x1f95c, 0x1f962, 0x1f964, 0x1f968, 0x1f976, 0x1f996, 0x1f9a6, 0x1f9ac, 0x1f9ba, 0x1f9ca, 0x1f9d2, 0x1f9d4, 0x1fa1a, 0x1fa2e, 0x1fa32, 0x1fa34, 0x1fa4e, 0x1fa5c, 0x1fa62, 0x1fa64, 0x1fa68, 0x1fa76, 0x1fa8e, 0x1fa9c, 0x1fab8, 0x1fac2, 0x1fac4, 0x1fac8, 0x1fad0, 0x1fade, 0x1fae6, 0x1faec, 0x1fb16, 0x1fb26, 0x1fb2c, 0x1fb3a, 0x1fb46, 0x1fb4c, 0x1fb58, 0x1fb6e, 0x1fb72, 0x1fb74, 0x1fb8a, 0x1fb92, 0x1fb94, 0x1fba2, 0x1fba4, 0x1fba8, 0x1fbb6, 0x1fbda }; /** * This table contains to codewords for all symbols. */ static const std::array CODEWORD_TABLE = { 2627, 1819, 2622, 2621, 1813, 1812, 2729, 2724, 2723, 2779, 2774, 2773, 902, 896, 908, 868, 865, 861, 859, 2511, 873, 871, 1780, 835, 2493, 825, 2491, 842, 837, 844, 1764, 1762, 811, 810, 809, 2483, 807, 2482, 806, 2480, 815, 814, 813, 812, 2484, 817, 816, 1745, 1744, 1742, 1746, 2655, 2637, 2635, 2626, 2625, 2623, 2628, 1820, 2752, 2739, 2737, 2728, 2727, 2725, 2730, 2785, 2783, 2778, 2777, 2775, 2780, 787, 781, 747, 739, 736, 2413, 754, 752, 1719, 692, 689, 681, 2371, 678, 2369, 700, 697, 694, 703, 1688, 1686, 642, 638, 2343, 631, 2341, 627, 2338, 651, 646, 643, 2345, 654, 652, 1652, 1650, 1647, 1654, 601, 599, 2322, 596, 2321, 594, 2319, 2317, 611, 610, 608, 606, 2324, 603, 2323, 615, 614, 612, 1617, 1616, 1614, 1612, 616, 1619, 1618, 2575, 2538, 2536, 905, 901, 898, 909, 2509, 2507, 2504, 870, 867, 864, 860, 2512, 875, 872, 1781, 2490, 2489, 2487, 2485, 1748, 836, 834, 832, 830, 2494, 827, 2492, 843, 841, 839, 845, 1765, 1763, 2701, 2676, 2674, 2653, 2648, 2656, 2634, 2633, 2631, 2629, 1821, 2638, 2636, 2770, 2763, 2761, 2750, 2745, 2753, 2736, 2735, 2733, 2731, 1848, 2740, 2738, 2786, 2784, 591, 588, 576, 569, 566, 2296, 1590, 537, 534, 526, 2276, 522, 2274, 545, 542, 539, 548, 1572, 1570, 481, 2245, 466, 2242, 462, 2239, 492, 485, 482, 2249, 496, 494, 1534, 1531, 1528, 1538, 413, 2196, 406, 2191, 2188, 425, 419, 2202, 415, 2199, 432, 430, 427, 1472, 1467, 1464, 433, 1476, 1474, 368, 367, 2160, 365, 2159, 362, 2157, 2155, 2152, 378, 377, 375, 2166, 372, 2165, 369, 2162, 383, 381, 379, 2168, 1419, 1418, 1416, 1414, 385, 1411, 384, 1423, 1422, 1420, 1424, 2461, 802, 2441, 2439, 790, 786, 783, 794, 2409, 2406, 2403, 750, 742, 738, 2414, 756, 753, 1720, 2367, 2365, 2362, 2359, 1663, 693, 691, 684, 2373, 680, 2370, 702, 699, 696, 704, 1690, 1687, 2337, 2336, 2334, 2332, 1624, 2329, 1622, 640, 637, 2344, 634, 2342, 630, 2340, 650, 648, 645, 2346, 655, 653, 1653, 1651, 1649, 1655, 2612, 2597, 2595, 2571, 2568, 2565, 2576, 2534, 2529, 2526, 1787, 2540, 2537, 907, 904, 900, 910, 2503, 2502, 2500, 2498, 1768, 2495, 1767, 2510, 2508, 2506, 869, 866, 863, 2513, 876, 874, 1782, 2720, 2713, 2711, 2697, 2694, 2691, 2702, 2672, 2670, 2664, 1828, 2678, 2675, 2647, 2646, 2644, 2642, 1823, 2639, 1822, 2654, 2652, 2650, 2657, 2771, 1855, 2765, 2762, 1850, 1849, 2751, 2749, 2747, 2754, 353, 2148, 344, 342, 336, 2142, 332, 2140, 345, 1375, 1373, 306, 2130, 299, 2128, 295, 2125, 319, 314, 311, 2132, 1354, 1352, 1349, 1356, 262, 257, 2101, 253, 2096, 2093, 274, 273, 267, 2107, 263, 2104, 280, 278, 275, 1316, 1311, 1308, 1320, 1318, 2052, 202, 2050, 2044, 2040, 219, 2063, 212, 2060, 208, 2055, 224, 221, 2066, 1260, 1258, 1252, 231, 1248, 229, 1266, 1264, 1261, 1268, 155, 1998, 153, 1996, 1994, 1991, 1988, 165, 164, 2007, 162, 2006, 159, 2003, 2000, 172, 171, 169, 2012, 166, 2010, 1186, 1184, 1182, 1179, 175, 1176, 173, 1192, 1191, 1189, 1187, 176, 1194, 1193, 2313, 2307, 2305, 592, 589, 2294, 2292, 2289, 578, 572, 568, 2297, 580, 1591, 2272, 2267, 2264, 1547, 538, 536, 529, 2278, 525, 2275, 547, 544, 541, 1574, 1571, 2237, 2235, 2229, 1493, 2225, 1489, 478, 2247, 470, 2244, 465, 2241, 493, 488, 484, 2250, 498, 495, 1536, 1533, 1530, 1539, 2187, 2186, 2184, 2182, 1432, 2179, 1430, 2176, 1427, 414, 412, 2197, 409, 2195, 405, 2193, 2190, 426, 424, 421, 2203, 418, 2201, 431, 429, 1473, 1471, 1469, 1466, 434, 1477, 1475, 2478, 2472, 2470, 2459, 2457, 2454, 2462, 803, 2437, 2432, 2429, 1726, 2443, 2440, 792, 789, 785, 2401, 2399, 2393, 1702, 2389, 1699, 2411, 2408, 2405, 745, 741, 2415, 758, 755, 1721, 2358, 2357, 2355, 2353, 1661, 2350, 1660, 2347, 1657, 2368, 2366, 2364, 2361, 1666, 690, 687, 2374, 683, 2372, 701, 698, 705, 1691, 1689, 2619, 2617, 2610, 2608, 2605, 2613, 2593, 2588, 2585, 1803, 2599, 2596, 2563, 2561, 2555, 1797, 2551, 1795, 2573, 2570, 2567, 2577, 2525, 2524, 2522, 2520, 1786, 2517, 1785, 2514, 1783, 2535, 2533, 2531, 2528, 1788, 2541, 2539, 906, 903, 911, 2721, 1844, 2715, 2712, 1838, 1836, 2699, 2696, 2693, 2703, 1827, 1826, 1824, 2673, 2671, 2669, 2666, 1829, 2679, 2677, 1858, 1857, 2772, 1854, 1853, 1851, 1856, 2766, 2764, 143, 1987, 139, 1986, 135, 133, 131, 1984, 128, 1983, 125, 1981, 138, 137, 136, 1985, 1133, 1132, 1130, 112, 110, 1974, 107, 1973, 104, 1971, 1969, 122, 121, 119, 117, 1977, 114, 1976, 124, 1115, 1114, 1112, 1110, 1117, 1116, 84, 83, 1953, 81, 1952, 78, 1950, 1948, 1945, 94, 93, 91, 1959, 88, 1958, 85, 1955, 99, 97, 95, 1961, 1086, 1085, 1083, 1081, 1078, 100, 1090, 1089, 1087, 1091, 49, 47, 1917, 44, 1915, 1913, 1910, 1907, 59, 1926, 56, 1925, 53, 1922, 1919, 66, 64, 1931, 61, 1929, 1042, 1040, 1038, 71, 1035, 70, 1032, 68, 1048, 1047, 1045, 1043, 1050, 1049, 12, 10, 1869, 1867, 1864, 1861, 21, 1880, 19, 1877, 1874, 1871, 28, 1888, 25, 1886, 22, 1883, 982, 980, 977, 974, 32, 30, 991, 989, 987, 984, 34, 995, 994, 992, 2151, 2150, 2147, 2146, 2144, 356, 355, 354, 2149, 2139, 2138, 2136, 2134, 1359, 343, 341, 338, 2143, 335, 2141, 348, 347, 346, 1376, 1374, 2124, 2123, 2121, 2119, 1326, 2116, 1324, 310, 308, 305, 2131, 302, 2129, 298, 2127, 320, 318, 316, 313, 2133, 322, 321, 1355, 1353, 1351, 1357, 2092, 2091, 2089, 2087, 1276, 2084, 1274, 2081, 1271, 259, 2102, 256, 2100, 252, 2098, 2095, 272, 269, 2108, 266, 2106, 281, 279, 277, 1317, 1315, 1313, 1310, 282, 1321, 1319, 2039, 2037, 2035, 2032, 1203, 2029, 1200, 1197, 207, 2053, 205, 2051, 201, 2049, 2046, 2043, 220, 218, 2064, 215, 2062, 211, 2059, 228, 226, 223, 2069, 1259, 1257, 1254, 232, 1251, 230, 1267, 1265, 1263, 2316, 2315, 2312, 2311, 2309, 2314, 2304, 2303, 2301, 2299, 1593, 2308, 2306, 590, 2288, 2287, 2285, 2283, 1578, 2280, 1577, 2295, 2293, 2291, 579, 577, 574, 571, 2298, 582, 581, 1592, 2263, 2262, 2260, 2258, 1545, 2255, 1544, 2252, 1541, 2273, 2271, 2269, 2266, 1550, 535, 532, 2279, 528, 2277, 546, 543, 549, 1575, 1573, 2224, 2222, 2220, 1486, 2217, 1485, 2214, 1482, 1479, 2238, 2236, 2234, 2231, 1496, 2228, 1492, 480, 477, 2248, 473, 2246, 469, 2243, 490, 487, 2251, 497, 1537, 1535, 1532, 2477, 2476, 2474, 2479, 2469, 2468, 2466, 2464, 1730, 2473, 2471, 2453, 2452, 2450, 2448, 1729, 2445, 1728, 2460, 2458, 2456, 2463, 805, 804, 2428, 2427, 2425, 2423, 1725, 2420, 1724, 2417, 1722, 2438, 2436, 2434, 2431, 1727, 2444, 2442, 793, 791, 788, 795, 2388, 2386, 2384, 1697, 2381, 1696, 2378, 1694, 1692, 2402, 2400, 2398, 2395, 1703, 2392, 1701, 2412, 2410, 2407, 751, 748, 744, 2416, 759, 757, 1807, 2620, 2618, 1806, 1805, 2611, 2609, 2607, 2614, 1802, 1801, 1799, 2594, 2592, 2590, 2587, 1804, 2600, 2598, 1794, 1793, 1791, 1789, 2564, 2562, 2560, 2557, 1798, 2554, 1796, 2574, 2572, 2569, 2578, 1847, 1846, 2722, 1843, 1842, 1840, 1845, 2716, 2714, 1835, 1834, 1832, 1830, 1839, 1837, 2700, 2698, 2695, 2704, 1817, 1811, 1810, 897, 862, 1777, 829, 826, 838, 1760, 1758, 808, 2481, 1741, 1740, 1738, 1743, 2624, 1818, 2726, 2776, 782, 740, 737, 1715, 686, 679, 695, 1682, 1680, 639, 628, 2339, 647, 644, 1645, 1643, 1640, 1648, 602, 600, 597, 595, 2320, 593, 2318, 609, 607, 604, 1611, 1610, 1608, 1606, 613, 1615, 1613, 2328, 926, 924, 892, 886, 899, 857, 850, 2505, 1778, 824, 823, 821, 819, 2488, 818, 2486, 833, 831, 828, 840, 1761, 1759, 2649, 2632, 2630, 2746, 2734, 2732, 2782, 2781, 570, 567, 1587, 531, 527, 523, 540, 1566, 1564, 476, 467, 463, 2240, 486, 483, 1524, 1521, 1518, 1529, 411, 403, 2192, 399, 2189, 423, 416, 1462, 1457, 1454, 428, 1468, 1465, 2210, 366, 363, 2158, 360, 2156, 357, 2153, 376, 373, 370, 2163, 1410, 1409, 1407, 1405, 382, 1402, 380, 1417, 1415, 1412, 1421, 2175, 2174, 777, 774, 771, 784, 732, 725, 722, 2404, 743, 1716, 676, 674, 668, 2363, 665, 2360, 685, 1684, 1681, 626, 624, 622, 2335, 620, 2333, 617, 2330, 641, 635, 649, 1646, 1644, 1642, 2566, 928, 925, 2530, 2527, 894, 891, 888, 2501, 2499, 2496, 858, 856, 854, 851, 1779, 2692, 2668, 2665, 2645, 2643, 2640, 2651, 2768, 2759, 2757, 2744, 2743, 2741, 2748, 352, 1382, 340, 337, 333, 1371, 1369, 307, 300, 296, 2126, 315, 312, 1347, 1342, 1350, 261, 258, 250, 2097, 246, 2094, 271, 268, 264, 1306, 1301, 1298, 276, 1312, 1309, 2115, 203, 2048, 195, 2045, 191, 2041, 213, 209, 2056, 1246, 1244, 1238, 225, 1234, 222, 1256, 1253, 1249, 1262, 2080, 2079, 154, 1997, 150, 1995, 147, 1992, 1989, 163, 160, 2004, 156, 2001, 1175, 1174, 1172, 1170, 1167, 170, 1164, 167, 1185, 1183, 1180, 1177, 174, 1190, 1188, 2025, 2024, 2022, 587, 586, 564, 559, 556, 2290, 573, 1588, 520, 518, 512, 2268, 508, 2265, 530, 1568, 1565, 461, 457, 2233, 450, 2230, 446, 2226, 479, 471, 489, 1526, 1523, 1520, 397, 395, 2185, 392, 2183, 389, 2180, 2177, 410, 2194, 402, 422, 1463, 1461, 1459, 1456, 1470, 2455, 799, 2433, 2430, 779, 776, 773, 2397, 2394, 2390, 734, 728, 724, 746, 1717, 2356, 2354, 2351, 2348, 1658, 677, 675, 673, 670, 667, 688, 1685, 1683, 2606, 2589, 2586, 2559, 2556, 2552, 927, 2523, 2521, 2518, 2515, 1784, 2532, 895, 893, 890, 2718, 2709, 2707, 2689, 2687, 2684, 2663, 2662, 2660, 2658, 1825, 2667, 2769, 1852, 2760, 2758, 142, 141, 1139, 1138, 134, 132, 129, 126, 1982, 1129, 1128, 1126, 1131, 113, 111, 108, 105, 1972, 101, 1970, 120, 118, 115, 1109, 1108, 1106, 1104, 123, 1113, 1111, 82, 79, 1951, 75, 1949, 72, 1946, 92, 89, 86, 1956, 1077, 1076, 1074, 1072, 98, 1069, 96, 1084, 1082, 1079, 1088, 1968, 1967, 48, 45, 1916, 42, 1914, 39, 1911, 1908, 60, 57, 54, 1923, 50, 1920, 1031, 1030, 1028, 1026, 67, 1023, 65, 1020, 62, 1041, 1039, 1036, 1033, 69, 1046, 1044, 1944, 1943, 1941, 11, 9, 1868, 7, 1865, 1862, 1859, 20, 1878, 16, 1875, 13, 1872, 970, 968, 966, 963, 29, 960, 26, 23, 983, 981, 978, 975, 33, 971, 31, 990, 988, 985, 1906, 1904, 1902, 993, 351, 2145, 1383, 331, 330, 328, 326, 2137, 323, 2135, 339, 1372, 1370, 294, 293, 291, 289, 2122, 286, 2120, 283, 2117, 309, 303, 317, 1348, 1346, 1344, 245, 244, 242, 2090, 239, 2088, 236, 2085, 2082, 260, 2099, 249, 270, 1307, 1305, 1303, 1300, 1314, 189, 2038, 186, 2036, 183, 2033, 2030, 2026, 206, 198, 2047, 194, 216, 1247, 1245, 1243, 1240, 227, 1237, 1255, 2310, 2302, 2300, 2286, 2284, 2281, 565, 563, 561, 558, 575, 1589, 2261, 2259, 2256, 2253, 1542, 521, 519, 517, 514, 2270, 511, 533, 1569, 1567, 2223, 2221, 2218, 2215, 1483, 2211, 1480, 459, 456, 453, 2232, 449, 474, 491, 1527, 1525, 1522, 2475, 2467, 2465, 2451, 2449, 2446, 801, 800, 2426, 2424, 2421, 2418, 1723, 2435, 780, 778, 775, 2387, 2385, 2382, 2379, 1695, 2375, 1693, 2396, 735, 733, 730, 727, 749, 1718, 2616, 2615, 2604, 2603, 2601, 2584, 2583, 2581, 2579, 1800, 2591, 2550, 2549, 2547, 2545, 1792, 2542, 1790, 2558, 929, 2719, 1841, 2710, 2708, 1833, 1831, 2690, 2688, 2686, 1815, 1809, 1808, 1774, 1756, 1754, 1737, 1736, 1734, 1739, 1816, 1711, 1676, 1674, 633, 629, 1638, 1636, 1633, 1641, 598, 1605, 1604, 1602, 1600, 605, 1609, 1607, 2327, 887, 853, 1775, 822, 820, 1757, 1755, 1584, 524, 1560, 1558, 468, 464, 1514, 1511, 1508, 1519, 408, 404, 400, 1452, 1447, 1444, 417, 1458, 1455, 2208, 364, 361, 358, 2154, 1401, 1400, 1398, 1396, 374, 1393, 371, 1408, 1406, 1403, 1413, 2173, 2172, 772, 726, 723, 1712, 672, 669, 666, 682, 1678, 1675, 625, 623, 621, 618, 2331, 636, 632, 1639, 1637, 1635, 920, 918, 884, 880, 889, 849, 848, 847, 846, 2497, 855, 852, 1776, 2641, 2742, 2787, 1380, 334, 1367, 1365, 301, 297, 1340, 1338, 1335, 1343, 255, 251, 247, 1296, 1291, 1288, 265, 1302, 1299, 2113, 204, 196, 192, 2042, 1232, 1230, 1224, 214, 1220, 210, 1242, 1239, 1235, 1250, 2077, 2075, 151, 148, 1993, 144, 1990, 1163, 1162, 1160, 1158, 1155, 161, 1152, 157, 1173, 1171, 1168, 1165, 168, 1181, 1178, 2021, 2020, 2018, 2023, 585, 560, 557, 1585, 516, 509, 1562, 1559, 458, 447, 2227, 472, 1516, 1513, 1510, 398, 396, 393, 390, 2181, 386, 2178, 407, 1453, 1451, 1449, 1446, 420, 1460, 2209, 769, 764, 720, 712, 2391, 729, 1713, 664, 663, 661, 659, 2352, 656, 2349, 671, 1679, 1677, 2553, 922, 919, 2519, 2516, 885, 883, 881, 2685, 2661, 2659, 2767, 2756, 2755, 140, 1137, 1136, 130, 127, 1125, 1124, 1122, 1127, 109, 106, 102, 1103, 1102, 1100, 1098, 116, 1107, 1105, 1980, 80, 76, 73, 1947, 1068, 1067, 1065, 1063, 90, 1060, 87, 1075, 1073, 1070, 1080, 1966, 1965, 46, 43, 40, 1912, 36, 1909, 1019, 1018, 1016, 1014, 58, 1011, 55, 1008, 51, 1029, 1027, 1024, 1021, 63, 1037, 1034, 1940, 1939, 1937, 1942, 8, 1866, 4, 1863, 1, 1860, 956, 954, 952, 949, 946, 17, 14, 969, 967, 964, 961, 27, 957, 24, 979, 976, 972, 1901, 1900, 1898, 1896, 986, 1905, 1903, 350, 349, 1381, 329, 327, 324, 1368, 1366, 292, 290, 287, 284, 2118, 304, 1341, 1339, 1337, 1345, 243, 240, 237, 2086, 233, 2083, 254, 1297, 1295, 1293, 1290, 1304, 2114, 190, 187, 184, 2034, 180, 2031, 177, 2027, 199, 1233, 1231, 1229, 1226, 217, 1223, 1241, 2078, 2076, 584, 555, 554, 552, 550, 2282, 562, 1586, 507, 506, 504, 502, 2257, 499, 2254, 515, 1563, 1561, 445, 443, 441, 2219, 438, 2216, 435, 2212, 460, 454, 475, 1517, 1515, 1512, 2447, 798, 797, 2422, 2419, 770, 768, 766, 2383, 2380, 2376, 721, 719, 717, 714, 731, 1714, 2602, 2582, 2580, 2548, 2546, 2543, 923, 921, 2717, 2706, 2705, 2683, 2682, 2680, 1771, 1752, 1750, 1733, 1732, 1731, 1735, 1814, 1707, 1670, 1668, 1631, 1629, 1626, 1634, 1599, 1598, 1596, 1594, 1603, 1601, 2326, 1772, 1753, 1751, 1581, 1554, 1552, 1504, 1501, 1498, 1509, 1442, 1437, 1434, 401, 1448, 1445, 2206, 1392, 1391, 1389, 1387, 1384, 359, 1399, 1397, 1394, 1404, 2171, 2170, 1708, 1672, 1669, 619, 1632, 1630, 1628, 1773, 1378, 1363, 1361, 1333, 1328, 1336, 1286, 1281, 1278, 248, 1292, 1289, 2111, 1218, 1216, 1210, 197, 1206, 193, 1228, 1225, 1221, 1236, 2073, 2071, 1151, 1150, 1148, 1146, 152, 1143, 149, 1140, 145, 1161, 1159, 1156, 1153, 158, 1169, 1166, 2017, 2016, 2014, 2019, 1582, 510, 1556, 1553, 452, 448, 1506, 1500, 394, 391, 387, 1443, 1441, 1439, 1436, 1450, 2207, 765, 716, 713, 1709, 662, 660, 657, 1673, 1671, 916, 914, 879, 878, 877, 882, 1135, 1134, 1121, 1120, 1118, 1123, 1097, 1096, 1094, 1092, 103, 1101, 1099, 1979, 1059, 1058, 1056, 1054, 77, 1051, 74, 1066, 1064, 1061, 1071, 1964, 1963, 1007, 1006, 1004, 1002, 999, 41, 996, 37, 1017, 1015, 1012, 1009, 52, 1025, 1022, 1936, 1935, 1933, 1938, 942, 940, 938, 935, 932, 5, 2, 955, 953, 950, 947, 18, 943, 15, 965, 962, 958, 1895, 1894, 1892, 1890, 973, 1899, 1897, 1379, 325, 1364, 1362, 288, 285, 1334, 1332, 1330, 241, 238, 234, 1287, 1285, 1283, 1280, 1294, 2112, 188, 185, 181, 178, 2028, 1219, 1217, 1215, 1212, 200, 1209, 1227, 2074, 2072, 583, 553, 551, 1583, 505, 503, 500, 513, 1557, 1555, 444, 442, 439, 436, 2213, 455, 451, 1507, 1505, 1502, 796, 763, 762, 760, 767, 711, 710, 708, 706, 2377, 718, 715, 1710, 2544, 917, 915, 2681, 1627, 1597, 1595, 2325, 1769, 1749, 1747, 1499, 1438, 1435, 2204, 1390, 1388, 1385, 1395, 2169, 2167, 1704, 1665, 1662, 1625, 1623, 1620, 1770, 1329, 1282, 1279, 2109, 1214, 1207, 1222, 2068, 2065, 1149, 1147, 1144, 1141, 146, 1157, 1154, 2013, 2011, 2008, 2015, 1579, 1549, 1546, 1495, 1487, 1433, 1431, 1428, 1425, 388, 1440, 2205, 1705, 658, 1667, 1664, 1119, 1095, 1093, 1978, 1057, 1055, 1052, 1062, 1962, 1960, 1005, 1003, 1000, 997, 38, 1013, 1010, 1932, 1930, 1927, 1934, 941, 939, 936, 933, 6, 930, 3, 951, 948, 944, 1889, 1887, 1884, 1881, 959, 1893, 1891, 35, 1377, 1360, 1358, 1327, 1325, 1322, 1331, 1277, 1275, 1272, 1269, 235, 1284, 2110, 1205, 1204, 1201, 1198, 182, 1195, 179, 1213, 2070, 2067, 1580, 501, 1551, 1548, 440, 437, 1497, 1494, 1490, 1503, 761, 709, 707, 1706, 913, 912, 2198, 1386, 2164, 2161, 1621, 1766, 2103, 1208, 2058, 2054, 1145, 1142, 2005, 2002, 1999, 2009, 1488, 1429, 1426, 2200, 1698, 1659, 1656, 1975, 1053, 1957, 1954, 1001, 998, 1924, 1921, 1918, 1928, 937, 934, 931, 1879, 1876, 1873, 1870, 945, 1885, 1882, 1323, 1273, 1270, 2105, 1202, 1199, 1196, 1211, 2061, 2057, 1576, 1543, 1540, 1484, 1481, 1478, 1491, 1700 }; using RatioTableType = std::array, SYMBOL_COUNT>; using ModuleBitCountType = std::array; static const RatioTableType& GetRatioTable() { auto initTable = [](RatioTableType& table) -> RatioTableType& { for (int i = 0; i < SYMBOL_COUNT; i++) { int currentSymbol = SYMBOL_TABLE[i]; int currentBit = currentSymbol & 0x1; for (int j = 0; j < CodewordDecoder::BARS_IN_MODULE; j++) { float size = 0.0f; while ((currentSymbol & 0x1) == currentBit) { size += 1.0f; currentSymbol >>= 1; } currentBit = currentSymbol & 0x1; table[i][CodewordDecoder::BARS_IN_MODULE - j - 1] = size / CodewordDecoder::MODULES_IN_CODEWORD; } } return table; }; static RatioTableType table; static const auto& ref = initTable(table); return ref; } static ModuleBitCountType SampleBitCounts(const ModuleBitCountType& moduleBitCount) { float bitCountSum = static_cast(std::accumulate(moduleBitCount.begin(), moduleBitCount.end(), 0)); ModuleBitCountType result; result.fill(0); int bitCountIndex = 0; int sumPreviousBits = 0; for (int i = 0; i < CodewordDecoder::MODULES_IN_CODEWORD; i++) { float sampleIndex = bitCountSum / (2 * CodewordDecoder::MODULES_IN_CODEWORD) + (i * bitCountSum) / CodewordDecoder::MODULES_IN_CODEWORD; if (sumPreviousBits + moduleBitCount[bitCountIndex] <= sampleIndex) { sumPreviousBits += moduleBitCount[bitCountIndex]; bitCountIndex++; if (bitCountIndex == (int)moduleBitCount.size()) { // this check is not done in original code, so I guess this should not happen? break; } } result[bitCountIndex]++; } return result; } static int GetBitValue(const ModuleBitCountType& moduleBitCount) { int result = 0; for (size_t i = 0; i < moduleBitCount.size(); i++) { for (int bit = 0; bit < moduleBitCount[i]; bit++) { result = (result << 1) | (i % 2 == 0 ? 1 : 0); } } return result; } static int GetDecodedCodewordValue(const ModuleBitCountType& moduleBitCount) { int decodedValue = GetBitValue(moduleBitCount); return CodewordDecoder::GetCodeword(decodedValue) == -1 ? -1 : decodedValue; } static int GetClosestDecodedValue(const ModuleBitCountType& moduleBitCount) { static const RatioTableType& ratioTable = GetRatioTable(); int bitCountSum = std::accumulate(moduleBitCount.begin(), moduleBitCount.end(), 0); std::array bitCountRatios = {}; if (bitCountSum > 1) { for (int i = 0; i < CodewordDecoder::BARS_IN_MODULE; i++) { bitCountRatios[i] = moduleBitCount[i] / (float)bitCountSum; } } float bestMatchError = std::numeric_limits::max(); int bestMatch = -1; for (size_t j = 0; j < ratioTable.size(); j++) { float error = 0.0f; auto& ratioTableRow = ratioTable[j]; for (int k = 0; k < CodewordDecoder::BARS_IN_MODULE; k++) { float diff = ratioTableRow[k] - bitCountRatios[k]; error += diff * diff; if (error >= bestMatchError) { break; } } if (error < bestMatchError) { bestMatchError = error; bestMatch = SYMBOL_TABLE[j]; } } return bestMatch; } int CodewordDecoder::GetDecodedValue(const std::array& moduleBitCount) { int decodedValue = GetDecodedCodewordValue(SampleBitCounts(moduleBitCount)); if (decodedValue != -1) { return decodedValue; } return GetClosestDecodedValue(moduleBitCount); } /** * @param symbol encoded symbol to translate to a codeword * @return the codeword corresponding to the symbol. */ int CodewordDecoder::GetCodeword(int symbol) { symbol &= 0x3FFFF; auto it = std::lower_bound(SYMBOL_TABLE.begin(), SYMBOL_TABLE.end(), symbol); if (it != SYMBOL_TABLE.end() && *it == symbol) { return (CODEWORD_TABLE[it - SYMBOL_TABLE.begin()] - 1) % NUMBER_OF_CODEWORDS; } return -1; } } // Pdf417 } // ZXing zxing-cpp-1.0.8+ds2/core/src/pdf417/PDFCodewordDecoder.h000066400000000000000000000026541361167020700224200ustar00rootroot00000000000000#pragma once /* * Copyright 2016 Nu-book Inc. * Copyright 2016 ZXing authors * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #include namespace ZXing { namespace Pdf417 { /** * @author Guenther Grau * @author creatale GmbH (christoph.schulz@creatale.de) */ class CodewordDecoder { public: static const int NUMBER_OF_CODEWORDS = 929; // Maximum Codewords (Data + Error). static const int MAX_CODEWORDS_IN_BARCODE = NUMBER_OF_CODEWORDS - 1; // One left row indication column + max 30 data columns + one right row indicator column //public static final int MAX_CODEWORDS_IN_ROW = 32; static const int MODULES_IN_CODEWORD = 17; static const int BARS_IN_MODULE = 8; /** * @param symbol encoded symbol to translate to a codeword * @return the codeword corresponding to the symbol. */ static int GetCodeword(int symbol); static int GetDecodedValue(const std::array& moduleBitCount); }; } // Pdf417 } // ZXing zxing-cpp-1.0.8+ds2/core/src/pdf417/PDFCompaction.h000066400000000000000000000013571361167020700214570ustar00rootroot00000000000000#pragma once /* * Copyright 2016 Huy Cuong Nguyen * Copyright 2016 ZXing authors * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ namespace ZXing { namespace Pdf417 { enum class Compaction { AUTO, TEXT, BYTE, NUMERIC }; } // Pdf417 } // ZXing zxing-cpp-1.0.8+ds2/core/src/pdf417/PDFDecodedBitStreamParser.cpp000066400000000000000000000552211361167020700242340ustar00rootroot00000000000000/* * Copyright 2016 Nu-book Inc. * Copyright 2016 ZXing authors * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #include "PDFDecodedBitStreamParser.h" #include "PDFDecoderResultExtra.h" #include "CharacterSetECI.h" #include "CharacterSet.h" #include "TextDecoder.h" #include "ZXBigInteger.h" #include "ByteArray.h" #include "DecodeStatus.h" #include "DecoderResult.h" #include "ZXStrConvWorkaround.h" #include "ZXTestSupport.h" #include #include namespace ZXing { namespace Pdf417 { enum class Mode { ALPHA, LOWER, MIXED, PUNCT, ALPHA_SHIFT, PUNCT_SHIFT }; static const int TEXT_COMPACTION_MODE_LATCH = 900; static const int BYTE_COMPACTION_MODE_LATCH = 901; static const int NUMERIC_COMPACTION_MODE_LATCH = 902; static const int BYTE_COMPACTION_MODE_LATCH_6 = 924; static const int ECI_USER_DEFINED = 925; static const int ECI_GENERAL_PURPOSE = 926; static const int ECI_CHARSET = 927; static const int BEGIN_MACRO_PDF417_CONTROL_BLOCK = 928; static const int BEGIN_MACRO_PDF417_OPTIONAL_FIELD = 923; static const int MACRO_PDF417_TERMINATOR = 922; static const int MODE_SHIFT_TO_BYTE_COMPACTION_MODE = 913; static const int MAX_NUMERIC_CODEWORDS = 15; static const int MACRO_PDF417_OPTIONAL_FIELD_FILE_NAME = 0; static const int MACRO_PDF417_OPTIONAL_FIELD_SEGMENT_COUNT = 1; static const int MACRO_PDF417_OPTIONAL_FIELD_TIME_STAMP = 2; static const int MACRO_PDF417_OPTIONAL_FIELD_SENDER = 3; static const int MACRO_PDF417_OPTIONAL_FIELD_ADDRESSEE = 4; static const int MACRO_PDF417_OPTIONAL_FIELD_FILE_SIZE = 5; static const int MACRO_PDF417_OPTIONAL_FIELD_CHECKSUM = 6; static const int PL = 25; static const int LL = 27; static const int AS = 27; static const int ML = 28; static const int AL = 28; static const int PS = 29; static const int PAL = 29; static const char* PUNCT_CHARS = ";<>@[\\]_`~!\r\t,:\n-.$/\"|*()?{}'"; static const char* MIXED_CHARS = "0123456789&\r\t,:#-.$/+%*=^"; static const CharacterSet DEFAULT_ENCODING = CharacterSet::ISO8859_1; static const int NUMBER_OF_SEQUENCE_CODEWORDS = 2; /** * The Text Compaction mode includes all the printable ASCII characters * (i.e. values from 32 to 126) and three ASCII control characters: HT or tab * (ASCII value 9), LF or line feed (ASCII value 10), and CR or carriage * return (ASCII value 13). The Text Compaction mode also includes various latch * and shift characters which are used exclusively within the mode. The Text * Compaction mode encodes up to 2 characters per codeword. The compaction rules * for converting data into PDF417 codewords are defined in 5.4.2.2. The sub-mode * switches are defined in 5.4.2.3. * * @param textCompactionData The text compaction data. * @param byteCompactionData The byte compaction data if there * was a mode shift. * @param length The size of the text compaction and byte compaction data. * @param result The decoded data is appended to the result. */ static void DecodeTextCompaction(const std::vector& textCompactionData, const std::vector& byteCompactionData, int length, std::string& result) { // Beginning from an initial state of the Alpha sub-mode // The default compaction mode for PDF417 in effect at the start of each symbol shall always be Text // Compaction mode Alpha sub-mode (uppercase alphabetic). A latch codeword from another mode to the Text // Compaction mode shall always switch to the Text Compaction Alpha sub-mode. Mode subMode = Mode::ALPHA; Mode priorToShiftMode = Mode::ALPHA; int i = 0; while (i < length) { int subModeCh = textCompactionData[i]; char ch = 0; switch (subMode) { case Mode::ALPHA: // Alpha (uppercase alphabetic) if (subModeCh < 26) { // Upper case Alpha Character ch = (char)('A' + subModeCh); } else { if (subModeCh == 26) { ch = ' '; } else if (subModeCh == LL) { subMode = Mode::LOWER; } else if (subModeCh == ML) { subMode = Mode::MIXED; } else if (subModeCh == PS) { // Shift to punctuation priorToShiftMode = subMode; subMode = Mode::PUNCT_SHIFT; } else if (subModeCh == MODE_SHIFT_TO_BYTE_COMPACTION_MODE) { result.push_back((char)byteCompactionData[i]); } else if (subModeCh == TEXT_COMPACTION_MODE_LATCH) { subMode = Mode::ALPHA; } } break; case Mode::LOWER: // Lower (lowercase alphabetic) if (subModeCh < 26) { ch = (char)('a' + subModeCh); } else { if (subModeCh == 26) { ch = ' '; } else if (subModeCh == AS) { // Shift to alpha priorToShiftMode = subMode; subMode = Mode::ALPHA_SHIFT; } else if (subModeCh == ML) { subMode = Mode::MIXED; } else if (subModeCh == PS) { // Shift to punctuation priorToShiftMode = subMode; subMode = Mode::PUNCT_SHIFT; } else if (subModeCh == MODE_SHIFT_TO_BYTE_COMPACTION_MODE) { // TODO Does this need to use the current character encoding? See other occurrences below result.push_back((char)byteCompactionData[i]); } else if (subModeCh == TEXT_COMPACTION_MODE_LATCH) { subMode = Mode::ALPHA; } } break; case Mode::MIXED: // Mixed (numeric and some punctuation) if (subModeCh < PL) { ch = MIXED_CHARS[subModeCh]; } else { if (subModeCh == PL) { subMode = Mode::PUNCT; } else if (subModeCh == 26) { ch = ' '; } else if (subModeCh == LL) { subMode = Mode::LOWER; } else if (subModeCh == AL) { subMode = Mode::ALPHA; } else if (subModeCh == PS) { // Shift to punctuation priorToShiftMode = subMode; subMode = Mode::PUNCT_SHIFT; } else if (subModeCh == MODE_SHIFT_TO_BYTE_COMPACTION_MODE) { result.push_back((char)byteCompactionData[i]); } else if (subModeCh == TEXT_COMPACTION_MODE_LATCH) { subMode = Mode::ALPHA; } } break; case Mode::PUNCT: // Punctuation if (subModeCh < PAL) { ch = PUNCT_CHARS[subModeCh]; } else { if (subModeCh == PAL) { subMode = Mode::ALPHA; } else if (subModeCh == MODE_SHIFT_TO_BYTE_COMPACTION_MODE) { result.push_back((char)byteCompactionData[i]); } else if (subModeCh == TEXT_COMPACTION_MODE_LATCH) { subMode = Mode::ALPHA; } } break; case Mode::ALPHA_SHIFT: // Restore sub-mode subMode = priorToShiftMode; if (subModeCh < 26) { ch = (char)('A' + subModeCh); } else { if (subModeCh == 26) { ch = ' '; } else if (subModeCh == TEXT_COMPACTION_MODE_LATCH) { subMode = Mode::ALPHA; } } break; case Mode::PUNCT_SHIFT: // Restore sub-mode subMode = priorToShiftMode; if (subModeCh < PAL) { ch = PUNCT_CHARS[subModeCh]; } else { if (subModeCh == PAL) { subMode = Mode::ALPHA; } else if (subModeCh == MODE_SHIFT_TO_BYTE_COMPACTION_MODE) { // PS before Shift-to-Byte is used as a padding character, // see 5.4.2.4 of the specification result.push_back((char)byteCompactionData[i]); } else if (subModeCh == TEXT_COMPACTION_MODE_LATCH) { subMode = Mode::ALPHA; } } break; } if (ch != 0) { // Append decoded character to result result.push_back(ch); } i++; } } /** * Text Compaction mode (see 5.4.1.5) permits all printable ASCII characters to be * encoded, i.e. values 32 - 126 inclusive in accordance with ISO/IEC 646 (IRV), as * well as selected control characters. * * @param codewords The array of codewords (data + error) * @param codeIndex The current index into the codeword array. * @param result The decoded data is appended to the result. * @return The next index into the codeword array. */ static int TextCompaction(const std::vector& codewords, int codeIndex, std::string& result) { // 2 character per codeword std::vector textCompactionData((codewords[0] - codeIndex) * 2, 0); // Used to hold the byte compaction value if there is a mode shift std::vector byteCompactionData((codewords[0] - codeIndex) * 2, 0); int index = 0; bool end = false; while ((codeIndex < codewords[0]) && !end) { int code = codewords[codeIndex++]; if (code < TEXT_COMPACTION_MODE_LATCH) { textCompactionData[index] = code / 30; textCompactionData[index + 1] = code % 30; index += 2; } else { switch (code) { case TEXT_COMPACTION_MODE_LATCH: // reinitialize text compaction mode to alpha sub mode textCompactionData[index++] = TEXT_COMPACTION_MODE_LATCH; break; case BYTE_COMPACTION_MODE_LATCH: case BYTE_COMPACTION_MODE_LATCH_6: case NUMERIC_COMPACTION_MODE_LATCH: case BEGIN_MACRO_PDF417_CONTROL_BLOCK: case BEGIN_MACRO_PDF417_OPTIONAL_FIELD: case MACRO_PDF417_TERMINATOR: codeIndex--; end = true; break; case MODE_SHIFT_TO_BYTE_COMPACTION_MODE: // The Mode Shift codeword 913 shall cause a temporary // switch from Text Compaction mode to Byte Compaction mode. // This switch shall be in effect for only the next codeword, // after which the mode shall revert to the prevailing sub-mode // of the Text Compaction mode. Codeword 913 is only available // in Text Compaction mode; its use is described in 5.4.2.4. textCompactionData[index] = MODE_SHIFT_TO_BYTE_COMPACTION_MODE; code = codewords[codeIndex++]; byteCompactionData[index] = code; index++; break; } } } DecodeTextCompaction(textCompactionData, byteCompactionData, index, result); return codeIndex; } /** * Byte Compaction mode (see 5.4.3) permits all 256 possible 8-bit byte values to be encoded. * This includes all ASCII characters value 0 to 127 inclusive and provides for international * character set support. * * @param mode The byte compaction mode i.e. 901 or 924 * @param codewords The array of codewords (data + error) * @param encoding Currently active character encoding * @param codeIndex The current index into the codeword array. * @param result The decoded data is appended to the result. * @return The next index into the codeword array. */ static int ByteCompaction(int mode, const std::vector& codewords, CharacterSet encoding, int codeIndex, std::wstring& result) { ByteArray decodedBytes; if (mode == BYTE_COMPACTION_MODE_LATCH) { // Total number of Byte Compaction characters to be encoded // is not a multiple of 6 int count = 0; int64_t value = 0; std::array byteCompactedCodewords = {}; bool end = false; int nextCode = codewords[codeIndex++]; while ((codeIndex < codewords[0]) && !end) { byteCompactedCodewords[count++] = nextCode; // Base 900 value = 900 * value + nextCode; nextCode = codewords[codeIndex++]; // perhaps it should be ok to check only nextCode >= TEXT_COMPACTION_MODE_LATCH if (nextCode == TEXT_COMPACTION_MODE_LATCH || nextCode == BYTE_COMPACTION_MODE_LATCH || nextCode == NUMERIC_COMPACTION_MODE_LATCH || nextCode == BYTE_COMPACTION_MODE_LATCH_6 || nextCode == BEGIN_MACRO_PDF417_CONTROL_BLOCK || nextCode == BEGIN_MACRO_PDF417_OPTIONAL_FIELD || nextCode == MACRO_PDF417_TERMINATOR) { codeIndex--; end = true; } else { if ((count % 5 == 0) && (count > 0)) { // Decode every 5 codewords // Convert to Base 256 for (int j = 0; j < 6; ++j) { decodedBytes.push_back((uint8_t)(value >> (8 * (5 - j)))); } value = 0; count = 0; } } } // if the end of all codewords is reached the last codeword needs to be added if (codeIndex == codewords[0] && nextCode < TEXT_COMPACTION_MODE_LATCH) { byteCompactedCodewords[count++] = nextCode; } // If Byte Compaction mode is invoked with codeword 901, // the last group of codewords is interpreted directly // as one byte per codeword, without compaction. for (int i = 0; i < count; i++) { decodedBytes.push_back((uint8_t)byteCompactedCodewords[i]); } } else if (mode == BYTE_COMPACTION_MODE_LATCH_6) { // Total number of Byte Compaction characters to be encoded // is an integer multiple of 6 int count = 0; int64_t value = 0; bool end = false; while (codeIndex < codewords[0] && !end) { int code = codewords[codeIndex++]; if (code < TEXT_COMPACTION_MODE_LATCH) { count++; // Base 900 value = 900 * value + code; } else { if (code == TEXT_COMPACTION_MODE_LATCH || code == BYTE_COMPACTION_MODE_LATCH || code == NUMERIC_COMPACTION_MODE_LATCH || code == BYTE_COMPACTION_MODE_LATCH_6 || code == BEGIN_MACRO_PDF417_CONTROL_BLOCK || code == BEGIN_MACRO_PDF417_OPTIONAL_FIELD || code == MACRO_PDF417_TERMINATOR) { codeIndex--; end = true; } } if ((count % 5 == 0) && (count > 0)) { // Decode every 5 codewords // Convert to Base 256 for (int j = 0; j < 6; ++j) { decodedBytes.push_back((uint8_t)(value >> (8 * (5 - j)))); } value = 0; count = 0; } } } TextDecoder::Append(result, decodedBytes.data(), decodedBytes.length(), encoding); return codeIndex; } /** * Convert a list of Numeric Compacted codewords from Base 900 to Base 10. * * @param codewords The array of codewords * @param count The number of codewords * @return The decoded string representing the Numeric data. */ /* EXAMPLE Encode the fifteen digit numeric string 000213298174000 Prefix the numeric string with a 1 and set the initial value of t = 1 000 213 298 174 000 Calculate codeword 0 d0 = 1 000 213 298 174 000 mod 900 = 200 t = 1 000 213 298 174 000 div 900 = 1 111 348 109 082 Calculate codeword 1 d1 = 1 111 348 109 082 mod 900 = 282 t = 1 111 348 109 082 div 900 = 1 234 831 232 Calculate codeword 2 d2 = 1 234 831 232 mod 900 = 632 t = 1 234 831 232 div 900 = 1 372 034 Calculate codeword 3 d3 = 1 372 034 mod 900 = 434 t = 1 372 034 div 900 = 1 524 Calculate codeword 4 d4 = 1 524 mod 900 = 624 t = 1 524 div 900 = 1 Calculate codeword 5 d5 = 1 mod 900 = 1 t = 1 div 900 = 0 Codeword sequence is: 1, 624, 434, 632, 282, 200 Decode the above codewords involves 1 x 900 power of 5 + 624 x 900 power of 4 + 434 x 900 power of 3 + 632 x 900 power of 2 + 282 x 900 power of 1 + 200 x 900 power of 0 = 1000213298174000 Remove leading 1 => Result is 000213298174000 */ static DecodeStatus DecodeBase900toBase10(const std::vector& codewords, int count, std::string& resultString) { // Table containing values for the exponent of 900. static const auto EXP900 = []() { std::array table = {1, 900}; for (size_t i = 2; i < table.size(); ++i) { table[i] = table[i - 1] * 900; } return table; }(); assert(count <= 16); BigInteger result; for (int i = 0; i < count; i++) { result += EXP900[count - i - 1] * codewords[i]; } resultString = result.toString(); if (!resultString.empty() && resultString.front() == '1') { resultString = resultString.substr(1); return DecodeStatus::NoError; } return DecodeStatus::FormatError; } /** * Numeric Compaction mode (see 5.4.4) permits efficient encoding of numeric data strings. * * @param codewords The array of codewords (data + error) * @param codeIndex The current index into the codeword array. * @param result The decoded data is appended to the result. * @return The next index into the codeword array. */ static DecodeStatus NumericCompaction(const std::vector& codewords, int codeIndex, std::string& result, int& next) { int count = 0; bool end = false; std::vector numericCodewords(MAX_NUMERIC_CODEWORDS); while (codeIndex < codewords[0] && !end) { int code = codewords[codeIndex++]; if (codeIndex == codewords[0]) { end = true; } if (code < TEXT_COMPACTION_MODE_LATCH) { numericCodewords[count] = code; count++; } else { if (code == TEXT_COMPACTION_MODE_LATCH || code == BYTE_COMPACTION_MODE_LATCH || code == BYTE_COMPACTION_MODE_LATCH_6 || code == BEGIN_MACRO_PDF417_CONTROL_BLOCK || code == BEGIN_MACRO_PDF417_OPTIONAL_FIELD || code == MACRO_PDF417_TERMINATOR) { codeIndex--; end = true; } } if (count % MAX_NUMERIC_CODEWORDS == 0 || code == NUMERIC_COMPACTION_MODE_LATCH || end) { // Re-invoking Numeric Compaction mode (by using codeword 902 // while in Numeric Compaction mode) serves to terminate the // current Numeric Compaction mode grouping as described in 5.4.4.2, // and then to start a new one grouping. if (count > 0) { std::string tmp; auto status = DecodeBase900toBase10(numericCodewords, count, tmp); if (StatusIsError(status)) { return status; } result += tmp; count = 0; } } } next = codeIndex; return DecodeStatus::NoError; } ZXING_EXPORT_TEST_ONLY DecodeStatus DecodeMacroBlock(const std::vector& codewords, int codeIndex, DecoderResultExtra& resultMetadata, int& next) { if (codeIndex + NUMBER_OF_SEQUENCE_CODEWORDS > codewords[0]) { // we must have at least two bytes left for the segment index return DecodeStatus::FormatError; } std::vector segmentIndexArray(NUMBER_OF_SEQUENCE_CODEWORDS); for (int i = 0; i < NUMBER_OF_SEQUENCE_CODEWORDS; i++, codeIndex++) { segmentIndexArray[i] = codewords[codeIndex]; } std::string strBuf; DecodeStatus status = DecodeBase900toBase10(segmentIndexArray, NUMBER_OF_SEQUENCE_CODEWORDS, strBuf); if (StatusIsError(status)) { return status; } resultMetadata.setSegmentIndex(std::stoi(strBuf)); std::string fileId; codeIndex = TextCompaction(codewords, codeIndex, fileId); resultMetadata.setFileId(fileId); int optionalFieldsStart = -1; if (codewords[codeIndex] == BEGIN_MACRO_PDF417_OPTIONAL_FIELD) { optionalFieldsStart = codeIndex + 1; } while (codeIndex < codewords[0]) { switch (codewords[codeIndex]) { case BEGIN_MACRO_PDF417_OPTIONAL_FIELD: { codeIndex++; switch (codewords[codeIndex]) { case MACRO_PDF417_OPTIONAL_FIELD_FILE_NAME: { std::string fileName; codeIndex = TextCompaction(codewords, codeIndex + 1, fileName); resultMetadata.setFileName(fileName); break; } case MACRO_PDF417_OPTIONAL_FIELD_SENDER: { std::string sender; codeIndex = TextCompaction(codewords, codeIndex + 1, sender); resultMetadata.setSender(sender); break; } case MACRO_PDF417_OPTIONAL_FIELD_ADDRESSEE: { std::string addressee; codeIndex = TextCompaction(codewords, codeIndex + 1, addressee); resultMetadata.setAddressee(addressee); break; } case MACRO_PDF417_OPTIONAL_FIELD_SEGMENT_COUNT: { std::string segmentCount; status = NumericCompaction(codewords, codeIndex + 1, segmentCount, codeIndex); resultMetadata.setSegmentCount(std::stoi(segmentCount)); break; } case MACRO_PDF417_OPTIONAL_FIELD_TIME_STAMP: { std::string timestamp; status = NumericCompaction(codewords, codeIndex + 1, timestamp, codeIndex); resultMetadata.setTimestamp(std::stoll(timestamp)); break; } case MACRO_PDF417_OPTIONAL_FIELD_CHECKSUM: { std::string checksum; status = NumericCompaction(codewords, codeIndex + 1, checksum, codeIndex); resultMetadata.setChecksum(std::stoi(checksum)); break; } case MACRO_PDF417_OPTIONAL_FIELD_FILE_SIZE: { std::string fileSize; status = NumericCompaction(codewords, codeIndex + 1, fileSize, codeIndex); resultMetadata.setFileSize(std::stoll(fileSize)); break; } default: { status = DecodeStatus::FormatError; break; } } break; } case MACRO_PDF417_TERMINATOR: { codeIndex++; resultMetadata.setLastSegment(true); break; } default: { status = DecodeStatus::FormatError; break; } if (StatusIsError(status)) { return status; } } } // copy optional fields to additional options if (optionalFieldsStart != -1) { int optionalFieldsLength = codeIndex - optionalFieldsStart; if (resultMetadata.isLastSegment()) { // do not include terminator optionalFieldsLength--; } resultMetadata.setOptionalData(std::vector(codewords.begin() + optionalFieldsStart, codewords.begin() + optionalFieldsStart + optionalFieldsLength)); } next = codeIndex; return DecodeStatus::NoError; } DecoderResult DecodedBitStreamParser::Decode(const std::vector& codewords, int ecLevel) { std::wstring resultString; auto encoding = DEFAULT_ENCODING; // Get compaction mode int codeIndex = 1; int code = codewords[codeIndex++]; auto resultMetadata = std::make_shared(); DecodeStatus status = DecodeStatus::NoError; while (codeIndex < codewords[0] && status == DecodeStatus::NoError) { switch (code) { case TEXT_COMPACTION_MODE_LATCH: { std::string buf; codeIndex = TextCompaction(codewords, codeIndex, buf); TextDecoder::AppendLatin1(resultString, buf); break; } case BYTE_COMPACTION_MODE_LATCH: case BYTE_COMPACTION_MODE_LATCH_6: codeIndex = ByteCompaction(code, codewords, encoding, codeIndex, resultString); break; case MODE_SHIFT_TO_BYTE_COMPACTION_MODE: resultString.push_back((wchar_t)codewords[codeIndex++]); break; case NUMERIC_COMPACTION_MODE_LATCH: { std::string buf; status = NumericCompaction(codewords, codeIndex, buf, codeIndex); TextDecoder::AppendLatin1(resultString, buf); break; } case ECI_CHARSET: encoding = CharacterSetECI::CharsetFromValue(codewords[codeIndex++]); break; case ECI_GENERAL_PURPOSE: // Can't do anything with generic ECI; skip its 2 characters codeIndex += 2; break; case ECI_USER_DEFINED: // Can't do anything with user ECI; skip its 1 character codeIndex++; break; case BEGIN_MACRO_PDF417_CONTROL_BLOCK: status = DecodeMacroBlock(codewords, codeIndex, *resultMetadata, codeIndex); break; case BEGIN_MACRO_PDF417_OPTIONAL_FIELD: case MACRO_PDF417_TERMINATOR: // Should not see these outside a macro block status = DecodeStatus::FormatError; break; default: { // Default to text compaction. During testing numerous barcodes // appeared to be missing the starting mode. In these cases defaulting // to text compaction seems to work. codeIndex--; std::string buf; codeIndex = TextCompaction(codewords, codeIndex, buf); TextDecoder::AppendLatin1(resultString, buf); break; } } if (codeIndex < (int)codewords.size()) { code = codewords[codeIndex++]; } else { status = DecodeStatus::FormatError; } } if (resultString.empty()) return DecodeStatus::FormatError; if (StatusIsError(status)) return status; return DecoderResult(ByteArray(), std::move(resultString)) .setEcLevel(std::to_wstring(ecLevel)) .setExtra(resultMetadata); } } // Pdf417 } // ZXing zxing-cpp-1.0.8+ds2/core/src/pdf417/PDFDecodedBitStreamParser.h000066400000000000000000000017601361167020700237000ustar00rootroot00000000000000#pragma once /* * Copyright 2016 Nu-book Inc. * Copyright 2016 ZXing authors * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #include namespace ZXing { class DecoderResult; namespace Pdf417 { /** *

This class contains the methods for decoding the PDF417 codewords.

* * @author SITA Lab (kevin.osullivan@sita.aero) * @author Guenther Grau */ class DecodedBitStreamParser { public: static DecoderResult Decode(const std::vector& codewords, int ecLevel); }; } // Pdf417 } // ZXing zxing-cpp-1.0.8+ds2/core/src/pdf417/PDFDecoderResultExtra.h000066400000000000000000000052201361167020700231240ustar00rootroot00000000000000#pragma once /* * Copyright 2016 Nu-book Inc. * Copyright 2016 ZXing authors * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #include "CustomData.h" #include #include namespace ZXing { namespace Pdf417 { /** * @author Guenther Grau */ class DecoderResultExtra : public CustomData { int _segmentIndex = 0; std::string _fileId; std::vector _optionalData; bool _lastSegment = false; int _segmentCount = -1; std::string _sender; std::string _addressee; std::string _fileName; int64_t _fileSize = -1; int64_t _timestamp = -1; int _checksum = -1; public: int segmentIndex() const { return _segmentIndex; } void setSegmentIndex(int segmentIndex) { _segmentIndex = segmentIndex; } std::string fileId() const { return _fileId; } void setFileId(const std::string& fileId) { _fileId = fileId; } const std::vector& optionalData() const { return _optionalData; } void setOptionalData(const std::vector& optionalData) { _optionalData = optionalData; } bool isLastSegment() const { return _lastSegment; } void setLastSegment(bool lastSegment) { _lastSegment = lastSegment; } int segmentCount() const { return _segmentCount; } void setSegmentCount(int segmentCount) { _segmentCount = segmentCount; } std::string sender() const { return _sender; } void setSender(const std::string& sender) { _sender = sender; } std::string addressee() const { return _addressee; } void setAddressee(const std::string& addressee) { _addressee = addressee; } std::string fileName() const { return _fileName; } void setFileName(const std::string& fileName) { _fileName = fileName; } // -1 if not set int64_t fileSize() const { return _fileSize; } void setFileSize(int64_t fileSize) { _fileSize = fileSize; } // 16-bit CRC checksum using CCITT-16, -1 if not set int checksum() const { return _checksum; } void setChecksum(int checksum) { _checksum = checksum; } // Unix epock timestamp, elapsed seconds since 1970-01-01, -1 if not set int64_t timestamp() const { return _timestamp; } void setTimestamp(int64_t timestamp) { _timestamp = timestamp; } }; } // Pdf417 } // ZXing zxing-cpp-1.0.8+ds2/core/src/pdf417/PDFDetectionResult.cpp000066400000000000000000000235171361167020700230350ustar00rootroot00000000000000/* * Copyright 2016 Nu-book Inc. * Copyright 2016 ZXing authors * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #include "PDFDetectionResult.h" #include "PDFCodewordDecoder.h" #include namespace ZXing { namespace Pdf417 { static const int ADJUST_ROW_NUMBER_SKIP = 2; DetectionResult::DetectionResult(const BarcodeMetadata& barcodeMetadata, const Nullable& boundingBox) : _barcodeMetadata(barcodeMetadata), _detectionResultColumns(barcodeMetadata.columnCount() + 2), _boundingBox(boundingBox) { } void DetectionResult::init(const BarcodeMetadata& barcodeMetadata, const Nullable& boundingBox) { _barcodeMetadata = barcodeMetadata; _boundingBox = boundingBox; _detectionResultColumns.resize(barcodeMetadata.columnCount() + 2); std::fill(_detectionResultColumns.begin(), _detectionResultColumns.end(), nullptr); } static void AdjustIndicatorColumnRowNumbers(Nullable& detectionResultColumn, const BarcodeMetadata& barcodeMetadata) { if (detectionResultColumn != nullptr) { detectionResultColumn.value().adjustCompleteIndicatorColumnRowNumbers(barcodeMetadata); } } static void AdjustRowNumbersFromBothRI(std::vector>& detectionResultColumns) { if (detectionResultColumns.front() == nullptr || detectionResultColumns.back() == nullptr) { return; } auto& LRIcodewords = detectionResultColumns.front().value().allCodewords(); auto& RRIcodewords = detectionResultColumns.back().value().allCodewords(); for (size_t codewordsRow = 0; codewordsRow < LRIcodewords.size(); codewordsRow++) { if (LRIcodewords[codewordsRow] != nullptr && RRIcodewords[codewordsRow] != nullptr && LRIcodewords[codewordsRow].value().rowNumber() == RRIcodewords[codewordsRow].value().rowNumber()) { auto lastColumn = detectionResultColumns.end() - 1; for (auto columnIter = detectionResultColumns.begin() + 1; columnIter != lastColumn; ++columnIter) { if (!columnIter->hasValue()) { continue; } auto& codeword = columnIter->value().allCodewords()[codewordsRow]; if (codeword != nullptr) { codeword.value().setRowNumber(LRIcodewords[codewordsRow].value().rowNumber()); if (!codeword.value().hasValidRowNumber()) { columnIter->value().allCodewords()[codewordsRow] = nullptr; } } } } } } static int AdjustRowNumberIfValid(int rowIndicatorRowNumber, int invalidRowCounts, Codeword& codeword) { if (!codeword.hasValidRowNumber()) { if (codeword.isValidRowNumber(rowIndicatorRowNumber)) { codeword.setRowNumber(rowIndicatorRowNumber); invalidRowCounts = 0; } else { ++invalidRowCounts; } } return invalidRowCounts; } static int AdjustRowNumbersFromLRI(std::vector>& detectionResultColumns) { if (detectionResultColumns.front() == nullptr) { return 0; } int unadjustedCount = 0; auto& codewords = detectionResultColumns.front().value().allCodewords(); for (size_t codewordsRow = 0; codewordsRow < codewords.size(); codewordsRow++) { if (codewords[codewordsRow] == nullptr) { continue; } int rowIndicatorRowNumber = codewords[codewordsRow].value().rowNumber(); int invalidRowCounts = 0; auto lastColumn = detectionResultColumns.end() - 1; for (auto columnIter = detectionResultColumns.begin() + 1; columnIter != lastColumn && invalidRowCounts < ADJUST_ROW_NUMBER_SKIP; ++columnIter) { if (!columnIter->hasValue()) { continue; } auto& codeword = columnIter->value().allCodewords()[codewordsRow]; if (codeword != nullptr) { invalidRowCounts = AdjustRowNumberIfValid(rowIndicatorRowNumber, invalidRowCounts, codeword.value()); if (!codeword.value().hasValidRowNumber()) { unadjustedCount++; } } } } return unadjustedCount; } static int AdjustRowNumbersFromRRI(std::vector>& detectionResultColumns) { if (detectionResultColumns.back() == nullptr) { return 0; } int unadjustedCount = 0; auto& codewords = detectionResultColumns.back().value().allCodewords(); for (size_t codewordsRow = 0; codewordsRow < codewords.size(); codewordsRow++) { if (codewords[codewordsRow] == nullptr) { continue; } int rowIndicatorRowNumber = codewords[codewordsRow].value().rowNumber(); int invalidRowCounts = 0; auto lastColumn = detectionResultColumns.end() - 1; for (auto columnIter = detectionResultColumns.begin() + 1; columnIter != lastColumn && invalidRowCounts < ADJUST_ROW_NUMBER_SKIP; ++columnIter) { if (!columnIter->hasValue()) { continue; } auto& codeword = columnIter->value().allCodewords()[codewordsRow]; if (codeword != nullptr) { invalidRowCounts = AdjustRowNumberIfValid(rowIndicatorRowNumber, invalidRowCounts, codeword.value()); if (!codeword.value().hasValidRowNumber()) { unadjustedCount++; } } } } return unadjustedCount; } static int AdjustRowNumbersByRow(std::vector>& detectionResultColumns) { AdjustRowNumbersFromBothRI(detectionResultColumns); // TODO we should only do full row adjustments if row numbers of left and right row indicator column match. // Maybe it's even better to calculated the height (in codeword rows) and divide it by the number of barcode // rows. This, together with the LRI and RRI row numbers should allow us to get a good estimate where a row // number starts and ends. int unadjustedCount = AdjustRowNumbersFromLRI(detectionResultColumns); return unadjustedCount + AdjustRowNumbersFromRRI(detectionResultColumns); } /** * @return true, if row number was adjusted, false otherwise */ static bool AdjustRowNumber(Nullable& codeword, const Nullable& otherCodeword) { if (codeword != nullptr && otherCodeword != nullptr && otherCodeword.value().hasValidRowNumber() && otherCodeword.value().bucket() == codeword.value().bucket()) { codeword.value().setRowNumber(otherCodeword.value().rowNumber()); return true; } return false; } static void AdjustRowNumbers(const std::vector>& detectionResultColumns, int barcodeColumn, int codewordsRow, std::vector>& codewords) { auto& codeword = codewords[codewordsRow]; auto& previousColumnCodewords = detectionResultColumns[barcodeColumn - 1].value().allCodewords(); auto& nextColumnCodewords = detectionResultColumns[barcodeColumn + 1] != nullptr ? detectionResultColumns[barcodeColumn + 1].value().allCodewords() : previousColumnCodewords; std::array, 14> otherCodewords; otherCodewords[2] = previousColumnCodewords[codewordsRow]; otherCodewords[3] = nextColumnCodewords[codewordsRow]; if (codewordsRow > 0) { otherCodewords[0] = codewords[codewordsRow - 1]; otherCodewords[4] = previousColumnCodewords[codewordsRow - 1]; otherCodewords[5] = nextColumnCodewords[codewordsRow - 1]; } if (codewordsRow > 1) { otherCodewords[8] = codewords[codewordsRow - 2]; otherCodewords[10] = previousColumnCodewords[codewordsRow - 2]; otherCodewords[11] = nextColumnCodewords[codewordsRow - 2]; } if (codewordsRow < (int)codewords.size() - 1) { otherCodewords[1] = codewords[codewordsRow + 1]; otherCodewords[6] = previousColumnCodewords[codewordsRow + 1]; otherCodewords[7] = nextColumnCodewords[codewordsRow + 1]; } if (codewordsRow < (int)codewords.size() - 2) { otherCodewords[9] = codewords[codewordsRow + 2]; otherCodewords[12] = previousColumnCodewords[codewordsRow + 2]; otherCodewords[13] = nextColumnCodewords[codewordsRow + 2]; } for (const auto& otherCodeword : otherCodewords) { if (AdjustRowNumber(codeword, otherCodeword)) { return; } } } // TODO ensure that no detected codewords with unknown row number are left // we should be able to estimate the row height and use it as a hint for the row number // we should also fill the rows top to bottom and bottom to top /** * @return number of codewords which don't have a valid row number. Note that the count is not accurate as codewords * will be counted several times. It just serves as an indicator to see when we can stop adjusting row numbers */ static int AdjustRowNumbers(std::vector>& detectionResultColumns) { int unadjustedCount = AdjustRowNumbersByRow(detectionResultColumns); if (unadjustedCount == 0) { return 0; } for (int barcodeColumn = 1; barcodeColumn < (int)detectionResultColumns.size() - 1; barcodeColumn++) { if (detectionResultColumns[barcodeColumn] == nullptr) { continue; } auto& codewords = detectionResultColumns[barcodeColumn].value().allCodewords(); for (int codewordsRow = 0; codewordsRow < (int)codewords.size(); codewordsRow++) { if (codewords[codewordsRow] == nullptr) { continue; } if (!codewords[codewordsRow].value().hasValidRowNumber()) { AdjustRowNumbers(detectionResultColumns, barcodeColumn, codewordsRow, codewords); } } } return unadjustedCount; } const std::vector> & DetectionResult::allColumns() { AdjustIndicatorColumnRowNumbers(_detectionResultColumns.front(), _barcodeMetadata); AdjustIndicatorColumnRowNumbers(_detectionResultColumns.back(), _barcodeMetadata); int unadjustedCodewordCount = CodewordDecoder::MAX_CODEWORDS_IN_BARCODE; int previousUnadjustedCount; do { previousUnadjustedCount = unadjustedCodewordCount; unadjustedCodewordCount = AdjustRowNumbers(_detectionResultColumns); } while (unadjustedCodewordCount > 0 && unadjustedCodewordCount < previousUnadjustedCount); return _detectionResultColumns; } } // Pdf417 } // ZXing zxing-cpp-1.0.8+ds2/core/src/pdf417/PDFDetectionResult.h000066400000000000000000000042761361167020700225030ustar00rootroot00000000000000#pragma once /* * Copyright 2016 Nu-book Inc. * Copyright 2016 ZXing authors * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #include "PDFBarcodeMetadata.h" #include "PDFBoundingBox.h" #include "PDFDetectionResultColumn.h" #include "ZXNullable.h" #include namespace ZXing { namespace Pdf417 { /** * @author Guenther Grau */ class DetectionResult { BarcodeMetadata _barcodeMetadata; std::vector> _detectionResultColumns; Nullable _boundingBox; public: DetectionResult() = default; DetectionResult(const BarcodeMetadata& barcodeMetadata, const Nullable& boundingBox); void init(const BarcodeMetadata& barcodeMetadata, const Nullable& boundingBox); const std::vector> & allColumns(); int barcodeColumnCount() const { return _barcodeMetadata.columnCount(); } int barcodeRowCount() const { return _barcodeMetadata.rowCount(); } int barcodeECLevel() const { return _barcodeMetadata.errorCorrectionLevel(); } void setBoundingBox(const BoundingBox& boundingBox) { _boundingBox = boundingBox; } const Nullable & getBoundingBox() const { return _boundingBox; } void setBoundingBox(const Nullable& box) { _boundingBox = box; } void setColumn(int barcodeColumn, const Nullable& detectionResultColumn) { _detectionResultColumns[barcodeColumn] = detectionResultColumn; } const Nullable& column(int barcodeColumn) const { return _detectionResultColumns[barcodeColumn]; } Nullable& column(int barcodeColumn) { return _detectionResultColumns[barcodeColumn]; } }; } // Pdf417 } // ZXing zxing-cpp-1.0.8+ds2/core/src/pdf417/PDFDetectionResultColumn.cpp000066400000000000000000000236611361167020700242130ustar00rootroot00000000000000/* * Copyright 2016 Nu-book Inc. * Copyright 2016 ZXing authors * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #include "PDFDetectionResultColumn.h" #include "PDFBarcodeMetadata.h" #include "PDFBarcodeValue.h" #include namespace ZXing { namespace Pdf417 { static const int MAX_NEARBY_DISTANCE = 5; static const int MIN_ROWS_IN_BARCODE = 3; static const int MAX_ROWS_IN_BARCODE = 90; DetectionResultColumn::DetectionResultColumn(const BoundingBox& boundingBox, RowIndicator rowIndicator) : _boundingBox(boundingBox), _rowIndicator(rowIndicator) { if (boundingBox.maxY() < boundingBox.minY()) { throw std::invalid_argument("Invalid bounding box"); } _codewords.resize(boundingBox.maxY() - boundingBox.minY() + 1); } Nullable DetectionResultColumn::codewordNearby(int imageRow) const { int index = imageRowToCodewordIndex(imageRow); if (_codewords[index] != nullptr) { return _codewords[index]; } for (int i = 1; i < MAX_NEARBY_DISTANCE; i++) { int nearImageRow = imageRowToCodewordIndex(imageRow) - i; if (nearImageRow >= 0) { if (_codewords[nearImageRow] != nullptr) { return _codewords[nearImageRow]; } } nearImageRow = imageRowToCodewordIndex(imageRow) + i; if (nearImageRow < (int)_codewords.size()) { if (_codewords[nearImageRow] != nullptr) { return _codewords[nearImageRow]; } } } return nullptr; } void DetectionResultColumn::setRowNumbers() { for (auto& codeword : allCodewords()) { if (codeword != nullptr) { codeword.value().setRowNumberAsRowIndicatorColumn(); } } } static void RemoveIncorrectCodewords(bool isLeft, std::vector>& codewords, const BarcodeMetadata& barcodeMetadata) { // Remove codewords which do not match the metadata // TODO Maybe we should keep the incorrect codewords for the start and end positions? for (auto& item : codewords) { if (item == nullptr) { continue; } const auto& codeword = item.value(); int rowIndicatorValue = codeword.value() % 30; int codewordRowNumber = codeword.rowNumber(); if (codewordRowNumber > barcodeMetadata.rowCount()) { item = nullptr; continue; } if (!isLeft) { codewordRowNumber += 2; } switch (codewordRowNumber % 3) { case 0: if (rowIndicatorValue * 3 + 1 != barcodeMetadata.rowCountUpperPart()) { item = nullptr; } break; case 1: if (rowIndicatorValue / 3 != barcodeMetadata.errorCorrectionLevel() || rowIndicatorValue % 3 != barcodeMetadata.rowCountLowerPart()) { item = nullptr; } break; case 2: if (rowIndicatorValue + 1 != barcodeMetadata.columnCount()) { item = nullptr; } break; } } } // TODO implement properly // TODO maybe we should add missing codewords to store the correct row number to make // finding row numbers for other columns easier // use row height count to make detection of invalid row numbers more reliable void DetectionResultColumn::adjustCompleteIndicatorColumnRowNumbers(const BarcodeMetadata& barcodeMetadata) { if (!isRowIndicator()) { return; } auto& codewords = allCodewords(); setRowNumbers(); RemoveIncorrectCodewords(isLeftRowIndicator(), codewords, barcodeMetadata); const auto& bb = boundingBox(); auto top = isLeftRowIndicator() ? bb.topLeft() : bb.topRight(); auto bottom = isLeftRowIndicator() ? bb.bottomLeft() : bb.bottomRight(); int firstRow = imageRowToCodewordIndex((int)top.value().y()); int lastRow = imageRowToCodewordIndex((int)bottom.value().y()); // We need to be careful using the average row height. Barcode could be skewed so that we have smaller and // taller rows //float averageRowHeight = (lastRow - firstRow) / (float)barcodeMetadata.rowCount(); int barcodeRow = -1; int maxRowHeight = 1; int currentRowHeight = 0; for (int codewordsRow = firstRow; codewordsRow < lastRow; codewordsRow++) { if (codewords[codewordsRow] == nullptr) { continue; } Codeword codeword = codewords[codewordsRow]; // float expectedRowNumber = (codewordsRow - firstRow) / averageRowHeight; // if (Math.abs(codeword.getRowNumber() - expectedRowNumber) > 2) { // SimpleLog.log(LEVEL.WARNING, // "Removing codeword, rowNumberSkew too high, codeword[" + codewordsRow + "]: Expected Row: " + // expectedRowNumber + ", RealRow: " + codeword.getRowNumber() + ", value: " + codeword.getValue()); // codewords[codewordsRow] = null; // } int rowDifference = codeword.rowNumber() - barcodeRow; // TODO improve handling with case where first row indicator doesn't start with 0 if (rowDifference == 0) { currentRowHeight++; } else if (rowDifference == 1) { maxRowHeight = std::max(maxRowHeight, currentRowHeight); currentRowHeight = 1; barcodeRow = codeword.rowNumber(); } else if (rowDifference < 0 || codeword.rowNumber() >= barcodeMetadata.rowCount() || rowDifference > codewordsRow) { codewords[codewordsRow] = nullptr; } else { int checkedRows; if (maxRowHeight > 2) { checkedRows = (maxRowHeight - 2) * rowDifference; } else { checkedRows = rowDifference; } bool closePreviousCodewordFound = checkedRows >= codewordsRow; for (int i = 1; i <= checkedRows && !closePreviousCodewordFound; i++) { // there must be (height * rowDifference) number of codewords missing. For now we assume height = 1. // This should hopefully get rid of most problems already. closePreviousCodewordFound = codewords[codewordsRow - i] != nullptr; } if (closePreviousCodewordFound) { codewords[codewordsRow] = nullptr; } else { barcodeRow = codeword.rowNumber(); currentRowHeight = 1; } } } //return static_cast(averageRowHeight + 0.5); } // TODO maybe we should add missing codewords to store the correct row number to make // finding row numbers for other columns easier // use row height count to make detection of invalid row numbers more reliable void DetectionResultColumn::adjustIncompleteIndicatorColumnRowNumbers(const BarcodeMetadata& barcodeMetadata) { if (!isRowIndicator()) { return; } const auto& bb = boundingBox(); auto top = isLeftRowIndicator() ? bb.topLeft() : bb.topRight(); auto bottom = isLeftRowIndicator() ? bb.bottomLeft() : bb.bottomRight(); int firstRow = imageRowToCodewordIndex((int)top.value().y()); int lastRow = imageRowToCodewordIndex((int)bottom.value().y()); //float averageRowHeight = (lastRow - firstRow) / (float)barcodeMetadata.rowCount(); auto& codewords = allCodewords(); int barcodeRow = -1; int maxRowHeight = 1; int currentRowHeight = 0; for (int codewordsRow = firstRow; codewordsRow < lastRow; codewordsRow++) { if (codewords[codewordsRow] == nullptr) { continue; } auto& item = codewords[codewordsRow]; auto& codeword = item.value(); codeword.setRowNumberAsRowIndicatorColumn(); int rowDifference = codeword.rowNumber() - barcodeRow; // TODO improve handling with case where first row indicator doesn't start with 0 if (rowDifference == 0) { currentRowHeight++; } else if (rowDifference == 1) { maxRowHeight = std::max(maxRowHeight, currentRowHeight); currentRowHeight = 1; barcodeRow = codeword.rowNumber(); } else if (codeword.rowNumber() >= barcodeMetadata.rowCount()) { item = nullptr; } else { barcodeRow = codeword.rowNumber(); currentRowHeight = 1; } } //return static_cast(averageRowHeight + 0.5); } // This is example of bad design, a getter should not modify object's state bool DetectionResultColumn::getRowHeights(std::vector& result) { BarcodeMetadata barcodeMetadata; if (!getBarcodeMetadata(barcodeMetadata)) { return false; } adjustIncompleteIndicatorColumnRowNumbers(barcodeMetadata); result.resize(barcodeMetadata.rowCount()); for (auto& item : allCodewords()) { if (item != nullptr) { size_t rowNumber = item.value().rowNumber(); if (rowNumber >= result.size()) { // We have more rows than the barcode metadata allows for, ignore them. continue; } result[rowNumber]++; } // else throw exception? } return true; } // This is example of bad design, a getter should not modify object's state bool DetectionResultColumn::getBarcodeMetadata(BarcodeMetadata& result) { if (!isRowIndicator()) { return false; } auto& codewords = allCodewords(); BarcodeValue barcodeColumnCount; BarcodeValue barcodeRowCountUpperPart; BarcodeValue barcodeRowCountLowerPart; BarcodeValue barcodeECLevel; for (auto& item : codewords) { if (item == nullptr) { continue; } auto& codeword = item.value(); codeword.setRowNumberAsRowIndicatorColumn(); int rowIndicatorValue = codeword.value() % 30; int codewordRowNumber = codeword.rowNumber(); if (!isLeftRowIndicator()) { codewordRowNumber += 2; } switch (codewordRowNumber % 3) { case 0: barcodeRowCountUpperPart.setValue(rowIndicatorValue * 3 + 1); break; case 1: barcodeECLevel.setValue(rowIndicatorValue / 3); barcodeRowCountLowerPart.setValue(rowIndicatorValue % 3); break; case 2: barcodeColumnCount.setValue(rowIndicatorValue + 1); break; } } // Maybe we should check if we have ambiguous values? auto cc = barcodeColumnCount.value(); auto rcu = barcodeRowCountUpperPart.value(); auto rcl = barcodeRowCountLowerPart.value(); auto ec = barcodeECLevel.value(); if (cc.empty() || rcu.empty() || rcl.empty() || ec.empty() || cc[0] < 1 || rcu[0] + rcl[0] < MIN_ROWS_IN_BARCODE || rcu[0] + rcl[0] > MAX_ROWS_IN_BARCODE) { return false; } result = { cc[0], rcu[0], rcl[0], ec[0] }; RemoveIncorrectCodewords(isLeftRowIndicator(), codewords, result); return true; } } // Pdf417 } // ZXing zxing-cpp-1.0.8+ds2/core/src/pdf417/PDFDetectionResultColumn.h000066400000000000000000000045351361167020700236570ustar00rootroot00000000000000#pragma once /* * Copyright 2016 Nu-book Inc. * Copyright 2016 ZXing authors * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #include "PDFBoundingBox.h" #include "PDFCodeword.h" #include "ZXNullable.h" #include #include namespace ZXing { namespace Pdf417 { class BarcodeMetadata; /** * @author Guenther Grau */ class DetectionResultColumn { public: enum class RowIndicator { None, Left, Right, }; DetectionResultColumn() {} explicit DetectionResultColumn(const BoundingBox& boundingBox, RowIndicator rowInd = RowIndicator::None); bool isRowIndicator() const { return _rowIndicator != RowIndicator::None; } bool isLeftRowIndicator() const { return _rowIndicator == RowIndicator::Left; } Nullable codewordNearby(int imageRow) const; int imageRowToCodewordIndex(int imageRow) const { return imageRow - _boundingBox.minY(); } void setCodeword(int imageRow, Codeword codeword) { _codewords[imageRowToCodewordIndex(imageRow)] = codeword; } Nullable codeword(int imageRow) const { return _codewords[imageRowToCodewordIndex(imageRow)]; } const BoundingBox& boundingBox() const { return _boundingBox; } const std::vector>& allCodewords() const { return _codewords; } std::vector>& allCodewords() { return _codewords; } void adjustCompleteIndicatorColumnRowNumbers(const BarcodeMetadata& barcodeMetadata); bool getRowHeights(std::vector& result); // not const, since it modifies object's state bool getBarcodeMetadata(BarcodeMetadata& result); // not const, since it modifies object's state private: BoundingBox _boundingBox; std::vector> _codewords; RowIndicator _rowIndicator = RowIndicator::None; void setRowNumbers(); void adjustIncompleteIndicatorColumnRowNumbers(const BarcodeMetadata& barcodeMetadata); }; } // Pdf417 } // ZXing zxing-cpp-1.0.8+ds2/core/src/pdf417/PDFDetector.cpp000066400000000000000000000306361361167020700214710ustar00rootroot00000000000000/* * Copyright 2016 Nu-book Inc. * Copyright 2016 ZXing authors * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #include "PDFDetector.h" #include "BinaryBitmap.h" #include "DecodeStatus.h" #include "BitMatrix.h" #include "ZXNullable.h" #include #include #include #include namespace ZXing { namespace Pdf417 { static const int INDEXES_START_PATTERN[] = { 0, 4, 1, 5 }; static const int INDEXES_STOP_PATTERN[] = { 6, 2, 7, 3 }; static const float MAX_AVG_VARIANCE = 0.42f; static const float MAX_INDIVIDUAL_VARIANCE = 0.8f; // B S B S B S B S Bar/Space pattern // 11111111 0 1 0 1 0 1 000 static const std::vector START_PATTERN = { 8, 1, 1, 1, 1, 1, 1, 3 }; // 1111111 0 1 000 1 0 1 00 1 static const std::vector STOP_PATTERN = { 7, 1, 1, 3, 1, 1, 1, 2, 1 }; static const int MAX_PIXEL_DRIFT = 3; static const int MAX_PATTERN_DRIFT = 5; // if we set the value too low, then we don't detect the correct height of the bar if the start patterns are damaged. // if we set the value too high, then we might detect the start pattern from a neighbor barcode. static const int SKIPPED_ROW_COUNT_MAX = 25; // A PDF471 barcode should have at least 3 rows, with each row being >= 3 times the module width. Therefore it should be at least // 9 pixels tall. To be conservative, we use about half the size to ensure we don't miss it. static const int ROW_STEP = 5; static const int BARCODE_MIN_HEIGHT = 10; /** * Determines how closely a set of observed counts of runs of black/white * values matches a given target pattern. This is reported as the ratio of * the total variance from the expected pattern proportions across all * pattern elements, to the length of the pattern. * * @param counters observed counters * @param pattern expected pattern * @param maxIndividualVariance The most any counter can differ before we give up * @return ratio of total variance between counters and pattern compared to total pattern size */ static float PatternMatchVariance(const std::vector& counters, const std::vector& pattern, float maxIndividualVariance) { int total = 0; int patternLength = 0; for (size_t i = 0; i < counters.size(); i++) { total += counters[i]; patternLength += pattern[i]; } if (total < patternLength) { // If we don't even have one pixel per unit of bar width, assume this // is too small to reliably match, so fail: return std::numeric_limits::max(); } // We're going to fake floating-point math in integers. We just need to use more bits. // Scale up patternLength so that intermediate values below like scaledCounter will have // more "significant digits". float unitBarWidth = (float)total / patternLength; maxIndividualVariance *= unitBarWidth; float totalVariance = 0.0f; for (size_t x = 0; x < counters.size(); x++) { int counter = counters[x]; float scaledPattern = pattern[x] * unitBarWidth; float variance = counter > scaledPattern ? counter - scaledPattern : scaledPattern - counter; if (variance > maxIndividualVariance) { return std::numeric_limits::max(); } totalVariance += variance; } return totalVariance / total; } /** * @param matrix row of black/white values to search * @param column x position to start search * @param row y position to start search * @param width the number of pixels to search on this row * @param pattern pattern of counts of number of black and white pixels that are * being searched for as a pattern * @param counters array of counters, as long as pattern, to re-use * @return start/end horizontal offset of guard pattern, as an array of two ints. */ static bool FindGuardPattern(const BitMatrix& matrix, int column, int row, int width, bool whiteFirst, const std::vector& pattern, std::vector& counters, int& startPos, int& endPos) { std::fill(counters.begin(), counters.end(), 0); int patternLength = static_cast(pattern.size()); bool isWhite = whiteFirst; int patternStart = column; int pixelDrift = 0; // if there are black pixels left of the current pixel shift to the left, but only for MAX_PIXEL_DRIFT pixels while (matrix.get(patternStart, row) && patternStart > 0 && pixelDrift++ < MAX_PIXEL_DRIFT) { patternStart--; } int x = patternStart; int counterPosition = 0; for (; x < width; x++) { bool pixel = matrix.get(x, row); if (pixel != isWhite) { counters[counterPosition]++; } else { if (counterPosition == patternLength - 1) { if (PatternMatchVariance(counters, pattern, MAX_INDIVIDUAL_VARIANCE) < MAX_AVG_VARIANCE) { startPos = patternStart; endPos = x; return true; } patternStart += counters[0] + counters[1]; std::copy(counters.begin() + 2, counters.end(), counters.begin()); counters[patternLength - 2] = 0; counters[patternLength - 1] = 0; counterPosition--; } else { counterPosition++; } counters[counterPosition] = 1; isWhite = !isWhite; } } if (counterPosition == patternLength - 1) { if (PatternMatchVariance(counters, pattern, MAX_INDIVIDUAL_VARIANCE) < MAX_AVG_VARIANCE) { startPos = patternStart; endPos = x - 1; return true; } } return false; } static std::array, 4>& FindRowsWithPattern(const BitMatrix& matrix, int height, int width, int startRow, int startColumn, const std::vector& pattern, std::array, 4>& result) { bool found = false; int startPos, endPos; std::vector counters(pattern.size(), 0); for (; startRow < height; startRow += ROW_STEP) { if (FindGuardPattern(matrix, startColumn, startRow, width, false, pattern, counters, startPos, endPos)) { while (startRow > 0) { if (!FindGuardPattern(matrix, startColumn, --startRow, width, false, pattern, counters, startPos, endPos)) { startRow++; break; } } result[0] = ResultPoint(startPos, startRow); result[1] = ResultPoint(endPos, startRow); found = true; break; } } int stopRow = startRow + 1; // Last row of the current symbol that contains pattern if (found) { int skippedRowCount = 0; int previousRowStart = static_cast(result[0].value().x()); int previousRowEnd = static_cast(result[1].value().x()); for (; stopRow < height; stopRow++) { int startPos, endPos; found = FindGuardPattern(matrix, previousRowStart, stopRow, width, false, pattern, counters, startPos, endPos); // a found pattern is only considered to belong to the same barcode if the start and end positions // don't differ too much. Pattern drift should be not bigger than two for consecutive rows. With // a higher number of skipped rows drift could be larger. To keep it simple for now, we allow a slightly // larger drift and don't check for skipped rows. if (found && std::abs(previousRowStart - startPos) < MAX_PATTERN_DRIFT && std::abs(previousRowEnd - endPos) < MAX_PATTERN_DRIFT) { previousRowStart = startPos; previousRowEnd = endPos; skippedRowCount = 0; } else if (skippedRowCount > SKIPPED_ROW_COUNT_MAX) { break; } else { skippedRowCount++; } } stopRow -= skippedRowCount + 1; result[2] = ResultPoint(previousRowStart, stopRow); result[3] = ResultPoint(previousRowEnd, stopRow); } if (stopRow - startRow < BARCODE_MIN_HEIGHT) { std::fill(result.begin(), result.end(), nullptr); } return result; } static void CopyToResult(std::array, 8>& result, const std::array, 4>& tmpResult, const int destinationIndexes[4]) { for (int i = 0; i < 4; i++) { result[destinationIndexes[i]] = tmpResult[i]; } } /** * Locate the vertices and the codewords area of a black blob using the Start * and Stop patterns as locators. * * @param matrix the scanned barcode image. * @return an array containing the vertices: * vertices[0] x, y top left barcode * vertices[1] x, y bottom left barcode * vertices[2] x, y top right barcode * vertices[3] x, y bottom right barcode * vertices[4] x, y top left codeword area * vertices[5] x, y bottom left codeword area * vertices[6] x, y top right codeword area * vertices[7] x, y bottom right codeword area */ static std::array, 8> FindVertices(const BitMatrix& matrix, int startRow, int startColumn) { int width = matrix.width(); int height = matrix.height(); std::array, 4> tmp; std::array, 8> result; CopyToResult(result, FindRowsWithPattern(matrix, height, width, startRow, startColumn, START_PATTERN, tmp), INDEXES_START_PATTERN); if (result[4] != nullptr) { startColumn = static_cast(result[4].value().x()); startRow = static_cast(result[4].value().y()); } CopyToResult(result, FindRowsWithPattern(matrix, height, width, startRow, startColumn, STOP_PATTERN, tmp), INDEXES_STOP_PATTERN); return result; } /** * Detects PDF417 codes in an image. Only checks 0 degree rotation * @param multiple if true, then the image is searched for multiple codes. If false, then at most one code will * be found and returned * @param bitMatrix bit matrix to detect barcodes in * @return List of ResultPoint arrays containing the coordinates of found barcodes */ static std::list, 8>> DetectBarcode(const BitMatrix& bitMatrix, bool multiple) { int row = 0; int column = 0; bool foundBarcodeInRow = false; std::list, 8>> barcodeCoordinates; while (row < bitMatrix.height()) { auto vertices = FindVertices(bitMatrix, row, column); if (vertices[0] == nullptr && vertices[3] == nullptr) { if (!foundBarcodeInRow) { // we didn't find any barcode so that's the end of searching break; } // we didn't find a barcode starting at the given column and row. Try again from the first column and slightly // below the lowest barcode we found so far. foundBarcodeInRow = false; column = 0; for (auto& barcodeCoordinate : barcodeCoordinates) { if (barcodeCoordinate[1] != nullptr) { row = std::max(row, static_cast(barcodeCoordinate[1].value().y())); } if (barcodeCoordinate[3] != nullptr) { row = std::max(row, static_cast(barcodeCoordinate[3].value().y())); } } row += ROW_STEP; continue; } foundBarcodeInRow = true; barcodeCoordinates.push_back(vertices); if (!multiple) { break; } // if we didn't find a right row indicator column, then continue the search for the next barcode after the // start pattern of the barcode just found. if (vertices[2] != nullptr) { column = static_cast(vertices[2].value().x()); row = static_cast(vertices[2].value().y()); } else { column = static_cast(vertices[4].value().x()); row = static_cast(vertices[4].value().y()); } } return barcodeCoordinates; } /** *

Detects a PDF417 Code in an image. Only checks 0 and 180 degree rotations.

* * @param image barcode image to decode * @param hints optional hints to detector * @param multiple if true, then the image is searched for multiple codes. If false, then at most one code will * be found and returned * @return {@link PDF417DetectorResult} encapsulating results of detecting a PDF417 code * @throws NotFoundException if no PDF417 Code can be found */ DecodeStatus Detector::Detect(const BinaryBitmap& image, bool multiple, Result& result) { // TODO detection improvement, tryHarder could try several different luminance thresholds/blackpoints or even // different binarizers //boolean tryHarder = hints != null && hints.containsKey(DecodeHintType.TRY_HARDER); auto binImg = image.getBlackMatrix(); if (binImg == nullptr) { return DecodeStatus::NotFound; } auto barcodeCoordinates = DetectBarcode(*binImg, multiple); if (barcodeCoordinates.empty()) { auto newBits = std::make_shared(binImg->copy()); newBits->rotate180(); binImg = newBits; barcodeCoordinates = DetectBarcode(*binImg, multiple); } if (barcodeCoordinates.empty()) { return DecodeStatus::NotFound; } result.points = barcodeCoordinates; result.bits = binImg; return DecodeStatus::NoError; } } // Pdf417 } // ZXing zxing-cpp-1.0.8+ds2/core/src/pdf417/PDFDetector.h000066400000000000000000000025221361167020700211270ustar00rootroot00000000000000#pragma once /* * Copyright 2016 Nu-book Inc. * Copyright 2016 ZXing authors * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #include "ResultPoint.h" #include "ZXNullable.h" #include #include #include namespace ZXing { class BitMatrix; class BinaryBitmap; enum class DecodeStatus; namespace Pdf417 { /** *

Encapsulates logic that can detect a PDF417 Code in an image, even if the * PDF417 Code is rotated or skewed, or partially obscured.< / p> * * @author SITA Lab(kevin.osullivan@sita.aero) * @author dswitkin@google.com(Daniel Switkin) * @author Guenther Grau */ class Detector { public: struct Result { std::shared_ptr bits; std::list, 8>> points; }; static DecodeStatus Detect(const BinaryBitmap& image, bool multiple, Result& result); }; } // Pdf417 } // ZXing zxing-cpp-1.0.8+ds2/core/src/pdf417/PDFEncoder.cpp000066400000000000000000001200151361167020700212660ustar00rootroot00000000000000/* * Copyright 2016 Huy Cuong Nguyen * Copyright 2016 ZXing authors * Copyright 2006 Jeremias Maerki * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #include "PDFEncoder.h" #include "PDFHighLevelEncoder.h" #include #include #include #include namespace ZXing { namespace Pdf417 { /** * The start pattern (17 bits) */ static const int START_PATTERN = 0x1fea8; /** * The stop pattern (18 bits) */ static const int STOP_PATTERN = 0x3fa29; /** * The codeword table from the Annex A of ISO/IEC 15438:2001(E). */ static const std::array, 3> CODEWORD_TABLE = { 0x1d5c0, 0x1eaf0, 0x1f57c, 0x1d4e0, 0x1ea78, 0x1f53e, 0x1a8c0, 0x1d470, 0x1a860, 0x15040, 0x1a830, 0x15020, 0x1adc0, 0x1d6f0, 0x1eb7c, 0x1ace0, 0x1d678, 0x1eb3e, 0x158c0, 0x1ac70, 0x15860, 0x15dc0, 0x1aef0, 0x1d77c, 0x15ce0, 0x1ae78, 0x1d73e, 0x15c70, 0x1ae3c, 0x15ef0, 0x1af7c, 0x15e78, 0x1af3e, 0x15f7c, 0x1f5fa, 0x1d2e0, 0x1e978, 0x1f4be, 0x1a4c0, 0x1d270, 0x1e93c, 0x1a460, 0x1d238, 0x14840, 0x1a430, 0x1d21c, 0x14820, 0x1a418, 0x14810, 0x1a6e0, 0x1d378, 0x1e9be, 0x14cc0, 0x1a670, 0x1d33c, 0x14c60, 0x1a638, 0x1d31e, 0x14c30, 0x1a61c, 0x14ee0, 0x1a778, 0x1d3be, 0x14e70, 0x1a73c, 0x14e38, 0x1a71e, 0x14f78, 0x1a7be, 0x14f3c, 0x14f1e, 0x1a2c0, 0x1d170, 0x1e8bc, 0x1a260, 0x1d138, 0x1e89e, 0x14440, 0x1a230, 0x1d11c, 0x14420, 0x1a218, 0x14410, 0x14408, 0x146c0, 0x1a370, 0x1d1bc, 0x14660, 0x1a338, 0x1d19e, 0x14630, 0x1a31c, 0x14618, 0x1460c, 0x14770, 0x1a3bc, 0x14738, 0x1a39e, 0x1471c, 0x147bc, 0x1a160, 0x1d0b8, 0x1e85e, 0x14240, 0x1a130, 0x1d09c, 0x14220, 0x1a118, 0x1d08e, 0x14210, 0x1a10c, 0x14208, 0x1a106, 0x14360, 0x1a1b8, 0x1d0de, 0x14330, 0x1a19c, 0x14318, 0x1a18e, 0x1430c, 0x14306, 0x1a1de, 0x1438e, 0x14140, 0x1a0b0, 0x1d05c, 0x14120, 0x1a098, 0x1d04e, 0x14110, 0x1a08c, 0x14108, 0x1a086, 0x14104, 0x141b0, 0x14198, 0x1418c, 0x140a0, 0x1d02e, 0x1a04c, 0x1a046, 0x14082, 0x1cae0, 0x1e578, 0x1f2be, 0x194c0, 0x1ca70, 0x1e53c, 0x19460, 0x1ca38, 0x1e51e, 0x12840, 0x19430, 0x12820, 0x196e0, 0x1cb78, 0x1e5be, 0x12cc0, 0x19670, 0x1cb3c, 0x12c60, 0x19638, 0x12c30, 0x12c18, 0x12ee0, 0x19778, 0x1cbbe, 0x12e70, 0x1973c, 0x12e38, 0x12e1c, 0x12f78, 0x197be, 0x12f3c, 0x12fbe, 0x1dac0, 0x1ed70, 0x1f6bc, 0x1da60, 0x1ed38, 0x1f69e, 0x1b440, 0x1da30, 0x1ed1c, 0x1b420, 0x1da18, 0x1ed0e, 0x1b410, 0x1da0c, 0x192c0, 0x1c970, 0x1e4bc, 0x1b6c0, 0x19260, 0x1c938, 0x1e49e, 0x1b660, 0x1db38, 0x1ed9e, 0x16c40, 0x12420, 0x19218, 0x1c90e, 0x16c20, 0x1b618, 0x16c10, 0x126c0, 0x19370, 0x1c9bc, 0x16ec0, 0x12660, 0x19338, 0x1c99e, 0x16e60, 0x1b738, 0x1db9e, 0x16e30, 0x12618, 0x16e18, 0x12770, 0x193bc, 0x16f70, 0x12738, 0x1939e, 0x16f38, 0x1b79e, 0x16f1c, 0x127bc, 0x16fbc, 0x1279e, 0x16f9e, 0x1d960, 0x1ecb8, 0x1f65e, 0x1b240, 0x1d930, 0x1ec9c, 0x1b220, 0x1d918, 0x1ec8e, 0x1b210, 0x1d90c, 0x1b208, 0x1b204, 0x19160, 0x1c8b8, 0x1e45e, 0x1b360, 0x19130, 0x1c89c, 0x16640, 0x12220, 0x1d99c, 0x1c88e, 0x16620, 0x12210, 0x1910c, 0x16610, 0x1b30c, 0x19106, 0x12204, 0x12360, 0x191b8, 0x1c8de, 0x16760, 0x12330, 0x1919c, 0x16730, 0x1b39c, 0x1918e, 0x16718, 0x1230c, 0x12306, 0x123b8, 0x191de, 0x167b8, 0x1239c, 0x1679c, 0x1238e, 0x1678e, 0x167de, 0x1b140, 0x1d8b0, 0x1ec5c, 0x1b120, 0x1d898, 0x1ec4e, 0x1b110, 0x1d88c, 0x1b108, 0x1d886, 0x1b104, 0x1b102, 0x12140, 0x190b0, 0x1c85c, 0x16340, 0x12120, 0x19098, 0x1c84e, 0x16320, 0x1b198, 0x1d8ce, 0x16310, 0x12108, 0x19086, 0x16308, 0x1b186, 0x16304, 0x121b0, 0x190dc, 0x163b0, 0x12198, 0x190ce, 0x16398, 0x1b1ce, 0x1638c, 0x12186, 0x16386, 0x163dc, 0x163ce, 0x1b0a0, 0x1d858, 0x1ec2e, 0x1b090, 0x1d84c, 0x1b088, 0x1d846, 0x1b084, 0x1b082, 0x120a0, 0x19058, 0x1c82e, 0x161a0, 0x12090, 0x1904c, 0x16190, 0x1b0cc, 0x19046, 0x16188, 0x12084, 0x16184, 0x12082, 0x120d8, 0x161d8, 0x161cc, 0x161c6, 0x1d82c, 0x1d826, 0x1b042, 0x1902c, 0x12048, 0x160c8, 0x160c4, 0x160c2, 0x18ac0, 0x1c570, 0x1e2bc, 0x18a60, 0x1c538, 0x11440, 0x18a30, 0x1c51c, 0x11420, 0x18a18, 0x11410, 0x11408, 0x116c0, 0x18b70, 0x1c5bc, 0x11660, 0x18b38, 0x1c59e, 0x11630, 0x18b1c, 0x11618, 0x1160c, 0x11770, 0x18bbc, 0x11738, 0x18b9e, 0x1171c, 0x117bc, 0x1179e, 0x1cd60, 0x1e6b8, 0x1f35e, 0x19a40, 0x1cd30, 0x1e69c, 0x19a20, 0x1cd18, 0x1e68e, 0x19a10, 0x1cd0c, 0x19a08, 0x1cd06, 0x18960, 0x1c4b8, 0x1e25e, 0x19b60, 0x18930, 0x1c49c, 0x13640, 0x11220, 0x1cd9c, 0x1c48e, 0x13620, 0x19b18, 0x1890c, 0x13610, 0x11208, 0x13608, 0x11360, 0x189b8, 0x1c4de, 0x13760, 0x11330, 0x1cdde, 0x13730, 0x19b9c, 0x1898e, 0x13718, 0x1130c, 0x1370c, 0x113b8, 0x189de, 0x137b8, 0x1139c, 0x1379c, 0x1138e, 0x113de, 0x137de, 0x1dd40, 0x1eeb0, 0x1f75c, 0x1dd20, 0x1ee98, 0x1f74e, 0x1dd10, 0x1ee8c, 0x1dd08, 0x1ee86, 0x1dd04, 0x19940, 0x1ccb0, 0x1e65c, 0x1bb40, 0x19920, 0x1eedc, 0x1e64e, 0x1bb20, 0x1dd98, 0x1eece, 0x1bb10, 0x19908, 0x1cc86, 0x1bb08, 0x1dd86, 0x19902, 0x11140, 0x188b0, 0x1c45c, 0x13340, 0x11120, 0x18898, 0x1c44e, 0x17740, 0x13320, 0x19998, 0x1ccce, 0x17720, 0x1bb98, 0x1ddce, 0x18886, 0x17710, 0x13308, 0x19986, 0x17708, 0x11102, 0x111b0, 0x188dc, 0x133b0, 0x11198, 0x188ce, 0x177b0, 0x13398, 0x199ce, 0x17798, 0x1bbce, 0x11186, 0x13386, 0x111dc, 0x133dc, 0x111ce, 0x177dc, 0x133ce, 0x1dca0, 0x1ee58, 0x1f72e, 0x1dc90, 0x1ee4c, 0x1dc88, 0x1ee46, 0x1dc84, 0x1dc82, 0x198a0, 0x1cc58, 0x1e62e, 0x1b9a0, 0x19890, 0x1ee6e, 0x1b990, 0x1dccc, 0x1cc46, 0x1b988, 0x19884, 0x1b984, 0x19882, 0x1b982, 0x110a0, 0x18858, 0x1c42e, 0x131a0, 0x11090, 0x1884c, 0x173a0, 0x13190, 0x198cc, 0x18846, 0x17390, 0x1b9cc, 0x11084, 0x17388, 0x13184, 0x11082, 0x13182, 0x110d8, 0x1886e, 0x131d8, 0x110cc, 0x173d8, 0x131cc, 0x110c6, 0x173cc, 0x131c6, 0x110ee, 0x173ee, 0x1dc50, 0x1ee2c, 0x1dc48, 0x1ee26, 0x1dc44, 0x1dc42, 0x19850, 0x1cc2c, 0x1b8d0, 0x19848, 0x1cc26, 0x1b8c8, 0x1dc66, 0x1b8c4, 0x19842, 0x1b8c2, 0x11050, 0x1882c, 0x130d0, 0x11048, 0x18826, 0x171d0, 0x130c8, 0x19866, 0x171c8, 0x1b8e6, 0x11042, 0x171c4, 0x130c2, 0x171c2, 0x130ec, 0x171ec, 0x171e6, 0x1ee16, 0x1dc22, 0x1cc16, 0x19824, 0x19822, 0x11028, 0x13068, 0x170e8, 0x11022, 0x13062, 0x18560, 0x10a40, 0x18530, 0x10a20, 0x18518, 0x1c28e, 0x10a10, 0x1850c, 0x10a08, 0x18506, 0x10b60, 0x185b8, 0x1c2de, 0x10b30, 0x1859c, 0x10b18, 0x1858e, 0x10b0c, 0x10b06, 0x10bb8, 0x185de, 0x10b9c, 0x10b8e, 0x10bde, 0x18d40, 0x1c6b0, 0x1e35c, 0x18d20, 0x1c698, 0x18d10, 0x1c68c, 0x18d08, 0x1c686, 0x18d04, 0x10940, 0x184b0, 0x1c25c, 0x11b40, 0x10920, 0x1c6dc, 0x1c24e, 0x11b20, 0x18d98, 0x1c6ce, 0x11b10, 0x10908, 0x18486, 0x11b08, 0x18d86, 0x10902, 0x109b0, 0x184dc, 0x11bb0, 0x10998, 0x184ce, 0x11b98, 0x18dce, 0x11b8c, 0x10986, 0x109dc, 0x11bdc, 0x109ce, 0x11bce, 0x1cea0, 0x1e758, 0x1f3ae, 0x1ce90, 0x1e74c, 0x1ce88, 0x1e746, 0x1ce84, 0x1ce82, 0x18ca0, 0x1c658, 0x19da0, 0x18c90, 0x1c64c, 0x19d90, 0x1cecc, 0x1c646, 0x19d88, 0x18c84, 0x19d84, 0x18c82, 0x19d82, 0x108a0, 0x18458, 0x119a0, 0x10890, 0x1c66e, 0x13ba0, 0x11990, 0x18ccc, 0x18446, 0x13b90, 0x19dcc, 0x10884, 0x13b88, 0x11984, 0x10882, 0x11982, 0x108d8, 0x1846e, 0x119d8, 0x108cc, 0x13bd8, 0x119cc, 0x108c6, 0x13bcc, 0x119c6, 0x108ee, 0x119ee, 0x13bee, 0x1ef50, 0x1f7ac, 0x1ef48, 0x1f7a6, 0x1ef44, 0x1ef42, 0x1ce50, 0x1e72c, 0x1ded0, 0x1ef6c, 0x1e726, 0x1dec8, 0x1ef66, 0x1dec4, 0x1ce42, 0x1dec2, 0x18c50, 0x1c62c, 0x19cd0, 0x18c48, 0x1c626, 0x1bdd0, 0x19cc8, 0x1ce66, 0x1bdc8, 0x1dee6, 0x18c42, 0x1bdc4, 0x19cc2, 0x1bdc2, 0x10850, 0x1842c, 0x118d0, 0x10848, 0x18426, 0x139d0, 0x118c8, 0x18c66, 0x17bd0, 0x139c8, 0x19ce6, 0x10842, 0x17bc8, 0x1bde6, 0x118c2, 0x17bc4, 0x1086c, 0x118ec, 0x10866, 0x139ec, 0x118e6, 0x17bec, 0x139e6, 0x17be6, 0x1ef28, 0x1f796, 0x1ef24, 0x1ef22, 0x1ce28, 0x1e716, 0x1de68, 0x1ef36, 0x1de64, 0x1ce22, 0x1de62, 0x18c28, 0x1c616, 0x19c68, 0x18c24, 0x1bce8, 0x19c64, 0x18c22, 0x1bce4, 0x19c62, 0x1bce2, 0x10828, 0x18416, 0x11868, 0x18c36, 0x138e8, 0x11864, 0x10822, 0x179e8, 0x138e4, 0x11862, 0x179e4, 0x138e2, 0x179e2, 0x11876, 0x179f6, 0x1ef12, 0x1de34, 0x1de32, 0x19c34, 0x1bc74, 0x1bc72, 0x11834, 0x13874, 0x178f4, 0x178f2, 0x10540, 0x10520, 0x18298, 0x10510, 0x10508, 0x10504, 0x105b0, 0x10598, 0x1058c, 0x10586, 0x105dc, 0x105ce, 0x186a0, 0x18690, 0x1c34c, 0x18688, 0x1c346, 0x18684, 0x18682, 0x104a0, 0x18258, 0x10da0, 0x186d8, 0x1824c, 0x10d90, 0x186cc, 0x10d88, 0x186c6, 0x10d84, 0x10482, 0x10d82, 0x104d8, 0x1826e, 0x10dd8, 0x186ee, 0x10dcc, 0x104c6, 0x10dc6, 0x104ee, 0x10dee, 0x1c750, 0x1c748, 0x1c744, 0x1c742, 0x18650, 0x18ed0, 0x1c76c, 0x1c326, 0x18ec8, 0x1c766, 0x18ec4, 0x18642, 0x18ec2, 0x10450, 0x10cd0, 0x10448, 0x18226, 0x11dd0, 0x10cc8, 0x10444, 0x11dc8, 0x10cc4, 0x10442, 0x11dc4, 0x10cc2, 0x1046c, 0x10cec, 0x10466, 0x11dec, 0x10ce6, 0x11de6, 0x1e7a8, 0x1e7a4, 0x1e7a2, 0x1c728, 0x1cf68, 0x1e7b6, 0x1cf64, 0x1c722, 0x1cf62, 0x18628, 0x1c316, 0x18e68, 0x1c736, 0x19ee8, 0x18e64, 0x18622, 0x19ee4, 0x18e62, 0x19ee2, 0x10428, 0x18216, 0x10c68, 0x18636, 0x11ce8, 0x10c64, 0x10422, 0x13de8, 0x11ce4, 0x10c62, 0x13de4, 0x11ce2, 0x10436, 0x10c76, 0x11cf6, 0x13df6, 0x1f7d4, 0x1f7d2, 0x1e794, 0x1efb4, 0x1e792, 0x1efb2, 0x1c714, 0x1cf34, 0x1c712, 0x1df74, 0x1cf32, 0x1df72, 0x18614, 0x18e34, 0x18612, 0x19e74, 0x18e32, 0x1bef4, 0x1f560, 0x1fab8, 0x1ea40, 0x1f530, 0x1fa9c, 0x1ea20, 0x1f518, 0x1fa8e, 0x1ea10, 0x1f50c, 0x1ea08, 0x1f506, 0x1ea04, 0x1eb60, 0x1f5b8, 0x1fade, 0x1d640, 0x1eb30, 0x1f59c, 0x1d620, 0x1eb18, 0x1f58e, 0x1d610, 0x1eb0c, 0x1d608, 0x1eb06, 0x1d604, 0x1d760, 0x1ebb8, 0x1f5de, 0x1ae40, 0x1d730, 0x1eb9c, 0x1ae20, 0x1d718, 0x1eb8e, 0x1ae10, 0x1d70c, 0x1ae08, 0x1d706, 0x1ae04, 0x1af60, 0x1d7b8, 0x1ebde, 0x15e40, 0x1af30, 0x1d79c, 0x15e20, 0x1af18, 0x1d78e, 0x15e10, 0x1af0c, 0x15e08, 0x1af06, 0x15f60, 0x1afb8, 0x1d7de, 0x15f30, 0x1af9c, 0x15f18, 0x1af8e, 0x15f0c, 0x15fb8, 0x1afde, 0x15f9c, 0x15f8e, 0x1e940, 0x1f4b0, 0x1fa5c, 0x1e920, 0x1f498, 0x1fa4e, 0x1e910, 0x1f48c, 0x1e908, 0x1f486, 0x1e904, 0x1e902, 0x1d340, 0x1e9b0, 0x1f4dc, 0x1d320, 0x1e998, 0x1f4ce, 0x1d310, 0x1e98c, 0x1d308, 0x1e986, 0x1d304, 0x1d302, 0x1a740, 0x1d3b0, 0x1e9dc, 0x1a720, 0x1d398, 0x1e9ce, 0x1a710, 0x1d38c, 0x1a708, 0x1d386, 0x1a704, 0x1a702, 0x14f40, 0x1a7b0, 0x1d3dc, 0x14f20, 0x1a798, 0x1d3ce, 0x14f10, 0x1a78c, 0x14f08, 0x1a786, 0x14f04, 0x14fb0, 0x1a7dc, 0x14f98, 0x1a7ce, 0x14f8c, 0x14f86, 0x14fdc, 0x14fce, 0x1e8a0, 0x1f458, 0x1fa2e, 0x1e890, 0x1f44c, 0x1e888, 0x1f446, 0x1e884, 0x1e882, 0x1d1a0, 0x1e8d8, 0x1f46e, 0x1d190, 0x1e8cc, 0x1d188, 0x1e8c6, 0x1d184, 0x1d182, 0x1a3a0, 0x1d1d8, 0x1e8ee, 0x1a390, 0x1d1cc, 0x1a388, 0x1d1c6, 0x1a384, 0x1a382, 0x147a0, 0x1a3d8, 0x1d1ee, 0x14790, 0x1a3cc, 0x14788, 0x1a3c6, 0x14784, 0x14782, 0x147d8, 0x1a3ee, 0x147cc, 0x147c6, 0x147ee, 0x1e850, 0x1f42c, 0x1e848, 0x1f426, 0x1e844, 0x1e842, 0x1d0d0, 0x1e86c, 0x1d0c8, 0x1e866, 0x1d0c4, 0x1d0c2, 0x1a1d0, 0x1d0ec, 0x1a1c8, 0x1d0e6, 0x1a1c4, 0x1a1c2, 0x143d0, 0x1a1ec, 0x143c8, 0x1a1e6, 0x143c4, 0x143c2, 0x143ec, 0x143e6, 0x1e828, 0x1f416, 0x1e824, 0x1e822, 0x1d068, 0x1e836, 0x1d064, 0x1d062, 0x1a0e8, 0x1d076, 0x1a0e4, 0x1a0e2, 0x141e8, 0x1a0f6, 0x141e4, 0x141e2, 0x1e814, 0x1e812, 0x1d034, 0x1d032, 0x1a074, 0x1a072, 0x1e540, 0x1f2b0, 0x1f95c, 0x1e520, 0x1f298, 0x1f94e, 0x1e510, 0x1f28c, 0x1e508, 0x1f286, 0x1e504, 0x1e502, 0x1cb40, 0x1e5b0, 0x1f2dc, 0x1cb20, 0x1e598, 0x1f2ce, 0x1cb10, 0x1e58c, 0x1cb08, 0x1e586, 0x1cb04, 0x1cb02, 0x19740, 0x1cbb0, 0x1e5dc, 0x19720, 0x1cb98, 0x1e5ce, 0x19710, 0x1cb8c, 0x19708, 0x1cb86, 0x19704, 0x19702, 0x12f40, 0x197b0, 0x1cbdc, 0x12f20, 0x19798, 0x1cbce, 0x12f10, 0x1978c, 0x12f08, 0x19786, 0x12f04, 0x12fb0, 0x197dc, 0x12f98, 0x197ce, 0x12f8c, 0x12f86, 0x12fdc, 0x12fce, 0x1f6a0, 0x1fb58, 0x16bf0, 0x1f690, 0x1fb4c, 0x169f8, 0x1f688, 0x1fb46, 0x168fc, 0x1f684, 0x1f682, 0x1e4a0, 0x1f258, 0x1f92e, 0x1eda0, 0x1e490, 0x1fb6e, 0x1ed90, 0x1f6cc, 0x1f246, 0x1ed88, 0x1e484, 0x1ed84, 0x1e482, 0x1ed82, 0x1c9a0, 0x1e4d8, 0x1f26e, 0x1dba0, 0x1c990, 0x1e4cc, 0x1db90, 0x1edcc, 0x1e4c6, 0x1db88, 0x1c984, 0x1db84, 0x1c982, 0x1db82, 0x193a0, 0x1c9d8, 0x1e4ee, 0x1b7a0, 0x19390, 0x1c9cc, 0x1b790, 0x1dbcc, 0x1c9c6, 0x1b788, 0x19384, 0x1b784, 0x19382, 0x1b782, 0x127a0, 0x193d8, 0x1c9ee, 0x16fa0, 0x12790, 0x193cc, 0x16f90, 0x1b7cc, 0x193c6, 0x16f88, 0x12784, 0x16f84, 0x12782, 0x127d8, 0x193ee, 0x16fd8, 0x127cc, 0x16fcc, 0x127c6, 0x16fc6, 0x127ee, 0x1f650, 0x1fb2c, 0x165f8, 0x1f648, 0x1fb26, 0x164fc, 0x1f644, 0x1647e, 0x1f642, 0x1e450, 0x1f22c, 0x1ecd0, 0x1e448, 0x1f226, 0x1ecc8, 0x1f666, 0x1ecc4, 0x1e442, 0x1ecc2, 0x1c8d0, 0x1e46c, 0x1d9d0, 0x1c8c8, 0x1e466, 0x1d9c8, 0x1ece6, 0x1d9c4, 0x1c8c2, 0x1d9c2, 0x191d0, 0x1c8ec, 0x1b3d0, 0x191c8, 0x1c8e6, 0x1b3c8, 0x1d9e6, 0x1b3c4, 0x191c2, 0x1b3c2, 0x123d0, 0x191ec, 0x167d0, 0x123c8, 0x191e6, 0x167c8, 0x1b3e6, 0x167c4, 0x123c2, 0x167c2, 0x123ec, 0x167ec, 0x123e6, 0x167e6, 0x1f628, 0x1fb16, 0x162fc, 0x1f624, 0x1627e, 0x1f622, 0x1e428, 0x1f216, 0x1ec68, 0x1f636, 0x1ec64, 0x1e422, 0x1ec62, 0x1c868, 0x1e436, 0x1d8e8, 0x1c864, 0x1d8e4, 0x1c862, 0x1d8e2, 0x190e8, 0x1c876, 0x1b1e8, 0x1d8f6, 0x1b1e4, 0x190e2, 0x1b1e2, 0x121e8, 0x190f6, 0x163e8, 0x121e4, 0x163e4, 0x121e2, 0x163e2, 0x121f6, 0x163f6, 0x1f614, 0x1617e, 0x1f612, 0x1e414, 0x1ec34, 0x1e412, 0x1ec32, 0x1c834, 0x1d874, 0x1c832, 0x1d872, 0x19074, 0x1b0f4, 0x19072, 0x1b0f2, 0x120f4, 0x161f4, 0x120f2, 0x161f2, 0x1f60a, 0x1e40a, 0x1ec1a, 0x1c81a, 0x1d83a, 0x1903a, 0x1b07a, 0x1e2a0, 0x1f158, 0x1f8ae, 0x1e290, 0x1f14c, 0x1e288, 0x1f146, 0x1e284, 0x1e282, 0x1c5a0, 0x1e2d8, 0x1f16e, 0x1c590, 0x1e2cc, 0x1c588, 0x1e2c6, 0x1c584, 0x1c582, 0x18ba0, 0x1c5d8, 0x1e2ee, 0x18b90, 0x1c5cc, 0x18b88, 0x1c5c6, 0x18b84, 0x18b82, 0x117a0, 0x18bd8, 0x1c5ee, 0x11790, 0x18bcc, 0x11788, 0x18bc6, 0x11784, 0x11782, 0x117d8, 0x18bee, 0x117cc, 0x117c6, 0x117ee, 0x1f350, 0x1f9ac, 0x135f8, 0x1f348, 0x1f9a6, 0x134fc, 0x1f344, 0x1347e, 0x1f342, 0x1e250, 0x1f12c, 0x1e6d0, 0x1e248, 0x1f126, 0x1e6c8, 0x1f366, 0x1e6c4, 0x1e242, 0x1e6c2, 0x1c4d0, 0x1e26c, 0x1cdd0, 0x1c4c8, 0x1e266, 0x1cdc8, 0x1e6e6, 0x1cdc4, 0x1c4c2, 0x1cdc2, 0x189d0, 0x1c4ec, 0x19bd0, 0x189c8, 0x1c4e6, 0x19bc8, 0x1cde6, 0x19bc4, 0x189c2, 0x19bc2, 0x113d0, 0x189ec, 0x137d0, 0x113c8, 0x189e6, 0x137c8, 0x19be6, 0x137c4, 0x113c2, 0x137c2, 0x113ec, 0x137ec, 0x113e6, 0x137e6, 0x1fba8, 0x175f0, 0x1bafc, 0x1fba4, 0x174f8, 0x1ba7e, 0x1fba2, 0x1747c, 0x1743e, 0x1f328, 0x1f996, 0x132fc, 0x1f768, 0x1fbb6, 0x176fc, 0x1327e, 0x1f764, 0x1f322, 0x1767e, 0x1f762, 0x1e228, 0x1f116, 0x1e668, 0x1e224, 0x1eee8, 0x1f776, 0x1e222, 0x1eee4, 0x1e662, 0x1eee2, 0x1c468, 0x1e236, 0x1cce8, 0x1c464, 0x1dde8, 0x1cce4, 0x1c462, 0x1dde4, 0x1cce2, 0x1dde2, 0x188e8, 0x1c476, 0x199e8, 0x188e4, 0x1bbe8, 0x199e4, 0x188e2, 0x1bbe4, 0x199e2, 0x1bbe2, 0x111e8, 0x188f6, 0x133e8, 0x111e4, 0x177e8, 0x133e4, 0x111e2, 0x177e4, 0x133e2, 0x177e2, 0x111f6, 0x133f6, 0x1fb94, 0x172f8, 0x1b97e, 0x1fb92, 0x1727c, 0x1723e, 0x1f314, 0x1317e, 0x1f734, 0x1f312, 0x1737e, 0x1f732, 0x1e214, 0x1e634, 0x1e212, 0x1ee74, 0x1e632, 0x1ee72, 0x1c434, 0x1cc74, 0x1c432, 0x1dcf4, 0x1cc72, 0x1dcf2, 0x18874, 0x198f4, 0x18872, 0x1b9f4, 0x198f2, 0x1b9f2, 0x110f4, 0x131f4, 0x110f2, 0x173f4, 0x131f2, 0x173f2, 0x1fb8a, 0x1717c, 0x1713e, 0x1f30a, 0x1f71a, 0x1e20a, 0x1e61a, 0x1ee3a, 0x1c41a, 0x1cc3a, 0x1dc7a, 0x1883a, 0x1987a, 0x1b8fa, 0x1107a, 0x130fa, 0x171fa, 0x170be, 0x1e150, 0x1f0ac, 0x1e148, 0x1f0a6, 0x1e144, 0x1e142, 0x1c2d0, 0x1e16c, 0x1c2c8, 0x1e166, 0x1c2c4, 0x1c2c2, 0x185d0, 0x1c2ec, 0x185c8, 0x1c2e6, 0x185c4, 0x185c2, 0x10bd0, 0x185ec, 0x10bc8, 0x185e6, 0x10bc4, 0x10bc2, 0x10bec, 0x10be6, 0x1f1a8, 0x1f8d6, 0x11afc, 0x1f1a4, 0x11a7e, 0x1f1a2, 0x1e128, 0x1f096, 0x1e368, 0x1e124, 0x1e364, 0x1e122, 0x1e362, 0x1c268, 0x1e136, 0x1c6e8, 0x1c264, 0x1c6e4, 0x1c262, 0x1c6e2, 0x184e8, 0x1c276, 0x18de8, 0x184e4, 0x18de4, 0x184e2, 0x18de2, 0x109e8, 0x184f6, 0x11be8, 0x109e4, 0x11be4, 0x109e2, 0x11be2, 0x109f6, 0x11bf6, 0x1f9d4, 0x13af8, 0x19d7e, 0x1f9d2, 0x13a7c, 0x13a3e, 0x1f194, 0x1197e, 0x1f3b4, 0x1f192, 0x13b7e, 0x1f3b2, 0x1e114, 0x1e334, 0x1e112, 0x1e774, 0x1e332, 0x1e772, 0x1c234, 0x1c674, 0x1c232, 0x1cef4, 0x1c672, 0x1cef2, 0x18474, 0x18cf4, 0x18472, 0x19df4, 0x18cf2, 0x19df2, 0x108f4, 0x119f4, 0x108f2, 0x13bf4, 0x119f2, 0x13bf2, 0x17af0, 0x1bd7c, 0x17a78, 0x1bd3e, 0x17a3c, 0x17a1e, 0x1f9ca, 0x1397c, 0x1fbda, 0x17b7c, 0x1393e, 0x17b3e, 0x1f18a, 0x1f39a, 0x1f7ba, 0x1e10a, 0x1e31a, 0x1e73a, 0x1ef7a, 0x1c21a, 0x1c63a, 0x1ce7a, 0x1defa, 0x1843a, 0x18c7a, 0x19cfa, 0x1bdfa, 0x1087a, 0x118fa, 0x139fa, 0x17978, 0x1bcbe, 0x1793c, 0x1791e, 0x138be, 0x179be, 0x178bc, 0x1789e, 0x1785e, 0x1e0a8, 0x1e0a4, 0x1e0a2, 0x1c168, 0x1e0b6, 0x1c164, 0x1c162, 0x182e8, 0x1c176, 0x182e4, 0x182e2, 0x105e8, 0x182f6, 0x105e4, 0x105e2, 0x105f6, 0x1f0d4, 0x10d7e, 0x1f0d2, 0x1e094, 0x1e1b4, 0x1e092, 0x1e1b2, 0x1c134, 0x1c374, 0x1c132, 0x1c372, 0x18274, 0x186f4, 0x18272, 0x186f2, 0x104f4, 0x10df4, 0x104f2, 0x10df2, 0x1f8ea, 0x11d7c, 0x11d3e, 0x1f0ca, 0x1f1da, 0x1e08a, 0x1e19a, 0x1e3ba, 0x1c11a, 0x1c33a, 0x1c77a, 0x1823a, 0x1867a, 0x18efa, 0x1047a, 0x10cfa, 0x11dfa, 0x13d78, 0x19ebe, 0x13d3c, 0x13d1e, 0x11cbe, 0x13dbe, 0x17d70, 0x1bebc, 0x17d38, 0x1be9e, 0x17d1c, 0x17d0e, 0x13cbc, 0x17dbc, 0x13c9e, 0x17d9e, 0x17cb8, 0x1be5e, 0x17c9c, 0x17c8e, 0x13c5e, 0x17cde, 0x17c5c, 0x17c4e, 0x17c2e, 0x1c0b4, 0x1c0b2, 0x18174, 0x18172, 0x102f4, 0x102f2, 0x1e0da, 0x1c09a, 0x1c1ba, 0x1813a, 0x1837a, 0x1027a, 0x106fa, 0x10ebe, 0x11ebc, 0x11e9e, 0x13eb8, 0x19f5e, 0x13e9c, 0x13e8e, 0x11e5e, 0x13ede, 0x17eb0, 0x1bf5c, 0x17e98, 0x1bf4e, 0x17e8c, 0x17e86, 0x13e5c, 0x17edc, 0x13e4e, 0x17ece, 0x17e58, 0x1bf2e, 0x17e4c, 0x17e46, 0x13e2e, 0x17e6e, 0x17e2c, 0x17e26, 0x10f5e, 0x11f5c, 0x11f4e, 0x13f58, 0x19fae, 0x13f4c, 0x13f46, 0x11f2e, 0x13f6e, 0x13f2c, 0x13f26, 0x1abe0, 0x1d5f8, 0x153c0, 0x1a9f0, 0x1d4fc, 0x151e0, 0x1a8f8, 0x1d47e, 0x150f0, 0x1a87c, 0x15078, 0x1fad0, 0x15be0, 0x1adf8, 0x1fac8, 0x159f0, 0x1acfc, 0x1fac4, 0x158f8, 0x1ac7e, 0x1fac2, 0x1587c, 0x1f5d0, 0x1faec, 0x15df8, 0x1f5c8, 0x1fae6, 0x15cfc, 0x1f5c4, 0x15c7e, 0x1f5c2, 0x1ebd0, 0x1f5ec, 0x1ebc8, 0x1f5e6, 0x1ebc4, 0x1ebc2, 0x1d7d0, 0x1ebec, 0x1d7c8, 0x1ebe6, 0x1d7c4, 0x1d7c2, 0x1afd0, 0x1d7ec, 0x1afc8, 0x1d7e6, 0x1afc4, 0x14bc0, 0x1a5f0, 0x1d2fc, 0x149e0, 0x1a4f8, 0x1d27e, 0x148f0, 0x1a47c, 0x14878, 0x1a43e, 0x1483c, 0x1fa68, 0x14df0, 0x1a6fc, 0x1fa64, 0x14cf8, 0x1a67e, 0x1fa62, 0x14c7c, 0x14c3e, 0x1f4e8, 0x1fa76, 0x14efc, 0x1f4e4, 0x14e7e, 0x1f4e2, 0x1e9e8, 0x1f4f6, 0x1e9e4, 0x1e9e2, 0x1d3e8, 0x1e9f6, 0x1d3e4, 0x1d3e2, 0x1a7e8, 0x1d3f6, 0x1a7e4, 0x1a7e2, 0x145e0, 0x1a2f8, 0x1d17e, 0x144f0, 0x1a27c, 0x14478, 0x1a23e, 0x1443c, 0x1441e, 0x1fa34, 0x146f8, 0x1a37e, 0x1fa32, 0x1467c, 0x1463e, 0x1f474, 0x1477e, 0x1f472, 0x1e8f4, 0x1e8f2, 0x1d1f4, 0x1d1f2, 0x1a3f4, 0x1a3f2, 0x142f0, 0x1a17c, 0x14278, 0x1a13e, 0x1423c, 0x1421e, 0x1fa1a, 0x1437c, 0x1433e, 0x1f43a, 0x1e87a, 0x1d0fa, 0x14178, 0x1a0be, 0x1413c, 0x1411e, 0x141be, 0x140bc, 0x1409e, 0x12bc0, 0x195f0, 0x1cafc, 0x129e0, 0x194f8, 0x1ca7e, 0x128f0, 0x1947c, 0x12878, 0x1943e, 0x1283c, 0x1f968, 0x12df0, 0x196fc, 0x1f964, 0x12cf8, 0x1967e, 0x1f962, 0x12c7c, 0x12c3e, 0x1f2e8, 0x1f976, 0x12efc, 0x1f2e4, 0x12e7e, 0x1f2e2, 0x1e5e8, 0x1f2f6, 0x1e5e4, 0x1e5e2, 0x1cbe8, 0x1e5f6, 0x1cbe4, 0x1cbe2, 0x197e8, 0x1cbf6, 0x197e4, 0x197e2, 0x1b5e0, 0x1daf8, 0x1ed7e, 0x169c0, 0x1b4f0, 0x1da7c, 0x168e0, 0x1b478, 0x1da3e, 0x16870, 0x1b43c, 0x16838, 0x1b41e, 0x1681c, 0x125e0, 0x192f8, 0x1c97e, 0x16de0, 0x124f0, 0x1927c, 0x16cf0, 0x1b67c, 0x1923e, 0x16c78, 0x1243c, 0x16c3c, 0x1241e, 0x16c1e, 0x1f934, 0x126f8, 0x1937e, 0x1fb74, 0x1f932, 0x16ef8, 0x1267c, 0x1fb72, 0x16e7c, 0x1263e, 0x16e3e, 0x1f274, 0x1277e, 0x1f6f4, 0x1f272, 0x16f7e, 0x1f6f2, 0x1e4f4, 0x1edf4, 0x1e4f2, 0x1edf2, 0x1c9f4, 0x1dbf4, 0x1c9f2, 0x1dbf2, 0x193f4, 0x193f2, 0x165c0, 0x1b2f0, 0x1d97c, 0x164e0, 0x1b278, 0x1d93e, 0x16470, 0x1b23c, 0x16438, 0x1b21e, 0x1641c, 0x1640e, 0x122f0, 0x1917c, 0x166f0, 0x12278, 0x1913e, 0x16678, 0x1b33e, 0x1663c, 0x1221e, 0x1661e, 0x1f91a, 0x1237c, 0x1fb3a, 0x1677c, 0x1233e, 0x1673e, 0x1f23a, 0x1f67a, 0x1e47a, 0x1ecfa, 0x1c8fa, 0x1d9fa, 0x191fa, 0x162e0, 0x1b178, 0x1d8be, 0x16270, 0x1b13c, 0x16238, 0x1b11e, 0x1621c, 0x1620e, 0x12178, 0x190be, 0x16378, 0x1213c, 0x1633c, 0x1211e, 0x1631e, 0x121be, 0x163be, 0x16170, 0x1b0bc, 0x16138, 0x1b09e, 0x1611c, 0x1610e, 0x120bc, 0x161bc, 0x1209e, 0x1619e, 0x160b8, 0x1b05e, 0x1609c, 0x1608e, 0x1205e, 0x160de, 0x1605c, 0x1604e, 0x115e0, 0x18af8, 0x1c57e, 0x114f0, 0x18a7c, 0x11478, 0x18a3e, 0x1143c, 0x1141e, 0x1f8b4, 0x116f8, 0x18b7e, 0x1f8b2, 0x1167c, 0x1163e, 0x1f174, 0x1177e, 0x1f172, 0x1e2f4, 0x1e2f2, 0x1c5f4, 0x1c5f2, 0x18bf4, 0x18bf2, 0x135c0, 0x19af0, 0x1cd7c, 0x134e0, 0x19a78, 0x1cd3e, 0x13470, 0x19a3c, 0x13438, 0x19a1e, 0x1341c, 0x1340e, 0x112f0, 0x1897c, 0x136f0, 0x11278, 0x1893e, 0x13678, 0x19b3e, 0x1363c, 0x1121e, 0x1361e, 0x1f89a, 0x1137c, 0x1f9ba, 0x1377c, 0x1133e, 0x1373e, 0x1f13a, 0x1f37a, 0x1e27a, 0x1e6fa, 0x1c4fa, 0x1cdfa, 0x189fa, 0x1bae0, 0x1dd78, 0x1eebe, 0x174c0, 0x1ba70, 0x1dd3c, 0x17460, 0x1ba38, 0x1dd1e, 0x17430, 0x1ba1c, 0x17418, 0x1ba0e, 0x1740c, 0x132e0, 0x19978, 0x1ccbe, 0x176e0, 0x13270, 0x1993c, 0x17670, 0x1bb3c, 0x1991e, 0x17638, 0x1321c, 0x1761c, 0x1320e, 0x1760e, 0x11178, 0x188be, 0x13378, 0x1113c, 0x17778, 0x1333c, 0x1111e, 0x1773c, 0x1331e, 0x1771e, 0x111be, 0x133be, 0x177be, 0x172c0, 0x1b970, 0x1dcbc, 0x17260, 0x1b938, 0x1dc9e, 0x17230, 0x1b91c, 0x17218, 0x1b90e, 0x1720c, 0x17206, 0x13170, 0x198bc, 0x17370, 0x13138, 0x1989e, 0x17338, 0x1b99e, 0x1731c, 0x1310e, 0x1730e, 0x110bc, 0x131bc, 0x1109e, 0x173bc, 0x1319e, 0x1739e, 0x17160, 0x1b8b8, 0x1dc5e, 0x17130, 0x1b89c, 0x17118, 0x1b88e, 0x1710c, 0x17106, 0x130b8, 0x1985e, 0x171b8, 0x1309c, 0x1719c, 0x1308e, 0x1718e, 0x1105e, 0x130de, 0x171de, 0x170b0, 0x1b85c, 0x17098, 0x1b84e, 0x1708c, 0x17086, 0x1305c, 0x170dc, 0x1304e, 0x170ce, 0x17058, 0x1b82e, 0x1704c, 0x17046, 0x1302e, 0x1706e, 0x1702c, 0x17026, 0x10af0, 0x1857c, 0x10a78, 0x1853e, 0x10a3c, 0x10a1e, 0x10b7c, 0x10b3e, 0x1f0ba, 0x1e17a, 0x1c2fa, 0x185fa, 0x11ae0, 0x18d78, 0x1c6be, 0x11a70, 0x18d3c, 0x11a38, 0x18d1e, 0x11a1c, 0x11a0e, 0x10978, 0x184be, 0x11b78, 0x1093c, 0x11b3c, 0x1091e, 0x11b1e, 0x109be, 0x11bbe, 0x13ac0, 0x19d70, 0x1cebc, 0x13a60, 0x19d38, 0x1ce9e, 0x13a30, 0x19d1c, 0x13a18, 0x19d0e, 0x13a0c, 0x13a06, 0x11970, 0x18cbc, 0x13b70, 0x11938, 0x18c9e, 0x13b38, 0x1191c, 0x13b1c, 0x1190e, 0x13b0e, 0x108bc, 0x119bc, 0x1089e, 0x13bbc, 0x1199e, 0x13b9e, 0x1bd60, 0x1deb8, 0x1ef5e, 0x17a40, 0x1bd30, 0x1de9c, 0x17a20, 0x1bd18, 0x1de8e, 0x17a10, 0x1bd0c, 0x17a08, 0x1bd06, 0x17a04, 0x13960, 0x19cb8, 0x1ce5e, 0x17b60, 0x13930, 0x19c9c, 0x17b30, 0x1bd9c, 0x19c8e, 0x17b18, 0x1390c, 0x17b0c, 0x13906, 0x17b06, 0x118b8, 0x18c5e, 0x139b8, 0x1189c, 0x17bb8, 0x1399c, 0x1188e, 0x17b9c, 0x1398e, 0x17b8e, 0x1085e, 0x118de, 0x139de, 0x17bde, 0x17940, 0x1bcb0, 0x1de5c, 0x17920, 0x1bc98, 0x1de4e, 0x17910, 0x1bc8c, 0x17908, 0x1bc86, 0x17904, 0x17902, 0x138b0, 0x19c5c, 0x179b0, 0x13898, 0x19c4e, 0x17998, 0x1bcce, 0x1798c, 0x13886, 0x17986, 0x1185c, 0x138dc, 0x1184e, 0x179dc, 0x138ce, 0x179ce, 0x178a0, 0x1bc58, 0x1de2e, 0x17890, 0x1bc4c, 0x17888, 0x1bc46, 0x17884, 0x17882, 0x13858, 0x19c2e, 0x178d8, 0x1384c, 0x178cc, 0x13846, 0x178c6, 0x1182e, 0x1386e, 0x178ee, 0x17850, 0x1bc2c, 0x17848, 0x1bc26, 0x17844, 0x17842, 0x1382c, 0x1786c, 0x13826, 0x17866, 0x17828, 0x1bc16, 0x17824, 0x17822, 0x13816, 0x17836, 0x10578, 0x182be, 0x1053c, 0x1051e, 0x105be, 0x10d70, 0x186bc, 0x10d38, 0x1869e, 0x10d1c, 0x10d0e, 0x104bc, 0x10dbc, 0x1049e, 0x10d9e, 0x11d60, 0x18eb8, 0x1c75e, 0x11d30, 0x18e9c, 0x11d18, 0x18e8e, 0x11d0c, 0x11d06, 0x10cb8, 0x1865e, 0x11db8, 0x10c9c, 0x11d9c, 0x10c8e, 0x11d8e, 0x1045e, 0x10cde, 0x11dde, 0x13d40, 0x19eb0, 0x1cf5c, 0x13d20, 0x19e98, 0x1cf4e, 0x13d10, 0x19e8c, 0x13d08, 0x19e86, 0x13d04, 0x13d02, 0x11cb0, 0x18e5c, 0x13db0, 0x11c98, 0x18e4e, 0x13d98, 0x19ece, 0x13d8c, 0x11c86, 0x13d86, 0x10c5c, 0x11cdc, 0x10c4e, 0x13ddc, 0x11cce, 0x13dce, 0x1bea0, 0x1df58, 0x1efae, 0x1be90, 0x1df4c, 0x1be88, 0x1df46, 0x1be84, 0x1be82, 0x13ca0, 0x19e58, 0x1cf2e, 0x17da0, 0x13c90, 0x19e4c, 0x17d90, 0x1becc, 0x19e46, 0x17d88, 0x13c84, 0x17d84, 0x13c82, 0x17d82, 0x11c58, 0x18e2e, 0x13cd8, 0x11c4c, 0x17dd8, 0x13ccc, 0x11c46, 0x17dcc, 0x13cc6, 0x17dc6, 0x10c2e, 0x11c6e, 0x13cee, 0x17dee, 0x1be50, 0x1df2c, 0x1be48, 0x1df26, 0x1be44, 0x1be42, 0x13c50, 0x19e2c, 0x17cd0, 0x13c48, 0x19e26, 0x17cc8, 0x1be66, 0x17cc4, 0x13c42, 0x17cc2, 0x11c2c, 0x13c6c, 0x11c26, 0x17cec, 0x13c66, 0x17ce6, 0x1be28, 0x1df16, 0x1be24, 0x1be22, 0x13c28, 0x19e16, 0x17c68, 0x13c24, 0x17c64, 0x13c22, 0x17c62, 0x11c16, 0x13c36, 0x17c76, 0x1be14, 0x1be12, 0x13c14, 0x17c34, 0x13c12, 0x17c32, 0x102bc, 0x1029e, 0x106b8, 0x1835e, 0x1069c, 0x1068e, 0x1025e, 0x106de, 0x10eb0, 0x1875c, 0x10e98, 0x1874e, 0x10e8c, 0x10e86, 0x1065c, 0x10edc, 0x1064e, 0x10ece, 0x11ea0, 0x18f58, 0x1c7ae, 0x11e90, 0x18f4c, 0x11e88, 0x18f46, 0x11e84, 0x11e82, 0x10e58, 0x1872e, 0x11ed8, 0x18f6e, 0x11ecc, 0x10e46, 0x11ec6, 0x1062e, 0x10e6e, 0x11eee, 0x19f50, 0x1cfac, 0x19f48, 0x1cfa6, 0x19f44, 0x19f42, 0x11e50, 0x18f2c, 0x13ed0, 0x19f6c, 0x18f26, 0x13ec8, 0x11e44, 0x13ec4, 0x11e42, 0x13ec2, 0x10e2c, 0x11e6c, 0x10e26, 0x13eec, 0x11e66, 0x13ee6, 0x1dfa8, 0x1efd6, 0x1dfa4, 0x1dfa2, 0x19f28, 0x1cf96, 0x1bf68, 0x19f24, 0x1bf64, 0x19f22, 0x1bf62, 0x11e28, 0x18f16, 0x13e68, 0x11e24, 0x17ee8, 0x13e64, 0x11e22, 0x17ee4, 0x13e62, 0x17ee2, 0x10e16, 0x11e36, 0x13e76, 0x17ef6, 0x1df94, 0x1df92, 0x19f14, 0x1bf34, 0x19f12, 0x1bf32, 0x11e14, 0x13e34, 0x11e12, 0x17e74, 0x13e32, 0x17e72, 0x1df8a, 0x19f0a, 0x1bf1a, 0x11e0a, 0x13e1a, 0x17e3a, 0x1035c, 0x1034e, 0x10758, 0x183ae, 0x1074c, 0x10746, 0x1032e, 0x1076e, 0x10f50, 0x187ac, 0x10f48, 0x187a6, 0x10f44, 0x10f42, 0x1072c, 0x10f6c, 0x10726, 0x10f66, 0x18fa8, 0x1c7d6, 0x18fa4, 0x18fa2, 0x10f28, 0x18796, 0x11f68, 0x18fb6, 0x11f64, 0x10f22, 0x11f62, 0x10716, 0x10f36, 0x11f76, 0x1cfd4, 0x1cfd2, 0x18f94, 0x19fb4, 0x18f92, 0x19fb2, 0x10f14, 0x11f34, 0x10f12, 0x13f74, 0x11f32, 0x13f72, 0x1cfca, 0x18f8a, 0x19f9a, 0x10f0a, 0x11f1a, 0x13f3a, 0x103ac, 0x103a6, 0x107a8, 0x183d6, 0x107a4, 0x107a2, 0x10396, 0x107b6, 0x187d4, 0x187d2, 0x10794, 0x10fb4, 0x10792, 0x10fb2, 0x1c7ea }; static const float PREFERRED_RATIO = 3.0f; static const float DEFAULT_MODULE_WIDTH = 0.357f; //1px in mm static const float HEIGHT = 2.0f; //mm /** * PDF417 error correction code following the algorithm described in ISO/IEC 15438:2001(E) in * chapter 4.10. */ /** * Tables of coefficients for calculating error correction words * (see annex F, ISO/IEC 15438:2001(E)) */ static const short EC_COEFFICIENTS_L0[] = { 27, 917 }; static const short EC_COEFFICIENTS_L1[] = { 522, 568, 723, 809 }; static const short EC_COEFFICIENTS_L2[] = { 237, 308, 436, 284, 646, 653, 428, 379 }; static const short EC_COEFFICIENTS_L3[] = { 274, 562, 232, 755, 599, 524, 801, 132, 295, 116, 442, 428, 295, 42, 176, 65, }; static const short EC_COEFFICIENTS_L4[] = { 361, 575, 922, 525, 176, 586, 640, 321, 536, 742, 677, 742, 687, 284, 193, 517, 273, 494, 263, 147, 593, 800, 571, 320, 803, 133, 231, 390, 685, 330, 63, 410, }; static const short EC_COEFFICIENTS_L5[] = { 539, 422, 6, 93, 862, 771, 453, 106, 610, 287, 107, 505, 733, 877, 381, 612, 723, 476, 462, 172, 430, 609, 858, 822, 543, 376, 511, 400, 672, 762, 283, 184, 440, 35, 519, 31, 460, 594, 225, 535, 517, 352, 605, 158, 651, 201, 488, 502, 648, 733, 717, 83, 404, 97, 280, 771, 840, 629, 4, 381, 843, 623, 264, 543, }; static const short EC_COEFFICIENTS_L6[] = { 521, 310, 864, 547, 858, 580, 296, 379, 53, 779, 897, 444, 400, 925, 749, 415, 822, 93, 217, 208, 928, 244, 583, 620, 246, 148, 447, 631, 292, 908, 490, 704, 516, 258, 457, 907, 594, 723, 674, 292, 272, 96, 684, 432, 686, 606, 860, 569, 193, 219, 129, 186, 236, 287, 192, 775, 278, 173, 40, 379, 712, 463, 646, 776, 171, 491, 297, 763, 156, 732, 95, 270, 447, 90, 507, 48, 228, 821, 808, 898, 784, 663, 627, 378, 382, 262, 380, 602, 754, 336, 89, 614, 87, 432, 670, 616, 157, 374, 242, 726, 600, 269, 375, 898, 845, 454, 354, 130, 814, 587, 804, 34, 211, 330, 539, 297, 827, 865, 37, 517, 834, 315, 550, 86, 801, 4, 108, 539, }; static const short EC_COEFFICIENTS_L7[] = { 524, 894, 75, 766, 882, 857, 74, 204, 82, 586, 708, 250, 905, 786, 138, 720, 858, 194, 311, 913, 275, 190, 375, 850, 438, 733, 194, 280, 201, 280, 828, 757, 710, 814, 919, 89, 68, 569, 11, 204, 796, 605, 540, 913, 801, 700, 799, 137, 439, 418, 592, 668, 353, 859, 370, 694, 325, 240, 216, 257, 284, 549, 209, 884, 315, 70, 329, 793, 490, 274, 877, 162, 749, 812, 684, 461, 334, 376, 849, 521, 307, 291, 803, 712, 19, 358, 399, 908, 103, 511, 51, 8, 517, 225, 289, 470, 637, 731, 66, 255, 917, 269, 463, 830, 730, 433, 848, 585, 136, 538, 906, 90, 2, 290, 743, 199, 655, 903, 329, 49, 802, 580, 355, 588, 188, 462, 10, 134, 628, 320, 479, 130, 739, 71, 263, 318, 374, 601, 192, 605, 142, 673, 687, 234, 722, 384, 177, 752, 607, 640, 455, 193, 689, 707, 805, 641, 48, 60, 732, 621, 895, 544, 261, 852, 655, 309, 697, 755, 756, 60, 231, 773, 434, 421, 726, 528, 503, 118, 49, 795, 32, 144, 500, 238, 836, 394, 280, 566, 319, 9, 647, 550, 73, 914, 342, 126, 32, 681, 331, 792, 620, 60, 609, 441, 180, 791, 893, 754, 605, 383, 228, 749, 760, 213, 54, 297, 134, 54, 834, 299, 922, 191, 910, 532, 609, 829, 189, 20, 167, 29, 872, 449, 83, 402, 41, 656, 505, 579, 481, 173, 404, 251, 688, 95, 497, 555, 642, 543, 307, 159, 924, 558, 648, 55, 497, 10, }; static const short EC_COEFFICIENTS_L8[] = { 352, 77, 373, 504, 35, 599, 428, 207, 409, 574, 118, 498, 285, 380, 350, 492, 197, 265, 920, 155, 914, 299, 229, 643, 294, 871, 306, 88, 87, 193, 352, 781, 846, 75, 327, 520, 435, 543, 203, 666, 249, 346, 781, 621, 640, 268, 794, 534, 539, 781, 408, 390, 644, 102, 476, 499, 290, 632, 545, 37, 858, 916, 552, 41, 542, 289, 122, 272, 383, 800, 485, 98, 752, 472, 761, 107, 784, 860, 658, 741, 290, 204, 681, 407, 855, 85, 99, 62, 482, 180, 20, 297, 451, 593, 913, 142, 808, 684, 287, 536, 561, 76, 653, 899, 729, 567, 744, 390, 513, 192, 516, 258, 240, 518, 794, 395, 768, 848, 51, 610, 384, 168, 190, 826, 328, 596, 786, 303, 570, 381, 415, 641, 156, 237, 151, 429, 531, 207, 676, 710, 89, 168, 304, 402, 40, 708, 575, 162, 864, 229, 65, 861, 841, 512, 164, 477, 221, 92, 358, 785, 288, 357, 850, 836, 827, 736, 707, 94, 8, 494, 114, 521, 2, 499, 851, 543, 152, 729, 771, 95, 248, 361, 578, 323, 856, 797, 289, 51, 684, 466, 533, 820, 669, 45, 902, 452, 167, 342, 244, 173, 35, 463, 651, 51, 699, 591, 452, 578, 37, 124, 298, 332, 552, 43, 427, 119, 662, 777, 475, 850, 764, 364, 578, 911, 283, 711, 472, 420, 245, 288, 594, 394, 511, 327, 589, 777, 699, 688, 43, 408, 842, 383, 721, 521, 560, 644, 714, 559, 62, 145, 873, 663, 713, 159, 672, 729, 624, 59, 193, 417, 158, 209, 563, 564, 343, 693, 109, 608, 563, 365, 181, 772, 677, 310, 248, 353, 708, 410, 579, 870, 617, 841, 632, 860, 289, 536, 35, 777, 618, 586, 424, 833, 77, 597, 346, 269, 757, 632, 695, 751, 331, 247, 184, 45, 787, 680, 18, 66, 407, 369, 54, 492, 228, 613, 830, 922, 437, 519, 644, 905, 789, 420, 305, 441, 207, 300, 892, 827, 141, 537, 381, 662, 513, 56, 252, 341, 242, 797, 838, 837, 720, 224, 307, 631, 61, 87, 560, 310, 756, 665, 397, 808, 851, 309, 473, 795, 378, 31, 647, 915, 459, 806, 590, 731, 425, 216, 548, 249, 321, 881, 699, 535, 673, 782, 210, 815, 905, 303, 843, 922, 281, 73, 469, 791, 660, 162, 498, 308, 155, 422, 907, 817, 187, 62, 16, 425, 535, 336, 286, 437, 375, 273, 610, 296, 183, 923, 116, 667, 751, 353, 62, 366, 691, 379, 687, 842, 37, 357, 720, 742, 330, 5, 39, 923, 311, 424, 242, 749, 321, 54, 669, 316, 342, 299, 534, 105, 667, 488, 640, 672, 576, 540, 316, 486, 721, 610, 46, 656, 447, 171, 616, 464, 190, 531, 297, 321, 762, 752, 533, 175, 134, 14, 381, 433, 717, 45, 111, 20, 596, 284, 736, 138, 646, 411, 877, 669, 141, 919, 45, 780, 407, 164, 332, 899, 165, 726, 600, 325, 498, 655, 357, 752, 768, 223, 849, 647, 63, 310, 863, 251, 366, 304, 282, 738, 675, 410, 389, 244, 31, 121, 303, 263, }; static const short* EC_COEFFICIENTS[] = {EC_COEFFICIENTS_L0, EC_COEFFICIENTS_L1, EC_COEFFICIENTS_L2, EC_COEFFICIENTS_L3, EC_COEFFICIENTS_L4, EC_COEFFICIENTS_L5, EC_COEFFICIENTS_L6, EC_COEFFICIENTS_L7, EC_COEFFICIENTS_L8}; /** * Determines the number of error correction codewords for a specified error correction * level. * * @param errorCorrectionLevel the error correction level (0-8) * @return the number of codewords generated for error correction */ static inline int GetErrorCorrectionCodewordCount(int errorCorrectionLevel) { return 1 << (errorCorrectionLevel + 1); } /** * Generates the error correction codewords according to 4.10 in ISO/IEC 15438:2001(E). * * @param dataCodewords the data codewords * @param errorCorrectionLevel the error correction level (0-8) * @return the String representing the error correction codewords */ static void GenerateErrorCorrection(std::vector& dataCodewords, int errorCorrectionLevel) { int k = GetErrorCorrectionCodewordCount(errorCorrectionLevel); std::vector e(k, 0); int sld = (int)dataCodewords.size(); for (int i = 0; i < sld; i++) { int t1 = (dataCodewords[i] + e[k - 1]) % 929; int t2; int t3; for (int j = k - 1; j >= 1; j--) { t2 = (t1 * EC_COEFFICIENTS[errorCorrectionLevel][j]) % 929; t3 = 929 - t2; e[j] = (e[j - 1] + t3) % 929; } t2 = (t1 * EC_COEFFICIENTS[errorCorrectionLevel][0]) % 929; t3 = 929 - t2; e[0] = t3 % 929; } for (int j = 0; j < k; ++j) { if (e[j] != 0) { e[j] = 929 - e[j]; } } dataCodewords.insert(dataCodewords.end(), e.rbegin(), e.rend()); } /** * Calculates the necessary number of rows as described in annex Q of ISO/IEC 15438:2001(E). * * @param m the number of source codewords prior to the additional of the Symbol Length * Descriptor and any pad codewords * @param k the number of error correction codewords * @param c the number of columns in the symbol in the data region (excluding start, stop and * row indicator codewords) * @return the number of rows in the symbol (r) */ static int CalculateNumberOfRows(int m, int k, int c) { int r = ((m + 1 + k) / c) + 1; if (c * r >= (m + 1 + k + c)) { r--; } return r; } /** * Calculates the number of pad codewords as described in 4.9.2 of ISO/IEC 15438:2001(E). * * @param m the number of source codewords prior to the additional of the Symbol Length * Descriptor and any pad codewords * @param k the number of error correction codewords * @param c the number of columns in the symbol in the data region (excluding start, stop and * row indicator codewords) * @param r the number of rows in the symbol * @return the number of pad codewords */ static int GetNumberOfPadCodewords(int m, int k, int c, int r) { int n = c * r - k; return n > m + 1 ? n - m - 1 : 0; } static void EncodeChar(int pattern, int len, BarcodeRow& logic) { int map = 1 << (len - 1); bool last = (pattern & map) != 0; //Initialize to inverse of first bit int width = 0; for (int i = 0; i < len; i++) { bool black = (pattern & map) != 0; if (last == black) { width++; } else { logic.addBar(last, width); last = black; width = 1; } map >>= 1; } logic.addBar(last, width); } static BarcodeMatrix EncodeLowLevel(const std::vector& fullCodewords, int c, int r, int errorCorrectionLevel, bool compact) { BarcodeMatrix logic; logic.init(r, c); int idx = 0; for (int y = 0; y < r; y++) { int cluster = y % 3; logic.startRow(); EncodeChar(START_PATTERN, 17, logic.currentRow()); int left; int right; if (cluster == 0) { left = (30 * (y / 3)) + ((r - 1) / 3); right = (30 * (y / 3)) + (c - 1); } else if (cluster == 1) { left = (30 * (y / 3)) + (errorCorrectionLevel * 3) + ((r - 1) % 3); right = (30 * (y / 3)) + ((r - 1) / 3); } else { left = (30 * (y / 3)) + (c - 1); right = (30 * (y / 3)) + (errorCorrectionLevel * 3) + ((r - 1) % 3); } int pattern = CODEWORD_TABLE[cluster][left]; EncodeChar(pattern, 17, logic.currentRow()); for (int x = 0; x < c; x++) { pattern = CODEWORD_TABLE[cluster][fullCodewords[idx]]; EncodeChar(pattern, 17, logic.currentRow()); idx++; } if (compact) { EncodeChar(STOP_PATTERN, 1, logic.currentRow()); // encodes stop line for compact pdf417 } else { pattern = CODEWORD_TABLE[cluster][right]; EncodeChar(pattern, 17, logic.currentRow()); EncodeChar(STOP_PATTERN, 18, logic.currentRow()); } } return logic; } /** * Determine optimal nr of columns and rows for the specified number of * codewords. * * @param sourceCodeWords number of code words * @param errorCorrectionCodeWords number of error correction code words * @return dimension object containing cols as width and rows as height */ static void DetermineDimensions(int minCols, int maxCols, int minRows, int maxRows, int sourceCodeWords, int errorCorrectionCodeWords, int& outCols, int& outRows) { float ratio = 0.0f; bool haveDimension = false; for (int cols = minCols; cols <= maxCols; cols++) { int rows = CalculateNumberOfRows(sourceCodeWords, errorCorrectionCodeWords, cols); if (rows < minRows) { break; } if (rows > maxRows) { continue; } float newRatio = ((17 * cols + 69) * DEFAULT_MODULE_WIDTH) / (rows * HEIGHT); // ignore if previous ratio is closer to preferred ratio if (haveDimension && std::abs(newRatio - PREFERRED_RATIO) > std::abs(ratio - PREFERRED_RATIO)) { continue; } ratio = newRatio; outCols = cols; outRows = rows; haveDimension = true; } // Handle case when min values were larger than necessary if (!haveDimension) { int rows = CalculateNumberOfRows(sourceCodeWords, errorCorrectionCodeWords, minCols); if (rows < minRows) { outCols = minCols; outRows = minRows; haveDimension = true; } else { throw std::invalid_argument("Unable to fit message in columns"); } } } /** * @param msg message to encode * @param errorCorrectionLevel PDF417 error correction level to use * @throws WriterException if the contents cannot be encoded in this format */ BarcodeMatrix Encoder::generateBarcodeLogic(const std::wstring& msg, int errorCorrectionLevel) const { if (errorCorrectionLevel < 0 || errorCorrectionLevel > 8) { throw std::invalid_argument("Error correction level must be between 0 and 8!"); } //1. step: High-level encoding int errorCorrectionCodeWords = GetErrorCorrectionCodewordCount(errorCorrectionLevel); std::vector highLevel = HighLevelEncoder::EncodeHighLevel(msg, _compaction, _encoding); int sourceCodeWords = static_cast(highLevel.size()); int cols, rows; DetermineDimensions(_minCols, _maxCols, _minRows, _maxRows, sourceCodeWords, errorCorrectionCodeWords, cols, rows); int pad = GetNumberOfPadCodewords(sourceCodeWords, errorCorrectionCodeWords, cols, rows); //2. step: construct data codewords if (sourceCodeWords + errorCorrectionCodeWords + 1 > 929) { // +1 for symbol length CW throw std::invalid_argument("Encoded message contains to many code words, message too big"); } int n = sourceCodeWords + pad + 1; std::vector dataCodewords; dataCodewords.reserve(n); dataCodewords.push_back(n); dataCodewords.insert(dataCodewords.end(), highLevel.begin(), highLevel.end()); for (int i = 0; i < pad; i++) { dataCodewords.push_back(900); //PAD characters } //3. step: Error correction GenerateErrorCorrection(dataCodewords, errorCorrectionLevel); //4. step: low-level encoding return EncodeLowLevel(dataCodewords, cols, rows, errorCorrectionLevel, _compact); } /** * Returns the recommended minimum error correction level as described in annex E of * ISO/IEC 15438:2001(E). * * @param n the number of data codewords * @return the recommended minimum error correction level */ int Encoder::GetRecommendedMinimumErrorCorrectionLevel(int n) { if (n <= 40) { return 2; } if (n <= 160) { return 3; } if (n <= 320) { return 4; } if (n <= 863) { return 5; } return 6; } } // Pdf417 } // ZXing zxing-cpp-1.0.8+ds2/core/src/pdf417/PDFEncoder.h000066400000000000000000000104221361167020700207330ustar00rootroot00000000000000#pragma once /* * Copyright 2016 Huy Cuong Nguyen * Copyright 2016 ZXing authors * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #include "CharacterSet.h" #include "PDFCompaction.h" #include #include namespace ZXing { namespace Pdf417 { /** * @author Jacob Haynes */ class BarcodeRow { std::vector _row; int _currentLocation = 0; // A tacker for position in the bar public: explicit BarcodeRow(int width = 0) : _row(width, false) {} void init(int width) { _row.resize(width, false); _currentLocation = 0; } void set(int x, bool black) { _row.at(x) = black; } /** * @param black A boolean which is true if the bar black false if it is white * @param width How many spots wide the bar is. */ void addBar(bool black, int width) { for (int ii = 0; ii < width; ii++) { _row.at(_currentLocation++) = black; } } /** * This function scales the row * * @param scale How much you want the image to be scaled, must be greater than or equal to 1. * @return the scaled row */ void getScaledRow(int scale, std::vector& output) const { output.resize(_row.size() * scale); for (size_t i = 0; i < output.size(); ++i) { output[i] = _row[i / scale]; } } }; /** * Holds all of the information for a barcode in a format where it can be easily accessable * * @author Jacob Haynes */ class BarcodeMatrix { std::vector _matrix; int _width = 0; int _currentRow = -1; public: BarcodeMatrix() {} /** * @param height the height of the matrix (Rows) * @param width the width of the matrix (Cols) */ BarcodeMatrix(int height, int width) { init(height, width); } void init(int height, int width) { _matrix.resize(height); for (int i = 0; i < height; ++i) { _matrix[i].init((width + 4) * 17 + 1); } _width = width * 17; _currentRow = -1; } void set(int x, int y, bool value) { _matrix[y].set(x, value); } void startRow() { ++_currentRow; } const BarcodeRow& currentRow() const { return _matrix[_currentRow]; } BarcodeRow& currentRow() { return _matrix[_currentRow]; } void getScaledMatrix(int xScale, int yScale, std::vector>& output) { output.resize(_matrix.size() * yScale); int yMax = static_cast(output.size()); for (int i = 0; i < yMax; i++) { _matrix[i / yScale].getScaledRow(xScale, output[yMax - i - 1]); } } }; /** * Top-level class for the logic part of the PDF417 implementation. * C++ port: this class was named PDF417 in Java code. Since that name * does say much in the context of PDF417 writer, it's renamed here Encoder * to follow the same naming convention with other modules. */ class Encoder { public: explicit Encoder(bool compact = false) : _compact(compact) {} BarcodeMatrix generateBarcodeLogic(const std::wstring& msg, int errorCorrectionLevel) const; /** * Sets max/min row/col values * * @param maxCols maximum allowed columns * @param minCols minimum allowed columns * @param maxRows maximum allowed rows * @param minRows minimum allowed rows */ void setDimensions(int minCols, int maxCols, int minRows, int maxRows) { _minCols = minCols; _maxCols = maxCols; _minRows = minRows; _maxRows = maxRows; } /** * @param compaction compaction mode to use */ void setCompaction(Compaction compaction) { _compaction = compaction; } /** * @param compact if true, enables compaction */ void setCompact(bool compact) { _compact = compact; } /** * @param encoding sets character encoding to use */ void setEncoding(CharacterSet encoding) { _encoding = encoding; } static int GetRecommendedMinimumErrorCorrectionLevel(int n); private: bool _compact; Compaction _compaction = Compaction::AUTO; CharacterSet _encoding = CharacterSet::ISO8859_1; int _minCols = 2; int _maxCols = 30; int _minRows = 2; int _maxRows = 30; }; } // Pdf417 } // ZXing zxing-cpp-1.0.8+ds2/core/src/pdf417/PDFHighLevelEncoder.cpp000066400000000000000000000354121361167020700230640ustar00rootroot00000000000000/* * Copyright 2016 Huy Cuong Nguyen * Copyright 2016 ZXing authors * Copyright 2006 Jeremias Maerki in part, and ZXing Authors in part * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #include "PDFHighLevelEncoder.h" #include "PDFCompaction.h" #include "CharacterSet.h" #include "CharacterSetECI.h" #include "TextEncoder.h" #include "ZXBigInteger.h" #include #include #include namespace ZXing { namespace Pdf417 { /** * code for Text compaction */ static const int TEXT_COMPACTION = 0; /** * code for Byte compaction */ static const int BYTE_COMPACTION = 1; /** * code for Numeric compaction */ static const int NUMERIC_COMPACTION = 2; /** * Text compaction submode Alpha */ static const int SUBMODE_ALPHA = 0; /** * Text compaction submode Lower */ static const int SUBMODE_LOWER = 1; /** * Text compaction submode Mixed */ static const int SUBMODE_MIXED = 2; /** * Text compaction submode Punctuation */ static const int SUBMODE_PUNCTUATION = 3; /** * mode latch to Text Compaction mode */ static const int LATCH_TO_TEXT = 900; /** * mode latch to Byte Compaction mode (number of characters NOT a multiple of 6) */ static const int LATCH_TO_BYTE_PADDED = 901; /** * mode latch to Numeric Compaction mode */ static const int LATCH_TO_NUMERIC = 902; /** * mode shift to Byte Compaction mode */ static const int SHIFT_TO_BYTE = 913; /** * mode latch to Byte Compaction mode (number of characters a multiple of 6) */ static const int LATCH_TO_BYTE = 924; /** * identifier for a user defined Extended Channel Interpretation (ECI) */ static const int ECI_USER_DEFINED = 925; /** * identifier for a general purpose ECO format */ static const int ECI_GENERAL_PURPOSE = 926; /** * identifier for an ECI of a character set of code page */ static const int ECI_CHARSET = 927; /** * Raw code table for text compaction Mixed sub-mode */ //static const uint8_t TEXT_MIXED_RAW[] = { // 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 38, 13, 9, 44, 58, // 35, 45, 46, 36, 47, 43, 37, 42, 61, 94, 0, 32, 0, 0, 0 }; /** * Raw code table for text compaction: Punctuation sub-mode */ //static const uint8_t TEXT_PUNCTUATION_RAW[] = { // 59, 60, 62, 64, 91, 92, 93, 95, 96, 126, 33, 13, 9, 44, 58, // 10, 45, 46, 36, 47, 34, 124, 42, 40, 41, 63, 123, 125, 39, 0 }; //static { // //Construct inverse lookups // Arrays.fill(MIXED, (byte)-1); // for (byte i = 0; i < TEXT_MIXED_RAW.length; i++) { // byte b = TEXT_MIXED_RAW[i]; // if (b > 0) { // MIXED[b] = i; // } // } // Arrays.fill(PUNCTUATION, (byte)-1); // for (byte i = 0; i < TEXT_PUNCTUATION_RAW.length; i++) { // byte b = TEXT_PUNCTUATION_RAW[i]; // if (b > 0) { // PUNCTUATION[b] = i; // } // } //} static const int8_t MIXED[] = { -1, -1, -1, -1, -1, -1, -1, -1, -1, 12, -1, -1, -1, 11, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 26, -1, -1, 15, 18, 21, 10, -1, -1, -1, 22, 20, 13, 16, 17, 19, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 14, -1, -1, 23, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 24, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, }; static const int8_t PUNCTUATION[] = { -1, -1, -1, -1, -1, -1, -1, -1, -1, 12, 15, -1, -1, 11, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 10, 20, -1, 18, -1, -1, 28, 23, 24, 22, -1, 13, 16, 17, 19, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 14, 0, 1, -1, 2, 25, 3, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 4, 5, 6, -1, 7, 8, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 26, 21, 27, 9, -1, }; static void EncodingECI(int eci, std::vector& buffer) { if (eci >= 0 && eci < 900) { buffer.push_back(ECI_CHARSET); buffer.push_back(eci); } else if (eci < 810900) { buffer.push_back(ECI_GENERAL_PURPOSE); buffer.push_back(eci / 900 - 1); buffer.push_back(eci % 900); } else if (eci < 811800) { buffer.push_back(ECI_USER_DEFINED); buffer.push_back(810900 - eci); } else { throw std::invalid_argument("ECI number not in valid range from 0..811799"); } } static inline bool IsDigit(int ch) { return ch >= '0' && ch <= '9'; } static inline bool IsAlphaUpper(int ch) { return ch == ' ' || (ch >= 'A' && ch <= 'Z'); } static inline bool IsAlphaLower(int ch) { return ch == ' ' || (ch >= 'a' && ch <= 'z'); } static bool IsMixed(int ch) { return (ch & 0x7f) == ch && MIXED[ch] != -1; } static bool IsPunctuation(int ch) { return (ch & 0x7f) == ch && PUNCTUATION[ch] != -1; } static bool IsText(int ch) { return ch == '\t' || ch == '\n' || ch == '\r' || (ch >= 32 && ch <= 126); } /** * Encode parts of the message using Text Compaction as described in ISO/IEC 15438:2001(E), * chapter 4.4.2. * * @param msg the message * @param startpos the start position within the message * @param count the number of characters to encode * @param sb receives the encoded codewords * @param initialSubmode should normally be SUBMODE_ALPHA * @return the text submode in which this method ends */ static int EncodeText(const std::wstring& msg, int startpos, int count, int submode, std::vector& output) { std::vector tmp; tmp.reserve(count); int idx = 0; while (true) { int ch = msg[startpos + idx]; switch (submode) { case SUBMODE_ALPHA: if (IsAlphaUpper(ch)) { tmp.push_back(ch == ' ' ? 26 : (ch - 65)); //space } else if (IsAlphaLower(ch)) { submode = SUBMODE_LOWER; tmp.push_back(27); //ll continue; } else if (IsMixed(ch)) { submode = SUBMODE_MIXED; tmp.push_back(28); //ml continue; } else { tmp.push_back(29); //ps tmp.push_back(PUNCTUATION[ch]); } break; case SUBMODE_LOWER: if (IsAlphaLower(ch)) { tmp.push_back(ch == ' ' ? 26 : (ch - 97)); //space } else if (IsAlphaUpper(ch)) { tmp.push_back(27); //as tmp.push_back(ch - 65); //space cannot happen here, it is also in "Lower" } else if (IsMixed(ch)) { submode = SUBMODE_MIXED; tmp.push_back(28); //ml continue; } else { tmp.push_back(29); //ps tmp.push_back(PUNCTUATION[ch]); } break; case SUBMODE_MIXED: if (IsMixed(ch)) { tmp.push_back(MIXED[ch]); } else if (IsAlphaUpper(ch)) { submode = SUBMODE_ALPHA; tmp.push_back(28); //al continue; } else if (IsAlphaLower(ch)) { submode = SUBMODE_LOWER; tmp.push_back(27); //ll continue; } else { if (startpos + idx + 1 < count) { int next = msg[startpos + idx + 1]; if (IsPunctuation(next)) { submode = SUBMODE_PUNCTUATION; tmp.push_back(25); //pl continue; } } tmp.push_back(29); //ps tmp.push_back(PUNCTUATION[ch]); } break; default: //SUBMODE_PUNCTUATION if (IsPunctuation(ch)) { tmp.push_back(PUNCTUATION[ch]); } else { submode = SUBMODE_ALPHA; tmp.push_back(29); //al continue; } } idx++; if (idx >= count) { break; } } int h = 0; size_t len = tmp.size(); for (size_t i = 0; i < len; i++) { bool odd = (i % 2) != 0; if (odd) { h = (h * 30) + tmp[i]; output.push_back(h); } else { h = tmp[i]; } } if ((len % 2) != 0) { output.push_back((h * 30) + 29); //ps } return submode; } /** * Encode parts of the message using Byte Compaction as described in ISO/IEC 15438:2001(E), * chapter 4.4.3. The Unicode characters will be converted to binary using the cp437 * codepage. * * @param bytes the message converted to a byte array * @param startpos the start position within the message * @param count the number of bytes to encode * @param startmode the mode from which this method starts * @param sb receives the encoded codewords */ static void EncodeBinary(const std::string& bytes, int startpos, int count, int startmode, std::vector& output) { if (count == 1 && startmode == TEXT_COMPACTION) { output.push_back(SHIFT_TO_BYTE); } else { if ((count % 6) == 0) { output.push_back(LATCH_TO_BYTE); } else { output.push_back(LATCH_TO_BYTE_PADDED); } } int idx = startpos; // Encode sixpacks if (count >= 6) { int chars[5]; while ((startpos + count - idx) >= 6) { long t = 0; for (int i = 0; i < 6; i++) { t <<= 8; t += bytes[idx + i] & 0xff; } for (int i = 0; i < 5; i++) { chars[i] = t % 900; t /= 900; } for (int i = 4; i >= 0; i--) { output.push_back(chars[i]); } idx += 6; } } //Encode rest (remaining n<5 bytes if any) for (int i = idx; i < startpos + count; i++) { int ch = bytes[i] & 0xff; output.push_back(ch); } } static void EncodeNumeric(const std::wstring& msg, int startpos, int count, std::vector& output) { int idx = 0; std::vector tmp; tmp.reserve(count / 3 + 1); BigInteger num900(900); while (idx < count) { tmp.clear(); int len = std::min(44, count - idx); auto part = L"1" + msg.substr(startpos + idx, len); BigInteger bigint, r; BigInteger::TryParse(part, bigint); do { BigInteger::Divide(bigint, num900, bigint, r); tmp.push_back(r.toInt()); } while (!bigint.isZero()); //Reverse temporary string output.insert(output.end(), tmp.rbegin(), tmp.rend()); idx += len; } } /** * Determines the number of consecutive characters that are encodable using numeric compaction. * * @param msg the message * @param startpos the start position within the message * @return the requested character count */ static int DetermineConsecutiveDigitCount(const std::wstring& msg, int startpos) { int count = 0; size_t len = msg.length(); size_t idx = startpos; if (idx < len) { int ch = msg[idx]; while (IsDigit(ch) && idx < len) { count++; idx++; if (idx < len) { ch = msg[idx]; } } } return count; } /** * Determines the number of consecutive characters that are encodable using text compaction. * * @param msg the message * @param startpos the start position within the message * @return the requested character count */ static int DetermineConsecutiveTextCount(const std::wstring& msg, int startpos) { size_t len = msg.length(); size_t idx = startpos; while (idx < len) { int ch = msg[idx]; int numericCount = 0; while (numericCount < 13 && IsDigit(ch) && idx < len) { numericCount++; idx++; if (idx < len) { ch = msg[idx]; } } if (numericCount >= 13) { return static_cast(idx - startpos - numericCount); } if (numericCount > 0) { //Heuristic: All text-encodable chars or digits are binary encodable continue; } ch = msg[idx]; //Check if character is encodable if (!IsText(ch)) { break; } idx++; } return static_cast(idx - startpos); } /** * Determines the number of consecutive characters that are encodable using binary compaction. * * @param msg the message * @param startpos the start position within the message * @param encoding the charset used to convert the message to a byte array * @return the requested character count */ static int DetermineConsecutiveBinaryCount(const std::wstring& msg, int startpos) { size_t len = msg.length(); size_t idx = startpos; while (idx < len) { int ch = msg[idx]; int numericCount = 0; while (numericCount < 13 && IsDigit(ch)) { numericCount++; //textCount++; size_t i = idx + numericCount; if (i >= len) { break; } ch = msg[i]; } if (numericCount >= 13) { return static_cast(idx - startpos); } idx++; } return static_cast(idx - startpos); } /** * Performs high-level encoding of a PDF417 message using the algorithm described in annex P * of ISO/IEC 15438:2001(E). If byte compaction has been selected, then only byte compaction * is used. * * @param msg the message * @param compaction compaction mode to use * @param encoding character encoding used to encode in default or byte compaction * or {@code null} for default / not applicable * @return the encoded message (the char values range from 0 to 928) */ std::vector HighLevelEncoder::EncodeHighLevel(const std::wstring& msg, Compaction compaction, CharacterSet encoding) { std::vector highLevel; highLevel.reserve(highLevel.size() + msg.length()); //the codewords 0..928 are encoded as Unicode characters if (encoding != CharacterSet::ISO8859_1) { EncodingECI(CharacterSetECI::ValueForCharset(encoding), highLevel); } int len = static_cast(msg.length()); int p = 0; int textSubMode = SUBMODE_ALPHA; // User selected encoding mode if (compaction == Compaction::TEXT) { EncodeText(msg, p, len, textSubMode, highLevel); } else if (compaction == Compaction::BYTE) { std::string bytes = TextEncoder::FromUnicode(msg, encoding); EncodeBinary(bytes, p, static_cast(bytes.length()), BYTE_COMPACTION, highLevel); } else if (compaction == Compaction::NUMERIC) { highLevel.push_back(LATCH_TO_NUMERIC); EncodeNumeric(msg, p, len, highLevel); } else { int encodingMode = TEXT_COMPACTION; //Default mode, see 4.4.2.1 while (p < len) { int n = DetermineConsecutiveDigitCount(msg, p); if (n >= 13) { highLevel.push_back(LATCH_TO_NUMERIC); encodingMode = NUMERIC_COMPACTION; textSubMode = SUBMODE_ALPHA; //Reset after latch EncodeNumeric(msg, p, n, highLevel); p += n; } else { int t = DetermineConsecutiveTextCount(msg, p); if (t >= 5 || n == len) { if (encodingMode != TEXT_COMPACTION) { highLevel.push_back(LATCH_TO_TEXT); encodingMode = TEXT_COMPACTION; textSubMode = SUBMODE_ALPHA; //start with submode alpha after latch } textSubMode = EncodeText(msg, p, t, textSubMode, highLevel); p += t; } else { int b = DetermineConsecutiveBinaryCount(msg, p); if (b == 0) { b = 1; } std::string bytes = TextEncoder::FromUnicode(msg.substr(p, b), encoding); if (bytes.length() == 1 && encodingMode == TEXT_COMPACTION) { //Switch for one byte (instead of latch) EncodeBinary(bytes, 0, 1, TEXT_COMPACTION, highLevel); } else { //Mode latch performed by encodeBinary() EncodeBinary(bytes, 0, static_cast(bytes.length()), encodingMode, highLevel); encodingMode = BYTE_COMPACTION; textSubMode = SUBMODE_ALPHA; //Reset after latch } p += b; } } } } return highLevel; } } // Pdf417 } // ZXing zxing-cpp-1.0.8+ds2/core/src/pdf417/PDFHighLevelEncoder.h000066400000000000000000000020571361167020700225300ustar00rootroot00000000000000#pragma once /* * Copyright 2016 Huy Cuong Nguyen * Copyright 2016 ZXing authors * Copyright 2006 Jeremias Maerki * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #include #include namespace ZXing { enum class CharacterSet; namespace Pdf417 { enum class Compaction; /** * PDF417 high-level encoder following the algorithm described in ISO/IEC 15438:2001(E) in * annex P. */ class HighLevelEncoder { public: static std::vector EncodeHighLevel(const std::wstring& msg, Compaction compaction, CharacterSet encoding); }; } // Pdf417 } // ZXing zxing-cpp-1.0.8+ds2/core/src/pdf417/PDFModulusGF.cpp000066400000000000000000000026171361167020700215630ustar00rootroot00000000000000/* * Copyright 2016 Nu-book Inc. * Copyright 2016 ZXing authors * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #include "PDFModulusGF.h" namespace ZXing { namespace Pdf417 { ModulusGF::ModulusGF(int modulus, int generator) : _modulus(modulus), _zero(*this, { 0 }), _one(*this, { 1 }) { _expTable.resize(modulus, 0); _logTable.resize(modulus, 0); int x = 1; for (int i = 0; i < modulus; i++) { _expTable[i] = x; x = (x * generator) % modulus; } for (int i = 0; i < modulus - 1; i++) { _logTable[_expTable[i]] = i; } // logTable[0] == 0 but this should never be used } ModulusPoly ModulusGF::buildMonomial(int degree, int coefficient) const { if (degree < 0) { throw std::invalid_argument("degree < 0"); } if (coefficient == 0) { return _zero; } std::vector coefficients(degree + 1, 0); coefficients[0] = coefficient; return ModulusPoly(*this, coefficients); } } // Pdf417 } // ZXing zxing-cpp-1.0.8+ds2/core/src/pdf417/PDFModulusGF.h000066400000000000000000000035611361167020700212270ustar00rootroot00000000000000#pragma once /* * Copyright 2016 Nu-book Inc. * Copyright 2016 ZXing authors * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #include "PDFModulusPoly.h" #include namespace ZXing { namespace Pdf417 { /** *

A field based on powers of a generator integer, modulo some modulus.< / p> * * @author Sean Owen * @see com.google.zxing.common.reedsolomon.GenericGF */ class ModulusGF { int _modulus; std::vector _expTable; std::vector _logTable; ModulusPoly _zero; ModulusPoly _one; public: ModulusGF(int modulus, int generator); const ModulusPoly& zero() const { return _zero; } const ModulusPoly& one() const { return _one; } ModulusPoly buildMonomial(int degree, int coefficient) const; int add(int a, int b) const { return (a + b) % _modulus; } int subtract(int a, int b) const { return (_modulus + a - b) % _modulus; } int exp(int a) const { return _expTable.at(a); } int log(int a) const { if (a == 0) { throw std::invalid_argument("a == 0"); } return _logTable[a]; } int inverse(int a) const { if (a == 0) { throw std::invalid_argument("a == 0"); } return _expTable[_modulus - _logTable[a] - 1]; } int multiply(int a, int b) const { if (a == 0 || b == 0) { return 0; } return _expTable[(_logTable[a] + _logTable[b]) % (_modulus - 1)]; } int size() const { return _modulus; } }; } // Pdf417 } // ZXing zxing-cpp-1.0.8+ds2/core/src/pdf417/PDFModulusPoly.cpp000066400000000000000000000136101361167020700222050ustar00rootroot00000000000000/* * Copyright 2016 Nu-book Inc. * Copyright 2016 ZXing authors * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #include "PDFModulusPoly.h" #include "PDFModulusGF.h" #include namespace ZXing { namespace Pdf417 { ModulusPoly::ModulusPoly(const ModulusGF& field, const std::vector& coefficients) : _field(&field) { size_t coefficientsLength = coefficients.size(); if (coefficientsLength > 1 && coefficients[0] == 0) { // Leading term must be non-zero for anything except the constant polynomial "0" size_t firstNonZero = 1; while (firstNonZero < coefficientsLength && coefficients[firstNonZero] == 0) { firstNonZero++; } if (firstNonZero == coefficientsLength) { _coefficients.resize(1, 0); } else { _coefficients.resize(coefficientsLength - firstNonZero); std::copy(coefficients.begin() + firstNonZero, coefficients.end(), _coefficients.begin()); } } else { _coefficients = coefficients; } } /** * @return evaluation of this polynomial at a given point */ int ModulusPoly::evaluateAt(int a) const { if (a == 0) { // Just return the x^0 coefficient return coefficient(0); } size_t size = _coefficients.size(); if (a == 1) { // Just the sum of the coefficients int result = 0; for (int coefficient : _coefficients) { result = _field->add(result, coefficient); } return result; } int result = _coefficients[0]; for (size_t i = 1; i < size; i++) { result = _field->add(_field->multiply(a, result), _coefficients[i]); } return result; } ModulusPoly ModulusPoly::add(const ModulusPoly& other) const { if (_field != other._field) { throw std::invalid_argument("ModulusPolys do not have same ModulusGF field"); } if (isZero()) { return other; } if (other.isZero()) { return *this; } auto smallerCoefficients = &_coefficients; auto largerCoefficients = &other._coefficients; if (smallerCoefficients->size() > largerCoefficients->size()) { std::swap(smallerCoefficients, largerCoefficients); } std::vector sumDiff(largerCoefficients->size()); size_t lengthDiff = largerCoefficients->size() - smallerCoefficients->size(); // Copy high-order terms only found in higher-degree polynomial's coefficients std::copy_n(largerCoefficients->begin(), lengthDiff, sumDiff.begin()); for (size_t i = lengthDiff; i < largerCoefficients->size(); i++) { sumDiff[i] = _field->add((*smallerCoefficients)[i - lengthDiff], (*largerCoefficients)[i]); } return ModulusPoly(*_field, sumDiff); } ModulusPoly ModulusPoly::subtract(const ModulusPoly& other) const { if (_field != other._field) { throw std::invalid_argument("ModulusPolys do not have same ModulusGF field"); } if (other.isZero()) { return *this; } return add(other.negative()); } ModulusPoly ModulusPoly::multiply(const ModulusPoly& other) const { if (_field != other._field) { throw std::invalid_argument("ModulusPolys do not have same ModulusGF field"); } if (isZero() || other.isZero()) { return _field->zero(); } auto& aCoefficients = _coefficients; size_t aLength = aCoefficients.size(); auto& bCoefficients = other._coefficients; size_t bLength = bCoefficients.size(); std::vector product(aLength + bLength - 1, 0); for (size_t i = 0; i < aLength; i++) { int aCoeff = aCoefficients[i]; for (size_t j = 0; j < bLength; j++) { product[i + j] = _field->add(product[i + j], _field->multiply(aCoeff, bCoefficients[j])); } } return ModulusPoly(*_field, product); } ModulusPoly ModulusPoly::negative() const { size_t size = _coefficients.size(); std::vector negativeCoefficients(size); for (size_t i = 0; i < size; i++) { negativeCoefficients[i] = _field->subtract(0, _coefficients[i]); } return ModulusPoly(*_field, negativeCoefficients); } ModulusPoly ModulusPoly::multiply(int scalar) const { if (scalar == 0) { return _field->zero(); } if (scalar == 1) { return *this; } size_t size = _coefficients.size(); std::vector product(size); for (size_t i = 0; i < size; i++) { product[i] = _field->multiply(_coefficients[i], scalar); } return ModulusPoly(*_field, product); } ModulusPoly ModulusPoly::multiplyByMonomial(int degree, int coefficient) const { if (degree < 0) { throw std::invalid_argument("degree < 0"); } if (coefficient == 0) { return _field->zero(); } size_t size = _coefficients.size(); std::vector product(size + degree, 0); for (size_t i = 0; i < size; i++) { product[i] = _field->multiply(_coefficients[i], coefficient); } return ModulusPoly(*_field, product); } void ModulusPoly::divide(const ModulusPoly& other, ModulusPoly& quotient, ModulusPoly& remainder) const { if (_field != other._field) { throw std::invalid_argument("ModulusPolys do not have same ModulusGF field"); } if (other.isZero()) { throw std::invalid_argument("Divide by 0"); } quotient = _field->zero(); remainder = *this; int denominatorLeadingTerm = other.coefficient(other.degree()); int inverseDenominatorLeadingTerm = _field->inverse(denominatorLeadingTerm); while (remainder.degree() >= other.degree() && !remainder.isZero()) { int degreeDifference = remainder.degree() - other.degree(); int scale = _field->multiply(remainder.coefficient(remainder.degree()), inverseDenominatorLeadingTerm); ModulusPoly term = other.multiplyByMonomial(degreeDifference, scale); ModulusPoly iterationQuotient = _field->buildMonomial(degreeDifference, scale); quotient = quotient.add(iterationQuotient); remainder = remainder.subtract(term); } } } // Pdf417 } // ZXing zxing-cpp-1.0.8+ds2/core/src/pdf417/PDFModulusPoly.h000066400000000000000000000043611361167020700216550ustar00rootroot00000000000000#pragma once /* * Copyright 2016 Nu-book Inc. * Copyright 2016 ZXing authors * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #include namespace ZXing { namespace Pdf417 { class ModulusGF; /** * @author Sean Owen * @see com.google.zxing.common.reedsolomon.GenericGFPoly */ class ModulusPoly { const ModulusGF* _field = nullptr; std::vector _coefficients; public: // Build a invalid object, so that this can be used in container or return by reference, // any access to invalid object is undefined behavior. ModulusPoly() = default; ModulusPoly(const ModulusGF& field, const std::vector& coefficients); const std::vector& coefficients() const { return _coefficients; } /** * @return degree of this polynomial */ int degree() const { return static_cast(_coefficients.size()) - 1; } /** * @return true iff this polynomial is the monomial "0" */ bool isZero() const { return _coefficients.at(0) == 0; } /** * @return coefficient of x^degree term in this polynomial */ int coefficient(int degree) const { return _coefficients.at(_coefficients.size() - 1 - degree); } /** * @return evaluation of this polynomial at a given point */ int evaluateAt(int a) const; ModulusPoly add(const ModulusPoly& other) const; ModulusPoly subtract(const ModulusPoly& other) const; ModulusPoly multiply(const ModulusPoly& other) const; ModulusPoly negative() const; ModulusPoly multiply(int scalar) const; ModulusPoly multiplyByMonomial(int degree, int coefficient) const; void divide(const ModulusPoly& other, ModulusPoly& quotient, ModulusPoly& remainder) const; friend void swap(ModulusPoly& a, ModulusPoly& b) { std::swap(a._field, b._field); std::swap(a._coefficients, b._coefficients); } }; } // Pdf417 } // ZXing zxing-cpp-1.0.8+ds2/core/src/pdf417/PDFReader.cpp000066400000000000000000000076341361167020700211240ustar00rootroot00000000000000/* * Copyright 2016 Nu-book Inc. * Copyright 2016 ZXing authors * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #include "PDFReader.h" #include "PDFDetector.h" #include "PDFScanningDecoder.h" #include "PDFCodewordDecoder.h" #include "PDFDecoderResultExtra.h" #include "DecodeStatus.h" #include "DecoderResult.h" #include "Result.h" #include #include #include namespace ZXing { namespace Pdf417 { static const int MODULES_IN_STOP_PATTERN = 18; static int GetMinWidth(const Nullable& p1, const Nullable& p2) { if (p1 == nullptr || p2 == nullptr) { // the division prevents an integer overflow (see below). 120 million is still sufficiently large. return std::numeric_limits::max() / CodewordDecoder::MODULES_IN_CODEWORD; } return std::abs(static_cast(p1.value().x()) - static_cast(p2.value().x())); } static int GetMinCodewordWidth(const std::array, 8>& p) { return std::min(std::min(GetMinWidth(p[0], p[4]), GetMinWidth(p[6], p[2]) * CodewordDecoder::MODULES_IN_CODEWORD / MODULES_IN_STOP_PATTERN), std::min(GetMinWidth(p[1], p[5]), GetMinWidth(p[7], p[3]) * CodewordDecoder::MODULES_IN_CODEWORD / MODULES_IN_STOP_PATTERN)); } static int GetMaxWidth(const Nullable& p1, const Nullable& p2) { if (p1 == nullptr || p2 == nullptr) { return 0; } return std::abs(static_cast(p1.value().x()) - static_cast(p2.value().x())); } static int GetMaxCodewordWidth(const std::array, 8>& p) { return std::max(std::max(GetMaxWidth(p[0], p[4]), GetMaxWidth(p[6], p[2]) * CodewordDecoder::MODULES_IN_CODEWORD / MODULES_IN_STOP_PATTERN), std::max(GetMaxWidth(p[1], p[5]), GetMaxWidth(p[7], p[3]) * CodewordDecoder::MODULES_IN_CODEWORD / MODULES_IN_STOP_PATTERN)); } DecodeStatus DoDecode(const BinaryBitmap& image, bool multiple, std::list& results) { Detector::Result detectorResult; DecodeStatus status = Detector::Detect(image, multiple, detectorResult); if (StatusIsError(status)) { return status; } for (const auto& points : detectorResult.points) { DecoderResult decoderResult = ScanningDecoder::Decode(*detectorResult.bits, points[4], points[5], points[6], points[7], GetMinCodewordWidth(points), GetMaxCodewordWidth(points)); if (decoderResult.isValid()) { std::vector foundPoints(points.size()); std::transform(points.begin(), points.end(), foundPoints.begin(), [](const Nullable& p) { return p.value(); }); Result result(std::move(decoderResult), std::move(foundPoints), BarcodeFormat::PDF_417); result.metadata().put(ResultMetadata::ERROR_CORRECTION_LEVEL, decoderResult.ecLevel()); if (auto extra = decoderResult.extra()) { result.metadata().put(ResultMetadata::PDF417_EXTRA_METADATA, extra); } results.push_back(result); if (!multiple) { return DecodeStatus::NoError; } } else if (!multiple) { return decoderResult.errorCode(); } } return results.empty() ? DecodeStatus::NotFound : DecodeStatus::NoError; } Result Reader::decode(const BinaryBitmap& image) const { std::list results; DecodeStatus status = DoDecode(image, false, results); if (StatusIsOK(status)) { return results.front(); } return Result(status); } std::list Reader::decodeMultiple(const BinaryBitmap& image) const { std::list results; DoDecode(image, true, results); return results; } } // Pdf417 } // ZXing zxing-cpp-1.0.8+ds2/core/src/pdf417/PDFReader.h000066400000000000000000000017551361167020700205670ustar00rootroot00000000000000#pragma once /* * Copyright 2016 Nu-book Inc. * Copyright 2016 ZXing authors * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #include "Reader.h" #include namespace ZXing { namespace Pdf417 { /** * This implementation can detect and decode PDF417 codes in an image. * * @author Guenther Grau */ class Reader : public ZXing::Reader { public: Result decode(const BinaryBitmap& image) const override; std::list decodeMultiple(const BinaryBitmap& image) const; }; } // Pdf417 } // ZXing zxing-cpp-1.0.8+ds2/core/src/pdf417/PDFScanningDecoder.cpp000066400000000000000000000675151361167020700227540ustar00rootroot00000000000000/* * Copyright 2016 Nu-book Inc. * Copyright 2016 ZXing authors * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #include "PDFScanningDecoder.h" #include "PDFBoundingBox.h" #include "PDFDetectionResultColumn.h" #include "PDFCodewordDecoder.h" #include "PDFBarcodeMetadata.h" #include "PDFDetectionResult.h" #include "PDFBarcodeValue.h" #include "PDFDecodedBitStreamParser.h" #include "PDFModulusGF.h" #include "ResultPoint.h" #include "ZXNullable.h" #include "BitMatrix.h" #include "DecoderResult.h" #include "DecodeStatus.h" #include "DecoderResult.h" #include "ZXTestSupport.h" #include #include #include #include namespace ZXing { namespace Pdf417 { static const int CODEWORD_SKEW_SIZE = 2; static const int MAX_ERRORS = 3; static const int MAX_EC_CODEWORDS = 512; using ModuleBitCountType = std::array; static int AdjustCodewordStartColumn(const BitMatrix& image, int minColumn, int maxColumn, bool leftToRight, int codewordStartColumn, int imageRow) { int correctedStartColumn = codewordStartColumn; int increment = leftToRight ? -1 : 1; // there should be no black pixels before the start column. If there are, then we need to start earlier. for (int i = 0; i < 2; i++) { while ((leftToRight ? correctedStartColumn >= minColumn : correctedStartColumn < maxColumn) && leftToRight == image.get(correctedStartColumn, imageRow)) { if (std::abs(codewordStartColumn - correctedStartColumn) > CODEWORD_SKEW_SIZE) { return codewordStartColumn; } correctedStartColumn += increment; } increment = -increment; leftToRight = !leftToRight; } return correctedStartColumn; } static bool GetModuleBitCount(const BitMatrix& image, int minColumn, int maxColumn, bool leftToRight, int startColumn, int imageRow, ModuleBitCountType& moduleBitCount) { int imageColumn = startColumn; size_t moduleNumber = 0; int increment = leftToRight ? 1 : -1; bool previousPixelValue = leftToRight; std::fill(moduleBitCount.begin(), moduleBitCount.end(), 0); while ((leftToRight ? (imageColumn < maxColumn) : (imageColumn >= minColumn)) && moduleNumber < moduleBitCount.size()) { if (image.get(imageColumn, imageRow) == previousPixelValue) { moduleBitCount[moduleNumber] += 1; imageColumn += increment; } else { moduleNumber += 1; previousPixelValue = !previousPixelValue; } } return moduleNumber == moduleBitCount.size() || (imageColumn == (leftToRight ? maxColumn : minColumn) && moduleNumber == moduleBitCount.size() - 1); } static bool CheckCodewordSkew(int codewordSize, int minCodewordWidth, int maxCodewordWidth) { return minCodewordWidth - CODEWORD_SKEW_SIZE <= codewordSize && codewordSize <= maxCodewordWidth + CODEWORD_SKEW_SIZE; } static ModuleBitCountType GetBitCountForCodeword(int codeword) { ModuleBitCountType result; result.fill(0); int previousValue = 0; int i = static_cast(result.size()) - 1; while (true) { if ((codeword & 0x1) != previousValue) { previousValue = codeword & 0x1; i--; if (i < 0) { break; } } result[i]++; codeword >>= 1; } return result; } static int GetCodewordBucketNumber(const ModuleBitCountType& moduleBitCount) { return (moduleBitCount[0] - moduleBitCount[2] + moduleBitCount[4] - moduleBitCount[6] + 9) % 9; } static int GetCodewordBucketNumber(int codeword) { return GetCodewordBucketNumber(GetBitCountForCodeword(codeword)); } static Nullable DetectCodeword(const BitMatrix& image, int minColumn, int maxColumn, bool leftToRight, int startColumn, int imageRow, int minCodewordWidth, int maxCodewordWidth) { startColumn = AdjustCodewordStartColumn(image, minColumn, maxColumn, leftToRight, startColumn, imageRow); // we usually know fairly exact now how long a codeword is. We should provide minimum and maximum expected length // and try to adjust the read pixels, e.g. remove single pixel errors or try to cut off exceeding pixels. // min and maxCodewordWidth should not be used as they are calculated for the whole barcode an can be inaccurate // for the current position ModuleBitCountType moduleBitCount; if (!GetModuleBitCount(image, minColumn, maxColumn, leftToRight, startColumn, imageRow, moduleBitCount)) { return nullptr; } int endColumn; int codewordBitCount = std::accumulate(moduleBitCount.begin(), moduleBitCount.end(), 0); if (leftToRight) { endColumn = startColumn + codewordBitCount; } else { std::reverse(moduleBitCount.begin(), moduleBitCount.end()); endColumn = startColumn; startColumn = endColumn - codewordBitCount; } // TODO implement check for width and correction of black and white bars // use start (and maybe stop pattern) to determine if blackbars are wider than white bars. If so, adjust. // should probably done only for codewords with a lot more than 17 bits. // The following fixes 10-1.png, which has wide black bars and small white bars // for (int i = 0; i < moduleBitCount.length; i++) { // if (i % 2 == 0) { // moduleBitCount[i]--; // } else { // moduleBitCount[i]++; // } // } // We could also use the width of surrounding codewords for more accurate results, but this seems // sufficient for now if (!CheckCodewordSkew(codewordBitCount, minCodewordWidth, maxCodewordWidth)) { // We could try to use the startX and endX position of the codeword in the same column in the previous row, // create the bit count from it and normalize it to 8. This would help with single pixel errors. return nullptr; } int decodedValue = CodewordDecoder::GetDecodedValue(moduleBitCount); if (decodedValue != -1) { int codeword = CodewordDecoder::GetCodeword(decodedValue); if (codeword != -1) { return Codeword(startColumn, endColumn, GetCodewordBucketNumber(decodedValue), codeword); } } return nullptr; } static DetectionResultColumn GetRowIndicatorColumn(const BitMatrix& image, const BoundingBox& boundingBox, const ResultPoint& startPoint, bool leftToRight, int minCodewordWidth, int maxCodewordWidth) { DetectionResultColumn rowIndicatorColumn(boundingBox, leftToRight ? DetectionResultColumn::RowIndicator::Left : DetectionResultColumn::RowIndicator::Right); for (int i = 0; i < 2; i++) { int increment = i == 0 ? 1 : -1; int startColumn = (int)startPoint.x(); for (int imageRow = (int)startPoint.y(); imageRow <= boundingBox.maxY() && imageRow >= boundingBox.minY(); imageRow += increment) { auto codeword = DetectCodeword(image, 0, image.width(), leftToRight, startColumn, imageRow, minCodewordWidth, maxCodewordWidth); if (codeword != nullptr) { rowIndicatorColumn.setCodeword(imageRow, codeword); if (leftToRight) { startColumn = codeword.value().startX(); } else { startColumn = codeword.value().endX(); } } } } return rowIndicatorColumn; } static bool GetBarcodeMetadata(Nullable& leftRowIndicatorColumn, Nullable& rightRowIndicatorColumn, BarcodeMetadata& result) { BarcodeMetadata leftBarcodeMetadata; if (leftRowIndicatorColumn == nullptr || !leftRowIndicatorColumn.value().getBarcodeMetadata(leftBarcodeMetadata)) { return rightRowIndicatorColumn != nullptr && rightRowIndicatorColumn.value().getBarcodeMetadata(result); } BarcodeMetadata rightBarcodeMetadata; if (rightRowIndicatorColumn == nullptr || !rightRowIndicatorColumn.value().getBarcodeMetadata(rightBarcodeMetadata)) { result = leftBarcodeMetadata; return true; } if (leftBarcodeMetadata.columnCount() != rightBarcodeMetadata.columnCount() && leftBarcodeMetadata.errorCorrectionLevel() != rightBarcodeMetadata.errorCorrectionLevel() && leftBarcodeMetadata.rowCount() != rightBarcodeMetadata.rowCount()) { return false; } result = leftBarcodeMetadata; return true; } template static auto GetMax(Iter start, Iter end) -> typename std::remove_reference::type { auto it = std::max_element(start, end); return it != end ? *it : -1; } static bool AdjustBoundingBox(Nullable& rowIndicatorColumn, Nullable& result) { if (rowIndicatorColumn == nullptr) { result = nullptr; return true; } std::vector rowHeights; if (!rowIndicatorColumn.value().getRowHeights(rowHeights)) { result = nullptr; return true; } int maxRowHeight = GetMax(rowHeights.begin(), rowHeights.end()); int missingStartRows = 0; for (int rowHeight : rowHeights) { missingStartRows += maxRowHeight - rowHeight; if (rowHeight > 0) { break; } } auto& codewords = rowIndicatorColumn.value().allCodewords(); for (int row = 0; missingStartRows > 0 && codewords[row] == nullptr; row++) { missingStartRows--; } int missingEndRows = 0; for (int row = (int)rowHeights.size() - 1; row >= 0; row--) { missingEndRows += maxRowHeight - rowHeights[row]; if (rowHeights[row] > 0) { break; } } for (int row = (int)codewords.size() - 1; missingEndRows > 0 && codewords[row] == nullptr; row--) { missingEndRows--; } BoundingBox box; if (BoundingBox::AddMissingRows(rowIndicatorColumn.value().boundingBox(), missingStartRows, missingEndRows, rowIndicatorColumn.value().isLeftRowIndicator(), box)) { result = box; return true; } return false; } static bool Merge(Nullable& leftRowIndicatorColumn, Nullable& rightRowIndicatorColumn, DetectionResult& result) { if (leftRowIndicatorColumn != nullptr || rightRowIndicatorColumn != nullptr) { BarcodeMetadata barcodeMetadata; if (GetBarcodeMetadata(leftRowIndicatorColumn, rightRowIndicatorColumn, barcodeMetadata)) { Nullable leftBox, rightBox, mergedBox; if (AdjustBoundingBox(leftRowIndicatorColumn, leftBox) && AdjustBoundingBox(rightRowIndicatorColumn, rightBox) && BoundingBox::Merge(leftBox, rightBox, mergedBox)) { result.init(barcodeMetadata, mergedBox); return true; } } } return false; } static bool IsValidBarcodeColumn(const DetectionResult& detectionResult, int barcodeColumn) { return barcodeColumn >= 0 && barcodeColumn <= detectionResult.barcodeColumnCount() + 1; } static int GetStartColumn(const DetectionResult& detectionResult, int barcodeColumn, int imageRow, bool leftToRight) { int offset = leftToRight ? 1 : -1; Nullable codeword; if (IsValidBarcodeColumn(detectionResult, barcodeColumn - offset)) { codeword = detectionResult.column(barcodeColumn - offset).value().codeword(imageRow); } if (codeword != nullptr) { return leftToRight ? codeword.value().endX() : codeword.value().startX(); } codeword = detectionResult.column(barcodeColumn).value().codewordNearby(imageRow); if (codeword != nullptr) { return leftToRight ? codeword.value().startX() : codeword.value().endX(); } if (IsValidBarcodeColumn(detectionResult, barcodeColumn - offset)) { codeword = detectionResult.column(barcodeColumn - offset).value().codewordNearby(imageRow); } if (codeword != nullptr) { return leftToRight ? codeword.value().endX() : codeword.value().startX(); } int skippedColumns = 0; while (IsValidBarcodeColumn(detectionResult, barcodeColumn - offset)) { barcodeColumn -= offset; for (auto& previousRowCodeword : detectionResult.column(barcodeColumn).value().allCodewords()) { if (previousRowCodeword != nullptr) { return (leftToRight ? previousRowCodeword.value().endX() : previousRowCodeword.value().startX()) + offset * skippedColumns * (previousRowCodeword.value().endX() - previousRowCodeword.value().startX()); } } skippedColumns++; } return leftToRight ? detectionResult.getBoundingBox().value().minX() : detectionResult.getBoundingBox().value().maxX(); } static std::vector> CreateBarcodeMatrix(DetectionResult& detectionResult) { std::vector> barcodeMatrix(detectionResult.barcodeRowCount()); for (auto& row : barcodeMatrix) { row.resize(detectionResult.barcodeColumnCount() + 2); } int column = 0; for (auto& resultColumn : detectionResult.allColumns()) { if (resultColumn != nullptr) { for (auto& codeword : resultColumn.value().allCodewords()) { if (codeword != nullptr) { int rowNumber = codeword.value().rowNumber(); if (rowNumber >= 0) { if (rowNumber >= (int)barcodeMatrix.size()) { // We have more rows than the barcode metadata allows for, ignore them. continue; } barcodeMatrix[rowNumber][column].setValue(codeword.value().value()); } } } } column++; } return barcodeMatrix; } static int GetNumberOfECCodeWords(int barcodeECLevel) { return 2 << barcodeECLevel; } static bool AdjustCodewordCount(const DetectionResult& detectionResult, std::vector>& barcodeMatrix) { auto numberOfCodewords = barcodeMatrix[0][1].value(); int calculatedNumberOfCodewords = detectionResult.barcodeColumnCount() * detectionResult.barcodeRowCount() - GetNumberOfECCodeWords(detectionResult.barcodeECLevel()); if (numberOfCodewords.empty()) { if (calculatedNumberOfCodewords < 1 || calculatedNumberOfCodewords > CodewordDecoder::MAX_CODEWORDS_IN_BARCODE) { return false; } barcodeMatrix[0][1].setValue(calculatedNumberOfCodewords); } else if (numberOfCodewords[0] != calculatedNumberOfCodewords) { // The calculated one is more reliable as it is derived from the row indicator columns barcodeMatrix[0][1].setValue(calculatedNumberOfCodewords); } return true; } // +++++++++++++++++++++++++++++++++++ Error Correction static const ModulusGF& GetModulusGF() { static const ModulusGF field(CodewordDecoder::NUMBER_OF_CODEWORDS, 3); return field; } static bool RunEuclideanAlgorithm(ModulusPoly a, ModulusPoly b, int R, ModulusPoly& sigma, ModulusPoly& omega) { const ModulusGF& field = GetModulusGF(); // Assume a's degree is >= b's if (a.degree() < b.degree()) { swap(a, b); } ModulusPoly rLast = a; ModulusPoly r = b; ModulusPoly tLast = field.zero(); ModulusPoly t = field.one(); // Run Euclidean algorithm until r's degree is less than R/2 while (r.degree() >= R / 2) { ModulusPoly rLastLast = rLast; ModulusPoly tLastLast = tLast; rLast = r; tLast = t; // Divide rLastLast by rLast, with quotient in q and remainder in r if (rLast.isZero()) { // Oops, Euclidean algorithm already terminated? return false; } r = rLastLast; ModulusPoly q = field.zero(); int denominatorLeadingTerm = rLast.coefficient(rLast.degree()); int dltInverse = field.inverse(denominatorLeadingTerm); while (r.degree() >= rLast.degree() && !r.isZero()) { int degreeDiff = r.degree() - rLast.degree(); int scale = field.multiply(r.coefficient(r.degree()), dltInverse); q = q.add(field.buildMonomial(degreeDiff, scale)); r = r.subtract(rLast.multiplyByMonomial(degreeDiff, scale)); } t = q.multiply(tLast).subtract(tLastLast).negative(); } int sigmaTildeAtZero = t.coefficient(0); if (sigmaTildeAtZero == 0) { return false; } int inverse = field.inverse(sigmaTildeAtZero); sigma = t.multiply(inverse); omega = r.multiply(inverse); return true; } static bool FindErrorLocations(const ModulusPoly& errorLocator, std::vector& result) { const ModulusGF& field = GetModulusGF(); // This is a direct application of Chien's search int numErrors = errorLocator.degree(); result.resize(numErrors); int e = 0; for (int i = 1; i < field.size() && e < numErrors; i++) { if (errorLocator.evaluateAt(i) == 0) { result[e] = field.inverse(i); e++; } } return e == numErrors; } static std::vector FindErrorMagnitudes(const ModulusPoly& errorEvaluator, const ModulusPoly& errorLocator, const std::vector& errorLocations) { const ModulusGF& field = GetModulusGF(); int errorLocatorDegree = errorLocator.degree(); std::vector formalDerivativeCoefficients(errorLocatorDegree); for (int i = 1; i <= errorLocatorDegree; i++) { formalDerivativeCoefficients[errorLocatorDegree - i] = field.multiply(i, errorLocator.coefficient(i)); } ModulusPoly formalDerivative(field, formalDerivativeCoefficients); // This is directly applying Forney's Formula std::vector result(errorLocations.size()); for (size_t i = 0; i < result.size(); i++) { int xiInverse = field.inverse(errorLocations[i]); int numerator = field.subtract(0, errorEvaluator.evaluateAt(xiInverse)); int denominator = field.inverse(formalDerivative.evaluateAt(xiInverse)); result[i] = field.multiply(numerator, denominator); } return result; } /** * @param received received codewords * @param numECCodewords number of those codewords used for EC * @param erasures location of erasures * @return number of errors * @throws ChecksumException if errors cannot be corrected, maybe because of too many errors */ ZXING_EXPORT_TEST_ONLY bool DecodeErrorCorrection(std::vector& received, int numECCodewords, const std::vector& erasures, int& nbErrors) { const ModulusGF& field = GetModulusGF(); ModulusPoly poly(field, received); std::vector S(numECCodewords); bool error = false; for (int i = numECCodewords; i > 0; i--) { int eval = poly.evaluateAt(field.exp(i)); S[numECCodewords - i] = eval; if (eval != 0) { error = true; } } if (!error) { nbErrors = 0; return true; } ModulusPoly knownErrors = field.one(); for (int erasure : erasures) { int b = field.exp(static_cast(received.size()) - 1 - erasure); // Add (1 - bx) term: ModulusPoly term(field, { field.subtract(0, b), 1 }); knownErrors = knownErrors.multiply(term); } ModulusPoly syndrome(field, S); //syndrome = syndrome.multiply(knownErrors); ModulusPoly sigma, omega; if (!RunEuclideanAlgorithm(field.buildMonomial(numECCodewords, 1), syndrome, numECCodewords, sigma, omega)) { return false; } //sigma = sigma.multiply(knownErrors); std::vector errorLocations; if (!FindErrorLocations(sigma, errorLocations)) { return false; } std::vector errorMagnitudes = FindErrorMagnitudes(omega, sigma, errorLocations); int receivedSize = static_cast(received.size()); for (size_t i = 0; i < errorLocations.size(); i++) { int position = receivedSize - 1 - field.log(errorLocations[i]); if (position < 0) { return false; } received[position] = field.subtract(received[position], errorMagnitudes[i]); } nbErrors = static_cast(errorLocations.size()); return true; } // --------------------------------------- Error Correction /** *

Given data and error-correction codewords received, possibly corrupted by errors, attempts to * correct the errors in-place.

* * @param codewords data and error correction codewords * @param erasures positions of any known erasures * @param numECCodewords number of error correction codewords that are available in codewords * @throws ChecksumException if error correction fails */ static bool CorrectErrors(std::vector& codewords, const std::vector& erasures, int numECCodewords, int& errorCount) { if ((int)erasures.size() > numECCodewords / 2 + MAX_ERRORS || numECCodewords < 0 || numECCodewords > MAX_EC_CODEWORDS) { // Too many errors or EC Codewords is corrupted return false; } return DecodeErrorCorrection(codewords, numECCodewords, erasures, errorCount); } /** * Verify that all is OK with the codeword array. */ static bool VerifyCodewordCount(std::vector& codewords, int numECCodewords) { if (codewords.size() < 4) { // Codeword array size should be at least 4 allowing for // Count CW, At least one Data CW, Error Correction CW, Error Correction CW return false; } // The first codeword, the Symbol Length Descriptor, shall always encode the total number of data // codewords in the symbol, including the Symbol Length Descriptor itself, data codewords and pad // codewords, but excluding the number of error correction codewords. int numberOfCodewords = codewords[0]; if (numberOfCodewords > (int)codewords.size()) { return false; } if (numberOfCodewords == 0) { // Reset to the length of the array - 8 (Allow for at least level 3 Error Correction (8 Error Codewords) if (numECCodewords < (int)codewords.size()) { codewords[0] = (int)codewords.size() - numECCodewords; } else { return false; } } return true; } static DecoderResult DecodeCodewords(std::vector& codewords, int ecLevel, const std::vector& erasures) { if (codewords.empty()) { return DecodeStatus::FormatError; } int numECCodewords = 1 << (ecLevel + 1); int correctedErrorsCount = 0; if (!CorrectErrors(codewords, erasures, numECCodewords, correctedErrorsCount)) return DecodeStatus::ChecksumError; if (!VerifyCodewordCount(codewords, numECCodewords)) return DecodeStatus::FormatError; // Decode the codewords auto result = DecodedBitStreamParser::Decode(codewords, ecLevel); if (result.isValid()) { result.setErrorsCorrected(correctedErrorsCount); result.setErasures(static_cast(erasures.size())); } return result; } /** * This method deals with the fact, that the decoding process doesn't always yield a single most likely value. The * current error correction implementation doesn't deal with erasures very well, so it's better to provide a value * for these ambiguous codewords instead of treating it as an erasure. The problem is that we don't know which of * the ambiguous values to choose. We try decode using the first value, and if that fails, we use another of the * ambiguous values and try to decode again. This usually only happens on very hard to read and decode barcodes, * so decoding the normal barcodes is not affected by this. * * @param erasureArray contains the indexes of erasures * @param ambiguousIndexes array with the indexes that have more than one most likely value * @param ambiguousIndexValues two dimensional array that contains the ambiguous values. The first dimension must * be the same length as the ambiguousIndexes array */ static DecoderResult CreateDecoderResultFromAmbiguousValues(int ecLevel, std::vector& codewords, const std::vector& erasureArray, const std::vector& ambiguousIndexes, const std::vector>& ambiguousIndexValues) { std::vector ambiguousIndexCount(ambiguousIndexes.size(), 0); int tries = 100; while (tries-- > 0) { for (size_t i = 0; i < ambiguousIndexCount.size(); i++) { codewords[ambiguousIndexes[i]] = ambiguousIndexValues[i][ambiguousIndexCount[i]]; } auto result = DecodeCodewords(codewords, ecLevel, erasureArray); if (result.errorCode() != DecodeStatus::ChecksumError) { return result; } if (ambiguousIndexCount.empty()) { return DecodeStatus::ChecksumError; } for (size_t i = 0; i < ambiguousIndexCount.size(); i++) { if (ambiguousIndexCount[i] < (int)ambiguousIndexValues[i].size() - 1) { ambiguousIndexCount[i]++; break; } else { ambiguousIndexCount[i] = 0; if (i == ambiguousIndexCount.size() - 1) { return DecodeStatus::ChecksumError; } } } } return DecodeStatus::ChecksumError; } static DecoderResult CreateDecoderResult(DetectionResult& detectionResult) { auto barcodeMatrix = CreateBarcodeMatrix(detectionResult); if (!AdjustCodewordCount(detectionResult, barcodeMatrix)) { return DecodeStatus::NotFound; } std::vector erasures; std::vector codewords(detectionResult.barcodeRowCount() * detectionResult.barcodeColumnCount(), 0); std::vector> ambiguousIndexValues; std::vector ambiguousIndexesList; for (int row = 0; row < detectionResult.barcodeRowCount(); row++) { for (int column = 0; column < detectionResult.barcodeColumnCount(); column++) { auto values = barcodeMatrix[row][column + 1].value(); int codewordIndex = row * detectionResult.barcodeColumnCount() + column; if (values.empty()) { erasures.push_back(codewordIndex); } else if (values.size() == 1) { codewords[codewordIndex] = values[0]; } else { ambiguousIndexesList.push_back(codewordIndex); ambiguousIndexValues.push_back(values); } } } return CreateDecoderResultFromAmbiguousValues(detectionResult.barcodeECLevel(), codewords, erasures, ambiguousIndexesList, ambiguousIndexValues); } // TODO don't pass in minCodewordWidth and maxCodewordWidth, pass in barcode columns for start and stop pattern // columns. That way width can be deducted from the pattern column. // This approach also allows to detect more details about the barcode, e.g. if a bar type (white or black) is wider // than it should be. This can happen if the scanner used a bad blackpoint. DecoderResult ScanningDecoder::Decode(const BitMatrix& image, const Nullable& imageTopLeft, const Nullable& imageBottomLeft, const Nullable& imageTopRight, const Nullable& imageBottomRight, int minCodewordWidth, int maxCodewordWidth) { BoundingBox boundingBox; if (!BoundingBox::Create(image.width(), image.height(), imageTopLeft, imageBottomLeft, imageTopRight, imageBottomRight, boundingBox)) { return DecodeStatus::NotFound; } Nullable leftRowIndicatorColumn, rightRowIndicatorColumn; DetectionResult detectionResult; for (int i = 0; i < 2; i++) { if (imageTopLeft != nullptr) { leftRowIndicatorColumn = GetRowIndicatorColumn(image, boundingBox, imageTopLeft, true, minCodewordWidth, maxCodewordWidth); } if (imageTopRight != nullptr) { rightRowIndicatorColumn = GetRowIndicatorColumn(image, boundingBox, imageTopRight, false, minCodewordWidth, maxCodewordWidth); } if (!Merge(leftRowIndicatorColumn, rightRowIndicatorColumn, detectionResult)) { return DecodeStatus::NotFound; } if (i == 0 && detectionResult.getBoundingBox() != nullptr && (detectionResult.getBoundingBox().value().minY() < boundingBox.minY() || detectionResult.getBoundingBox().value().maxY() > boundingBox.maxY())) { boundingBox = detectionResult.getBoundingBox(); } else { detectionResult.setBoundingBox(boundingBox); break; } } int maxBarcodeColumn = detectionResult.barcodeColumnCount() + 1; detectionResult.setColumn(0, leftRowIndicatorColumn); detectionResult.setColumn(maxBarcodeColumn, rightRowIndicatorColumn); bool leftToRight = leftRowIndicatorColumn != nullptr; for (int barcodeColumnCount = 1; barcodeColumnCount <= maxBarcodeColumn; barcodeColumnCount++) { int barcodeColumn = leftToRight ? barcodeColumnCount : maxBarcodeColumn - barcodeColumnCount; if (detectionResult.column(barcodeColumn) != nullptr) { // This will be the case for the opposite row indicator column, which doesn't need to be decoded again. continue; } DetectionResultColumn::RowIndicator rowIndicator = barcodeColumn == 0 ? DetectionResultColumn::RowIndicator::Left : (barcodeColumn == maxBarcodeColumn ? DetectionResultColumn::RowIndicator::Right : DetectionResultColumn::RowIndicator::None); detectionResult.setColumn(barcodeColumn, DetectionResultColumn(boundingBox, rowIndicator)); int startColumn = -1; int previousStartColumn = startColumn; // TODO start at a row for which we know the start position, then detect upwards and downwards from there. for (int imageRow = boundingBox.minY(); imageRow <= boundingBox.maxY(); imageRow++) { startColumn = GetStartColumn(detectionResult, barcodeColumn, imageRow, leftToRight); if (startColumn < 0 || startColumn > boundingBox.maxX()) { if (previousStartColumn == -1) { continue; } startColumn = previousStartColumn; } Nullable codeword = DetectCodeword(image, boundingBox.minX(), boundingBox.maxX(), leftToRight, startColumn, imageRow, minCodewordWidth, maxCodewordWidth); if (codeword != nullptr) { detectionResult.column(barcodeColumn).value().setCodeword(imageRow, codeword); previousStartColumn = startColumn; minCodewordWidth = std::min(minCodewordWidth, codeword.value().width()); maxCodewordWidth = std::max(maxCodewordWidth, codeword.value().width()); } } } return CreateDecoderResult(detectionResult); } } // Pdf417 } // ZXing zxing-cpp-1.0.8+ds2/core/src/pdf417/PDFScanningDecoder.h000066400000000000000000000021611361167020700224030ustar00rootroot00000000000000#pragma once /* * Copyright 2016 Nu-book Inc. * Copyright 2016 ZXing authors * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ namespace ZXing { class BitMatrix; class ResultPoint; class DecoderResult; template class Nullable; namespace Pdf417 { /** * @author Guenther Grau */ class ScanningDecoder { public: static DecoderResult Decode(const BitMatrix& image, const Nullable& imageTopLeft, const Nullable& imageBottomLeft, const Nullable& imageTopRight, const Nullable& imageBottomRight, int minCodewordWidth, int maxCodewordWidth); }; } // Pdf417 } // ZXing zxing-cpp-1.0.8+ds2/core/src/pdf417/PDFWriter.cpp000066400000000000000000000104001361167020700211570ustar00rootroot00000000000000/* * Copyright 2016 Huy Cuong Nguyen * Copyright 2016 ZXing authors * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #include "PDFWriter.h" #include "PDFEncoder.h" #include "BitMatrix.h" #include "CharacterSetECI.h" namespace ZXing { namespace Pdf417 { /** * default white space (margin) around the code */ static const int WHITE_SPACE = 30; /** * default error correction level */ static const int DEFAULT_ERROR_CORRECTION_LEVEL = 2; /** * Takes and rotates the it 90 degrees */ static void RotateArray(const std::vector>& input, std::vector>& output) { size_t height = input.size(); size_t width = input[0].size(); output.resize(width); for (size_t i = 0; i < width; ++i) { output[i].resize(height); } for (size_t ii = 0; ii < height; ++ii) { // This makes the direction consistent on screen when rotating the screen size_t inverseii = height - ii - 1; for (size_t jj = 0; jj < width; ++jj) { output[jj][inverseii] = input[ii][jj]; } } } /** * This takes an array holding the values of the PDF 417 * * @param input a byte array of information with 0 is black, and 1 is white * @param margin border around the barcode * @return BitMatrix of the input */ static BitMatrix BitMatrixFromBitArray(const std::vector>& input, int margin) { // Creates the bitmatrix with extra space for whitespace int width = static_cast(input[0].size()); int height = static_cast(input.size()); BitMatrix result(width + 2 * margin, height + 2 * margin); for (int y = 0, yOutput = static_cast(result.height()) - margin - 1; y < height; y++, yOutput--) { for (int x = 0; x < width; ++x) { // Zero is white in the bytematrix if (input[y][x]) { result.set(x + margin, yOutput); } } } return result; } BitMatrix Writer::encode(const std::wstring& contents, int width, int height) const { int margin = _margin >= 0 ? _margin : WHITE_SPACE; int ecLevel = _ecLevel >= 0 ? _ecLevel : DEFAULT_ERROR_CORRECTION_LEVEL; BarcodeMatrix resultMatrix = _encoder->generateBarcodeLogic(contents, ecLevel); int aspectRatio = 4; std::vector> originalScale; resultMatrix.getScaledMatrix(1, aspectRatio, originalScale); bool rotated = false; if ((height > width) != (originalScale[0].size() < originalScale.size())) { std::vector> temp; RotateArray(originalScale, temp); originalScale = temp; rotated = true; } int scaleX = width / static_cast(originalScale[0].size()); int scaleY = height / static_cast(originalScale.size()); int scale; if (scaleX < scaleY) { scale = scaleX; } else { scale = scaleY; } if (scale > 1) { std::vector> scaledMatrix; resultMatrix.getScaledMatrix(scale, scale * aspectRatio, scaledMatrix); if (rotated) { std::vector> temp; RotateArray(scaledMatrix, temp); scaledMatrix = temp; } return BitMatrixFromBitArray(scaledMatrix, margin); } else { return BitMatrixFromBitArray(originalScale, margin); } } Writer::Writer() { _encoder.reset(new Encoder); } Writer::Writer(Writer &&other) : _margin(other._margin), _ecLevel(other._ecLevel), _encoder(std::move(other._encoder)) { } Writer::~Writer() { } Writer& Writer::setDimensions(int minCols, int maxCols, int minRows, int maxRows) { _encoder->setDimensions(minCols, maxCols, minRows, maxRows); return *this; } Writer& Writer::setCompaction(Compaction compaction) { _encoder->setCompaction(compaction); return *this; } /** * @param compact if true, enables compaction */ Writer& Writer::setCompact(bool compact) { _encoder->setCompact(compact); return *this; } /** * @param encoding sets character encoding to use */ Writer& Writer::setEncoding(CharacterSet encoding) { _encoder->setEncoding(encoding); return *this; } } // Pdf417 } // ZXing zxing-cpp-1.0.8+ds2/core/src/pdf417/PDFWriter.h000066400000000000000000000034771361167020700206440ustar00rootroot00000000000000#pragma once /* * Copyright 2016 Huy Cuong Nguyen * Copyright 2016 ZXing authors * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #include #include namespace ZXing { class BitMatrix; enum class CharacterSet; namespace Pdf417 { enum class Compaction; class Encoder; /** * @author Jacob Haynes * @author qwandor@google.com (Andrew Walbran) */ class Writer { public: Writer(); Writer(Writer &&); ~Writer(); Writer& setMargin(int margin) { _margin = margin; return *this; } Writer& setErrorCorrectionLevel(int ecLevel) { _ecLevel = ecLevel; return *this; } /** * Sets max/min row/col values * * @param maxCols maximum allowed columns * @param minCols minimum allowed columns * @param maxRows maximum allowed rows * @param minRows minimum allowed rows */ Writer& setDimensions(int minCols, int maxCols, int minRows, int maxRows); /** * @param compaction compaction mode to use */ Writer& setCompaction(Compaction compaction); /** * @param compact if true, enables compaction */ Writer& setCompact(bool compact); /** * @param encoding sets character encoding to use */ Writer& setEncoding(CharacterSet encoding); BitMatrix encode(const std::wstring& contents, int width, int height) const; private: int _margin = -1; int _ecLevel = -1; std::unique_ptr _encoder; }; } // Pdf417 } // ZXing zxing-cpp-1.0.8+ds2/core/src/qrcode/000077500000000000000000000000001361167020700171225ustar00rootroot00000000000000zxing-cpp-1.0.8+ds2/core/src/qrcode/QRAlignmentPattern.cpp000066400000000000000000000032451361167020700233510ustar00rootroot00000000000000/* * Copyright 2016 Nu-book Inc. * Copyright 2016 ZXing authors * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #include "QRAlignmentPattern.h" #include namespace ZXing { namespace QRCode { AlignmentPattern::AlignmentPattern(float posX, float posY, float estimatedModuleSize) : ResultPoint(posX, posY), _estimatedModuleSize(estimatedModuleSize) { } bool AlignmentPattern::aboutEquals(float moduleSize, float i, float j) const { if (std::abs(i - y()) <= moduleSize && std::abs(j - x()) <= moduleSize) { float moduleSizeDiff = std::abs(moduleSize - _estimatedModuleSize); return moduleSizeDiff <= 1.0f || moduleSizeDiff <= _estimatedModuleSize; } return false; } /** * Combines this object's current estimate of a finder pattern position and module size * with a new estimate. It returns a new {@code FinderPattern} containing an average of the two. */ AlignmentPattern AlignmentPattern::combineEstimate(float i, float j, float newModuleSize) const { float combinedX = (x() + j) / 2.0f; float combinedY = (y() + i) / 2.0f; float combinedModuleSize = (_estimatedModuleSize + newModuleSize) / 2.0f; return {combinedX, combinedY, combinedModuleSize}; } } // QRCode } // ZXing zxing-cpp-1.0.8+ds2/core/src/qrcode/QRAlignmentPattern.h000066400000000000000000000033021361167020700230100ustar00rootroot00000000000000#pragma once /* * Copyright 2016 Nu-book Inc. * Copyright 2016 ZXing authors * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #include "ResultPoint.h" namespace ZXing { namespace QRCode { /** *

Encapsulates an alignment pattern, which are the smaller square patterns found in * all but the simplest QR Codes.

* * @author Sean Owen */ class AlignmentPattern : public ResultPoint { float _estimatedModuleSize = 0; public: AlignmentPattern() = default; AlignmentPattern(float posX, float posY, float estimatedModuleSize); float estimatedModuleSize() const { return _estimatedModuleSize; } bool isValid() const { return _estimatedModuleSize > 0.f; } /** *

Determines if this alignment pattern "about equals" an alignment pattern at the stated * position and size -- meaning, it is at nearly the same center with nearly the same size.

*/ bool aboutEquals(float moduleSize, float i, float j) const; /** * Combines this object's current estimate of a finder pattern position and module size * with a new estimate. It returns a new {@code FinderPattern} containing an average of the two. */ AlignmentPattern combineEstimate(float i, float j, float newModuleSize) const; }; } // QRCode } // ZXing zxing-cpp-1.0.8+ds2/core/src/qrcode/QRAlignmentPatternFinder.cpp000066400000000000000000000162541361167020700245050ustar00rootroot00000000000000/* * Copyright 2016 Nu-book Inc. * Copyright 2016 ZXing authors * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #include "QRAlignmentPatternFinder.h" #include "QRAlignmentPattern.h" #include "BitMatrix.h" #include "DecodeStatus.h" #include "ZXContainerAlgorithms.h" #include #include #include #include namespace ZXing { namespace QRCode { using StateCount = std::array; /** * Given a count of black/white/black pixels just seen and an end position, * figures the location of the center of this black/white/black run. */ static float CenterFromEnd(const StateCount& stateCount, int end) { return static_cast(end - stateCount[2]) - stateCount[1] / 2.0f; } /** * @param stateCount count of black/white/black pixels just read * @return true iff the proportions of the counts is close enough to the 1/1/1 ratios * used by alignment patterns to be considered a match */ static bool FoundPatternCross(const StateCount& stateCount, float moduleSize) { float maxVariance = moduleSize / 2.0f; for (int i = 0; i < 3; i++) { if (std::fabs(moduleSize - stateCount[i]) >= maxVariance) { return false; } } return true; } /** *

After a horizontal scan finds a potential alignment pattern, this method * "cross-checks" by scanning down vertically through the center of the possible * alignment pattern to see if the same proportion is detected.

* * @param startI row where an alignment pattern was detected * @param centerJ center of the section that appears to cross an alignment pattern * @param maxCount maximum reasonable number of modules that should be * observed in any reading state, based on the results of the horizontal scan * @return vertical center of alignment pattern, or {@link Float#NaN} if not found */ static float CrossCheckVertical(const BitMatrix& image, int startI, int centerJ, int maxCount, int originalStateCountTotal, float moduleSize) { int maxI = image.height(); StateCount stateCount = {}; // Start counting up from center int i = startI; while (i >= 0 && image.get(centerJ, i) && stateCount[1] <= maxCount) { stateCount[1]++; i--; } // If already too many modules in this state or ran off the edge: if (i < 0 || stateCount[1] > maxCount) { return std::numeric_limits::quiet_NaN(); } while (i >= 0 && !image.get(centerJ, i) && stateCount[0] <= maxCount) { stateCount[0]++; i--; } if (stateCount[0] > maxCount) { return std::numeric_limits::quiet_NaN(); } // Now also count down from center i = startI + 1; while (i < maxI && image.get(centerJ, i) && stateCount[1] <= maxCount) { stateCount[1]++; i++; } if (i == maxI || stateCount[1] > maxCount) { return std::numeric_limits::quiet_NaN(); } while (i < maxI && !image.get(centerJ, i) && stateCount[2] <= maxCount) { stateCount[2]++; i++; } if (stateCount[2] > maxCount) { return std::numeric_limits::quiet_NaN(); } int stateCountTotal = Accumulate(stateCount, 0); if (5 * std::abs(stateCountTotal - originalStateCountTotal) >= 2 * originalStateCountTotal) { return std::numeric_limits::quiet_NaN(); } return FoundPatternCross(stateCount, moduleSize) ? CenterFromEnd(stateCount, i) : std::numeric_limits::quiet_NaN(); } /** *

This is called when a horizontal scan finds a possible alignment pattern. It will * cross check with a vertical scan, and if successful, will see if this pattern had been * found on a previous horizontal scan. If so, we consider it confirmed and conclude we have * found the alignment pattern.

* * @param stateCount reading state module counts from horizontal scan * @param i row where alignment pattern may be found * @param j end of possible alignment pattern in row * @return {@link AlignmentPattern} if we have found the same pattern twice, or null if not */ static AlignmentPattern HandlePossibleCenter(const BitMatrix& image, const StateCount& stateCount, int i, int j, float moduleSize, std::vector& possibleCenters) { int stateCountTotal = Accumulate(stateCount, 0); float centerJ = CenterFromEnd(stateCount, j); float centerI = CrossCheckVertical(image, i, static_cast(centerJ), 2 * stateCount[1], stateCountTotal, moduleSize); if (!std::isnan(centerI)) { float estimatedModuleSize = stateCountTotal / 3.0f; for (const AlignmentPattern& center : possibleCenters) { // Look for about the same center and module size: if (center.aboutEquals(estimatedModuleSize, centerI, centerJ)) { return center.combineEstimate(centerI, centerJ, estimatedModuleSize); } } // Hadn't found this before; save it possibleCenters.emplace_back(centerJ, centerI, estimatedModuleSize); } return {}; } AlignmentPattern AlignmentPatternFinder::Find(const BitMatrix& image, int startX, int startY, int width, int height, float moduleSize) { int maxJ = startX + width; int middleI = startY + (height / 2); std::vector possibleCenters; possibleCenters.reserve(5); // We are looking for black/white/black modules in 1:1:1 ratio; // this tracks the number of black/white/black modules seen so far for (int iGen = 0; iGen < height; iGen++) { // Search from middle outwards StateCount stateCount = {}; int i = middleI + ((iGen & 0x01) == 0 ? (iGen + 1) / 2 : -((iGen + 1) / 2)); int j = startX; // Burn off leading white pixels before anything else; if we start in the middle of // a white run, it doesn't make sense to count its length, since we don't know if the // white run continued to the left of the start point while (j < maxJ && !image.get(j, i)) { j++; } int currentState = 0; while (j < maxJ) { if (image.get(j, i)) { // Black pixel if (currentState == 1) { // Counting black pixels stateCount[1]++; } else { // Counting white pixels if (currentState == 2) { // A winner? if (FoundPatternCross(stateCount, moduleSize)) { // Yes auto result = HandlePossibleCenter(image, stateCount, i, j, moduleSize, possibleCenters); if (result.isValid()) return result; } stateCount[0] = stateCount[2]; stateCount[1] = 1; stateCount[2] = 0; currentState = 1; } else { stateCount[++currentState]++; } } } else { // White pixel if (currentState == 1) { // Counting black pixels currentState++; } stateCount[currentState]++; } j++; } if (FoundPatternCross(stateCount, moduleSize)) { auto result = HandlePossibleCenter(image, stateCount, i, maxJ, moduleSize, possibleCenters); if (result.isValid()) return result; } } // Hmm, nothing we saw was observed and confirmed twice. If we had // any guess at all, return it. if (!possibleCenters.empty()) { return possibleCenters.front(); } return {}; } } // QRCode } // ZXing zxing-cpp-1.0.8+ds2/core/src/qrcode/QRAlignmentPatternFinder.h000066400000000000000000000040031361167020700241370ustar00rootroot00000000000000#pragma once /* * Copyright 2016 Nu-book Inc. * Copyright 2016 ZXing authors * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ namespace ZXing { class BitMatrix; namespace QRCode { class AlignmentPattern; /** *

This class attempts to find alignment patterns in a QR Code. Alignment patterns look like finder * patterns but are smaller and appear at regular intervals throughout the image.

* *

At the moment this only looks for the bottom-right alignment pattern.

* *

This is mostly a simplified copy of {@link FinderPatternFinder}. It is copied, * pasted and stripped down here for maximum performance but does unfortunately duplicate * some code.

* *

This class is thread-safe but not reentrant. Each thread must allocate its own object.

* * @author Sean Owen */ class AlignmentPatternFinder { public: /** *

This method attempts to find the bottom-right alignment pattern in the image. It is a bit messy since * it's pretty performance-critical and so is written to be fast foremost.

* @param image image to search * @param startX left column from which to start searching * @param startY top row from which to start searching * @param width width of region to search * @param height height of region to search * @param moduleSize estimated module size so far * * @return {@link AlignmentPattern} if found * @throws NotFoundException if not found */ static AlignmentPattern Find(const BitMatrix& image, int startX, int startY, int width, int height, float moduleSize); }; } // QRCode } // ZXing zxing-cpp-1.0.8+ds2/core/src/qrcode/QRBitMatrixParser.cpp000066400000000000000000000134711361167020700231570ustar00rootroot00000000000000/* * Copyright 2016 Nu-book Inc. * Copyright 2016 ZXing authors * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #include "QRBitMatrixParser.h" #include "QRVersion.h" #include "QRFormatInformation.h" #include "BitMatrix.h" #include "ByteArray.h" #include "DecodeStatus.h" namespace ZXing { namespace QRCode { static inline int copyBit(const BitMatrix& bitMatrix, int i, int j, int versionBits, bool mirrored) { bool bit = mirrored ? bitMatrix.get(j, i) : bitMatrix.get(i, j); return (versionBits << 1) | static_cast(bit); } static inline bool hasValidDimension(const BitMatrix& bitMatrix) { int dimension = bitMatrix.height(); return !(dimension < 21 || (dimension & 0x03) != 1); } /** *

Reads version information from one of its two locations within the QR Code.

* * @return {@link Version} encapsulating the QR Code's version * @throws FormatException if both version information locations cannot be parsed as * the valid encoding of version information */ const Version* BitMatrixParser::ReadVersion(const BitMatrix& bitMatrix, bool mirrored) { if (!hasValidDimension(bitMatrix)) return nullptr; int dimension = bitMatrix.height(); int provisionalVersion = (dimension - 17) / 4; if (provisionalVersion <= 6) { return Version::VersionForNumber(provisionalVersion); } // Read top-right version info: 3 wide by 6 tall int versionBits = 0; int ijMin = dimension - 11; for (int j = 5; j >= 0; j--) { for (int i = dimension - 9; i >= ijMin; i--) { versionBits = copyBit(bitMatrix, i, j, versionBits, mirrored); } } auto theParsedVersion = Version::DecodeVersionInformation(versionBits); if (theParsedVersion != nullptr && theParsedVersion->dimensionForVersion() == dimension) { return theParsedVersion; } // Hmm, failed. Try bottom left: 6 wide by 3 tall versionBits = 0; for (int i = 5; i >= 0; i--) { for (int j = dimension - 9; j >= ijMin; j--) { versionBits = copyBit(bitMatrix, i, j, versionBits, mirrored); } } theParsedVersion = Version::DecodeVersionInformation(versionBits); if (theParsedVersion != nullptr && theParsedVersion->dimensionForVersion() == dimension) { return theParsedVersion; } return nullptr; } /** *

Reads format information from one of its two locations within the QR Code.

* * @return {@link FormatInformation} encapsulating the QR Code's format info * @throws FormatException if both format information locations cannot be parsed as * the valid encoding of format information */ FormatInformation BitMatrixParser::ReadFormatInformation(const BitMatrix& bitMatrix, bool mirrored) { if (!hasValidDimension(bitMatrix)) return {}; // Read top-left format info bits int formatInfoBits1 = 0; for (int i = 0; i < 6; i++) { formatInfoBits1 = copyBit(bitMatrix, i, 8, formatInfoBits1, mirrored); } // .. and skip a bit in the timing pattern ... formatInfoBits1 = copyBit(bitMatrix, 7, 8, formatInfoBits1, mirrored); formatInfoBits1 = copyBit(bitMatrix, 8, 8, formatInfoBits1, mirrored); formatInfoBits1 = copyBit(bitMatrix, 8, 7, formatInfoBits1, mirrored); // .. and skip a bit in the timing pattern ... for (int j = 5; j >= 0; j--) { formatInfoBits1 = copyBit(bitMatrix, 8, j, formatInfoBits1, mirrored); } // Read the top-right/bottom-left pattern too int dimension = bitMatrix.height(); int formatInfoBits2 = 0; int jMin = dimension - 7; for (int j = dimension - 1; j >= jMin; j--) { formatInfoBits2 = copyBit(bitMatrix, 8, j, formatInfoBits2, mirrored); } for (int i = dimension - 8; i < dimension; i++) { formatInfoBits2 = copyBit(bitMatrix, i, 8, formatInfoBits2, mirrored); } return FormatInformation::DecodeFormatInformation(formatInfoBits1, formatInfoBits2); } /** *

Reads the bits in the {@link BitMatrix} representing the finder pattern in the * correct order in order to reconstruct the codewords bytes contained within the * QR Code.

* * @return bytes encoded within the QR Code * @throws FormatException if the exact number of bytes expected is not read */ ByteArray BitMatrixParser::ReadCodewords(const BitMatrix& bitMatrix, const Version& version) { if (!hasValidDimension(bitMatrix)) return {}; BitMatrix functionPattern; version.buildFunctionPattern(functionPattern); bool readingUp = true; ByteArray result(version.totalCodewords()); int resultOffset = 0; int currentByte = 0; int bitsRead = 0; int dimension = bitMatrix.height(); // Read columns in pairs, from right to left for (int j = dimension - 1; j > 0; j -= 2) { if (j == 6) { // Skip whole column with vertical alignment pattern; // saves time and makes the other code proceed more cleanly j--; } // Read alternatingly from bottom to top then top to bottom for (int count = 0; count < dimension; count++) { int i = readingUp ? dimension - 1 - count : count; for (int col = 0; col < 2; col++) { // Ignore bits covered by the function pattern if (!functionPattern.get(j - col, i)) { // Read a bit bitsRead++; currentByte = (currentByte << 1) | static_cast(bitMatrix.get(j - col, i)); // If we've made a whole byte, save it off if (bitsRead == 8) { result[resultOffset++] = static_cast(currentByte); bitsRead = 0; currentByte = 0; } } } } readingUp ^= true; // readingUp = !readingUp; // switch directions } if (resultOffset != version.totalCodewords()) return {}; return result; } } // QRCode } // ZXing zxing-cpp-1.0.8+ds2/core/src/qrcode/QRBitMatrixParser.h000066400000000000000000000027371361167020700226270ustar00rootroot00000000000000#pragma once /* * Copyright 2016 Nu-book Inc. * Copyright 2016 ZXing authors * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ namespace ZXing { class BitMatrix; class ByteArray; namespace QRCode { class Version; class FormatInformation; /** * @author Sean Owen */ class BitMatrixParser { public: /** * @param bitMatrix {@link BitMatrix} to parse * return false if dimension is not >= 21 and 1 mod 4 */ static const Version* ReadVersion(const BitMatrix& bitMatrix, bool mirrored); static FormatInformation ReadFormatInformation(const BitMatrix& bitMatrix, bool mirrored); /** *

Reads the bits in the {@link BitMatrix} representing the finder pattern in the * correct order in order to reconstruct the codewords bytes contained within the * QR Code.

* * @return bytes encoded within the QR Code * or empty array if the exact number of bytes expected is not read */ static ByteArray ReadCodewords(const BitMatrix& bitMatrix, const Version& version); }; } // QRCode } // ZXing zxing-cpp-1.0.8+ds2/core/src/qrcode/QRCodecMode.cpp000066400000000000000000000027321361167020700217170ustar00rootroot00000000000000/* * Copyright 2016 Nu-book Inc. * Copyright 2016 ZXing authors * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #include "QRCodecMode.h" #include "QRVersion.h" #include namespace ZXing { namespace QRCode { namespace { static const int CHAR_COUNT_PER_MODE[] = { 0, 0, 0, 10, 12, 14, 9, 11, 13, 0, 0, 0, 8, 16, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8, 10, 12, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8, 10, 12, }; } // anonymous CodecMode::Mode CodecMode::ModeForBits(int bits) { if ((bits >= 0x00 && bits <= 0x05) || (bits >= 0x07 && bits <= 0x09) || bits == 0x0d) { return static_cast(bits); } throw std::invalid_argument("Invalid mode"); } int CodecMode::CharacterCountBits(Mode mode, const Version& version) { int number = version.versionNumber(); int offset; if (number <= 9) { offset = 0; } else if (number <= 26) { offset = 1; } else { offset = 2; } return CHAR_COUNT_PER_MODE[static_cast(mode) * 3 + offset]; } } // QRCode } // ZXing zxing-cpp-1.0.8+ds2/core/src/qrcode/QRCodecMode.h000066400000000000000000000033521361167020700213630ustar00rootroot00000000000000#pragma once /* * Copyright 2016 Nu-book Inc. * Copyright 2016 ZXing authors * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ namespace ZXing { namespace QRCode { class Version; /** *

See ISO 18004:2006, 6.4.1, Tables 2 and 3. This enum encapsulates the various modes in which * data can be encoded to bits in the QR code standard.

* * @author Sean Owen */ class CodecMode { public: enum Mode { TERMINATOR = 0x00, // Not really a mode... NUMERIC = 0x01, ALPHANUMERIC = 0x02, STRUCTURED_APPEND = 0x03, BYTE = 0x04, FNC1_FIRST_POSITION = 0x05, ECI = 0x07, // character counts don't apply KANJI = 0x08, FNC1_SECOND_POSITION = 0x09, /** See GBT 18284-2000; "Hanzi" is a transliteration of this mode name. */ HANZI = 0x0D, }; /** * @param bits four bits encoding a QR Code data mode * @return Mode encoded by these bits * @throws IllegalArgumentException if bits do not correspond to a known mode */ static Mode ModeForBits(int bits); /** * @param version version in question * @return number of bits used, in this QR Code symbol {@link Version}, to encode the * count of characters that will follow encoded in this Mode */ static int CharacterCountBits(Mode mode, const Version& version); }; } // QRCode } // ZXing zxing-cpp-1.0.8+ds2/core/src/qrcode/QRDataBlock.cpp000066400000000000000000000061051361167020700217170ustar00rootroot00000000000000/* * Copyright 2016 Nu-book Inc. * Copyright 2016 ZXing authors * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #include "QRDataBlock.h" #include "QRVersion.h" #include "QRErrorCorrectionLevel.h" #include "DecodeStatus.h" #include namespace ZXing { namespace QRCode { std::vector DataBlock::GetDataBlocks(const ByteArray& rawCodewords, const Version& version, ErrorCorrectionLevel ecLevel) { if (rawCodewords.length() != version.totalCodewords()) return {}; // Figure out the number and size of data blocks used by this version and // error correction level auto& ecBlocks = version.ecBlocksForLevel(ecLevel); // First count the total number of data blocks int totalBlocks = ecBlocks.numBlocks(); std::vector result(totalBlocks); // Now establish DataBlocks of the appropriate size and number of data codewords int numResultBlocks = 0; for (auto& ecBlock : ecBlocks.blockArray()) { for (int i = 0; i < ecBlock.count; i++) { auto& item = result[numResultBlocks++]; item._numDataCodewords = ecBlock.dataCodewords; item._codewords.resize(ecBlocks.codewordsPerBlock + ecBlock.dataCodewords); } } // All blocks have the same amount of data, except that the last n // (where n may be 0) have 1 more byte. Figure out where these start. int shorterBlocksTotalCodewords = result[0]._codewords.length(); int longerBlocksStartAt = static_cast(result.size()) - 1; while (longerBlocksStartAt >= 0) { int numCodewords = result[longerBlocksStartAt]._codewords.length(); if (numCodewords == shorterBlocksTotalCodewords) { break; } longerBlocksStartAt--; } longerBlocksStartAt++; int shorterBlocksNumDataCodewords = shorterBlocksTotalCodewords - ecBlocks.codewordsPerBlock; // The last elements of result may be 1 element longer; // first fill out as many elements as all of them have int rawCodewordsOffset = 0; for (int i = 0; i < shorterBlocksNumDataCodewords; i++) { for (int j = 0; j < numResultBlocks; j++) { result[j]._codewords[i] = rawCodewords[rawCodewordsOffset++]; } } // Fill out the last data block in the longer ones for (int j = longerBlocksStartAt; j < numResultBlocks; j++) { result[j]._codewords[shorterBlocksNumDataCodewords] = rawCodewords[rawCodewordsOffset++]; } // Now add in error correction blocks int max = result[0]._codewords.length(); for (int i = shorterBlocksNumDataCodewords; i < max; i++) { for (int j = 0; j < numResultBlocks; j++) { int iOffset = j < longerBlocksStartAt ? i : i + 1; result[j]._codewords[iOffset] = rawCodewords[rawCodewordsOffset++]; } } return result; } } // QRCode } // ZXing zxing-cpp-1.0.8+ds2/core/src/qrcode/QRDataBlock.h000066400000000000000000000036431361167020700213700ustar00rootroot00000000000000#pragma once /* * Copyright 2016 Nu-book Inc. * Copyright 2016 ZXing authors * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #include "ByteArray.h" #include namespace ZXing { namespace QRCode { class Version; enum class ErrorCorrectionLevel; /** *

Encapsulates a block of data within a QR Code. QR Codes may split their data into * multiple blocks, each of which is a unit of data and error-correction codewords. Each * is represented by an instance of this class.

* * @author Sean Owen */ class DataBlock { public: int numDataCodewords() const { return _numDataCodewords; } const ByteArray& codewords() const { return _codewords; } ByteArray& codewords() { return _codewords; } /** *

When QR Codes use multiple data blocks, they are actually interleaved. * That is, the first byte of data block 1 to n is written, then the second bytes, and so on. This * method will separate the data into original blocks.

* * @param rawCodewords bytes as read directly from the QR Code * @param version version of the QR Code * @param ecLevel error-correction level of the QR Code * @return DataBlocks containing original bytes, "de-interleaved" from representation in the * QR Code */ static std::vector GetDataBlocks(const ByteArray& rawCodewords, const Version& version, ErrorCorrectionLevel ecLevel); private: int _numDataCodewords = 0; ByteArray _codewords; }; } // QRCode } // ZXing zxing-cpp-1.0.8+ds2/core/src/qrcode/QRDataMask.cpp000066400000000000000000000050001361167020700215510ustar00rootroot00000000000000/* * Copyright 2016 Nu-book Inc. * Copyright 2016 ZXing authors * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #include "QRDataMask.h" #include "BitMatrix.h" #include "ZXContainerAlgorithms.h" #include namespace ZXing { namespace QRCode { namespace { /** * 000: mask bits for which (x + y) mod 2 == 0 */ bool DataMask000(int i, int j) { return ((i + j) & 0x01) == 0; } /** * 001: mask bits for which x mod 2 == 0 */ bool DataMask001(int i, int) { return (i & 0x01) == 0; } /** * 010: mask bits for which y mod 3 == 0 */ bool DataMask010(int, int j) { return j % 3 == 0; } /** * 011: mask bits for which (x + y) mod 3 == 0 */ bool DataMask011(int i, int j) { return (i + j) % 3 == 0; } /** * 100: mask bits for which (x/2 + y/3) mod 2 == 0 */ bool DataMask100(int i, int j) { return (((i / 2) + (j / 3)) & 0x01) == 0; } /** * 101: mask bits for which xy mod 2 + xy mod 3 == 0 * equivalently, such that xy mod 6 == 0 */ bool DataMask101(int i, int j) { return (i * j) % 6 == 0; } /** * 110: mask bits for which (xy mod 2 + xy mod 3) mod 2 == 0 * equivalently, such that xy mod 6 < 3 */ bool DataMask110(int i, int j) { return ((i * j) % 6) < 3; } /** * 111: mask bits for which ((x+y)mod 2 + xy mod 3) mod 2 == 0 * equivalently, such that (x + y + xy mod 3) mod 2 == 0 */ bool DataMask111(int i, int j) { return ((i + j + ((i * j) % 3)) & 0x01) == 0; } using IsMaskedFunc = bool (*)(int, int); /** * See ISO 18004:2006 6.8.1 */ static const IsMaskedFunc DATA_MASKS[] = { DataMask000, DataMask001, DataMask010, DataMask011, DataMask100, DataMask101, DataMask110, DataMask111, }; } // anonymous DataMask::DataMask(int reference) { if (reference < 0 || reference >= Length(DATA_MASKS)) { throw std::invalid_argument("Invalid data mask"); } _isMasked = DATA_MASKS[reference]; } void DataMask::unmaskBitMatrix(BitMatrix& bits, int dimension) const { for (int i = 0; i < dimension; i++) { for (int j = 0; j < dimension; j++) { if (_isMasked(i, j)) { bits.flip(j, i); } } } } } // QRCode } // ZXing zxing-cpp-1.0.8+ds2/core/src/qrcode/QRDataMask.h000066400000000000000000000035601361167020700212270ustar00rootroot00000000000000#pragma once /* * Copyright 2016 Nu-book Inc. * Copyright 2016 ZXing authors * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ namespace ZXing { class BitMatrix; namespace QRCode { /** *

Encapsulates data masks for the data bits in a QR code, per ISO 18004:2006 6.8. Implementations * of this class can un-mask a raw BitMatrix. For simplicity, they will unmask the entire BitMatrix, * including areas used for finder patterns, timing patterns, etc. These areas should be unused * after the point they are unmasked anyway.

* *

Note that the diagram in section 6.8.1 is misleading since it indicates that i is column position * and j is row position. In fact, as the text says, i is row position and j is column position.

* * @author Sean Owen */ class DataMask { public: /** * @param reference a value between 0 and 7 indicating one of the eight possible * data mask patterns a QR Code may use * @return DataMask encapsulating the data mask pattern */ explicit DataMask(int reference); /** *

Implementations of this method reverse the data masking process applied to a QR Code and * make its bits ready to read.

* * @param bits representation of QR Code bits * @param dimension dimension of QR Code, represented by bits, being unmasked */ void unmaskBitMatrix(BitMatrix& bits, int dimension) const; private: bool(*_isMasked)(int, int); }; } // QRCode } // ZXing zxing-cpp-1.0.8+ds2/core/src/qrcode/QRDecoder.cpp000066400000000000000000000364661361167020700214550ustar00rootroot00000000000000/* * Copyright 2016 Nu-book Inc. * Copyright 2016 ZXing authors * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #include "QRDecoder.h" #include "QRBitMatrixParser.h" #include "QRVersion.h" #include "QRFormatInformation.h" #include "QRDecoderMetadata.h" #include "QRDataMask.h" #include "QRDataBlock.h" #include "QRCodecMode.h" #include "DecoderResult.h" #include "BitMatrix.h" #include "ReedSolomonDecoder.h" #include "GenericGF.h" #include "BitSource.h" #include "TextDecoder.h" #include "CharacterSet.h" #include "CharacterSetECI.h" #include "DecodeHints.h" #include "DecodeStatus.h" #include "ZXContainerAlgorithms.h" #include "ZXTestSupport.h" #include #include namespace ZXing { namespace QRCode { /** *

Given data and error-correction codewords received, possibly corrupted by errors, attempts to * correct the errors in-place using Reed-Solomon error correction.

* * @param codewordBytes data and error correction codewords * @param numDataCodewords number of codewords that are data bytes * @throws ChecksumException if error correction fails */ static bool CorrectErrors(ByteArray& codewordBytes, int numDataCodewords) { // First read into an array of ints std::vector codewordsInts(codewordBytes.begin(), codewordBytes.end()); int numECCodewords = codewordBytes.length() - numDataCodewords; if (!ReedSolomonDecoder::Decode(GenericGF::QRCodeField256(), codewordsInts, numECCodewords)) return false; // Copy back into array of bytes -- only need to worry about the bytes that were data // We don't care about errors in the error-correction codewords std::copy_n(codewordsInts.begin(), numDataCodewords, codewordBytes.begin()); return true; } /** * See specification GBT 18284-2000 */ static DecodeStatus DecodeHanziSegment(BitSource& bits, int count, std::wstring& result) { // Don't crash trying to read more bits than we have available. if (count * 13 > bits.available()) { return DecodeStatus::FormatError; } // Each character will require 2 bytes. Read the characters as 2-byte pairs // and decode as GB2312 afterwards ByteArray buffer; buffer.reserve(2 * count); while (count > 0) { // Each 13 bits encodes a 2-byte character int twoBytes = bits.readBits(13); int assembledTwoBytes = ((twoBytes / 0x060) << 8) | (twoBytes % 0x060); if (assembledTwoBytes < 0x00A00) { // In the 0xA1A1 to 0xAAFE range assembledTwoBytes += 0x0A1A1; } else { // In the 0xB0A1 to 0xFAFE range assembledTwoBytes += 0x0A6A1; } buffer.push_back(static_cast((assembledTwoBytes >> 8) & 0xFF)); buffer.push_back(static_cast(assembledTwoBytes & 0xFF)); count--; } TextDecoder::Append(result, buffer.data(), buffer.length(), CharacterSet::GB2312); return DecodeStatus::NoError; } static DecodeStatus DecodeKanjiSegment(BitSource& bits, int count, std::wstring& result) { // Don't crash trying to read more bits than we have available. if (count * 13 > bits.available()) { return DecodeStatus::FormatError; } // Each character will require 2 bytes. Read the characters as 2-byte pairs // and decode as Shift_JIS afterwards ByteArray buffer; buffer.reserve(2 * count); while (count > 0) { // Each 13 bits encodes a 2-byte character int twoBytes = bits.readBits(13); int assembledTwoBytes = ((twoBytes / 0x0C0) << 8) | (twoBytes % 0x0C0); if (assembledTwoBytes < 0x01F00) { // In the 0x8140 to 0x9FFC range assembledTwoBytes += 0x08140; } else { // In the 0xE040 to 0xEBBF range assembledTwoBytes += 0x0C140; } buffer.push_back(static_cast(assembledTwoBytes >> 8)); buffer.push_back(static_cast(assembledTwoBytes)); count--; } TextDecoder::Append(result, buffer.data(), buffer.length(), CharacterSet::Shift_JIS); return DecodeStatus::NoError; } static DecodeStatus DecodeByteSegment(BitSource& bits, int count, CharacterSet currentCharset, const std::string& hintedCharset, std::wstring& result, std::list& byteSegments) { // Don't crash trying to read more bits than we have available. if (8 * count > bits.available()) { return DecodeStatus::FormatError; } ByteArray readBytes(count); for (int i = 0; i < count; i++) { readBytes[i] = static_cast(bits.readBits(8)); } if (currentCharset == CharacterSet::Unknown) { // The spec isn't clear on this mode; see // section 6.4.5: t does not say which encoding to assuming // upon decoding. I have seen ISO-8859-1 used as well as // Shift_JIS -- without anything like an ECI designator to // give a hint. if (!hintedCharset.empty()) { currentCharset = CharacterSetECI::CharsetFromName(hintedCharset.c_str()); } if (currentCharset == CharacterSet::Unknown) { currentCharset = TextDecoder::GuessEncoding(readBytes.data(), readBytes.length()); } } TextDecoder::Append(result, readBytes.data(), readBytes.length(), currentCharset); byteSegments.push_back(readBytes); return DecodeStatus::NoError; } static char ToAlphaNumericChar(int value) { /** * See ISO 18004:2006, 6.4.4 Table 5 */ static const char ALPHANUMERIC_CHARS[] = { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z', ' ', '$', '%', '*', '+', '-', '.', '/', ':' }; if (value < 0 || value >= Length(ALPHANUMERIC_CHARS)) { throw std::out_of_range("ToAlphaNumericChar: out of range"); } return ALPHANUMERIC_CHARS[value]; } static DecodeStatus DecodeAlphanumericSegment(BitSource& bits, int count, bool fc1InEffect, std::wstring& result) { // Read two characters at a time std::string buffer; while (count > 1) { if (bits.available() < 11) { return DecodeStatus::FormatError; } int nextTwoCharsBits = bits.readBits(11); buffer += ToAlphaNumericChar(nextTwoCharsBits / 45); buffer += ToAlphaNumericChar(nextTwoCharsBits % 45); count -= 2; } if (count == 1) { // special case: one character left if (bits.available() < 6) { return DecodeStatus::FormatError; } buffer += ToAlphaNumericChar(bits.readBits(6)); } // See section 6.4.8.1, 6.4.8.2 if (fc1InEffect) { // We need to massage the result a bit if in an FNC1 mode: for (size_t i = 0; i < buffer.length(); i++) { if (buffer[i] == '%') { if (i < buffer.length() - 1 && buffer[i + 1] == '%') { // %% is rendered as % buffer.erase(i + 1); } else { // In alpha mode, % should be converted to FNC1 separator 0x1D buffer[i] = static_cast(0x1D); } } } } TextDecoder::AppendLatin1(result, buffer); return DecodeStatus::NoError; } static DecodeStatus DecodeNumericSegment(BitSource& bits, int count, std::wstring& result) { // Read three digits at a time std::string buffer; while (count >= 3) { // Each 10 bits encodes three digits if (bits.available() < 10) { return DecodeStatus::FormatError; } int threeDigitsBits = bits.readBits(10); if (threeDigitsBits >= 1000) { return DecodeStatus::FormatError; } buffer += ToAlphaNumericChar(threeDigitsBits / 100); buffer += ToAlphaNumericChar((threeDigitsBits / 10) % 10); buffer += ToAlphaNumericChar(threeDigitsBits % 10); count -= 3; } if (count == 2) { // Two digits left over to read, encoded in 7 bits if (bits.available() < 7) { return DecodeStatus::FormatError; } int twoDigitsBits = bits.readBits(7); if (twoDigitsBits >= 100) { return DecodeStatus::FormatError; } buffer += ToAlphaNumericChar(twoDigitsBits / 10); buffer += ToAlphaNumericChar(twoDigitsBits % 10); } else if (count == 1) { // One digit left over to read if (bits.available() < 4) { return DecodeStatus::FormatError; } int digitBits = bits.readBits(4); if (digitBits >= 10) { return DecodeStatus::FormatError; } buffer += ToAlphaNumericChar(digitBits); } TextDecoder::AppendLatin1(result, buffer); return DecodeStatus::NoError; } static DecodeStatus ParseECIValue(BitSource& bits, int &outValue) { int firstByte = bits.readBits(8); if ((firstByte & 0x80) == 0) { // just one byte outValue = firstByte & 0x7F; return DecodeStatus::NoError; } if ((firstByte & 0xC0) == 0x80) { // two bytes int secondByte = bits.readBits(8); outValue = ((firstByte & 0x3F) << 8) | secondByte; return DecodeStatus::NoError; } if ((firstByte & 0xE0) == 0xC0) { // three bytes int secondThirdBytes = bits.readBits(16); outValue = ((firstByte & 0x1F) << 16) | secondThirdBytes; return DecodeStatus::NoError; } return DecodeStatus::FormatError; } /** *

QR Codes can encode text as bits in one of several modes, and can use multiple modes * in one QR Code. This method decodes the bits back into text.

* *

See ISO 18004:2006, 6.4.3 - 6.4.7

*/ ZXING_EXPORT_TEST_ONLY DecoderResult DecodeBitStream(ByteArray&& bytes, const Version& version, ErrorCorrectionLevel ecLevel, const std::string& hintedCharset) { BitSource bits(bytes); std::wstring result; std::list byteSegments; int codeSequence = -1; int codeCount = -1; int parityData = -1; static const int GB2312_SUBSET = 1; try { CharacterSet currentCharset = CharacterSet::Unknown; bool fc1InEffect = false; CodecMode::Mode mode; do { // While still another segment to read... if (bits.available() < 4) { // OK, assume we're done. Really, a TERMINATOR mode should have been recorded here mode = CodecMode::TERMINATOR; } else { mode = CodecMode::ModeForBits(bits.readBits(4)); // mode is encoded by 4 bits } switch (mode) { case CodecMode::TERMINATOR: break; case CodecMode::FNC1_FIRST_POSITION: case CodecMode::FNC1_SECOND_POSITION: // We do little with FNC1 except alter the parsed result a bit according to the spec fc1InEffect = true; break; case CodecMode::STRUCTURED_APPEND: if (bits.available() < 16) { return DecodeStatus::FormatError; } // sequence number and parity is added later to the result metadata // Read next 4 bits of sequence #, 4 bits of code count, and 8 bits of parity data, then continue codeSequence = bits.readBits(4); codeCount = bits.readBits(4) + 1; parityData = bits.readBits(8); break; case CodecMode::ECI: { // Count doesn't apply to ECI int value; auto status = ParseECIValue(bits, value); if (StatusIsError(status)) { return status; } currentCharset = CharacterSetECI::CharsetFromValue(value); if (currentCharset == CharacterSet::Unknown) { return DecodeStatus::FormatError; } break; } case CodecMode::HANZI: { // First handle Hanzi mode which does not start with character count // chinese mode contains a sub set indicator right after mode indicator int subset = bits.readBits(4); int countHanzi = bits.readBits(CodecMode::CharacterCountBits(mode, version)); if (subset == GB2312_SUBSET) { auto status = DecodeHanziSegment(bits, countHanzi, result); if (StatusIsError(status)) { return status; } } break; } default: { // "Normal" QR code modes: // How many characters will follow, encoded in this mode? int count = bits.readBits(CodecMode::CharacterCountBits(mode, version)); DecodeStatus status; switch (mode) { case CodecMode::NUMERIC: status = DecodeNumericSegment(bits, count, result); break; case CodecMode::ALPHANUMERIC: status = DecodeAlphanumericSegment(bits, count, fc1InEffect, result); break; case CodecMode::BYTE: status = DecodeByteSegment(bits, count, currentCharset, hintedCharset, result, byteSegments); break; case CodecMode::KANJI: status = DecodeKanjiSegment(bits, count, result); break; default: status = DecodeStatus::FormatError; } if (StatusIsError(status)) { return status; } break; } } } while (mode != CodecMode::TERMINATOR); } catch (const std::exception &) { // from readBits() calls return DecodeStatus::FormatError; } return DecoderResult(std::move(bytes), std::move(result)) .setByteSegments(std::move(byteSegments)) .setEcLevel(ToString(ecLevel)) .setStructuredAppendParity(parityData) .setStructuredAppendSequenceNumber(codeSequence) .setStructuredAppendCodeCount(codeCount); } static DecoderResult DoDecode(const BitMatrix& bits, const Version& version, const FormatInformation& formatInfo, const std::string& hintedCharset) { auto ecLevel = formatInfo.errorCorrectionLevel(); // Read codewords ByteArray codewords = BitMatrixParser::ReadCodewords(bits, version); if (codewords.empty()) return DecodeStatus::FormatError; // Separate into data blocks std::vector dataBlocks = DataBlock::GetDataBlocks(codewords, version, ecLevel); if (dataBlocks.empty()) return DecodeStatus::FormatError; // Count total number of data bytes int totalBytes = 0; for (const auto& dataBlock : dataBlocks) { totalBytes += dataBlock.numDataCodewords(); } ByteArray resultBytes(totalBytes); auto resultIterator = resultBytes.begin(); // Error-correct and copy data blocks together into a stream of bytes for (auto& dataBlock : dataBlocks) { ByteArray& codewordBytes = dataBlock.codewords(); int numDataCodewords = dataBlock.numDataCodewords(); if (!CorrectErrors(codewordBytes, numDataCodewords)) return DecodeStatus::ChecksumError; resultIterator = std::copy_n(codewordBytes.begin(), numDataCodewords, resultIterator); } // Decode the contents of that stream of bytes return DecodeBitStream(std::move(resultBytes), version, ecLevel, hintedCharset); } static void ReMask(BitMatrix& bitMatrix, const FormatInformation& formatInfo) { int dimension = bitMatrix.height(); DataMask(formatInfo.dataMask()).unmaskBitMatrix(bitMatrix, dimension); } DecoderResult Decoder::Decode(const BitMatrix& bits_, const std::string& hintedCharset) { BitMatrix bits = bits_.copy(); // Construct a parser and read version, error-correction level const Version* version = BitMatrixParser::ReadVersion(bits, false); FormatInformation formatInfo = BitMatrixParser::ReadFormatInformation(bits, false); if (version != nullptr && formatInfo.isValid()) { ReMask(bits, formatInfo); auto result = DoDecode(bits, *version, formatInfo, hintedCharset); if (result.isValid()) { return result; } } if (version != nullptr) { // Revert the bit matrix ReMask(bits, formatInfo); } version = BitMatrixParser::ReadVersion(bits, true); formatInfo = BitMatrixParser::ReadFormatInformation(bits, true); if (version != nullptr && formatInfo.isValid()) { /* * Since we're here, this means we have successfully detected some kind * of version and format information when mirrored. This is a good sign, * that the QR code may be mirrored, and we should try once more with a * mirrored content. */ // Prepare for a mirrored reading. bits.mirror(); ReMask(bits, formatInfo); auto result = DoDecode(bits, *version, formatInfo, hintedCharset); if (result.isValid()) result.setExtra(std::make_shared(true)); return result; } return DecodeStatus::FormatError; } } // QRCode } // ZXing zxing-cpp-1.0.8+ds2/core/src/qrcode/QRDecoder.h000066400000000000000000000037211361167020700211060ustar00rootroot00000000000000#pragma once /* * Copyright 2016 Nu-book Inc. * Copyright 2016 ZXing authors * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #include #include namespace ZXing { class DecoderResult; class BitMatrix; namespace QRCode { /** *

The main class which implements QR Code decoding -- as opposed to locating and extracting * the QR Code from an image.

* * @author Sean Owen */ class Decoder { public: /** *

Convenience method that can decode a QR Code represented as a 2D array of booleans. * "true" is taken to mean a black module.

* * @param image booleans representing white/black QR Code modules * @param hints decoding hints that should be used to influence decoding * @return text and bytes encoded within the QR Code * @throws FormatException if the QR Code cannot be decoded * @throws ChecksumException if error correction fails */ //DecoderResult decode(boolean[][] image, Map hints); /** *

Decodes a QR Code represented as a {@link BitMatrix}. A 1 or "true" is taken to mean a black module.

* * @param bits booleans representing white/black QR Code modules * @param hints decoding hints that should be used to influence decoding * @return text and bytes encoded within the QR Code * @throws FormatException if the QR Code cannot be decoded * @throws ChecksumException if error correction fails */ static DecoderResult Decode(const BitMatrix& bits, const std::string& hintedCharset); }; } // QRCode } // ZXing zxing-cpp-1.0.8+ds2/core/src/qrcode/QRDecoderMetadata.h000066400000000000000000000023261361167020700225470ustar00rootroot00000000000000#pragma once /* * Copyright 2016 Nu-book Inc. * Copyright 2016 ZXing authors * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #include "CustomData.h" #include namespace ZXing { class ResultPoint; namespace QRCode { /** * Meta-data container for QR Code decoding. Instances of this class may be used to convey information back to the * decoding caller. Callers are expected to process this. * * @see com.google.zxing.common.DecoderResult#getOther() */ class DecoderMetadata : public CustomData { bool _mirrored; public: explicit DecoderMetadata(bool mirrored) : _mirrored(mirrored) {} /** * @return true if the QR Code was mirrored. */ bool isMirrored() const { return _mirrored; } }; } // QRCode } // ZXing zxing-cpp-1.0.8+ds2/core/src/qrcode/QRDetector.cpp000066400000000000000000000276511361167020700216550ustar00rootroot00000000000000/* * Copyright 2016 Nu-book Inc. * Copyright 2016 ZXing authors * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #include "QRDetector.h" #include "QRFinderPatternFinder.h" #include "QRFinderPatternInfo.h" #include "QRAlignmentPattern.h" #include "QRAlignmentPatternFinder.h" #include "QRVersion.h" #include "BitMatrix.h" #include "DecodeHints.h" #include "DetectorResult.h" #include "PerspectiveTransform.h" #include "GridSampler.h" #include "ZXNumeric.h" #include "DecodeStatus.h" #include namespace ZXing { namespace QRCode { /** *

This method traces a line from a point in the image, in the direction towards another point. * It begins in a black region, and keeps going until it finds white, then black, then white again. * It reports the distance from the start to this point.

* *

This is used when figuring out how wide a finder pattern is, when the finder pattern * may be skewed or rotated.

*/ static float SizeOfBlackWhiteBlackRun(const BitMatrix& image, int fromX, int fromY, int toX, int toY) { // Mild variant of Bresenham's algorithm; // see http://en.wikipedia.org/wiki/Bresenham's_line_algorithm bool steep = std::abs(toY - fromY) > std::abs(toX - fromX); if (steep) { std::swap(fromX, fromY); std::swap(toX, toY); } int dx = std::abs(toX - fromX); int dy = std::abs(toY - fromY); int error = -dx / 2; int xstep = fromX < toX ? 1 : -1; int ystep = fromY < toY ? 1 : -1; // In black pixels, looking for white, first or second time. int state = 0; // Loop up until x == toX, but not beyond int xLimit = toX + xstep; for (int x = fromX, y = fromY; x != xLimit; x += xstep) { int realX = steep ? y : x; int realY = steep ? x : y; // Does current pixel mean we have moved white to black or vice versa? // Scanning black in state 0,2 and white in state 1, so if we find the wrong // color, advance to next state or end if we are in state 2 already if ((state == 1) == image.get(realX, realY)) { if (state == 2) { return ResultPoint::Distance(x, y, fromX, fromY); } state++; } error += dy; if (error > 0) { if (y == toY) { break; } y += ystep; error -= dx; } } // Found black-white-black; give the benefit of the doubt that the next pixel outside the image // is "white" so this last point at (toX+xStep,toY) is the right ending. This is really a // small approximation; (toX+xStep,toY+yStep) might be really correct. Ignore this. if (state == 2) { return ResultPoint::Distance(toX + xstep, toY, fromX, fromY); } // else we didn't find even black-white-black; no estimate is really possible return std::numeric_limits::quiet_NaN(); } /** * See {@link #sizeOfBlackWhiteBlackRun(int, int, int, int)}; computes the total width of * a finder pattern by looking for a black-white-black run from the center in the direction * of another point (another finder pattern center), and in the opposite direction too. */ static float SizeOfBlackWhiteBlackRunBothWays(const BitMatrix& image, int fromX, int fromY, int toX, int toY) { float result = SizeOfBlackWhiteBlackRun(image, fromX, fromY, toX, toY); // Now count other way -- don't run off image though of course float scale = 1.0f; int otherToX = fromX - (toX - fromX); if (otherToX < 0) { scale = (float)fromX / (float)(fromX - otherToX); otherToX = 0; } else if (otherToX >= image.width()) { scale = (float)(image.width() - 1 - fromX) / (float)(otherToX - fromX); otherToX = image.width() - 1; } int otherToY = (int)(fromY - (toY - fromY) * scale); scale = 1.0f; if (otherToY < 0) { scale = (float)fromY / (float)(fromY - otherToY); otherToY = 0; } else if (otherToY >= image.height()) { scale = (float)(image.height() - 1 - fromY) / (float)(otherToY - fromY); otherToY = image.height() - 1; } otherToX = (int)(fromX + (otherToX - fromX) * scale); result += SizeOfBlackWhiteBlackRun(image, fromX, fromY, otherToX, otherToY); // Middle pixel is double-counted this way; subtract 1 return result - 1.0f; } /** *

Estimates module size based on two finder patterns -- it uses * {@link #sizeOfBlackWhiteBlackRunBothWays(int, int, int, int)} to figure the * width of each, measuring along the axis between their centers.

*/ static float CalculateModuleSizeOneWay(const BitMatrix& image, const ResultPoint& pattern, const ResultPoint& otherPattern) { float moduleSizeEst1 = SizeOfBlackWhiteBlackRunBothWays(image, static_cast(pattern.x()), static_cast(pattern.y()), static_cast(otherPattern.x()), static_cast(otherPattern.y())); float moduleSizeEst2 = SizeOfBlackWhiteBlackRunBothWays(image, static_cast(otherPattern.x()), static_cast(otherPattern.y()), static_cast(pattern.x()), static_cast(pattern.y())); if (std::isnan(moduleSizeEst1)) { return moduleSizeEst2 / 7.0f; } if (std::isnan(moduleSizeEst2)) { return moduleSizeEst1 / 7.0f; } // Average them, and divide by 7 since we've counted the width of 3 black modules, // and 1 white and 1 black module on either side. Ergo, divide sum by 14. return (moduleSizeEst1 + moduleSizeEst2) / 14.0f; } /** *

Computes an average estimated module size based on estimated derived from the positions * of the three finder patterns.

* * @param topLeft detected top-left finder pattern center * @param topRight detected top-right finder pattern center * @param bottomLeft detected bottom-left finder pattern center * @return estimated module size */ static float CalculateModuleSize(const BitMatrix& image, const ResultPoint& topLeft, const ResultPoint& topRight, const ResultPoint& bottomLeft) { // Take the average return (CalculateModuleSizeOneWay(image, topLeft, topRight) + CalculateModuleSizeOneWay(image, topLeft, bottomLeft)) / 2.0f; } /** *

Attempts to locate an alignment pattern in a limited region of the image, which is * guessed to contain it. This method uses {@link AlignmentPattern}.

* * @param overallEstModuleSize estimated module size so far * @param estAlignmentX x coordinate of center of area probably containing alignment pattern * @param estAlignmentY y coordinate of above * @param allowanceFactor number of pixels in all directions to search from the center * @return {@link AlignmentPattern} if found, or null otherwise * @throws NotFoundException if an unexpected error occurs during detection */ AlignmentPattern FindAlignmentInRegion(const BitMatrix& image, float overallEstModuleSize, int estAlignmentX, int estAlignmentY, float allowanceFactor) { // Look for an alignment pattern (3 modules in size) around where it // should be int allowance = (int)(allowanceFactor * overallEstModuleSize); int alignmentAreaLeftX = std::max(0, estAlignmentX - allowance); int alignmentAreaRightX = std::min(image.width() - 1, estAlignmentX + allowance); if (alignmentAreaRightX - alignmentAreaLeftX < overallEstModuleSize * 3) { return {}; } int alignmentAreaTopY = std::max(0, estAlignmentY - allowance); int alignmentAreaBottomY = std::min(image.height() - 1, estAlignmentY + allowance); if (alignmentAreaBottomY - alignmentAreaTopY < overallEstModuleSize * 3) { return {}; } return AlignmentPatternFinder::Find(image, alignmentAreaLeftX, alignmentAreaTopY, alignmentAreaRightX - alignmentAreaLeftX, alignmentAreaBottomY - alignmentAreaTopY, overallEstModuleSize); } static PerspectiveTransform CreateTransform(const ResultPoint& topLeft, const ResultPoint& topRight, const ResultPoint& bottomLeft, const AlignmentPattern& alignmentPattern, int dimension) { float dimMinusThree = (float)dimension - 3.5f; float bottomRightX; float bottomRightY; float sourceBottomRightX; float sourceBottomRightY; if (alignmentPattern.isValid()) { bottomRightX = alignmentPattern.x(); bottomRightY = alignmentPattern.y(); sourceBottomRightX = dimMinusThree - 3.0f; sourceBottomRightY = sourceBottomRightX; } else { // Don't have an alignment pattern, just make up the bottom-right point bottomRightX = (topRight.x() - topLeft.x()) + bottomLeft.x(); bottomRightY = (topRight.y() - topLeft.y()) + bottomLeft.y(); sourceBottomRightX = dimMinusThree; sourceBottomRightY = dimMinusThree; } return PerspectiveTransform::QuadrilateralToQuadrilateral( 3.5f, 3.5f, dimMinusThree, 3.5f, sourceBottomRightX, sourceBottomRightY, 3.5f, dimMinusThree, topLeft.x(), topLeft.y(), topRight.x(), topRight.y(), bottomRightX, bottomRightY, bottomLeft.x(), bottomLeft.y()); } /** *

Computes the dimension (number of modules on a size) of the QR Code based on the position * of the finder patterns and estimated module size.

* Return -1 in case of error. */ static int ComputeDimension(const ResultPoint& topLeft, const ResultPoint& topRight, const ResultPoint& bottomLeft, float moduleSize) { int tltrCentersDimension = RoundToNearest(ResultPoint::Distance(topLeft, topRight) / moduleSize); int tlblCentersDimension = RoundToNearest(ResultPoint::Distance(topLeft, bottomLeft) / moduleSize); int dimension = ((tltrCentersDimension + tlblCentersDimension) / 2) + 7; switch (dimension & 0x03) { // mod 4 case 0: return ++dimension; case 1: return dimension; case 2: return --dimension; } return -1; // to signal error; } static DetectorResult ProcessFinderPatternInfo(const BitMatrix& image, const FinderPatternInfo& info) { float moduleSize = CalculateModuleSize(image, info.topLeft, info.topRight, info.bottomLeft); if (moduleSize < 1.0f) { return {}; } int dimension = ComputeDimension(info.topLeft, info.topRight, info.bottomLeft, moduleSize); if (dimension < 0) return {}; const Version* provisionalVersion = Version::ProvisionalVersionForDimension(dimension); if (provisionalVersion == nullptr) return {}; int modulesBetweenFPCenters = provisionalVersion->dimensionForVersion() - 7; AlignmentPattern alignmentPattern; // Anything above version 1 has an alignment pattern if (!provisionalVersion->alignmentPatternCenters().empty()) { // Guess where a "bottom right" finder pattern would have been float bottomRightX = info.topRight.x() - info.topLeft.x() + info.bottomLeft.x(); float bottomRightY = info.topRight.y() - info.topLeft.y() + info.bottomLeft.y(); // Estimate that alignment pattern is closer by 3 modules // from "bottom right" to known top left location float correctionToTopLeft = 1.0f - 3.0f / (float)modulesBetweenFPCenters; int estAlignmentX = static_cast(info.topLeft.x() + correctionToTopLeft * (bottomRightX - info.topLeft.x())); int estAlignmentY = static_cast(info.topLeft.y() + correctionToTopLeft * (bottomRightY - info.topLeft.y())); // Kind of arbitrary -- expand search radius before giving up for (int i = 4; i <= 16; i <<= 1) { alignmentPattern = FindAlignmentInRegion(image, moduleSize, estAlignmentX, estAlignmentY, static_cast(i)); if (alignmentPattern.isValid()) break; } // If we didn't find alignment pattern... well try anyway without it } PerspectiveTransform transform = CreateTransform(info.topLeft, info.topRight, info.bottomLeft, alignmentPattern, dimension); auto bits = GridSampler::Instance()->sampleGrid(image, dimension, dimension, transform); if (bits.empty()) return {}; if (alignmentPattern.isValid()) return {std::move(bits), {info.bottomLeft, info.topLeft, info.topRight, alignmentPattern}}; else return {std::move(bits), {info.bottomLeft, info.topLeft, info.topRight}}; } DetectorResult Detector::Detect(const BitMatrix& image, bool tryHarder) { FinderPatternInfo info = FinderPatternFinder::Find(image, tryHarder); if (!info.isValid()) return {}; return ProcessFinderPatternInfo(image, info); } } // QRCode } // ZXing zxing-cpp-1.0.8+ds2/core/src/qrcode/QRDetector.h000066400000000000000000000024021361167020700213050ustar00rootroot00000000000000#pragma once /* * Copyright 2016 Nu-book Inc. * Copyright 2016 ZXing authors * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ namespace ZXing { class DetectorResult; class BitMatrix; namespace QRCode { /** *

Encapsulates logic that can detect a QR Code in an image, even if the QR Code * is rotated or skewed, or partially obscured.

* * @author Sean Owen */ class Detector { public: /** *

Detects a QR Code in an image.

* * @param hints optional hints to detector * @return {@link DetectorResult} encapsulating results of detecting a QR Code * @throws NotFoundException if QR Code cannot be found * @throws FormatException if a QR Code cannot be decoded */ static DetectorResult Detect(const BitMatrix& image, bool tryHarder); }; } // QRCode } // ZXing zxing-cpp-1.0.8+ds2/core/src/qrcode/QRECB.h000066400000000000000000000035271361167020700201360ustar00rootroot00000000000000#pragma once /* * Copyright 2016 Nu-book Inc. * Copyright 2016 ZXing authors * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #include namespace ZXing { namespace QRCode { /** *

Encapsualtes the parameters for one error-correction block in one symbol version. * This includes the number of data codewords, and the number of times a block with these * parameters is used consecutively in the QR code version's format.

* * @author Sean Owen */ struct ECB { int count; int dataCodewords; }; /** *

Encapsulates a set of error-correction blocks in one symbol version. Most versions will * use blocks of differing sizes within one version, so, this encapsulates the parameters for * each set of blocks. It also holds the number of error-correction codewords per block since it * will be the same across all blocks within one version.

* * @author Sean Owen */ struct ECBlocks { int codewordsPerBlock; std::array blocks; int numBlocks() const { return blocks[0].count + blocks[1].count; } int totalCodewords() const { return codewordsPerBlock * numBlocks(); } int totalDataCodewords() const { return blocks[0].count * (blocks[0].dataCodewords + codewordsPerBlock) + blocks[1].count * (blocks[1].dataCodewords + codewordsPerBlock); } const std::array& blockArray() const { return blocks; } }; } // QRCode } // ZXing zxing-cpp-1.0.8+ds2/core/src/qrcode/QREncodeResult.h000066400000000000000000000023671361167020700221420ustar00rootroot00000000000000#pragma once /* * Copyright 2016 Huy Cuong Nguyen * Copyright 2016 ZXing authors * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #include "ByteArray.h" #include "ByteMatrix.h" #include "QRCodecMode.h" #include "QRVersion.h" namespace ZXing { namespace QRCode { /** * @author satorux@google.com (Satoru Takabayashi) - creator * @author dswitkin@google.com (Daniel Switkin) - ported from C++ * * Original class name in Java was QRCode, as this name is taken already for the namespace, * so it's renamed here EncodeResult. */ class EncodeResult { public: ErrorCorrectionLevel ecLevel = ErrorCorrectionLevel::Invalid; CodecMode::Mode mode = CodecMode::TERMINATOR; const Version* version = nullptr; int maskPattern = -1; ByteMatrix matrix; }; } // QRCode } // ZXing zxing-cpp-1.0.8+ds2/core/src/qrcode/QREncoder.cpp000066400000000000000000000461701361167020700214600ustar00rootroot00000000000000/* * Copyright 2016 Huy Cuong Nguyen * Copyright 2016 ZXing authors * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #include "QREncoder.h" #include "QRMaskUtil.h" #include "QRMatrixUtil.h" #include "QRErrorCorrectionLevel.h" #include "QREncodeResult.h" #include "GenericGF.h" #include "ReedSolomonEncoder.h" #include "BitArray.h" #include "CharacterSet.h" #include "CharacterSetECI.h" #include "TextEncoder.h" #include "ZXStrConvWorkaround.h" #include "ZXTestSupport.h" #include namespace ZXing { namespace QRCode { static const CharacterSet DEFAULT_BYTE_MODE_ENCODING = CharacterSet::ISO8859_1; // The original table is defined in the table 5 of JISX0510:2004 (p.19). static const std::array ALPHANUMERIC_TABLE = { -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, // 0x00-0x0f -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, // 0x10-0x1f 36, -1, -1, -1, 37, 38, -1, -1, -1, -1, 39, 40, -1, 41, 42, 43, // 0x20-0x2f 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 44, -1, -1, -1, -1, -1, // 0x30-0x3f -1, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, // 0x40-0x4f 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, -1, -1, -1, -1, -1, // 0x50-0x5f }; // The mask penalty calculation is complicated. See Table 21 of JISX0510:2004 (p.45) for details. // Basically it applies four rules and summate all penalties. static int CalculateMaskPenalty(const ByteMatrix& matrix) { return MaskUtil::ApplyMaskPenaltyRule1(matrix) + MaskUtil::ApplyMaskPenaltyRule2(matrix) + MaskUtil::ApplyMaskPenaltyRule3(matrix) + MaskUtil::ApplyMaskPenaltyRule4(matrix); } static bool IsOnlyDoubleByteKanji(const std::wstring& content) { std::string bytes = TextEncoder::FromUnicode(content, CharacterSet::Shift_JIS); size_t length = bytes.length(); if (length % 2 != 0) { return false; } for (size_t i = 0; i < length; i += 2) { int byte1 = bytes[i] & 0xff; if ((byte1 < 0x81 || byte1 > 0x9F) && (byte1 < 0xE0 || byte1 > 0xEB)) { return false; } } return true; } /** * @return the code point of the table used in alphanumeric mode or * -1 if there is no corresponding code in the table. */ ZXING_EXPORT_TEST_ONLY int GetAlphanumericCode(int code) { if (code < (int)ALPHANUMERIC_TABLE.size()) { return ALPHANUMERIC_TABLE[code]; } return -1; } /** * Choose the best mode by examining the content. Note that 'encoding' is used as a hint; * if it is Shift_JIS, and the input is only double-byte Kanji, then we return {@link Mode#KANJI}. */ ZXING_EXPORT_TEST_ONLY CodecMode::Mode ChooseMode(const std::wstring& content, CharacterSet encoding) { if (encoding == CharacterSet::Shift_JIS && IsOnlyDoubleByteKanji(content)) { // Choose Kanji mode if all input are double-byte characters return CodecMode::KANJI; } bool hasNumeric = false; bool hasAlphanumeric = false; for (wchar_t c : content) { if (c >= '0' && c <= '9') { hasNumeric = true; } else if (GetAlphanumericCode(c) != -1) { hasAlphanumeric = true; } else { return CodecMode::BYTE; } } if (hasAlphanumeric) { return CodecMode::ALPHANUMERIC; } if (hasNumeric) { return CodecMode::NUMERIC; } return CodecMode::BYTE; } static void AppendECI(CharacterSet eci, BitArray& bits) { bits.appendBits(CodecMode::ECI, 4); // This is correct for values up to 127, which is all we need now. bits.appendBits(CharacterSetECI::ValueForCharset(eci), 8); } /** * Append mode info. On success, store the result in "bits". */ ZXING_EXPORT_TEST_ONLY void AppendModeInfo(CodecMode::Mode mode, BitArray& bits) { bits.appendBits(mode, 4); } /** * Append length info. On success, store the result in "bits". */ ZXING_EXPORT_TEST_ONLY void AppendLengthInfo(int numLetters, const Version& version, CodecMode::Mode mode, BitArray& bits) { int numBits = CodecMode::CharacterCountBits(mode, version); if (numLetters >= (1 << numBits)) { return throw std::invalid_argument(std::to_string(numLetters) + " is bigger than " + std::to_string((1 << numBits) - 1)); } bits.appendBits(numLetters, numBits); } ZXING_EXPORT_TEST_ONLY void AppendNumericBytes(const std::wstring& content, BitArray& bits) { size_t length = content.length(); size_t i = 0; while (i < length) { int num1 = content[i] - '0'; if (i + 2 < length) { // Encode three numeric letters in ten bits. int num2 = content[i + 1] - '0'; int num3 = content[i + 2] - '0'; bits.appendBits(num1 * 100 + num2 * 10 + num3, 10); i += 3; } else if (i + 1 < length) { // Encode two numeric letters in seven bits. int num2 = content[i + 1] - '0'; bits.appendBits(num1 * 10 + num2, 7); i += 2; } else { // Encode one numeric letter in four bits. bits.appendBits(num1, 4); i++; } } } ZXING_EXPORT_TEST_ONLY void AppendAlphanumericBytes(const std::wstring& content, BitArray& bits) { size_t length = content.length(); size_t i = 0; while (i < length) { int code1 = GetAlphanumericCode(content[i]); if (code1 == -1) { throw std::invalid_argument("Unexpected contents"); } if (i + 1 < length) { int code2 = GetAlphanumericCode(content[i + 1]); if (code2 == -1) { throw std::invalid_argument("Unexpected contents"); } // Encode two alphanumeric letters in 11 bits. bits.appendBits(code1 * 45 + code2, 11); i += 2; } else { // Encode one alphanumeric letter in six bits. bits.appendBits(code1, 6); i++; } } } ZXING_EXPORT_TEST_ONLY void Append8BitBytes(const std::wstring& content, CharacterSet encoding, BitArray& bits) { for (char b : TextEncoder::FromUnicode(content, encoding)) { bits.appendBits(b, 8); } } ZXING_EXPORT_TEST_ONLY void AppendKanjiBytes(const std::wstring& content, BitArray& bits) { std::string bytes = TextEncoder::FromUnicode(content, CharacterSet::Shift_JIS); int length = (int)bytes.size(); if (length % 2 != 0) { throw std::invalid_argument("Kanji byte size not even"); } --length; for (int i = 0; i < length; i += 2) { int byte1 = bytes[i] & 0xff; int byte2 = bytes[i + 1] & 0xff; int code = (byte1 << 8) | byte2; int subtracted = -1; if (code >= 0x8140 && code <= 0x9ffc) { subtracted = code - 0x8140; } else if (code >= 0xe040 && code <= 0xebbf) { subtracted = code - 0xc140; } if (subtracted == -1) { throw std::invalid_argument("Invalid byte sequence"); } int encoded = ((subtracted >> 8) * 0xc0) + (subtracted & 0xff); bits.appendBits(encoded, 13); } } /** * Append "bytes" in "mode" mode (encoding) into "bits". On success, store the result in "bits". */ ZXING_EXPORT_TEST_ONLY void AppendBytes(const std::wstring& content, CodecMode::Mode mode, CharacterSet encoding, BitArray& bits) { switch (mode) { case CodecMode::NUMERIC: AppendNumericBytes(content, bits); break; case CodecMode::ALPHANUMERIC: AppendAlphanumericBytes(content, bits); break; case CodecMode::BYTE: Append8BitBytes(content, encoding, bits); break; case CodecMode::KANJI: AppendKanjiBytes(content, bits); break; default: throw std::invalid_argument("Invalid mode: " + std::to_string(mode)); } } /** * @return true if the number of input bits will fit in a code with the specified version and * error correction level. */ static bool WillFit(int numInputBits, const Version& version, ErrorCorrectionLevel ecLevel) { // In the following comments, we use numbers of Version 7-H. // numBytes = 196 int numBytes = version.totalCodewords(); // getNumECBytes = 130 auto ecBlocks = version.ecBlocksForLevel(ecLevel); int numEcBytes = ecBlocks.totalCodewords(); // getNumDataBytes = 196 - 130 = 66 int numDataBytes = numBytes - numEcBytes; int totalInputBytes = (numInputBits + 7) / 8; return numDataBytes >= totalInputBytes; } static const Version& ChooseVersion(int numInputBits, ErrorCorrectionLevel ecLevel) { for (int versionNum = 1; versionNum <= 40; versionNum++) { const Version* version = Version::VersionForNumber(versionNum); if (WillFit(numInputBits, *version, ecLevel)) { return *version; } } throw std::invalid_argument("Data too big"); } /** * Terminate bits as described in 8.4.8 and 8.4.9 of JISX0510:2004 (p.24). */ ZXING_EXPORT_TEST_ONLY void TerminateBits(int numDataBytes, BitArray& bits) { int capacity = numDataBytes * 8; if (bits.size() > capacity) { throw std::invalid_argument("data bits cannot fit in the QR Code" + std::to_string(bits.size()) + " > " + std::to_string(capacity)); } for (int i = 0; i < 4 && bits.size() < capacity; ++i) { bits.appendBit(false); } // Append termination bits. See 8.4.8 of JISX0510:2004 (p.24) for details. // If the last byte isn't 8-bit aligned, we'll add padding bits. int numBitsInLastByte = bits.size() & 0x07; if (numBitsInLastByte > 0) { for (int i = numBitsInLastByte; i < 8; i++) { bits.appendBit(false); } } // If we have more space, we'll fill the space with padding patterns defined in 8.4.9 (p.24). int numPaddingBytes = numDataBytes - bits.sizeInBytes(); for (int i = 0; i < numPaddingBytes; ++i) { bits.appendBits((i & 0x01) == 0 ? 0xEC : 0x11, 8); } if (bits.size() != capacity) { throw std::invalid_argument("Bits size does not equal capacity"); } } struct BlockPair { ByteArray dataBytes; ByteArray ecBytes; }; /** * Get number of data bytes and number of error correction bytes for block id "blockID". Store * the result in "numDataBytesInBlock", and "numECBytesInBlock". See table 12 in 8.5.1 of * JISX0510:2004 (p.30) */ ZXING_EXPORT_TEST_ONLY void GetNumDataBytesAndNumECBytesForBlockID(int numTotalBytes, int numDataBytes, int numRSBlocks, int blockID, int& numDataBytesInBlock, int& numECBytesInBlock) { if (blockID >= numRSBlocks) { throw std::invalid_argument("Block ID too large"); } // numRsBlocksInGroup2 = 196 % 5 = 1 int numRsBlocksInGroup2 = numTotalBytes % numRSBlocks; // numRsBlocksInGroup1 = 5 - 1 = 4 int numRsBlocksInGroup1 = numRSBlocks - numRsBlocksInGroup2; // numTotalBytesInGroup1 = 196 / 5 = 39 int numTotalBytesInGroup1 = numTotalBytes / numRSBlocks; // numTotalBytesInGroup2 = 39 + 1 = 40 int numTotalBytesInGroup2 = numTotalBytesInGroup1 + 1; // numDataBytesInGroup1 = 66 / 5 = 13 int numDataBytesInGroup1 = numDataBytes / numRSBlocks; // numDataBytesInGroup2 = 13 + 1 = 14 int numDataBytesInGroup2 = numDataBytesInGroup1 + 1; // numEcBytesInGroup1 = 39 - 13 = 26 int numEcBytesInGroup1 = numTotalBytesInGroup1 - numDataBytesInGroup1; // numEcBytesInGroup2 = 40 - 14 = 26 int numEcBytesInGroup2 = numTotalBytesInGroup2 - numDataBytesInGroup2; // Sanity checks. // 26 = 26 if (numEcBytesInGroup1 != numEcBytesInGroup2) { throw std::invalid_argument("EC bytes mismatch"); } // 5 = 4 + 1. if (numRSBlocks != numRsBlocksInGroup1 + numRsBlocksInGroup2) { throw std::invalid_argument("RS blocks mismatch"); } // 196 = (13 + 26) * 4 + (14 + 26) * 1 if (numTotalBytes != ((numDataBytesInGroup1 + numEcBytesInGroup1) * numRsBlocksInGroup1) + ((numDataBytesInGroup2 + numEcBytesInGroup2) * numRsBlocksInGroup2)) { throw std::invalid_argument("Total bytes mismatch"); } if (blockID < numRsBlocksInGroup1) { numDataBytesInBlock = numDataBytesInGroup1; numECBytesInBlock = numEcBytesInGroup1; } else { numDataBytesInBlock = numDataBytesInGroup2; numECBytesInBlock = numEcBytesInGroup2; } } ZXING_EXPORT_TEST_ONLY void GenerateECBytes(const ByteArray& dataBytes, int numEcBytesInBlock, ByteArray& ecBytes) { size_t numDataBytes = dataBytes.size(); std::vector toEncode(numDataBytes + numEcBytesInBlock, 0); std::copy(dataBytes.begin(), dataBytes.end(), toEncode.begin()); ReedSolomonEncoder(GenericGF::QRCodeField256()).encode(toEncode, numEcBytesInBlock); ecBytes.resize(numEcBytesInBlock); for (int i = 0; i < numEcBytesInBlock; i++) { ecBytes[i] = static_cast(toEncode[numDataBytes + i]); } } /** * Interleave "bits" with corresponding error correction bytes. On success, store the result in * "result". The interleave rule is complicated. See 8.6 of JISX0510:2004 (p.37) for details. */ ZXING_EXPORT_TEST_ONLY BitArray InterleaveWithECBytes(const BitArray& bits, int numTotalBytes, int numDataBytes, int numRSBlocks) { // "bits" must have "getNumDataBytes" bytes of data. if (bits.sizeInBytes() != numDataBytes) { throw std::invalid_argument("Number of bits and data bytes does not match"); } // Step 1. Divide data bytes into blocks and generate error correction bytes for them. We'll // store the divided data bytes blocks and error correction bytes blocks into "blocks". int dataBytesOffset = 0; int maxNumDataBytes = 0; int maxNumEcBytes = 0; // Since, we know the number of reedsolmon blocks, we can initialize the vector with the number. std::vector blocks(numRSBlocks); for (int i = 0; i < numRSBlocks; ++i) { int numDataBytesInBlock = 0; int numEcBytesInBlock = 0; GetNumDataBytesAndNumECBytesForBlockID(numTotalBytes, numDataBytes, numRSBlocks, i, numDataBytesInBlock, numEcBytesInBlock); int size = numDataBytesInBlock; blocks[i].dataBytes.resize(size); bits.toBytes(8 * dataBytesOffset, blocks[i].dataBytes.data(), size); GenerateECBytes(blocks[i].dataBytes, numEcBytesInBlock, blocks[i].ecBytes); maxNumDataBytes = std::max(maxNumDataBytes, size); maxNumEcBytes = std::max(maxNumEcBytes, (int)blocks[i].ecBytes.size()); dataBytesOffset += numDataBytesInBlock; } if (numDataBytes != dataBytesOffset) { throw std::invalid_argument("Data bytes does not match offset"); } BitArray output; // First, place data blocks. for (int i = 0; i < maxNumDataBytes; ++i) { for (auto& block : blocks) { if (i < (int)block.dataBytes.size()) { output.appendBits(block.dataBytes[i], 8); } } } // Then, place error correction blocks. for (int i = 0; i < maxNumEcBytes; ++i) { for (auto& block : blocks) { if (i < (int)block.ecBytes.size()) { output.appendBits(block.ecBytes[i], 8); } } } if (numTotalBytes != output.sizeInBytes()) { // Should be same. throw std::invalid_argument("Interleaving error: " + std::to_string(numTotalBytes) + " and " + std::to_string(output.sizeInBytes()) + " differ."); } return output; } static int ChooseMaskPattern(const BitArray& bits, ErrorCorrectionLevel ecLevel, const Version& version, ByteMatrix& matrix) { int minPenalty = std::numeric_limits::max(); // Lower penalty is better. int bestMaskPattern = -1; // We try all mask patterns to choose the best one. for (int maskPattern = 0; maskPattern < MatrixUtil::NUM_MASK_PATTERNS; maskPattern++) { MatrixUtil::BuildMatrix(bits, ecLevel, version, maskPattern, matrix); int penalty = CalculateMaskPenalty(matrix); if (penalty < minPenalty) { minPenalty = penalty; bestMaskPattern = maskPattern; } } return bestMaskPattern; } static int CalculateBitsNeeded(CodecMode::Mode mode, const BitArray& headerBits, const BitArray& dataBits, const Version& version) { return headerBits.size() + CodecMode::CharacterCountBits(mode, version) + dataBits.size(); } /** * Decides the smallest version of QR code that will contain all of the provided data. * @throws WriterException if the data cannot fit in any version */ static const Version& RecommendVersion(ErrorCorrectionLevel ecLevel, CodecMode::Mode mode, const BitArray& headerBits, const BitArray& dataBits) { // Hard part: need to know version to know how many bits length takes. But need to know how many // bits it takes to know version. First we take a guess at version by assuming version will be // the minimum, 1: int provisionalBitsNeeded = CalculateBitsNeeded(mode, headerBits, dataBits, *Version::VersionForNumber(1)); const Version& provisionalVersion = ChooseVersion(provisionalBitsNeeded, ecLevel); // Use that guess to calculate the right version. I am still not sure this works in 100% of cases. int bitsNeeded = CalculateBitsNeeded(mode, headerBits, dataBits, provisionalVersion); return ChooseVersion(bitsNeeded, ecLevel); } EncodeResult Encoder::Encode(const std::wstring& content, ErrorCorrectionLevel ecLevel, CharacterSet charset, int versionNumber, bool useGs1Format, int maskPattern) { bool charsetWasUnknown = charset == CharacterSet::Unknown; if (charsetWasUnknown) { charset = DEFAULT_BYTE_MODE_ENCODING; } // Pick an encoding mode appropriate for the content. Note that this will not attempt to use // multiple modes / segments even if that were more efficient. Twould be nice. CodecMode::Mode mode = ChooseMode(content, charset); // This will store the header information, like mode and // length, as well as "header" segments like an ECI segment. BitArray headerBits; // Append ECI segment if applicable if (mode == CodecMode::BYTE && !charsetWasUnknown) { AppendECI(charset, headerBits); } // Append the FNC1 mode header for GS1 formatted data if applicable if (useGs1Format) { // GS1 formatted codes are prefixed with a FNC1 in first position mode header AppendModeInfo(CodecMode::FNC1_FIRST_POSITION, headerBits); } // (With ECI in place,) Write the mode marker AppendModeInfo(mode, headerBits); // Collect data within the main segment, separately, to count its size if needed. Don't add it to // main payload yet. BitArray dataBits; AppendBytes(content, mode, charset, dataBits); const Version* version; if (versionNumber > 0) { version = Version::VersionForNumber(versionNumber); if (version != nullptr) { int bitsNeeded = CalculateBitsNeeded(mode, headerBits, dataBits, *version); if (!WillFit(bitsNeeded, *version, ecLevel)) { throw std::invalid_argument("Data too big for requested version"); } } else { version = &RecommendVersion(ecLevel, mode, headerBits, dataBits); } } else { version = &RecommendVersion(ecLevel, mode, headerBits, dataBits); } BitArray headerAndDataBits; headerAndDataBits.appendBitArray(headerBits); // Find "length" of main segment and write it int numLetters = mode == CodecMode::BYTE ? dataBits.sizeInBytes() : static_cast(content.length()); AppendLengthInfo(numLetters, *version, mode, headerAndDataBits); // Put data together into the overall payload headerAndDataBits.appendBitArray(dataBits); auto& ecBlocks = version->ecBlocksForLevel(ecLevel); int numDataBytes = version->totalCodewords() - ecBlocks.totalCodewords(); // Terminate the bits properly. TerminateBits(numDataBytes, headerAndDataBits); // Interleave data bits with error correction code. BitArray finalBits = InterleaveWithECBytes(headerAndDataBits, version->totalCodewords(), numDataBytes, ecBlocks.numBlocks()); EncodeResult output; output.ecLevel = ecLevel; output.mode = mode; output.version = version; // Choose the mask pattern and set to "qrCode". int dimension = version->dimensionForVersion(); output.matrix = ByteMatrix(dimension, dimension); output.maskPattern = maskPattern != -1 ? maskPattern : ChooseMaskPattern(finalBits, ecLevel, *version, output.matrix); // Build the matrix and set it to "qrCode". MatrixUtil::BuildMatrix(finalBits, ecLevel, *version, output.maskPattern, output.matrix); return output; } } // QRCode } // ZXing zxing-cpp-1.0.8+ds2/core/src/qrcode/QREncoder.h000066400000000000000000000026661361167020700211270ustar00rootroot00000000000000#pragma once /* * Copyright 2016 Huy Cuong Nguyen * Copyright 2016 ZXing authors * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #include namespace ZXing { enum class CharacterSet; namespace QRCode { enum class ErrorCorrectionLevel; class EncodeResult; /** * @author satorux@google.com (Satoru Takabayashi) - creator * @author dswitkin@google.com (Daniel Switkin) - ported from C++ */ class Encoder { public: /** * @param content text to encode * @param ecLevel error correction level to use * @param maskPattern Mask patern to use or -1 for automatically chosen pattern * @return {@link QRCode} representing the encoded QR code * @throws WriterException if encoding can't succeed, because of for example invalid content * or configuration */ static EncodeResult Encode(const std::wstring& content, ErrorCorrectionLevel ecLevel, CharacterSet encoding, int versionNumber, bool useGs1Format, int maskPattern); }; } // QRCode } // ZXing zxing-cpp-1.0.8+ds2/core/src/qrcode/QRErrorCorrectionLevel.cpp000066400000000000000000000032461361167020700242070ustar00rootroot00000000000000/* * Copyright 2016 Nu-book Inc. * Copyright 2016 ZXing authors * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #include "QRErrorCorrectionLevel.h" #include namespace ZXing { namespace QRCode { const wchar_t* ToString(ErrorCorrectionLevel l) { assert(l != ErrorCorrectionLevel::Invalid); static const wchar_t* const LEVEL_STR[] = { L"L", L"M", L"Q", L"H", nullptr }; return LEVEL_STR[static_cast(l)]; } ErrorCorrectionLevel ECLevelFromString(const char* str) { switch (str[0]) { case 'L': return ErrorCorrectionLevel::Low; case 'M': return ErrorCorrectionLevel::Medium; case 'Q': return ErrorCorrectionLevel::Quality; case 'H': return ErrorCorrectionLevel::High; default: return ErrorCorrectionLevel::Invalid; } } ErrorCorrectionLevel ECLevelFromBits(int bits) { static const ErrorCorrectionLevel LEVEL_FOR_BITS[] = { ErrorCorrectionLevel::Medium, ErrorCorrectionLevel::Low, ErrorCorrectionLevel::High, ErrorCorrectionLevel::Quality }; return LEVEL_FOR_BITS[bits & 0x3]; } int BitsFromECLevel(ErrorCorrectionLevel l) { assert(l != ErrorCorrectionLevel::Invalid); static const int BITS[] = { 1, 0, 3, 2, -1 }; return BITS[(int)l]; } } // QRCode } // ZXing zxing-cpp-1.0.8+ds2/core/src/qrcode/QRErrorCorrectionLevel.h000066400000000000000000000023551361167020700236540ustar00rootroot00000000000000#pragma once /* * Copyright 2016 Nu-book Inc. * Copyright 2016 ZXing authors * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ namespace ZXing { namespace QRCode { /** *

See ISO 18004:2006, 6.5.1. This enum encapsulates the four error correction levels * defined by the QR code standard.

* * @author Sean Owen */ enum class ErrorCorrectionLevel { Low, // L = ~7 % correction Medium, // M = ~15% correction Quality, // Q = ~25% correction High, // H = ~30% correction Invalid, // denotes in invalid/unknown value }; const wchar_t* ToString(ErrorCorrectionLevel l); ErrorCorrectionLevel ECLevelFromString(const char* str); ErrorCorrectionLevel ECLevelFromBits(int bits); int BitsFromECLevel(ErrorCorrectionLevel l); } // QRCode } // ZXing zxing-cpp-1.0.8+ds2/core/src/qrcode/QRFinderPattern.cpp000066400000000000000000000037351361167020700226460ustar00rootroot00000000000000/* * Copyright 2016 Nu-book Inc. * Copyright 2016 ZXing authors * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #include "QRFinderPattern.h" #include namespace ZXing { namespace QRCode { FinderPattern::FinderPattern(float posX, float posY, float estimatedModuleSize, int count) : ResultPoint(posX, posY), _estimatedModuleSize(estimatedModuleSize), _count(count) { } /** *

Determines if this finder pattern "about equals" a finder pattern at the stated * position and size -- meaning, it is at nearly the same center with nearly the same size.

*/ bool FinderPattern::aboutEquals(float moduleSize, float i, float j) const { if (std::abs(i - y()) <= moduleSize && std::abs(j - x()) <= moduleSize) { float moduleSizeDiff = std::abs(moduleSize - _estimatedModuleSize); return moduleSizeDiff <= 1.0f || moduleSizeDiff <= _estimatedModuleSize; } return false; } /** * Combines this object's current estimate of a finder pattern position and module size * with a new estimate. It returns a new {@code FinderPattern} containing a weighted average * based on count. */ FinderPattern FinderPattern::combineEstimate(float i, float j, float newModuleSize) const { int combinedCount = _count + 1; float combinedX = (_count * x() + j) / combinedCount; float combinedY = (_count * y() + i) / combinedCount; float combinedModuleSize = (_count * _estimatedModuleSize + newModuleSize) / combinedCount; return {combinedX, combinedY, combinedModuleSize, combinedCount}; } } // QRCode } // ZXing zxing-cpp-1.0.8+ds2/core/src/qrcode/QRFinderPattern.h000066400000000000000000000035301361167020700223040ustar00rootroot00000000000000#pragma once /* * Copyright 2016 Nu-book Inc. * Copyright 2016 ZXing authors * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #include "ResultPoint.h" namespace ZXing { namespace QRCode { /** *

Encapsulates a finder pattern, which are the three square patterns found in * the corners of QR Codes. It also encapsulates a count of similar finder patterns, * as a convenience to the finder's bookkeeping.

* * @author Sean Owen */ class FinderPattern : public ResultPoint { float _estimatedModuleSize = 0; int _count = 0; public: FinderPattern() = default; FinderPattern(float posX, float posY, float estimatedModuleSize, int count = 1); float estimatedModuleSize() const { return _estimatedModuleSize; } int count() const { return _count; } bool isValid() const { return _count > 0; } /** *

Determines if this finder pattern "about equals" a finder pattern at the stated * position and size -- meaning, it is at nearly the same center with nearly the same size.

*/ bool aboutEquals(float moduleSize, float i, float j) const; /** * Combines this object's current estimate of a finder pattern position and module size * with a new estimate. It returns a new {@code FinderPattern} containing a weighted average * based on count. */ FinderPattern combineEstimate(float i, float j, float newModuleSize) const; }; } // QRCode } // ZXing zxing-cpp-1.0.8+ds2/core/src/qrcode/QRFinderPatternFinder.cpp000066400000000000000000000531261361167020700237750ustar00rootroot00000000000000/* * Copyright 2016 Nu-book Inc. * Copyright 2016 ZXing authors * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #include "QRFinderPatternFinder.h" #include "QRFinderPatternInfo.h" #include "BitMatrix.h" #include "DecodeHints.h" #include "DecodeStatus.h" #include "ZXContainerAlgorithms.h" #include #include #include #include #include namespace ZXing { namespace QRCode { static const int CENTER_QUORUM = 2; static const int MIN_SKIP = 3; // 1 pixel/module times 3 modules/center static const int MAX_MODULES = 97; // support up to version 20 for mobile clients using StateCount = FinderPatternFinder::StateCount; /** * Given a count of black/white/black/white/black pixels just seen and an end position, * figures the location of the center of this run. */ static float CenterFromEnd(const StateCount& stateCount, int end) { return (float)(end - stateCount[4] - stateCount[3]) - stateCount[2] / 2.0f; } /** * @param stateCount count of black/white/black/white/black pixels just read * @return true iff the proportions of the counts is close enough to the 1/1/3/1/1 ratios * used by finder patterns to be considered a match */ static bool FoundPatternDiagonal(const StateCount& stateCount) { int totalModuleSize = 0; for (int i = 0; i < 5; i++) { int count = stateCount[i]; if (count == 0) { return false; } totalModuleSize += count; } if (totalModuleSize < 7) { return false; } float moduleSize = totalModuleSize / 7.0f; float maxVariance = moduleSize / 1.333f; // Allow less than 75% variance from 1-1-3-1-1 proportions return std::abs(moduleSize - stateCount[0]) < maxVariance && std::abs(moduleSize - stateCount[1]) < maxVariance && std::abs(3.0f * moduleSize - stateCount[2]) < 3 * maxVariance && std::abs(moduleSize - stateCount[3]) < maxVariance && std::abs(moduleSize - stateCount[4]) < maxVariance; } /** * After a vertical and horizontal scan finds a potential finder pattern, this method * "cross-cross-cross-checks" by scanning down diagonally through the center of the possible * finder pattern to see if the same proportion is detected. * * @param centerI row where a finder pattern was detected * @param centerJ center of the section that appears to cross a finder pattern * @param maxCount maximum reasonable number of modules that should be * observed in any reading state, based on the results of the horizontal scan * @param originalStateCountTotal The original state count total. * @return true if proportions are withing expected limits */ static bool CrossCheckDiagonal(const BitMatrix& image, int centerI, int centerJ) { StateCount stateCount = {}; // Start counting up, left from center finding black center mass int i = 0; while (centerI >= i && centerJ >= i && image.get(centerJ - i, centerI - i)) { stateCount[2]++; i++; } if (stateCount[2] == 0) { return false; } // Continue up, left finding white space while (centerI >= i && centerJ >= i && !image.get(centerJ - i, centerI - i)) { stateCount[1]++; i++; } if (stateCount[1] == 0) { return false; } // Continue up, left finding black border while (centerI >= i && centerJ >= i && image.get(centerJ - i, centerI - i)) { stateCount[0]++; i++; } if (stateCount[0] == 0) { return false; } int maxI = image.height(); int maxJ = image.width(); // Now also count down, right from center i = 1; while (centerI + i < maxI && centerJ + i < maxJ && image.get(centerJ + i, centerI + i)) { stateCount[2]++; i++; } while (centerI + i < maxI && centerJ + i < maxJ && !image.get(centerJ + i, centerI + i)) { stateCount[3]++; i++; } if (stateCount[3] == 0) { return false; } while (centerI + i < maxI && centerJ + i < maxJ && image.get(centerJ + i, centerI + i)) { stateCount[4]++; i++; } if (stateCount[4] == 0) { return false; } return FoundPatternDiagonal(stateCount); } /** *

After a horizontal scan finds a potential finder pattern, this method * "cross-checks" by scanning down vertically through the center of the possible * finder pattern to see if the same proportion is detected.

* * @param startI row where a finder pattern was detected * @param centerJ center of the section that appears to cross a finder pattern * @param maxCount maximum reasonable number of modules that should be * observed in any reading state, based on the results of the horizontal scan * @return vertical center of finder pattern, or {@link Float#NaN} if not found */ static float CrossCheckVertical(const BitMatrix& image, int startI, int centerJ, int maxCount, int originalStateCountTotal) { StateCount stateCount = {}; int maxI = image.height(); // Start counting up from center int i = startI; while (i >= 0 && image.get(centerJ, i)) { stateCount[2]++; i--; } if (i < 0) { return std::numeric_limits::quiet_NaN(); } while (i >= 0 && !image.get(centerJ, i) && stateCount[1] <= maxCount) { stateCount[1]++; i--; } // If already too many modules in this state or ran off the edge: if (i < 0 || stateCount[1] > maxCount) { return std::numeric_limits::quiet_NaN(); } while (i >= 0 && image.get(centerJ, i) && stateCount[0] <= maxCount) { stateCount[0]++; i--; } if (stateCount[0] > maxCount) { return std::numeric_limits::quiet_NaN(); } // Now also count down from center i = startI + 1; while (i < maxI && image.get(centerJ, i)) { stateCount[2]++; i++; } if (i == maxI) { return std::numeric_limits::quiet_NaN(); } while (i < maxI && !image.get(centerJ, i) && stateCount[3] < maxCount) { stateCount[3]++; i++; } if (i == maxI || stateCount[3] >= maxCount) { return std::numeric_limits::quiet_NaN(); } while (i < maxI && image.get(centerJ, i) && stateCount[4] < maxCount) { stateCount[4]++; i++; } if (stateCount[4] >= maxCount) { return std::numeric_limits::quiet_NaN(); } // If we found a finder-pattern-like section, but its size is more than 40% different than // the original, assume it's a false positive int stateCountTotal = Accumulate(stateCount, 0); if (5 * std::abs(stateCountTotal - originalStateCountTotal) >= 2 * originalStateCountTotal) { return std::numeric_limits::quiet_NaN(); } return FinderPatternFinder::FoundPatternCross(stateCount) ? CenterFromEnd(stateCount, i) : std::numeric_limits::quiet_NaN(); } /** *

Like {@link #crossCheckVertical(int, int, int, int)}, and in fact is basically identical, * except it reads horizontally instead of vertically. This is used to cross-cross * check a vertical cross check and locate the real center of the alignment pattern.

*/ static float CrossCheckHorizontal(const BitMatrix& image, int startJ, int centerI, int maxCount, int originalStateCountTotal) { StateCount stateCount = {}; int maxJ = image.width(); int j = startJ; while (j >= 0 && image.get(j, centerI)) { stateCount[2]++; j--; } if (j < 0) { return std::numeric_limits::quiet_NaN(); } while (j >= 0 && !image.get(j, centerI) && stateCount[1] <= maxCount) { stateCount[1]++; j--; } if (j < 0 || stateCount[1] > maxCount) { return std::numeric_limits::quiet_NaN(); } while (j >= 0 && image.get(j, centerI) && stateCount[0] <= maxCount) { stateCount[0]++; j--; } if (stateCount[0] > maxCount) { return std::numeric_limits::quiet_NaN(); } j = startJ + 1; while (j < maxJ && image.get(j, centerI)) { stateCount[2]++; j++; } if (j == maxJ) { return std::numeric_limits::quiet_NaN(); } while (j < maxJ && !image.get(j, centerI) && stateCount[3] < maxCount) { stateCount[3]++; j++; } if (j == maxJ || stateCount[3] >= maxCount) { return std::numeric_limits::quiet_NaN(); } while (j < maxJ && image.get(j, centerI) && stateCount[4] < maxCount) { stateCount[4]++; j++; } if (stateCount[4] >= maxCount) { return std::numeric_limits::quiet_NaN(); } // If we found a finder-pattern-like section, but its size is significantly different than // the original, assume it's a false positive int stateCountTotal = Accumulate(stateCount, 0); if (5 * std::abs(stateCountTotal - originalStateCountTotal) >= originalStateCountTotal) { return std::numeric_limits::quiet_NaN(); } return FinderPatternFinder::FoundPatternCross(stateCount) ? CenterFromEnd(stateCount, j) : std::numeric_limits::quiet_NaN(); } /** * @return number of rows we could safely skip during scanning, based on the first * two finder patterns that have been located. In some cases their position will * allow us to infer that the third pattern must lie below a certain point farther * down in the image. */ static int FindRowSkip(const std::vector& possibleCenters, bool& hasSkipped) { if (possibleCenters.size() <= 1) { return 0; } const ResultPoint* firstConfirmedCenter = nullptr; for (const FinderPattern& center : possibleCenters) { if (center.count() >= CENTER_QUORUM) { if (firstConfirmedCenter == nullptr) { firstConfirmedCenter = ¢er; } else { // We have two confirmed centers // How far down can we skip before resuming looking for the next // pattern? In the worst case, only the difference between the // difference in the x / y coordinates of the two centers. // This is the case where you find top left last. hasSkipped = true; return static_cast(std::abs(firstConfirmedCenter->x() - center.x()) - std::abs(firstConfirmedCenter->y() - center.y())) / 2; } } } return 0; } /** * @return true iff we have found at least 3 finder patterns that have been detected * at least {@link #CENTER_QUORUM} times each, and, the estimated module size of the * candidates is "pretty similar" */ static bool HaveMultiplyConfirmedCenters(const std::vector& possibleCenters) { int confirmedCount = 0; float totalModuleSize = 0.0f; //int max = possibleCenters.size(); for (const FinderPattern& pattern : possibleCenters) { if (pattern.count() >= CENTER_QUORUM) { confirmedCount++; totalModuleSize += pattern.estimatedModuleSize(); } } if (confirmedCount < 3) { return false; } // OK, we have at least 3 confirmed centers, but, it's possible that one is a "false positive" // and that we need to keep looking. We detect this by asking if the estimated module sizes // vary too much. We arbitrarily say that when the total deviation from average exceeds // 5% of the total module size estimates, it's too much. float average = totalModuleSize / static_cast(possibleCenters.size()); float totalDeviation = 0.0f; for (const FinderPattern& pattern : possibleCenters) { totalDeviation += std::abs(pattern.estimatedModuleSize() - average); } return totalDeviation <= 0.05f * totalModuleSize; } /** *

Orders by furthest from average

*/ struct FurthestFromAverageComparator { float average; bool operator()(const FinderPattern& center1, const FinderPattern& center2) const { return std::abs(center1.estimatedModuleSize() - average) > std::abs(center2.estimatedModuleSize() - average); } }; /** *

Orders by {@link FinderPatternFinder#estimatedModuleSize()}, descending.

*/ struct EstimatedModuleComparator { bool operator()(const FinderPattern& center1, const FinderPattern& center2) const { return center1.estimatedModuleSize() < center2.estimatedModuleSize(); } }; /** * @return the 3 best {@link FinderPattern}s from our list of candidates. The "best" are * those have similar module size and form a shape closer to a isosceles right triangle. * Return empty if 3 such finder patterns do not exist */ static std::vector SelectBestPatterns(std::vector possibleCenters) { std::vector bestPatterns; int nbPossibleCenters = static_cast(possibleCenters.size()); if (nbPossibleCenters < 3) { // Couldn't find enough finder patterns return bestPatterns; } std::sort(possibleCenters.begin(), possibleCenters.end(), EstimatedModuleComparator()); double distortion = std::numeric_limits::max(); std::array squares; for (int i = 0; i < nbPossibleCenters - 2; i++) { auto& fpi = possibleCenters[i]; float minModuleSize = fpi.estimatedModuleSize(); for (int j = i + 1; j < nbPossibleCenters - 1; j++) { auto& fpj = possibleCenters[j]; double squares0 = ResultPoint::SquaredDistance(fpi, fpj); for (int k = j + 1; k < nbPossibleCenters; k++) { auto& fpk = possibleCenters[k]; float maxModuleSize = fpk.estimatedModuleSize(); if (maxModuleSize > minModuleSize * 1.4f) { // module size is not similar continue; } squares[0] = squares0; squares[1] = ResultPoint::SquaredDistance(fpj, fpk); squares[2] = ResultPoint::SquaredDistance(fpi, fpk); std::sort(squares.begin(), squares.end()); // a^2 + b^2 = c^2 (Pythagorean theorem), and a = b (isosceles triangle). // Since any right triangle satisfies the formula c^2 - b^2 - a^2 = 0, // we need to check both two equal sides separately. // The value of |c^2 - 2 * b^2| + |c^2 - 2 * a^2| increases as dissimilarity // from isosceles right triangle. double d = std::abs(squares[2] - 2 * squares[1]) + std::abs(squares[2] - 2 * squares[0]); if (d < distortion) { distortion = d; bestPatterns.resize(3); bestPatterns[0] = fpi; bestPatterns[1] = fpj; bestPatterns[2] = fpk; } } } } return bestPatterns; } /** * Returns the z component of the cross product between vectors BC and BA. */ static float CrossProductZ(const ResultPoint& a, const ResultPoint& b, const ResultPoint& c) { return (c.x() - b.x())*(a.y() - b.y()) - (c.y() - b.y())*(a.x() - b.x()); } /** * Orders an array of three ResultPoints in an order [A,B,C] such that AB is less than AC * and BC is less than AC, and the angle between BC and BA is less than 180 degrees. * * @param patterns array of three {@code ResultPoint} to order */ static void OrderBestPatterns(std::vector& patterns) { assert(patterns.size() == 3); auto &p0 = patterns[0], &p1 = patterns[1], &p2 = patterns[2]; // Find distances between pattern centers float zeroOneDistance = ResultPoint::Distance(p0, p1); float oneTwoDistance = ResultPoint::Distance(p1, p2); float zeroTwoDistance = ResultPoint::Distance(p0, p2); // Assume one closest to other two is B; A and C will just be guesses at first if (oneTwoDistance >= zeroOneDistance && oneTwoDistance >= zeroTwoDistance) std::swap(p0, p1); else if (zeroTwoDistance >= oneTwoDistance && zeroTwoDistance >= zeroOneDistance) ; // do nothing, the order is correct else std::swap(p1, p2); // Use cross product to figure out whether A and C are correct or flipped. // This asks whether BC x BA has a positive z component, which is the arrangement // we want for A, B, C. If it's negative, then we've got it flipped around and // should swap A and C. if (CrossProductZ(p0, p1, p2) < 0.0f) { std::swap(p0, p2); } } FinderPatternInfo FinderPatternFinder::Find(const BitMatrix& image, bool tryHarder) { int maxI = image.height(); int maxJ = image.width(); // We are looking for black/white/black/white/black modules in // 1:1:3:1:1 ratio; this tracks the number of such modules seen so far // Let's assume that the maximum version QR Code we support takes up 1/4 the height of the // image, and then account for the center being 3 modules in size. This gives the smallest // number of pixels the center could be, so skip this often. When trying harder, look for all // QR versions regardless of how dense they are. int iSkip = (3 * maxI) / (4 * MAX_MODULES); if (iSkip < MIN_SKIP || tryHarder) { iSkip = MIN_SKIP; } bool hasSkipped = false; std::vector possibleCenters; bool done = false; for (int i = iSkip - 1; i < maxI && !done; i += iSkip) { // Get a row of black/white values StateCount stateCount = {}; size_t currentState = 0; for (int j = 0; j < maxJ; j++) { if (image.get(j, i)) { // Black pixel if ((currentState & 1) == 1) { // Counting white pixels currentState++; } stateCount[currentState]++; } else { // White pixel if ((currentState & 1) == 0) { // Counting black pixels if (currentState == 4) { // A winner? if (FoundPatternCross(stateCount)) { // Yes bool confirmed = HandlePossibleCenter(image, stateCount, i, j, possibleCenters); if (confirmed) { // Start examining every other line. Checking each line turned out to be too // expensive and didn't improve performance. iSkip = 2; if (hasSkipped) { done = HaveMultiplyConfirmedCenters(possibleCenters); } else { int rowSkip = FindRowSkip(possibleCenters, hasSkipped); if (rowSkip > stateCount[2]) { // Skip rows between row of lower confirmed center // and top of presumed third confirmed center // but back up a bit to get a full chance of detecting // it, entire width of center of finder pattern // Skip by rowSkip, but back off by stateCount[2] (size of last center // of pattern we saw) to be conservative, and also back off by iSkip which // is about to be re-added i += rowSkip - stateCount[2] - iSkip; j = maxJ - 1; } } } else { stateCount[0] = stateCount[2]; stateCount[1] = stateCount[3]; stateCount[2] = stateCount[4]; stateCount[3] = 1; stateCount[4] = 0; currentState = 3; continue; } // Clear state to start looking again currentState = 0; stateCount.fill(0); } else { // No, shift counts back by two stateCount[0] = stateCount[2]; stateCount[1] = stateCount[3]; stateCount[2] = stateCount[4]; stateCount[3] = 1; stateCount[4] = 0; currentState = 3; } } else { stateCount[++currentState]++; } } else { // Counting white pixels stateCount[currentState]++; } } } if (FinderPatternFinder::FoundPatternCross(stateCount)) { bool confirmed = FinderPatternFinder::HandlePossibleCenter(image, stateCount, i, maxJ, possibleCenters); if (confirmed) { iSkip = stateCount[0]; if (hasSkipped) { // Found a third one done = HaveMultiplyConfirmedCenters(possibleCenters); } } } } auto bestPatterns = SelectBestPatterns(possibleCenters); if (bestPatterns.empty()) return {}; OrderBestPatterns(bestPatterns); return { bestPatterns[0], bestPatterns[1], bestPatterns[2]}; } /** * @param stateCount count of black/white/black/white/black pixels just read * @return true iff the proportions of the counts is close enough to the 1/1/3/1/1 ratios * used by finder patterns to be considered a match */ bool FinderPatternFinder::FoundPatternCross(const StateCount& stateCount) { int totalModuleSize = Accumulate(stateCount, 0); if (totalModuleSize < 7) { return false; } float moduleSize = totalModuleSize / 7.0f; float maxVariance = moduleSize / 2.0f; // Allow less than 50% variance from 1-1-3-1-1 proportions return std::abs(moduleSize - stateCount[0]) < maxVariance && std::abs(moduleSize - stateCount[1]) < maxVariance && std::abs(3.0f * moduleSize - stateCount[2]) < 3 * maxVariance && std::abs(moduleSize - stateCount[3]) < maxVariance && std::abs(moduleSize - stateCount[4]) < maxVariance; } /** *

This is called when a horizontal scan finds a possible alignment pattern. It will * cross check with a vertical scan, and if successful, will, ah, cross-cross-check * with another horizontal scan. This is needed primarily to locate the real horizontal * center of the pattern in cases of extreme skew. * And then we cross-cross-cross check with another diagonal scan.

* *

If that succeeds the finder pattern location is added to a list that tracks * the number of times each location has been nearly-matched as a finder pattern. * Each additional find is more evidence that the location is in fact a finder * pattern center * * @param stateCount reading state module counts from horizontal scan * @param i row where finder pattern may be found * @param j end of possible finder pattern in row * @param pureBarcode true if in "pure barcode" mode * @return true if a finder pattern candidate was found this time */ bool FinderPatternFinder::HandlePossibleCenter(const BitMatrix& image, const StateCount& stateCount, int i, int j, std::vector& possibleCenters) { int stateCountTotal = Accumulate(stateCount, 0); float centerJ = CenterFromEnd(stateCount, j); float centerI = CrossCheckVertical(image, i, static_cast(centerJ), stateCount[2], stateCountTotal); if (std::isnan(centerI)) return false; // Re-cross check centerJ = CrossCheckHorizontal(image, static_cast(centerJ), static_cast(centerI), stateCount[2], stateCountTotal); if (std::isnan(centerJ) || !CrossCheckDiagonal(image, (int)centerI, (int)centerJ)) return false; float estimatedModuleSize = stateCountTotal / 7.0f; auto center = ZXing::FindIf(possibleCenters, [=](const FinderPattern& center) { return center.aboutEquals(estimatedModuleSize, centerI, centerJ); }); if (center != possibleCenters.end()) *center = center->combineEstimate(centerI, centerJ, estimatedModuleSize); else possibleCenters.emplace_back(centerJ, centerI, estimatedModuleSize); return true; } } // QRCode } // ZXing zxing-cpp-1.0.8+ds2/core/src/qrcode/QRFinderPatternFinder.h000066400000000000000000000050521361167020700234350ustar00rootroot00000000000000#pragma once /* * Copyright 2016 Nu-book Inc. * Copyright 2016 ZXing authors * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #include #include namespace ZXing { class BitMatrix; namespace QRCode { class FinderPattern; class FinderPatternInfo; /** *

This class attempts to find finder patterns in a QR Code. Finder patterns are the square * markers at three corners of a QR Code.

* *

This class is thread-safe but not reentrant. Each thread must allocate its own object. * * @author Sean Owen */ class FinderPatternFinder { public: using StateCount = std::array; static FinderPatternInfo Find(const BitMatrix& image, bool tryHarder); /** * @param stateCount count of black/white/black/white/black pixels just read * @return true iff the proportions of the counts is close enough to the 1/1/3/1/1 ratios * used by finder patterns to be considered a match */ static bool FoundPatternCross(const StateCount& stateCount); /** *

This is called when a horizontal scan finds a possible alignment pattern. It will * cross check with a vertical scan, and if successful, will, ah, cross-cross-check * with another horizontal scan. This is needed primarily to locate the real horizontal * center of the pattern in cases of extreme skew. * And then we cross-cross-cross check with another diagonal scan.

* *

If that succeeds the finder pattern location is added to a list that tracks * the number of times each location has been nearly-matched as a finder pattern. * Each additional find is more evidence that the location is in fact a finder * pattern center * * @param stateCount reading state module counts from horizontal scan * @param i row where finder pattern may be found * @param j end of possible finder pattern in row * @param pureBarcode true if in "pure barcode" mode * @return true if a finder pattern candidate was found this time */ static bool HandlePossibleCenter(const BitMatrix& image, const StateCount& stateCount, int i, int j, std::vector& possibleCenters); }; } // QRCode } // ZXing zxing-cpp-1.0.8+ds2/core/src/qrcode/QRFinderPatternInfo.h000066400000000000000000000021361361167020700231210ustar00rootroot00000000000000#pragma once /* * Copyright 2016 Nu-book Inc. * Copyright 2016 ZXing authors * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #include "QRFinderPattern.h" namespace ZXing { namespace QRCode { /** *

Encapsulates information about finder patterns in an image, including the location of * the three finder patterns, and their estimated module size.

* * @author Sean Owen */ class FinderPatternInfo { public: FinderPattern bottomLeft; FinderPattern topLeft; FinderPattern topRight; bool isValid() const { return bottomLeft.isValid() && topLeft.isValid() && topRight.isValid(); } }; } // QRCode } // ZXing zxing-cpp-1.0.8+ds2/core/src/qrcode/QRFormatInformation.cpp000066400000000000000000000070261361167020700235340ustar00rootroot00000000000000/* * Copyright 2016 Nu-book Inc. * Copyright 2016 ZXing authors * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #include "QRFormatInformation.h" #include "BitHacks.h" #include #include namespace ZXing { namespace QRCode { namespace { static const int FORMAT_INFO_MASK_QR = 0x5412; /** * See ISO 18004:2006, Annex C, Table C.1 */ static const std::array FORMAT_INFO_DECODE_LOOKUP[] = { 0x5412, 0x00, 0x5125, 0x01, 0x5E7C, 0x02, 0x5B4B, 0x03, 0x45F9, 0x04, 0x40CE, 0x05, 0x4F97, 0x06, 0x4AA0, 0x07, 0x77C4, 0x08, 0x72F3, 0x09, 0x7DAA, 0x0A, 0x789D, 0x0B, 0x662F, 0x0C, 0x6318, 0x0D, 0x6C41, 0x0E, 0x6976, 0x0F, 0x1689, 0x10, 0x13BE, 0x11, 0x1CE7, 0x12, 0x19D0, 0x13, 0x0762, 0x14, 0x0255, 0x15, 0x0D0C, 0x16, 0x083B, 0x17, 0x355F, 0x18, 0x3068, 0x19, 0x3F31, 0x1A, 0x3A06, 0x1B, 0x24B4, 0x1C, 0x2183, 0x1D, 0x2EDA, 0x1E, 0x2BED, 0x1F, }; } // anonymous FormatInformation::FormatInformation(int formatInfo) { // Bits 3,4 _errorCorrectionLevel = ECLevelFromBits((formatInfo >> 3) & 0x03); // Bottom 3 bits _dataMask = static_cast(formatInfo & 0x07); } /** * @param maskedFormatInfo1 format info indicator, with mask still applied * @param maskedFormatInfo2 second copy of same info; both are checked at the same time * to establish best match * @return information about the format it specifies, or {@code null} * if doesn't seem to match any known pattern */ FormatInformation FormatInformation::DecodeFormatInformation(int maskedFormatInfo1, int maskedFormatInfo2) { auto result = DoDecodeFormatInformation(maskedFormatInfo1, maskedFormatInfo2); if (!result.isValid()) // Should return null, but, some QR codes apparently // do not mask this info. Try again by actually masking the pattern // first result = DoDecodeFormatInformation(maskedFormatInfo1 ^ FORMAT_INFO_MASK_QR, maskedFormatInfo2 ^ FORMAT_INFO_MASK_QR); return result; } FormatInformation FormatInformation::DoDecodeFormatInformation(int maskedFormatInfo1, int maskedFormatInfo2) { // Find the int in FORMAT_INFO_DECODE_LOOKUP with fewest bits differing int bestDifference = std::numeric_limits::max(); int bestFormatInfo = 0; for (auto& decodeInfo : FORMAT_INFO_DECODE_LOOKUP) { int targetInfo = decodeInfo[0]; if (targetInfo == maskedFormatInfo1 || targetInfo == maskedFormatInfo2) { // Found an exact match return {decodeInfo[1]}; } int bitsDifference = BitHacks::CountBitsSet(maskedFormatInfo1 ^ targetInfo); if (bitsDifference < bestDifference) { bestFormatInfo = decodeInfo[1]; bestDifference = bitsDifference; } if (maskedFormatInfo1 != maskedFormatInfo2) { // also try the other option bitsDifference = BitHacks::CountBitsSet(maskedFormatInfo2 ^ targetInfo); if (bitsDifference < bestDifference) { bestFormatInfo = decodeInfo[1]; bestDifference = bitsDifference; } } } // Hamming distance of the 32 masked codes is 7, by construction, so <= 3 bits // differing means we found a match if (bestDifference <= 3) { return {bestFormatInfo}; } return {}; } } // QRCode } // ZXing zxing-cpp-1.0.8+ds2/core/src/qrcode/QRFormatInformation.h000066400000000000000000000033071361167020700231770ustar00rootroot00000000000000#pragma once /* * Copyright 2016 Nu-book Inc. * Copyright 2016 ZXing authors * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #include "QRErrorCorrectionLevel.h" #include namespace ZXing { namespace QRCode { /** *

Encapsulates a QR Code's format information, including the data mask used and * error correction level.

* * @author Sean Owen * @see DataMask * @see ErrorCorrectionLevel */ class FormatInformation { public: FormatInformation() = default; static FormatInformation DecodeFormatInformation(int maskedFormatInfo1, int maskedFormatInfo2); ErrorCorrectionLevel errorCorrectionLevel() const { return _errorCorrectionLevel; } uint8_t dataMask() const { return _dataMask; } bool isValid() const { return _errorCorrectionLevel != ErrorCorrectionLevel::Invalid; } bool operator==(const FormatInformation& other) const { return _dataMask == other._dataMask && _errorCorrectionLevel == other._errorCorrectionLevel; } private: ErrorCorrectionLevel _errorCorrectionLevel = ErrorCorrectionLevel::Invalid; uint8_t _dataMask = 0; FormatInformation(int formatInfo); static FormatInformation DoDecodeFormatInformation(int maskedFormatInfo1, int maskedFormatInfo2); }; } // QRCode } // ZXing zxing-cpp-1.0.8+ds2/core/src/qrcode/QRMaskUtil.cpp000066400000000000000000000117421361167020700216270ustar00rootroot00000000000000/* * Copyright 2016 Huy Cuong Nguyen * Copyright 2016 ZXing authors * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #include "QRMaskUtil.h" #include "ByteMatrix.h" #include #include #include #include namespace ZXing { namespace QRCode { // Penalty weights from section 6.8.2.1 static const int N1 = 3; static const int N2 = 3; static const int N3 = 40; static const int N4 = 10; /** * Helper function for applyMaskPenaltyRule1. We need this for doing this calculation in both * vertical and horizontal orders respectively. */ static int ApplyMaskPenaltyRule1Internal(const ByteMatrix& matrix, bool isHorizontal) { int penalty = 0; int width = matrix.width(); int height = matrix.height(); int iLimit = isHorizontal ? height : width; int jLimit = isHorizontal ? width : height; for (int i = 0; i < iLimit; i++) { int numSameBitCells = 0; int prevBit = -1; for (int j = 0; j < jLimit; j++) { int bit = isHorizontal ? matrix.get(j, i) : matrix.get(i, j); if (bit == prevBit) { numSameBitCells++; } else { if (numSameBitCells >= 5) { penalty += N1 + (numSameBitCells - 5); } numSameBitCells = 1; // Include the cell itself. prevBit = bit; } } if (numSameBitCells >= 5) { penalty += N1 + (numSameBitCells - 5); } } return penalty; } /** * Apply mask penalty rule 1 and return the penalty. Find repetitive cells with the same color and * give penalty to them. Example: 00000 or 11111. */ int MaskUtil::ApplyMaskPenaltyRule1(const ByteMatrix& matrix) { return ApplyMaskPenaltyRule1Internal(matrix, true) + ApplyMaskPenaltyRule1Internal(matrix, false); } /** * Apply mask penalty rule 2 and return the penalty. Find 2x2 blocks with the same color and give * penalty to them. This is actually equivalent to the spec's rule, which is to find MxN blocks and give a * penalty proportional to (M-1)x(N-1), because this is the number of 2x2 blocks inside such a block. */ int MaskUtil::ApplyMaskPenaltyRule2(const ByteMatrix& matrix) { int penalty = 0; int width = matrix.width(); int height = matrix.height(); for (int y = 0; y < height - 1; y++) { for (int x = 0; x < width - 1; x++) { int value = matrix.get(x, y); if (value == matrix.get(x+1, y) && value == matrix.get(x, y+1) && value == matrix.get(x+1, y+1)) { penalty++; } } } return N2 * penalty; } template static bool HasPatternAt(const std::array& pattern, const int8_t* begin, int count, int stride) { assert(std::abs(count) <= (int)N); auto end = begin + count * stride; if (count < 0) std::swap(begin, end); auto a = begin; for (auto b = pattern.begin(); a < end && b != pattern.end(); a += stride, ++b) if (*a != *b) return false; return true; } /** * Apply mask penalty rule 3 and return the penalty. Find consecutive runs of 1:1:3:1:1:4 * starting with black, or 4:1:1:3:1:1 starting with white, and give penalty to them. If we * find patterns like 000010111010000, we give penalty once. */ int MaskUtil::ApplyMaskPenaltyRule3(const ByteMatrix& matrix) { const std::array white = {0, 0, 0, 0}; const std::array finder = {1, 0, 1, 1, 1, 0, 1}; const int whiteSize = (int)white.size(); const int finderSize = (int)finder.size(); int numPenalties = 0; int width = matrix.width(); int height = matrix.height(); for (int y = 0; y < height; y++) { for (int x = 0; x < width; x++) { auto i = &matrix.get(x, y); if (x <= width - finderSize && HasPatternAt(finder, i, finderSize, 1) && (HasPatternAt(white, i, -std::min(x, whiteSize), 1) || HasPatternAt(white, i + finderSize, std::min(width - x - finderSize, whiteSize), 1))) { numPenalties++; } if (y <= height - finderSize && HasPatternAt(finder, i, finderSize, width) && (HasPatternAt(white, i, -std::min(y, whiteSize), width) || HasPatternAt(white, i + finderSize * width, std::min(height - y - finderSize, whiteSize), width))) { numPenalties++; } } } return numPenalties * N3; } /** * Apply mask penalty rule 4 and return the penalty. Calculate the ratio of dark cells and give * penalty if the ratio is far from 50%. It gives 10 penalty for 5% distance. */ int MaskUtil::ApplyMaskPenaltyRule4(const ByteMatrix& matrix) { auto numDarkCells = std::count_if(matrix.begin(), matrix.end(), [](int8_t cell){ return cell == 1; }); auto numTotalCells = matrix.size(); auto fivePercentVariances = std::abs(numDarkCells * 2 - numTotalCells) * 10 / numTotalCells; return static_cast(fivePercentVariances * N4); } } // QRCode } // ZXing zxing-cpp-1.0.8+ds2/core/src/qrcode/QRMaskUtil.h000066400000000000000000000017321361167020700212720ustar00rootroot00000000000000#pragma once /* * Copyright 2016 Huy Cuong Nguyen * Copyright 2016 ZXing authors * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ namespace ZXing { class ByteMatrix; namespace QRCode { class MaskUtil { public: static int ApplyMaskPenaltyRule1(const ByteMatrix& matrix); static int ApplyMaskPenaltyRule2(const ByteMatrix& matrix); static int ApplyMaskPenaltyRule3(const ByteMatrix& matrix); static int ApplyMaskPenaltyRule4(const ByteMatrix& matrix); }; } // QRCode } // ZXing zxing-cpp-1.0.8+ds2/core/src/qrcode/QRMatrixUtil.cpp000066400000000000000000000413661361167020700222050ustar00rootroot00000000000000/* * Copyright 2016 Huy Cuong Nguyen * Copyright 2016 ZXing authors * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #include "QRMatrixUtil.h" #include "QRErrorCorrectionLevel.h" #include "QRVersion.h" #include "BitArray.h" #include "ByteMatrix.h" #include "BitHacks.h" #include "ZXStrConvWorkaround.h" #include #include namespace ZXing { namespace QRCode { static const std::array, 7> POSITION_DETECTION_PATTERN = { 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 1, 1, 0, 1, 1, 1, 0, 1, 1, 0, 1, 1, 1, 0, 1, 1, 0, 1, 1, 1, 0, 1, 1, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, }; static const std::array, 5> POSITION_ADJUSTMENT_PATTERN = { 1, 1, 1, 1, 1, 1, 0, 0, 0, 1, 1, 0, 1, 0, 1, 1, 0, 0, 0, 1, 1, 1, 1, 1, 1, }; // From Appendix E. Table 1, JIS0510X:2004 (p 71). The table was double-checked by komatsu. static const std::array, 40> POSITION_ADJUSTMENT_PATTERN_COORDINATE_TABLE = { -1, -1, -1, -1, -1, -1, -1, // Version 1 6, 18, -1, -1, -1, -1, -1, // Version 2 6, 22, -1, -1, -1, -1, -1, // Version 3 6, 26, -1, -1, -1, -1, -1, // Version 4 6, 30, -1, -1, -1, -1, -1, // Version 5 6, 34, -1, -1, -1, -1, -1, // Version 6 6, 22, 38, -1, -1, -1, -1, // Version 7 6, 24, 42, -1, -1, -1, -1, // Version 8 6, 26, 46, -1, -1, -1, -1, // Version 9 6, 28, 50, -1, -1, -1, -1, // Version 10 6, 30, 54, -1, -1, -1, -1, // Version 11 6, 32, 58, -1, -1, -1, -1, // Version 12 6, 34, 62, -1, -1, -1, -1, // Version 13 6, 26, 46, 66, -1, -1, -1, // Version 14 6, 26, 48, 70, -1, -1, -1, // Version 15 6, 26, 50, 74, -1, -1, -1, // Version 16 6, 30, 54, 78, -1, -1, -1, // Version 17 6, 30, 56, 82, -1, -1, -1, // Version 18 6, 30, 58, 86, -1, -1, -1, // Version 19 6, 34, 62, 90, -1, -1, -1, // Version 20 6, 28, 50, 72, 94, -1, -1, // Version 21 6, 26, 50, 74, 98, -1, -1, // Version 22 6, 30, 54, 78, 102, -1, -1, // Version 23 6, 28, 54, 80, 106, -1, -1, // Version 24 6, 32, 58, 84, 110, -1, -1, // Version 25 6, 30, 58, 86, 114, -1, -1, // Version 26 6, 34, 62, 90, 118, -1, -1, // Version 27 6, 26, 50, 74, 98, 122, -1, // Version 28 6, 30, 54, 78, 102, 126, -1, // Version 29 6, 26, 52, 78, 104, 130, -1, // Version 30 6, 30, 56, 82, 108, 134, -1, // Version 31 6, 34, 60, 86, 112, 138, -1, // Version 32 6, 30, 58, 86, 114, 142, -1, // Version 33 6, 34, 62, 90, 118, 146, -1, // Version 34 6, 30, 54, 78, 102, 126, 150, // Version 35 6, 24, 50, 76, 102, 128, 154, // Version 36 6, 28, 54, 80, 106, 132, 158, // Version 37 6, 32, 58, 84, 110, 136, 162, // Version 38 6, 26, 54, 82, 110, 138, 166, // Version 39 6, 30, 58, 86, 114, 142, 170, // Version 40 }; // Type info cells at the left top corner. static const std::array, 15> TYPE_INFO_COORDINATES = { 8, 0, 8, 1, 8, 2, 8, 3, 8, 4, 8, 5, 8, 7, 8, 8, 7, 8, 5, 8, 4, 8, 3, 8, 2, 8, 1, 8, 0, 8, }; // From Appendix D in JISX0510:2004 (p. 67) static const int VERSION_INFO_POLY = 0x1f25; // 1 1111 0010 0101 // From Appendix C in JISX0510:2004 (p.65). static const int TYPE_INFO_POLY = 0x537; static const int TYPE_INFO_MASK_PATTERN = 0x5412; // Set all cells to -1. -1 means that the cell is empty (not set yet). // // JAVAPORT: We shouldn't need to do this at all. The code should be rewritten to begin encoding // with the ByteMatrix initialized all to zero. static void makeEmpty(ByteMatrix& matrix) { matrix.clear(-1); } // Check if "value" is empty. static inline bool IsEmpty(int8_t value) { return value == -1; } static void EmbedTimingPatterns(ByteMatrix& matrix) { // -8 is for skipping position detection patterns (size 7), and two horizontal/vertical // separation patterns (size 1). Thus, 8 = 7 + 1. for (int i = 8; i < matrix.width() - 8; ++i) { bool bit = (i + 1) % 2; // Horizontal line. if (IsEmpty(matrix.get(i, 6))) { matrix.set(i, 6, bit); } // Vertical line. if (IsEmpty(matrix.get(6, i))) { matrix.set(6, i, bit); } } } // Note that we cannot unify the function with embedPositionDetectionPattern() despite they are // almost identical, since we cannot write a function that takes 2D arrays in different sizes in // C/C++. We should live with the fact. static void EmbedPositionAdjustmentPattern(int xStart, int yStart, ByteMatrix& matrix) { for (int y = 0; y < 5; ++y) { for (int x = 0; x < 5; ++x) { matrix.set(xStart + x, yStart + y, POSITION_ADJUSTMENT_PATTERN[y][x]); } } } // Embed position adjustment patterns if need be. static void MaybeEmbedPositionAdjustmentPatterns(const Version& version, ByteMatrix& matrix) { if (version.versionNumber() < 2) { // The patterns appear if version >= 2 return; } int index = version.versionNumber() - 1; auto& coordinates = POSITION_ADJUSTMENT_PATTERN_COORDINATE_TABLE[index]; int numCoordinates = static_cast(coordinates.size()); for (int i = 0; i < numCoordinates; ++i) { for (int j = 0; j < numCoordinates; ++j) { int y = coordinates[i]; int x = coordinates[j]; if (x == -1 || y == -1) { continue; } // If the cell is unset, we embed the position adjustment pattern here. if (IsEmpty(matrix.get(x, y))) { // -2 is necessary since the x/y coordinates point to the center of the pattern, not the // left top corner. EmbedPositionAdjustmentPattern(x - 2, y - 2, matrix); } } } } static void EmbedPositionDetectionPattern(int xStart, int yStart, ByteMatrix& matrix) { for (int y = 0; y < 7; ++y) { for (int x = 0; x < 7; ++x) { matrix.set(xStart + x, yStart + y, POSITION_DETECTION_PATTERN[y][x]); } } } static void EmbedHorizontalSeparationPattern(int xStart, int yStart, ByteMatrix& matrix) { for (int x = 0; x < 8; ++x) { if (!IsEmpty(matrix.get(xStart + x, yStart))) { throw std::invalid_argument("Unexpected input"); } matrix.set(xStart + x, yStart, 0); } } static void EmbedVerticalSeparationPattern(int xStart, int yStart, ByteMatrix& matrix) { for (int y = 0; y < 7; ++y) { if (!IsEmpty(matrix.get(xStart, yStart + y))) { throw std::invalid_argument("Unexpected input"); } matrix.set(xStart, yStart + y, 0); } } // Embed position detection patterns and surrounding vertical/horizontal separators. static void EmbedPositionDetectionPatternsAndSeparators(ByteMatrix& matrix) { // Embed three big squares at corners. int pdpWidth = static_cast(POSITION_DETECTION_PATTERN[0].size()); // Left top corner. EmbedPositionDetectionPattern(0, 0, matrix); // Right top corner. EmbedPositionDetectionPattern(matrix.width() - pdpWidth, 0, matrix); // Left bottom corner. EmbedPositionDetectionPattern(0, matrix.width() - pdpWidth, matrix); // Embed horizontal separation patterns around the squares. int hspWidth = 8; // Left top corner. EmbedHorizontalSeparationPattern(0, hspWidth - 1, matrix); // Right top corner. EmbedHorizontalSeparationPattern(matrix.width() - hspWidth, hspWidth - 1, matrix); // Left bottom corner. EmbedHorizontalSeparationPattern(0, matrix.width() - hspWidth, matrix); // Embed vertical separation patterns around the squares. int vspSize = 7; // Left top corner. EmbedVerticalSeparationPattern(vspSize, 0, matrix); // Right top corner. EmbedVerticalSeparationPattern(matrix.height() - vspSize - 1, 0, matrix); // Left bottom corner. EmbedVerticalSeparationPattern(vspSize, matrix.height() - vspSize, matrix); } // Embed the lonely dark dot at left bottom corner. JISX0510:2004 (p.46) static void EmbedDarkDotAtLeftBottomCorner(ByteMatrix& matrix) { if (matrix.get(8, matrix.height() - 8) == 0) { throw std::invalid_argument("Unexpected input"); } matrix.set(8, matrix.height() - 8, 1); } // Embed basic patterns. On success, modify the matrix and return true. // The basic patterns are: // - Position detection patterns // - Timing patterns // - Dark dot at the left bottom corner // - Position adjustment patterns, if need be static void EmbedBasicPatterns(const Version& version, ByteMatrix& matrix) { // Let's get started with embedding big squares at corners. EmbedPositionDetectionPatternsAndSeparators(matrix); // Then, embed the dark dot at the left bottom corner. EmbedDarkDotAtLeftBottomCorner(matrix); // Position adjustment patterns appear if version >= 2. MaybeEmbedPositionAdjustmentPatterns(version, matrix); // Timing patterns should be embedded after position adj. patterns. EmbedTimingPatterns(matrix); } // Return the position of the most significant bit set (to one) in the "value". The most // significant bit is position 32. If there is no bit set, return 0. Examples: // - findMSBSet(0) => 0 // - findMSBSet(1) => 1 // - findMSBSet(255) => 8 static int FindMSBSet(unsigned value) { return 32 - BitHacks::NumberOfLeadingZeros(value); } // Calculate BCH (Bose-Chaudhuri-Hocquenghem) code for "value" using polynomial "poly". The BCH // code is used for encoding type information and version information. // Example: Calculation of version information of 7. // f(x) is created from 7. // - 7 = 000111 in 6 bits // - f(x) = x^2 + x^1 + x^0 // g(x) is given by the standard (p. 67) // - g(x) = x^12 + x^11 + x^10 + x^9 + x^8 + x^5 + x^2 + 1 // Multiply f(x) by x^(18 - 6) // - f'(x) = f(x) * x^(18 - 6) // - f'(x) = x^14 + x^13 + x^12 // Calculate the remainder of f'(x) / g(x) // x^2 // __________________________________________________ // g(x) )x^14 + x^13 + x^12 // x^14 + x^13 + x^12 + x^11 + x^10 + x^7 + x^4 + x^2 // -------------------------------------------------- // x^11 + x^10 + x^7 + x^4 + x^2 // // The remainder is x^11 + x^10 + x^7 + x^4 + x^2 // Encode it in binary: 110010010100 // The return value is 0xc94 (1100 1001 0100) // // Since all coefficients in the polynomials are 1 or 0, we can do the calculation by bit // operations. We don't care if cofficients are positive or negative. static int CalculateBCHCode(int value, int poly) { // If poly is "1 1111 0010 0101" (version info poly), msbSetInPoly is 13. We'll subtract 1 // from 13 to make it 12. int msbSetInPoly = FindMSBSet(poly); value <<= msbSetInPoly - 1; // Do the division business using exclusive-or operations. while (FindMSBSet(value) >= msbSetInPoly) { value ^= poly << (FindMSBSet(value) - msbSetInPoly); } // Now the "value" is the remainder (i.e. the BCH code) return value; } // Make bit vector of type information. On success, store the result in "bits" and return true. // Encode error correction level and mask pattern. See 8.9 of // JISX0510:2004 (p.45) for details. static void MakeTypeInfoBits(ErrorCorrectionLevel ecLevel, int maskPattern, BitArray& bits) { if (maskPattern < 0 || maskPattern >= MatrixUtil::NUM_MASK_PATTERNS) { throw std::invalid_argument("Invalid mask pattern"); } int typeInfo = (BitsFromECLevel(ecLevel) << 3) | maskPattern; bits.appendBits(typeInfo, 5); int bchCode = CalculateBCHCode(typeInfo, TYPE_INFO_POLY); bits.appendBits(bchCode, 10); BitArray maskBits; maskBits.appendBits(TYPE_INFO_MASK_PATTERN, 15); bits.bitwiseXOR(maskBits); if (bits.size() != 15) { // Just in case. throw std::logic_error("Should not happen but we got: " + std::to_string(bits.size())); } } // Embed type information. On success, modify the matrix. static void EmbedTypeInfo(ErrorCorrectionLevel ecLevel, int maskPattern, ByteMatrix& matrix) { BitArray typeInfoBits; MakeTypeInfoBits(ecLevel, maskPattern, typeInfoBits); for (int i = 0; i < typeInfoBits.size(); ++i) { // Place bits in LSB to MSB order. LSB (least significant bit) is the last value in // "typeInfoBits". bool bit = typeInfoBits.get(typeInfoBits.size() - 1 - i); // Type info bits at the left top corner. See 8.9 of JISX0510:2004 (p.46). int x1 = TYPE_INFO_COORDINATES[i][0]; int y1 = TYPE_INFO_COORDINATES[i][1]; matrix.set(x1, y1, bit); if (i < 8) { // Right top corner. int x2 = matrix.width() - i - 1; int y2 = 8; matrix.set(x2, y2, bit); } else { // Left bottom corner. int x2 = 8; int y2 = matrix.height() - 7 + (i - 8); matrix.set(x2, y2, bit); } } } // Make bit vector of version information. On success, store the result in "bits" and return true. // See 8.10 of JISX0510:2004 (p.45) for details. static void MakeVersionInfoBits(const Version& version, BitArray& bits) { bits.appendBits(version.versionNumber(), 6); int bchCode = CalculateBCHCode(version.versionNumber(), VERSION_INFO_POLY); bits.appendBits(bchCode, 12); if (bits.size() != 18) { // Just in case. throw std::logic_error("Should not happen but we got: " + std::to_string(bits.size())); } } // Embed version information if need be. On success, modify the matrix and return true. // See 8.10 of JISX0510:2004 (p.47) for how to embed version information. static void MaybeEmbedVersionInfo(const Version& version, ByteMatrix& matrix) { if (version.versionNumber() < 7) { // Version info is necessary if version >= 7. return; // Don't need version info. } BitArray versionInfoBits; MakeVersionInfoBits(version, versionInfoBits); int bitIndex = 6 * 3 - 1; // It will decrease from 17 to 0. for (int i = 0; i < 6; ++i) { for (int j = 0; j < 3; ++j) { // Place bits in LSB (least significant bit) to MSB order. bool bit = versionInfoBits.get(bitIndex); bitIndex--; // Left bottom corner. matrix.set(i, matrix.height() - 11 + j, bit); // Right bottom corner. matrix.set(matrix.height() - 11 + j, i, bit); } } } /** * Return the mask bit for "getMaskPattern" at "x" and "y". See 8.8 of JISX0510:2004 for mask * pattern conditions. */ static bool GetDataMaskBit(int maskPattern, int x, int y) { int intermediate; int temp; switch (maskPattern) { case 0: intermediate = (y + x) & 0x1; break; case 1: intermediate = y & 0x1; break; case 2: intermediate = x % 3; break; case 3: intermediate = (y + x) % 3; break; case 4: intermediate = ((y / 2) + (x / 3)) & 0x1; break; case 5: temp = y * x; intermediate = (temp & 0x1) + (temp % 3); break; case 6: temp = y * x; intermediate = ((temp & 0x1) + (temp % 3)) & 0x1; break; case 7: temp = y * x; intermediate = ((temp % 3) + ((y + x) & 0x1)) & 0x1; break; default: throw std::invalid_argument("Invalid mask pattern: " + std::to_string(maskPattern)); } return intermediate == 0; } // Embed "dataBits" using "getMaskPattern". On success, modify the matrix and return true. // For debugging purposes, it skips masking process if "getMaskPattern" is -1. // See 8.7 of JISX0510:2004 (p.38) for how to embed data bits. static void EmbedDataBits(const BitArray& dataBits, int maskPattern, ByteMatrix& matrix) { int bitIndex = 0; int direction = -1; // Start from the right bottom cell. int x = matrix.width() - 1; int y = matrix.height() - 1; while (x > 0) { // Skip the vertical timing pattern. if (x == 6) { x -= 1; } while (y >= 0 && y < matrix.height()) { for (int i = 0; i < 2; ++i) { int xx = x - i; // Skip the cell if it's not empty. if (!IsEmpty(matrix.get(xx, y))) { continue; } bool bit; if (bitIndex < dataBits.size()) { bit = dataBits.get(bitIndex); ++bitIndex; } else { // Padding bit. If there is no bit left, we'll fill the left cells with 0, as described // in 8.4.9 of JISX0510:2004 (p. 24). bit = false; } // Skip masking if mask_pattern is -1. if (maskPattern != -1 && GetDataMaskBit(maskPattern, xx, y)) { bit = !bit; } matrix.set(xx, y, bit); } y += direction; } direction = -direction; // Reverse the direction. y += direction; x -= 2; // Move to the left. } // All bits should be consumed. if (bitIndex != dataBits.size()) { throw std::invalid_argument("Not all bits consumed: " + std::to_string(bitIndex) + '/' + std::to_string(dataBits.size())); } } // Build 2D matrix of QR Code from "dataBits" with "ecLevel", "version" and "getMaskPattern". On // success, store the result in "matrix" and return true. void MatrixUtil::BuildMatrix(const BitArray& dataBits, ErrorCorrectionLevel ecLevel, const Version& version, int maskPattern, ByteMatrix& matrix) { makeEmpty(matrix); EmbedBasicPatterns(version, matrix); // Type information appear with any version. EmbedTypeInfo(ecLevel, maskPattern, matrix); // Version info appear if version >= 7. MaybeEmbedVersionInfo(version, matrix); // Data should be embedded at end. EmbedDataBits(dataBits, maskPattern, matrix); } } // QRCode } // ZXing zxing-cpp-1.0.8+ds2/core/src/qrcode/QRMatrixUtil.h000066400000000000000000000017421361167020700216440ustar00rootroot00000000000000#pragma once /* * Copyright 2016 Huy Cuong Nguyen * Copyright 2016 ZXing authors * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ namespace ZXing { class BitArray; class ByteMatrix; namespace QRCode { enum class ErrorCorrectionLevel; class Version; class MatrixUtil { public: static const int NUM_MASK_PATTERNS = 8; static void BuildMatrix(const BitArray& dataBits, ErrorCorrectionLevel ecLevel, const Version& version, int maskPattern, ByteMatrix& matrix); }; } // QRCode } // ZXing zxing-cpp-1.0.8+ds2/core/src/qrcode/QRReader.cpp000066400000000000000000000117001361167020700212720ustar00rootroot00000000000000/* * Copyright 2016 Nu-book Inc. * Copyright 2016 ZXing authors * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #include "QRReader.h" #include "QRDecoder.h" #include "QRDetector.h" #include "QRDecoderMetadata.h" #include "Result.h" #include "DecoderResult.h" #include "DetectorResult.h" #include "ResultPoint.h" #include "DecodeHints.h" #include "BinaryBitmap.h" #include "BitMatrix.h" #include "ZXNumeric.h" #include "ZXConfig.h" namespace ZXing { namespace QRCode { static float GetModuleSize(int x, int y, const BitMatrix& image) { int orgX = x; int height = image.height(); int width = image.width(); bool inBlack = true; int transitions = 0; while (x < width && y < height) { if (inBlack != image.get(x, y)) { if (++transitions == 5) { break; } inBlack = !inBlack; } x++; y++; } if (x == width || y == height) { return 0.0f; } return static_cast(x - orgX) / 7.0f; } /** * This method detects a code in a "pure" image -- that is, pure monochrome image * which contains only an unrotated, unskewed, image of a code, with some white border * around it. This is a specialized method that works exceptionally fast in this special * case. * * @see com.google.zxing.datamatrix.DataMatrixReader#extractPureBits(BitMatrix) */ static BitMatrix ExtractPureBits(const BitMatrix& image) { int left, top, right, bottom; if (!image.getTopLeftOnBit(left, top) || !image.getBottomRightOnBit(right, bottom)) { return {}; } float moduleSize = GetModuleSize(left, top, image); if (moduleSize <= 0.0f) { return {}; } // Sanity check! if (left >= right || top >= bottom) { return {}; } if (bottom - top != right - left) { // Special case, where bottom-right module wasn't black so we found something else in the last row // Assume it's a square, so use height as the width right = left + (bottom - top); if (right >= image.width()) { // Abort if that would not make sense -- off image return {}; } } int matrixWidth = RoundToNearest((right - left + 1) / moduleSize); int matrixHeight = RoundToNearest((bottom - top + 1) / moduleSize); if (matrixWidth <= 0 || matrixHeight <= 0) { return {}; } if (matrixHeight != matrixWidth) { // Only possibly decode square regions return {}; } // Push in the "border" by half the module width so that we start // sampling in the middle of the module. Just in case the image is a // little off, this will help recover. int nudge = (int)(moduleSize / 2.0f); top += nudge; left += nudge; // But careful that this does not sample off the edge // "right" is the farthest-right valid pixel location -- right+1 is not necessarily // This is positive by how much the inner x loop below would be too large int nudgedTooFarRight = left + (int)((matrixWidth - 1) * moduleSize) - right; if (nudgedTooFarRight > 0) { if (nudgedTooFarRight > nudge) { // Neither way fits; abort return {}; } left -= nudgedTooFarRight; } // See logic above int nudgedTooFarDown = top + (int)((matrixHeight - 1) * moduleSize) - bottom; if (nudgedTooFarDown > 0) { if (nudgedTooFarDown > nudge) { // Neither way fits; abort return {}; } top -= nudgedTooFarDown; } // Now just read off the bits (this is a crop + subsample) return Deflate(image, matrixWidth, matrixHeight, top, left, static_cast(moduleSize)); } Reader::Reader(const DecodeHints& hints) : _tryHarder(hints.tryHarder()), _charset(hints.characterSet()) { } Result Reader::decode(const BinaryBitmap& image) const { auto binImg = image.getBlackMatrix(); if (binImg == nullptr) { return Result(DecodeStatus::NotFound); } DecoderResult decoderResult; std::vector points; if (image.isPureBarcode()) { BitMatrix bits = ExtractPureBits(*binImg); if (bits.empty()) return Result(DecodeStatus::NotFound); decoderResult = Decoder::Decode(bits, _charset); } else { DetectorResult detectorResult = Detector::Detect(*binImg, _tryHarder); if (!detectorResult.isValid()) return Result(DecodeStatus::NotFound); decoderResult = Decoder::Decode(detectorResult.bits(), _charset); points = detectorResult.points(); } // If the code was mirrored: swap the bottom-left and the top-right points. // No need to 'fix' top-left and alignment pattern. if (points.size() >= 3 && decoderResult.extra() && static_cast(decoderResult.extra().get())->isMirrored()) { std::swap(points.at(0), points.at(2)); } return Result(std::move(decoderResult), std::move(points), BarcodeFormat::QR_CODE); } } // QRCode } // ZXing zxing-cpp-1.0.8+ds2/core/src/qrcode/QRReader.h000066400000000000000000000020531361167020700207400ustar00rootroot00000000000000#pragma once /* * Copyright 2016 Nu-book Inc. * Copyright 2016 ZXing authors * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #include "Reader.h" #include #include namespace ZXing { class DecodeHints; namespace QRCode { /** * This implementation can detect and decode QR Codes in an image. * * @author Sean Owen */ class Reader : public ZXing::Reader { public: explicit Reader(const DecodeHints& hints); Result decode(const BinaryBitmap& image) const override; private: bool _tryHarder; std::string _charset; }; } // QRCode } // ZXing zxing-cpp-1.0.8+ds2/core/src/qrcode/QRVersion.cpp000066400000000000000000000220421361167020700215160ustar00rootroot00000000000000/* * Copyright 2016 Nu-book Inc. * Copyright 2016 ZXing authors * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #include "QRVersion.h" #include "QRECB.h" #include "BitHacks.h" #include "BitMatrix.h" #include namespace ZXing { namespace QRCode { namespace { /** * See ISO 18004:2006 Annex D. * Element i represents the raw version bits that specify version i + 7 */ static const int VERSION_DECODE_INFO[] = { 0x07C94, 0x085BC, 0x09A99, 0x0A4D3, 0x0BBF6, 0x0C762, 0x0D847, 0x0E60D, 0x0F928, 0x10B78, 0x1145D, 0x12A17, 0x13532, 0x149A6, 0x15683, 0x168C9, 0x177EC, 0x18EC4, 0x191E1, 0x1AFAB, 0x1B08E, 0x1CC1A, 0x1D33F, 0x1ED75, 0x1F250, 0x209D5, 0x216F0, 0x228BA, 0x2379F, 0x24B0B, 0x2542E, 0x26A64, 0x27541, 0x28C69 }; } // anonymous const Version * Version::AllVersions() { /** * See ISO 18004:2006 6.5.1 Table 9 */ static const Version allVersions[] = { {1, {}, { 7, 1, 19, 0, 0, 10, 1, 16, 0, 0, 13, 1, 13, 0, 0, 17, 1, 9 , 0, 0 }}, {2, {6, 18}, { 10, 1, 34, 0, 0, 16, 1, 28, 0, 0, 22, 1, 22, 0, 0, 28, 1, 16, 0, 0, }}, {3, {6, 22}, { 15, 1, 55, 0, 0, 26, 1, 44, 0, 0, 18, 2, 17, 0, 0, 22, 2, 13, 0, 0, }}, {4, {6, 26}, { 20, 1, 80, 0, 0, 18, 2, 32, 0, 0, 26, 2, 24, 0, 0, 16, 4, 9 , 0, 0, }}, {5, {6, 30}, { 26, 1, 108, 0, 0, 24, 2, 43 , 0, 0, 18, 2, 15 , 2, 16, 22, 2, 11 , 2, 12, }}, {6, {6, 34}, { 18, 2, 68, 0, 0, 16, 4, 27, 0, 0, 24, 4, 19, 0, 0, 28, 4, 15, 0, 0, }}, {7, {6, 22, 38}, { 20, 2, 78, 0, 0, 18, 4, 31, 0, 0, 18, 2, 14, 4, 15, 26, 4, 13, 1, 14, }}, {8, {6, 24, 42}, { 24, 2, 97, 0, 0, 22, 2, 38, 2, 39, 22, 4, 18, 2, 19, 26, 4, 14, 2, 15, }}, {9, {6, 26, 46}, { 30, 2, 116, 0, 0, 22, 3, 36, 2, 37, 20, 4, 16, 4, 17, 24, 4, 12, 4, 13, }}, {10, {6, 28, 50}, { 18, 2, 68, 2, 69, 26, 4, 43, 1, 44, 24, 6, 19, 2, 20, 28, 6, 15, 2, 16, }}, {11, {6, 30, 54}, { 20, 4, 81, 0, 0, 30, 1, 50, 4, 51, 28, 4, 22, 4, 23, 24, 3, 12, 8, 13, }}, {12, {6, 32, 58}, { 24, 2, 92, 2, 93, 22, 6, 36, 2, 37, 26, 4, 20, 6, 21, 28, 7, 14, 4, 15, }}, {13, {6, 34, 62}, { 26, 4, 107, 0, 0, 22, 8, 37, 1, 38, 24, 8, 20, 4, 21, 22, 12, 11, 4, 12, }}, {14, {6, 26, 46, 66}, { 30, 3, 115, 1, 116, 24, 4, 40, 5, 41, 20, 11, 16, 5, 17, 24, 11, 12, 5, 13, }}, {15, {6, 26, 48, 70}, { 22, 5, 87, 1, 88, 24, 5, 41, 5, 42, 30, 5, 24, 7, 25, 24, 11, 12, 7, 13, }}, {16, {6, 26, 50, 74}, { 24, 5, 98, 1, 99, 28, 7, 45, 3, 46, 24, 15, 19, 2, 20, 30, 3, 15, 13, 16, }}, {17, {6, 30, 54, 78}, { 28, 1, 107, 5, 108, 28, 10, 46, 1, 47, 28, 1, 22, 15, 23, 28, 2, 14, 17, 15, }}, {18, {6, 30, 56, 82}, { 30, 5, 120, 1, 121, 26, 9, 43, 4, 44, 28, 17, 22, 1, 23, 28, 2, 14, 19, 15, }}, {19, {6, 30, 58, 86}, { 28, 3, 113, 4, 114, 26, 3, 44, 11, 45, 26, 17, 21, 4, 22, 26, 9, 13, 16, 14, }}, {20, {6, 34, 62, 90}, { 28, 3, 107, 5, 108, 26, 3, 41, 13, 42, 30, 15, 24, 5, 25, 28, 15, 15, 10, 16, }}, {21, {6, 28, 50, 72, 94}, { 28, 4, 116, 4, 117, 26, 17, 42, 0, 0, 28, 17, 22, 6, 23, 30, 19, 16, 6, 17, }}, {22, {6, 26, 50, 74, 98}, { 28, 2, 111, 7, 112, 28, 17, 46, 0, 0, 30, 7, 24, 16, 25, 24, 34, 13, 0, 0, }}, {23, {6, 30, 54, 78, 102}, { 30, 4, 121, 5, 122, 28, 4, 47, 14, 48, 30, 11, 24, 14, 25, 30, 16, 15, 14, 16, }}, {24, {6, 28, 54, 80, 106}, { 30, 6, 117, 4, 118, 28, 6, 45, 14, 46, 30, 11, 24, 16, 25, 30, 30, 16, 2, 17, }}, {25, {6, 32, 58, 84, 110}, { 26, 8, 106, 4, 107, 28, 8, 47, 13, 48, 30, 7, 24, 22, 25, 30, 22, 15, 13, 16, }}, {26, {6, 30, 58, 86, 114}, { 28, 10, 114, 2, 115, 28, 19, 46, 4, 47, 28, 28, 22, 6, 23, 30, 33, 16, 4, 17, }}, {27, {6, 34, 62, 90, 118}, { 30, 8, 122, 4, 123, 28, 22, 45, 3, 46, 30, 8, 23, 26, 24, 30, 12, 15, 28, 16, }}, {28, {6, 26, 50, 74, 98, 122}, { 30, 3, 117, 10, 118, 28, 3, 45, 23, 46, 30, 4, 24, 31, 25, 30, 11, 15, 31, 16, }}, {29, {6, 30, 54, 78, 102, 126}, { 30, 7, 116, 7, 117, 28, 21, 45, 7, 46, 30, 1, 23, 37, 24, 30, 19, 15, 26, 16, }}, {30, {6, 26, 52, 78, 104, 130}, { 30, 5, 115, 10, 116, 28, 19, 47, 10, 48, 30, 15, 24, 25, 25, 30, 23, 15, 25, 16, }}, {31, {6, 30, 56, 82, 108, 134}, { 30, 13, 115, 3, 116, 28, 2, 46, 29, 47, 30, 42, 24, 1, 25, 30, 23, 15, 28, 16, }}, {32, {6, 34, 60, 86, 112, 138}, { 30, 17, 115, 0, 0, 28, 10, 46, 23, 47, 30, 10, 24, 35, 25, 30, 19, 15, 35, 16, }}, {33, {6, 30, 58, 86, 114, 142}, { 30, 17, 115, 1, 116, 28, 14, 46, 21, 47, 30, 29, 24, 19, 25, 30, 11, 15, 46, 16, }}, {34, {6, 34, 62, 90, 118, 146}, { 30, 13, 115, 6, 116, 28, 14, 46, 23, 47, 30, 44, 24, 7, 25, 30, 59, 16, 1, 17, }}, {35, {6, 30, 54, 78, 102, 126, 150}, { 30, 12, 121, 7, 122, 28, 12, 47, 26, 48, 30, 39, 24, 14, 25, 30, 22, 15, 41, 16, }}, {36, {6, 24, 50, 76, 102, 128, 154}, { 30, 6, 121, 14, 122, 28, 6, 47, 34, 48, 30, 46, 24, 10, 25, 30, 2, 15, 64, 16, }}, {37, {6, 28, 54, 80, 106, 132, 158}, { 30, 17, 122, 4, 123, 28, 29, 46, 14, 47, 30, 49, 24, 10, 25, 30, 24, 15, 46, 16, }}, {38, {6, 32, 58, 84, 110, 136, 162}, { 30, 4, 122, 18, 123, 28, 13, 46, 32, 47, 30, 48, 24, 14, 25, 30, 42, 15, 32, 16, }}, {39, {6, 26, 54, 82, 110, 138, 166}, { 30, 20, 117, 4, 118, 28, 40, 47, 7, 48, 30, 43, 24, 22, 25, 30, 10, 15, 67, 16, }}, {40, {6, 30, 58, 86, 114, 142, 170}, { 30, 19, 118, 6, 119, 28, 18, 47, 31, 48, 30, 34, 24, 34, 25, 30, 20, 15, 61, 16 }}, }; return allVersions; } Version::Version(int versionNumber, std::initializer_list alignmentPatternCenters, const std::array &ecBlocks) : _versionNumber(versionNumber), _alignmentPatternCenters(alignmentPatternCenters), _ecBlocks(ecBlocks) { _totalCodewords = ecBlocks[0].totalDataCodewords(); } const Version * Version::VersionForNumber(int versionNumber) { if (versionNumber < 1 || versionNumber > 40) { //throw std::invalid_argument("Version should be in range [1-40]."); return nullptr; } return &AllVersions()[versionNumber - 1]; } const Version * Version::ProvisionalVersionForDimension(int dimension) { if (dimension % 4 != 1) { //throw std::invalid_argument("Unexpected dimension"); return nullptr; } return VersionForNumber((dimension - 17) / 4); } const Version * Version::DecodeVersionInformation(int versionBits) { int bestDifference = std::numeric_limits::max(); int bestVersion = 0; int i = 0; for (int targetVersion : VERSION_DECODE_INFO) { // Do the version info bits match exactly? done. if (targetVersion == versionBits) { return VersionForNumber(i + 7); } // Otherwise see if this is the closest to a real version info bit string // we have seen so far int bitsDifference = BitHacks::CountBitsSet(versionBits ^ targetVersion); if (bitsDifference < bestDifference) { bestVersion = i + 7; bestDifference = bitsDifference; } ++i; } // We can tolerate up to 3 bits of error since no two version info codewords will // differ in less than 8 bits. if (bestDifference <= 3) { return VersionForNumber(bestVersion); } // If we didn't find a close enough match, fail return nullptr; } /** * See ISO 18004:2006 Annex E */ void Version::buildFunctionPattern(BitMatrix& bitMatrix) const { int dimension = dimensionForVersion(); bitMatrix = BitMatrix(dimension, dimension); // Top left finder pattern + separator + format bitMatrix.setRegion(0, 0, 9, 9); // Top right finder pattern + separator + format bitMatrix.setRegion(dimension - 8, 0, 8, 9); // Bottom left finder pattern + separator + format bitMatrix.setRegion(0, dimension - 8, 9, 8); // Alignment patterns size_t max = _alignmentPatternCenters.size(); for (size_t x = 0; x < max; ++x) { int i = _alignmentPatternCenters[x] - 2; for (size_t y = 0; y < max; ++y) { if ((x == 0 && (y == 0 || y == max - 1)) || (x == max - 1 && y == 0)) { // No alignment patterns near the three finder paterns continue; } bitMatrix.setRegion(_alignmentPatternCenters[y] - 2, i, 5, 5); } } // Vertical timing pattern bitMatrix.setRegion(6, 9, 1, dimension - 17); // Horizontal timing pattern bitMatrix.setRegion(9, 6, dimension - 17, 1); if (_versionNumber > 6) { // Version info, top right bitMatrix.setRegion(dimension - 11, 0, 3, 6); // Version info, bottom left bitMatrix.setRegion(0, dimension - 11, 6, 3); } } } // QRCode } // ZXing zxing-cpp-1.0.8+ds2/core/src/qrcode/QRVersion.h000066400000000000000000000040411361167020700211620ustar00rootroot00000000000000#pragma once /* * Copyright 2016 Nu-book Inc. * Copyright 2016 ZXing authors * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #include "QRECB.h" #include "QRErrorCorrectionLevel.h" #include #include namespace ZXing { class BitMatrix; namespace QRCode { /** * See ISO 18004:2006 Annex D * * @author Sean Owen */ class Version { public: int versionNumber() const { return _versionNumber; } const std::vector& alignmentPatternCenters() const { return _alignmentPatternCenters; } int totalCodewords() const { return _totalCodewords; } int dimensionForVersion() const { return 17 + 4 * _versionNumber; } const ECBlocks & ecBlocksForLevel(ErrorCorrectionLevel ecLevel) const { return _ecBlocks[(int)ecLevel]; } void buildFunctionPattern(BitMatrix& bitMatrix) const; /** *

Deduces version information purely from QR Code dimensions.

* * @param dimension dimension in modules * @return Version for a QR Code of that dimension * @throws FormatException if dimension is not 1 mod 4 */ static const Version* ProvisionalVersionForDimension(int dimension); static const Version* VersionForNumber(int versionNumber); static const Version* DecodeVersionInformation(int versionBits); private: int _versionNumber; std::vector _alignmentPatternCenters; std::array _ecBlocks; int _totalCodewords; Version(int versionNumber, std::initializer_list alignmentPatternCenters, const std::array &ecBlocks); static const Version* AllVersions(); }; } // QRCode } // ZXing zxing-cpp-1.0.8+ds2/core/src/qrcode/QRWriter.cpp000066400000000000000000000027731361167020700213560ustar00rootroot00000000000000/* * Copyright 2016 Huy Cuong Nguyen * Copyright 2016 ZXing authors * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #include "QRWriter.h" #include "QRErrorCorrectionLevel.h" #include "QREncoder.h" #include "QREncodeResult.h" #include "BitMatrix.h" #include "CharacterSet.h" #include namespace ZXing { namespace QRCode { static const int QUIET_ZONE_SIZE = 4; Writer::Writer() : _margin(QUIET_ZONE_SIZE), _ecLevel(ErrorCorrectionLevel::Low), _encoding(CharacterSet::Unknown), _version(0), _useGs1Format(false), _maskPattern(-1) { } BitMatrix Writer::encode(const std::wstring& contents, int width, int height) const { if (contents.empty()) { throw std::invalid_argument("Found empty contents"); } if (width < 0 || height < 0) { throw std::invalid_argument("Requested dimensions are invalid"); } EncodeResult code = Encoder::Encode(contents, _ecLevel, _encoding, _version, _useGs1Format, _maskPattern); return Inflate(BitMatrix(code.matrix, 1), width, height, _margin); } } // QRCode } // ZXing zxing-cpp-1.0.8+ds2/core/src/qrcode/QRWriter.h000066400000000000000000000032311361167020700210110ustar00rootroot00000000000000#pragma once /* * Copyright 2016 Huy Cuong Nguyen * Copyright 2016 ZXing authors * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #include namespace ZXing { class BitMatrix; enum class CharacterSet; namespace QRCode { enum class ErrorCorrectionLevel; /** * This object renders a QR Code as a BitMatrix 2D array of greyscale values. * * @author dswitkin@google.com (Daniel Switkin) */ class Writer { public: Writer(); Writer& setMargin(int margin) { _margin = margin; return *this; } Writer& setErrorCorrectionLevel(ErrorCorrectionLevel ecLevel) { _ecLevel = ecLevel; return *this; } Writer& setEncoding(CharacterSet encoding) { _encoding = encoding; return *this; } Writer& setVersion(int versionNumber) { _version = versionNumber; return *this; } Writer& useGS1Format() { _useGs1Format = true; return *this; } Writer& setMaskPattern(int pattern) { _maskPattern = pattern; return *this; } BitMatrix encode(const std::wstring& contents, int width, int height) const; private: int _margin; ErrorCorrectionLevel _ecLevel; CharacterSet _encoding; int _version; bool _useGs1Format; int _maskPattern; }; } // QRCode } // ZXing zxing-cpp-1.0.8+ds2/core/src/textcodec/000077500000000000000000000000001361167020700176275ustar00rootroot00000000000000zxing-cpp-1.0.8+ds2/core/src/textcodec/Big5MapTable.cpp000066400000000000000000003303221361167020700225320ustar00rootroot00000000000000/**************************************************************************** ** ** Copyright (C) 2015 The Qt Company Ltd. ** Contact: http://www.qt.io/licensing/ ** ** This file is part of the QtCore module of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:LGPL21$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and The Qt Company. For licensing terms ** and conditions see http://www.qt.io/terms-conditions. For further ** information use the contact form at http://www.qt.io/contact-us. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 or version 3 as published by the Free ** Software Foundation and appearing in the file LICENSE.LGPLv21 and ** LICENSE.LGPLv3 included in the packaging of this file. Please review the ** following information to ensure the GNU Lesser General Public License ** requirements will be met: https://www.gnu.org/licenses/lgpl.html and ** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** As a special exception, The Qt Company gives you certain additional ** rights. These rights are described in The Qt Company LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** $QT_END_LICENSE$ ** ****************************************************************************/ #include "Big5MapTable.h" #include // Big 5 to Unicode maping tables. // Tables are in sorted order on X(all table together) & Y(individually) static const B5Map b5_8140_to_uc_map[2041] = { {0x8140,0xeeb8}, {0x8141,0xeeb9}, {0x8142,0xeeba}, {0x8143,0xeebb}, {0x8144,0xeebc}, {0x8145,0xeebd}, {0x8146,0xeebe}, {0x8147,0xeebf}, {0x8148,0xeec0}, {0x8149,0xeec1}, {0x814a,0xeec2}, {0x814b,0xeec3}, {0x814c,0xeec4}, {0x814d,0xeec5}, {0x814e,0xeec6}, {0x814f,0xeec7}, {0x8150,0xeec8}, {0x8151,0xeec9}, {0x8152,0xeeca}, {0x8153,0xeecb}, {0x8154,0xeecc}, {0x8155,0xeecd}, {0x8156,0xeece}, {0x8157,0xeecf}, {0x8158,0xeed0}, {0x8159,0xeed1}, {0x815a,0xeed2}, {0x815b,0xeed3}, {0x815c,0xeed4}, {0x815d,0xeed5}, {0x815e,0xeed6}, {0x815f,0xeed7}, {0x8160,0xeed8}, {0x8161,0xeed9}, {0x8162,0xeeda}, {0x8163,0xeedb}, {0x8164,0xeedc}, {0x8165,0xeedd}, {0x8166,0xeede}, {0x8167,0xeedf}, {0x8168,0xeee0}, {0x8169,0xeee1}, {0x816a,0xeee2}, {0x816b,0xeee3}, {0x816c,0xeee4}, {0x816d,0xeee5}, {0x816e,0xeee6}, {0x816f,0xeee7}, {0x8170,0xeee8}, {0x8171,0xeee9}, {0x8172,0xeeea}, {0x8173,0xeeeb}, {0x8174,0xeeec}, {0x8175,0xeeed}, {0x8176,0xeeee}, {0x8177,0xeeef}, {0x8178,0xeef0}, {0x8179,0xeef1}, {0x817a,0xeef2}, {0x817b,0xeef3}, {0x817c,0xeef4}, {0x817d,0xeef5}, {0x817e,0xeef6}, {0x81a1,0xeef7}, {0x81a2,0xeef8}, {0x81a3,0xeef9}, {0x81a4,0xeefa}, {0x81a5,0xeefb}, {0x81a6,0xeefc}, {0x81a7,0xeefd}, {0x81a8,0xeefe}, {0x81a9,0xeeff}, {0x81aa,0xef00}, {0x81ab,0xef01}, {0x81ac,0xef02}, {0x81ad,0xef03}, {0x81ae,0xef04}, {0x81af,0xef05}, {0x81b0,0xef06}, {0x81b1,0xef07}, {0x81b2,0xef08}, {0x81b3,0xef09}, {0x81b4,0xef0a}, {0x81b5,0xef0b}, {0x81b6,0xef0c}, {0x81b7,0xef0d}, {0x81b8,0xef0e}, {0x81b9,0xef0f}, {0x81ba,0xef10}, {0x81bb,0xef11}, {0x81bc,0xef12}, {0x81bd,0xef13}, {0x81be,0xef14}, {0x81bf,0xef15}, {0x81c0,0xef16}, {0x81c1,0xef17}, {0x81c2,0xef18}, {0x81c3,0xef19}, {0x81c4,0xef1a}, {0x81c5,0xef1b}, {0x81c6,0xef1c}, {0x81c7,0xef1d}, {0x81c8,0xef1e}, {0x81c9,0xef1f}, {0x81ca,0xef20}, {0x81cb,0xef21}, {0x81cc,0xef22}, {0x81cd,0xef23}, {0x81ce,0xef24}, {0x81cf,0xef25}, {0x81d0,0xef26}, {0x81d1,0xef27}, {0x81d2,0xef28}, {0x81d3,0xef29}, {0x81d4,0xef2a}, {0x81d5,0xef2b}, {0x81d6,0xef2c}, {0x81d7,0xef2d}, {0x81d8,0xef2e}, {0x81d9,0xef2f}, {0x81da,0xef30}, {0x81db,0xef31}, {0x81dc,0xef32}, {0x81dd,0xef33}, {0x81de,0xef34}, {0x81df,0xef35}, {0x81e0,0xef36}, {0x81e1,0xef37}, {0x81e2,0xef38}, {0x81e3,0xef39}, {0x81e4,0xef3a}, {0x81e5,0xef3b}, {0x81e6,0xef3c}, {0x81e7,0xef3d}, {0x81e8,0xef3e}, {0x81e9,0xef3f}, {0x81ea,0xef40}, {0x81eb,0xef41}, {0x81ec,0xef42}, {0x81ed,0xef43}, {0x81ee,0xef44}, {0x81ef,0xef45}, {0x81f0,0xef46}, {0x81f1,0xef47}, {0x81f2,0xef48}, {0x81f3,0xef49}, {0x81f4,0xef4a}, {0x81f5,0xef4b}, {0x81f6,0xef4c}, {0x81f7,0xef4d}, {0x81f8,0xef4e}, {0x81f9,0xef4f}, {0x81fa,0xef50}, {0x81fb,0xef51}, {0x81fc,0xef52}, {0x81fd,0xef53}, {0x81fe,0xef54}, {0x8240,0xef55}, {0x8241,0xef56}, {0x8242,0xef57}, {0x8243,0xef58}, {0x8244,0xef59}, {0x8245,0xef5a}, {0x8246,0xef5b}, {0x8247,0xef5c}, {0x8248,0xef5d}, {0x8249,0xef5e}, {0x824a,0xef5f}, {0x824b,0xef60}, {0x824c,0xef61}, {0x824d,0xef62}, {0x824e,0xef63}, {0x824f,0xef64}, {0x8250,0xef65}, {0x8251,0xef66}, {0x8252,0xef67}, {0x8253,0xef68}, {0x8254,0xef69}, {0x8255,0xef6a}, {0x8256,0xef6b}, {0x8257,0xef6c}, {0x8258,0xef6d}, {0x8259,0xef6e}, {0x825a,0xef6f}, {0x825b,0xef70}, {0x825c,0xef71}, {0x825d,0xef72}, {0x825e,0xef73}, {0x825f,0xef74}, {0x8260,0xef75}, {0x8261,0xef76}, {0x8262,0xef77}, {0x8263,0xef78}, {0x8264,0xef79}, {0x8265,0xef7a}, {0x8266,0xef7b}, {0x8267,0xef7c}, {0x8268,0xef7d}, {0x8269,0xef7e}, {0x826a,0xef7f}, {0x826b,0xef80}, {0x826c,0xef81}, {0x826d,0xef82}, {0x826e,0xef83}, {0x826f,0xef84}, {0x8270,0xef85}, {0x8271,0xef86}, {0x8272,0xef87}, {0x8273,0xef88}, {0x8274,0xef89}, {0x8275,0xef8a}, {0x8276,0xef8b}, {0x8277,0xef8c}, {0x8278,0xef8d}, {0x8279,0xef8e}, {0x827a,0xef8f}, {0x827b,0xef90}, {0x827c,0xef91}, {0x827d,0xef92}, {0x827e,0xef93}, {0x82a1,0xef94}, {0x82a2,0xef95}, {0x82a3,0xef96}, {0x82a4,0xef97}, {0x82a5,0xef98}, {0x82a6,0xef99}, {0x82a7,0xef9a}, {0x82a8,0xef9b}, {0x82a9,0xef9c}, {0x82aa,0xef9d}, {0x82ab,0xef9e}, {0x82ac,0xef9f}, {0x82ad,0xefa0}, {0x82ae,0xefa1}, {0x82af,0xefa2}, {0x82b0,0xefa3}, {0x82b1,0xefa4}, {0x82b2,0xefa5}, {0x82b3,0xefa6}, {0x82b4,0xefa7}, {0x82b5,0xefa8}, {0x82b6,0xefa9}, {0x82b7,0xefaa}, {0x82b8,0xefab}, {0x82b9,0xefac}, {0x82ba,0xefad}, {0x82bb,0xefae}, {0x82bc,0xefaf}, {0x82bd,0xefb0}, {0x82be,0xefb1}, {0x82bf,0xefb2}, {0x82c0,0xefb3}, {0x82c1,0xefb4}, {0x82c2,0xefb5}, {0x82c3,0xefb6}, {0x82c4,0xefb7}, {0x82c5,0xefb8}, {0x82c6,0xefb9}, {0x82c7,0xefba}, {0x82c8,0xefbb}, {0x82c9,0xefbc}, {0x82ca,0xefbd}, {0x82cb,0xefbe}, {0x82cc,0xefbf}, {0x82cd,0xefc0}, {0x82ce,0xefc1}, {0x82cf,0xefc2}, {0x82d0,0xefc3}, {0x82d1,0xefc4}, {0x82d2,0xefc5}, {0x82d3,0xefc6}, {0x82d4,0xefc7}, {0x82d5,0xefc8}, {0x82d6,0xefc9}, {0x82d7,0xefca}, {0x82d8,0xefcb}, {0x82d9,0xefcc}, {0x82da,0xefcd}, {0x82db,0xefce}, {0x82dc,0xefcf}, {0x82dd,0xefd0}, {0x82de,0xefd1}, {0x82df,0xefd2}, {0x82e0,0xefd3}, {0x82e1,0xefd4}, {0x82e2,0xefd5}, {0x82e3,0xefd6}, {0x82e4,0xefd7}, {0x82e5,0xefd8}, {0x82e6,0xefd9}, {0x82e7,0xefda}, {0x82e8,0xefdb}, {0x82e9,0xefdc}, {0x82ea,0xefdd}, {0x82eb,0xefde}, {0x82ec,0xefdf}, {0x82ed,0xefe0}, {0x82ee,0xefe1}, {0x82ef,0xefe2}, {0x82f0,0xefe3}, {0x82f1,0xefe4}, {0x82f2,0xefe5}, {0x82f3,0xefe6}, {0x82f4,0xefe7}, {0x82f5,0xefe8}, {0x82f6,0xefe9}, {0x82f7,0xefea}, {0x82f8,0xefeb}, {0x82f9,0xefec}, {0x82fa,0xefed}, {0x82fb,0xefee}, {0x82fc,0xefef}, {0x82fd,0xeff0}, {0x82fe,0xeff1}, {0x8340,0xeff2}, {0x8341,0xeff3}, {0x8342,0xeff4}, {0x8343,0xeff5}, {0x8344,0xeff6}, {0x8345,0xeff7}, {0x8346,0xeff8}, {0x8347,0xeff9}, {0x8348,0xeffa}, {0x8349,0xeffb}, {0x834a,0xeffc}, {0x834b,0xeffd}, {0x834c,0xeffe}, {0x834d,0xefff}, {0x834e,0xf000}, {0x834f,0xf001}, {0x8350,0xf002}, {0x8351,0xf003}, {0x8352,0xf004}, {0x8353,0xf005}, {0x8354,0xf006}, {0x8355,0xf007}, {0x8356,0xf008}, {0x8357,0xf009}, {0x8358,0xf00a}, {0x8359,0xf00b}, {0x835a,0xf00c}, {0x835b,0xf00d}, {0x835c,0xf00e}, {0x835d,0xf00f}, {0x835e,0xf010}, {0x835f,0xf011}, {0x8360,0xf012}, {0x8361,0xf013}, {0x8362,0xf014}, {0x8363,0xf015}, {0x8364,0xf016}, {0x8365,0xf017}, {0x8366,0xf018}, {0x8367,0xf019}, {0x8368,0xf01a}, {0x8369,0xf01b}, {0x836a,0xf01c}, {0x836b,0xf01d}, {0x836c,0xf01e}, {0x836d,0xf01f}, {0x836e,0xf020}, {0x836f,0xf021}, {0x8370,0xf022}, {0x8371,0xf023}, {0x8372,0xf024}, {0x8373,0xf025}, {0x8374,0xf026}, {0x8375,0xf027}, {0x8376,0xf028}, {0x8377,0xf029}, {0x8378,0xf02a}, {0x8379,0xf02b}, {0x837a,0xf02c}, {0x837b,0xf02d}, {0x837c,0xf02e}, {0x837d,0xf02f}, {0x837e,0xf030}, {0x83a1,0xf031}, {0x83a2,0xf032}, {0x83a3,0xf033}, {0x83a4,0xf034}, {0x83a5,0xf035}, {0x83a6,0xf036}, {0x83a7,0xf037}, {0x83a8,0xf038}, {0x83a9,0xf039}, {0x83aa,0xf03a}, {0x83ab,0xf03b}, {0x83ac,0xf03c}, {0x83ad,0xf03d}, {0x83ae,0xf03e}, {0x83af,0xf03f}, {0x83b0,0xf040}, {0x83b1,0xf041}, {0x83b2,0xf042}, {0x83b3,0xf043}, {0x83b4,0xf044}, {0x83b5,0xf045}, {0x83b6,0xf046}, {0x83b7,0xf047}, {0x83b8,0xf048}, {0x83b9,0xf049}, {0x83ba,0xf04a}, {0x83bb,0xf04b}, {0x83bc,0xf04c}, {0x83bd,0xf04d}, {0x83be,0xf04e}, {0x83bf,0xf04f}, {0x83c0,0xf050}, {0x83c1,0xf051}, {0x83c2,0xf052}, {0x83c3,0xf053}, {0x83c4,0xf054}, {0x83c5,0xf055}, {0x83c6,0xf056}, {0x83c7,0xf057}, {0x83c8,0xf058}, {0x83c9,0xf059}, {0x83ca,0xf05a}, {0x83cb,0xf05b}, {0x83cc,0xf05c}, {0x83cd,0xf05d}, {0x83ce,0xf05e}, {0x83cf,0xf05f}, {0x83d0,0xf060}, {0x83d1,0xf061}, {0x83d2,0xf062}, {0x83d3,0xf063}, {0x83d4,0xf064}, {0x83d5,0xf065}, {0x83d6,0xf066}, {0x83d7,0xf067}, {0x83d8,0xf068}, {0x83d9,0xf069}, {0x83da,0xf06a}, {0x83db,0xf06b}, {0x83dc,0xf06c}, {0x83dd,0xf06d}, {0x83de,0xf06e}, {0x83df,0xf06f}, {0x83e0,0xf070}, {0x83e1,0xf071}, {0x83e2,0xf072}, {0x83e3,0xf073}, {0x83e4,0xf074}, {0x83e5,0xf075}, {0x83e6,0xf076}, {0x83e7,0xf077}, {0x83e8,0xf078}, {0x83e9,0xf079}, {0x83ea,0xf07a}, {0x83eb,0xf07b}, {0x83ec,0xf07c}, {0x83ed,0xf07d}, {0x83ee,0xf07e}, {0x83ef,0xf07f}, {0x83f0,0xf080}, {0x83f1,0xf081}, {0x83f2,0xf082}, {0x83f3,0xf083}, {0x83f4,0xf084}, {0x83f5,0xf085}, {0x83f6,0xf086}, {0x83f7,0xf087}, {0x83f8,0xf088}, {0x83f9,0xf089}, {0x83fa,0xf08a}, {0x83fb,0xf08b}, {0x83fc,0xf08c}, {0x83fd,0xf08d}, {0x83fe,0xf08e}, {0x8440,0xf08f}, {0x8441,0xf090}, {0x8442,0xf091}, {0x8443,0xf092}, {0x8444,0xf093}, {0x8445,0xf094}, {0x8446,0xf095}, {0x8447,0xf096}, {0x8448,0xf097}, {0x8449,0xf098}, {0x844a,0xf099}, {0x844b,0xf09a}, {0x844c,0xf09b}, {0x844d,0xf09c}, {0x844e,0xf09d}, {0x844f,0xf09e}, {0x8450,0xf09f}, {0x8451,0xf0a0}, {0x8452,0xf0a1}, {0x8453,0xf0a2}, {0x8454,0xf0a3}, {0x8455,0xf0a4}, {0x8456,0xf0a5}, {0x8457,0xf0a6}, {0x8458,0xf0a7}, {0x8459,0xf0a8}, {0x845a,0xf0a9}, {0x845b,0xf0aa}, {0x845c,0xf0ab}, {0x845d,0xf0ac}, {0x845e,0xf0ad}, {0x845f,0xf0ae}, {0x8460,0xf0af}, {0x8461,0xf0b0}, {0x8462,0xf0b1}, {0x8463,0xf0b2}, {0x8464,0xf0b3}, {0x8465,0xf0b4}, {0x8466,0xf0b5}, {0x8467,0xf0b6}, {0x8468,0xf0b7}, {0x8469,0xf0b8}, {0x846a,0xf0b9}, {0x846b,0xf0ba}, {0x846c,0xf0bb}, {0x846d,0xf0bc}, {0x846e,0xf0bd}, {0x846f,0xf0be}, {0x8470,0xf0bf}, {0x8471,0xf0c0}, {0x8472,0xf0c1}, {0x8473,0xf0c2}, {0x8474,0xf0c3}, {0x8475,0xf0c4}, {0x8476,0xf0c5}, {0x8477,0xf0c6}, {0x8478,0xf0c7}, {0x8479,0xf0c8}, {0x847a,0xf0c9}, {0x847b,0xf0ca}, {0x847c,0xf0cb}, {0x847d,0xf0cc}, {0x847e,0xf0cd}, {0x84a1,0xf0ce}, {0x84a2,0xf0cf}, {0x84a3,0xf0d0}, {0x84a4,0xf0d1}, {0x84a5,0xf0d2}, {0x84a6,0xf0d3}, {0x84a7,0xf0d4}, {0x84a8,0xf0d5}, {0x84a9,0xf0d6}, {0x84aa,0xf0d7}, {0x84ab,0xf0d8}, {0x84ac,0xf0d9}, {0x84ad,0xf0da}, {0x84ae,0xf0db}, {0x84af,0xf0dc}, {0x84b0,0xf0dd}, {0x84b1,0xf0de}, {0x84b2,0xf0df}, {0x84b3,0xf0e0}, {0x84b4,0xf0e1}, {0x84b5,0xf0e2}, {0x84b6,0xf0e3}, {0x84b7,0xf0e4}, {0x84b8,0xf0e5}, {0x84b9,0xf0e6}, {0x84ba,0xf0e7}, {0x84bb,0xf0e8}, {0x84bc,0xf0e9}, {0x84bd,0xf0ea}, {0x84be,0xf0eb}, {0x84bf,0xf0ec}, {0x84c0,0xf0ed}, {0x84c1,0xf0ee}, {0x84c2,0xf0ef}, {0x84c3,0xf0f0}, {0x84c4,0xf0f1}, {0x84c5,0xf0f2}, {0x84c6,0xf0f3}, {0x84c7,0xf0f4}, {0x84c8,0xf0f5}, {0x84c9,0xf0f6}, {0x84ca,0xf0f7}, {0x84cb,0xf0f8}, {0x84cc,0xf0f9}, {0x84cd,0xf0fa}, {0x84ce,0xf0fb}, {0x84cf,0xf0fc}, {0x84d0,0xf0fd}, {0x84d1,0xf0fe}, {0x84d2,0xf0ff}, {0x84d3,0xf100}, {0x84d4,0xf101}, {0x84d5,0xf102}, {0x84d6,0xf103}, {0x84d7,0xf104}, {0x84d8,0xf105}, {0x84d9,0xf106}, {0x84da,0xf107}, {0x84db,0xf108}, {0x84dc,0xf109}, {0x84dd,0xf10a}, {0x84de,0xf10b}, {0x84df,0xf10c}, {0x84e0,0xf10d}, {0x84e1,0xf10e}, {0x84e2,0xf10f}, {0x84e3,0xf110}, {0x84e4,0xf111}, {0x84e5,0xf112}, {0x84e6,0xf113}, {0x84e7,0xf114}, {0x84e8,0xf115}, {0x84e9,0xf116}, {0x84ea,0xf117}, {0x84eb,0xf118}, {0x84ec,0xf119}, {0x84ed,0xf11a}, {0x84ee,0xf11b}, {0x84ef,0xf11c}, {0x84f0,0xf11d}, {0x84f1,0xf11e}, {0x84f2,0xf11f}, {0x84f3,0xf120}, {0x84f4,0xf121}, {0x84f5,0xf122}, {0x84f6,0xf123}, {0x84f7,0xf124}, {0x84f8,0xf125}, {0x84f9,0xf126}, {0x84fa,0xf127}, {0x84fb,0xf128}, {0x84fc,0xf129}, {0x84fd,0xf12a}, {0x84fe,0xf12b}, {0x8540,0xf12c}, {0x8541,0xf12d}, {0x8542,0xf12e}, {0x8543,0xf12f}, {0x8544,0xf130}, {0x8545,0xf131}, {0x8546,0xf132}, {0x8547,0xf133}, {0x8548,0xf134}, {0x8549,0xf135}, {0x854a,0xf136}, {0x854b,0xf137}, {0x854c,0xf138}, {0x854d,0xf139}, {0x854e,0xf13a}, {0x854f,0xf13b}, {0x8550,0xf13c}, {0x8551,0xf13d}, {0x8552,0xf13e}, {0x8553,0xf13f}, {0x8554,0xf140}, {0x8555,0xf141}, {0x8556,0xf142}, {0x8557,0xf143}, {0x8558,0xf144}, {0x8559,0xf145}, {0x855a,0xf146}, {0x855b,0xf147}, {0x855c,0xf148}, {0x855d,0xf149}, {0x855e,0xf14a}, {0x855f,0xf14b}, {0x8560,0xf14c}, {0x8561,0xf14d}, {0x8562,0xf14e}, {0x8563,0xf14f}, {0x8564,0xf150}, {0x8565,0xf151}, {0x8566,0xf152}, {0x8567,0xf153}, {0x8568,0xf154}, {0x8569,0xf155}, {0x856a,0xf156}, {0x856b,0xf157}, {0x856c,0xf158}, {0x856d,0xf159}, {0x856e,0xf15a}, {0x856f,0xf15b}, {0x8570,0xf15c}, {0x8571,0xf15d}, {0x8572,0xf15e}, {0x8573,0xf15f}, {0x8574,0xf160}, {0x8575,0xf161}, {0x8576,0xf162}, {0x8577,0xf163}, {0x8578,0xf164}, {0x8579,0xf165}, {0x857a,0xf166}, {0x857b,0xf167}, {0x857c,0xf168}, {0x857d,0xf169}, {0x857e,0xf16a}, {0x85a1,0xf16b}, {0x85a2,0xf16c}, {0x85a3,0xf16d}, {0x85a4,0xf16e}, {0x85a5,0xf16f}, {0x85a6,0xf170}, {0x85a7,0xf171}, {0x85a8,0xf172}, {0x85a9,0xf173}, {0x85aa,0xf174}, {0x85ab,0xf175}, {0x85ac,0xf176}, {0x85ad,0xf177}, {0x85ae,0xf178}, {0x85af,0xf179}, {0x85b0,0xf17a}, {0x85b1,0xf17b}, {0x85b2,0xf17c}, {0x85b3,0xf17d}, {0x85b4,0xf17e}, {0x85b5,0xf17f}, {0x85b6,0xf180}, {0x85b7,0xf181}, {0x85b8,0xf182}, {0x85b9,0xf183}, {0x85ba,0xf184}, {0x85bb,0xf185}, {0x85bc,0xf186}, {0x85bd,0xf187}, {0x85be,0xf188}, {0x85bf,0xf189}, {0x85c0,0xf18a}, {0x85c1,0xf18b}, {0x85c2,0xf18c}, {0x85c3,0xf18d}, {0x85c4,0xf18e}, {0x85c5,0xf18f}, {0x85c6,0xf190}, {0x85c7,0xf191}, {0x85c8,0xf192}, {0x85c9,0xf193}, {0x85ca,0xf194}, {0x85cb,0xf195}, {0x85cc,0xf196}, {0x85cd,0xf197}, {0x85ce,0xf198}, {0x85cf,0xf199}, {0x85d0,0xf19a}, {0x85d1,0xf19b}, {0x85d2,0xf19c}, {0x85d3,0xf19d}, {0x85d4,0xf19e}, {0x85d5,0xf19f}, {0x85d6,0xf1a0}, {0x85d7,0xf1a1}, {0x85d8,0xf1a2}, {0x85d9,0xf1a3}, {0x85da,0xf1a4}, {0x85db,0xf1a5}, {0x85dc,0xf1a6}, {0x85dd,0xf1a7}, {0x85de,0xf1a8}, {0x85df,0xf1a9}, {0x85e0,0xf1aa}, {0x85e1,0xf1ab}, {0x85e2,0xf1ac}, {0x85e3,0xf1ad}, {0x85e4,0xf1ae}, {0x85e5,0xf1af}, {0x85e6,0xf1b0}, {0x85e7,0xf1b1}, {0x85e8,0xf1b2}, {0x85e9,0xf1b3}, {0x85ea,0xf1b4}, {0x85eb,0xf1b5}, {0x85ec,0xf1b6}, {0x85ed,0xf1b7}, {0x85ee,0xf1b8}, {0x85ef,0xf1b9}, {0x85f0,0xf1ba}, {0x85f1,0xf1bb}, {0x85f2,0xf1bc}, {0x85f3,0xf1bd}, {0x85f4,0xf1be}, {0x85f5,0xf1bf}, {0x85f6,0xf1c0}, {0x85f7,0xf1c1}, {0x85f8,0xf1c2}, {0x85f9,0xf1c3}, {0x85fa,0xf1c4}, {0x85fb,0xf1c5}, {0x85fc,0xf1c6}, {0x85fd,0xf1c7}, {0x85fe,0xf1c8}, {0x8640,0xf1c9}, {0x8641,0xf1ca}, {0x8642,0xf1cb}, {0x8643,0xf1cc}, {0x8644,0xf1cd}, {0x8645,0xf1ce}, {0x8646,0xf1cf}, {0x8647,0xf1d0}, {0x8648,0xf1d1}, {0x8649,0xf1d2}, {0x864a,0xf1d3}, {0x864b,0xf1d4}, {0x864c,0xf1d5}, {0x864d,0xf1d6}, {0x864e,0xf1d7}, {0x864f,0xf1d8}, {0x8650,0xf1d9}, {0x8651,0xf1da}, {0x8652,0xf1db}, {0x8653,0xf1dc}, {0x8654,0xf1dd}, {0x8655,0xf1de}, {0x8656,0xf1df}, {0x8657,0xf1e0}, {0x8658,0xf1e1}, {0x8659,0xf1e2}, {0x865a,0xf1e3}, {0x865b,0xf1e4}, {0x865c,0xf1e5}, {0x865d,0xf1e6}, {0x865e,0xf1e7}, {0x865f,0xf1e8}, {0x8660,0xf1e9}, {0x8661,0xf1ea}, {0x8662,0xf1eb}, {0x8663,0xf1ec}, {0x8664,0xf1ed}, {0x8665,0xf1ee}, {0x8666,0xf1ef}, {0x8667,0xf1f0}, {0x8668,0xf1f1}, {0x8669,0xf1f2}, {0x866a,0xf1f3}, {0x866b,0xf1f4}, {0x866c,0xf1f5}, {0x866d,0xf1f6}, {0x866e,0xf1f7}, {0x866f,0xf1f8}, {0x8670,0xf1f9}, {0x8671,0xf1fa}, {0x8672,0xf1fb}, {0x8673,0xf1fc}, {0x8674,0xf1fd}, {0x8675,0xf1fe}, {0x8676,0xf1ff}, {0x8677,0xf200}, {0x8678,0xf201}, {0x8679,0xf202}, {0x867a,0xf203}, {0x867b,0xf204}, {0x867c,0xf205}, {0x867d,0xf206}, {0x867e,0xf207}, {0x86a1,0xf208}, {0x86a2,0xf209}, {0x86a3,0xf20a}, {0x86a4,0xf20b}, {0x86a5,0xf20c}, {0x86a6,0xf20d}, {0x86a7,0xf20e}, {0x86a8,0xf20f}, {0x86a9,0xf210}, {0x86aa,0xf211}, {0x86ab,0xf212}, {0x86ac,0xf213}, {0x86ad,0xf214}, {0x86ae,0xf215}, {0x86af,0xf216}, {0x86b0,0xf217}, {0x86b1,0xf218}, {0x86b2,0xf219}, {0x86b3,0xf21a}, {0x86b4,0xf21b}, {0x86b5,0xf21c}, {0x86b6,0xf21d}, {0x86b7,0xf21e}, {0x86b8,0xf21f}, {0x86b9,0xf220}, {0x86ba,0xf221}, {0x86bb,0xf222}, {0x86bc,0xf223}, {0x86bd,0xf224}, {0x86be,0xf225}, {0x86bf,0xf226}, {0x86c0,0xf227}, {0x86c1,0xf228}, {0x86c2,0xf229}, {0x86c3,0xf22a}, {0x86c4,0xf22b}, {0x86c5,0xf22c}, {0x86c6,0xf22d}, {0x86c7,0xf22e}, {0x86c8,0xf22f}, {0x86c9,0xf230}, {0x86ca,0xf231}, {0x86cb,0xf232}, {0x86cc,0xf233}, {0x86cd,0xf234}, {0x86ce,0xf235}, {0x86cf,0xf236}, {0x86d0,0xf237}, {0x86d1,0xf238}, {0x86d2,0xf239}, {0x86d3,0xf23a}, {0x86d4,0xf23b}, {0x86d5,0xf23c}, {0x86d6,0xf23d}, {0x86d7,0xf23e}, {0x86d8,0xf23f}, {0x86d9,0xf240}, {0x86da,0xf241}, {0x86db,0xf242}, {0x86dc,0xf243}, {0x86dd,0xf244}, {0x86de,0xf245}, {0x86df,0xf246}, {0x86e0,0xf247}, {0x86e1,0xf248}, {0x86e2,0xf249}, {0x86e3,0xf24a}, {0x86e4,0xf24b}, {0x86e5,0xf24c}, {0x86e6,0xf24d}, {0x86e7,0xf24e}, {0x86e8,0xf24f}, {0x86e9,0xf250}, {0x86ea,0xf251}, {0x86eb,0xf252}, {0x86ec,0xf253}, {0x86ed,0xf254}, {0x86ee,0xf255}, {0x86ef,0xf256}, {0x86f0,0xf257}, {0x86f1,0xf258}, {0x86f2,0xf259}, {0x86f3,0xf25a}, {0x86f4,0xf25b}, {0x86f5,0xf25c}, {0x86f6,0xf25d}, {0x86f7,0xf25e}, {0x86f8,0xf25f}, {0x86f9,0xf260}, {0x86fa,0xf261}, {0x86fb,0xf262}, {0x86fc,0xf263}, {0x86fd,0xf264}, {0x86fe,0xf265}, {0x8740,0xf266}, {0x8741,0xf267}, {0x8742,0xf268}, {0x8743,0xf269}, {0x8744,0xf26a}, {0x8745,0xf26b}, {0x8746,0xf26c}, {0x8747,0xf26d}, {0x8748,0xf26e}, {0x8749,0xf26f}, {0x874a,0xf270}, {0x874b,0xf271}, {0x874c,0xf272}, {0x874d,0xf273}, {0x874e,0xf274}, {0x874f,0xf275}, {0x8750,0xf276}, {0x8751,0xf277}, {0x8752,0xf278}, {0x8753,0xf279}, {0x8754,0xf27a}, {0x8755,0xf27b}, {0x8756,0xf27c}, {0x8757,0xf27d}, {0x8758,0xf27e}, {0x8759,0xf27f}, {0x875a,0xf280}, {0x875b,0xf281}, {0x875c,0xf282}, {0x875d,0xf283}, {0x875e,0xf284}, {0x875f,0xf285}, {0x8760,0xf286}, {0x8761,0xf287}, {0x8762,0xf288}, {0x8763,0xf289}, {0x8764,0xf28a}, {0x8765,0xf28b}, {0x8766,0xf28c}, {0x8767,0xf28d}, {0x8768,0xf28e}, {0x8769,0xf28f}, {0x876a,0xf290}, {0x876b,0xf291}, {0x876c,0xf292}, {0x876d,0xf293}, {0x876e,0xf294}, {0x876f,0xf295}, {0x8770,0xf296}, {0x8771,0xf297}, {0x8772,0xf298}, {0x8773,0xf299}, {0x8774,0xf29a}, {0x8775,0xf29b}, {0x8776,0xf29c}, {0x8777,0xf29d}, {0x8778,0xf29e}, {0x8779,0xf29f}, {0x877a,0xf2a0}, {0x877b,0xf2a1}, {0x877c,0xf2a2}, {0x877d,0xf2a3}, {0x877e,0xf2a4}, {0x87a1,0xf2a5}, {0x87a2,0xf2a6}, {0x87a3,0xf2a7}, {0x87a4,0xf2a8}, {0x87a5,0xf2a9}, {0x87a6,0xf2aa}, {0x87a7,0xf2ab}, {0x87a8,0xf2ac}, {0x87a9,0xf2ad}, {0x87aa,0xf2ae}, {0x87ab,0xf2af}, {0x87ac,0xf2b0}, {0x87ad,0xf2b1}, {0x87ae,0xf2b2}, {0x87af,0xf2b3}, {0x87b0,0xf2b4}, {0x87b1,0xf2b5}, {0x87b2,0xf2b6}, {0x87b3,0xf2b7}, {0x87b4,0xf2b8}, {0x87b5,0xf2b9}, {0x87b6,0xf2ba}, {0x87b7,0xf2bb}, {0x87b8,0xf2bc}, {0x87b9,0xf2bd}, {0x87ba,0xf2be}, {0x87bb,0xf2bf}, {0x87bc,0xf2c0}, {0x87bd,0xf2c1}, {0x87be,0xf2c2}, {0x87bf,0xf2c3}, {0x87c0,0xf2c4}, {0x87c1,0xf2c5}, {0x87c2,0xf2c6}, {0x87c3,0xf2c7}, {0x87c4,0xf2c8}, {0x87c5,0xf2c9}, {0x87c6,0xf2ca}, {0x87c7,0xf2cb}, {0x87c8,0xf2cc}, {0x87c9,0xf2cd}, {0x87ca,0xf2ce}, {0x87cb,0xf2cf}, {0x87cc,0xf2d0}, {0x87cd,0xf2d1}, {0x87ce,0xf2d2}, {0x87cf,0xf2d3}, {0x87d0,0xf2d4}, {0x87d1,0xf2d5}, {0x87d2,0xf2d6}, {0x87d3,0xf2d7}, {0x87d4,0xf2d8}, {0x87d5,0xf2d9}, {0x87d6,0xf2da}, {0x87d7,0xf2db}, {0x87d8,0xf2dc}, {0x87d9,0xf2dd}, {0x87da,0xf2de}, {0x87db,0xf2df}, {0x87dc,0xf2e0}, {0x87dd,0xf2e1}, {0x87de,0xf2e2}, {0x87df,0xf2e3}, {0x87e0,0xf2e4}, {0x87e1,0xf2e5}, {0x87e2,0xf2e6}, {0x87e3,0xf2e7}, {0x87e4,0xf2e8}, {0x87e5,0xf2e9}, {0x87e6,0xf2ea}, {0x87e7,0xf2eb}, {0x87e8,0xf2ec}, {0x87e9,0xf2ed}, {0x87ea,0xf2ee}, {0x87eb,0xf2ef}, {0x87ec,0xf2f0}, {0x87ed,0xf2f1}, {0x87ee,0xf2f2}, {0x87ef,0xf2f3}, {0x87f0,0xf2f4}, {0x87f1,0xf2f5}, {0x87f2,0xf2f6}, {0x87f3,0xf2f7}, {0x87f4,0xf2f8}, {0x87f5,0xf2f9}, {0x87f6,0xf2fa}, {0x87f7,0xf2fb}, {0x87f8,0xf2fc}, {0x87f9,0xf2fd}, {0x87fa,0xf2fe}, {0x87fb,0xf2ff}, {0x87fc,0xf300}, {0x87fd,0xf301}, {0x87fe,0xf302}, {0x8840,0xf303}, {0x8841,0xf304}, {0x8842,0xf305}, {0x8843,0xf306}, {0x8844,0xf307}, {0x8845,0xf308}, {0x8846,0xf309}, {0x8847,0xf30a}, {0x8848,0xf30b}, {0x8849,0xf30c}, {0x884a,0xf30d}, {0x884b,0xf30e}, {0x884c,0xf30f}, {0x884d,0xf310}, {0x884e,0xf311}, {0x884f,0xf312}, {0x8850,0xf313}, {0x8851,0xf314}, {0x8852,0xf315}, {0x8853,0xf316}, {0x8854,0xf317}, {0x8855,0xf318}, {0x8856,0xf319}, {0x8857,0xf31a}, {0x8858,0xf31b}, {0x8859,0xf31c}, {0x885a,0xf31d}, {0x885b,0xf31e}, {0x885c,0xf31f}, {0x885d,0xf320}, {0x885e,0xf321}, {0x885f,0xf322}, {0x8860,0xf323}, {0x8861,0xf324}, {0x8862,0xf325}, {0x8863,0xf326}, {0x8864,0xf327}, {0x8865,0xf328}, {0x8866,0xf329}, {0x8867,0xf32a}, {0x8868,0xf32b}, {0x8869,0xf32c}, {0x886a,0xf32d}, {0x886b,0xf32e}, {0x886c,0xf32f}, {0x886d,0xf330}, {0x886e,0xf331}, {0x886f,0xf332}, {0x8870,0xf333}, {0x8871,0xf334}, {0x8872,0xf335}, {0x8873,0xf336}, {0x8874,0xf337}, {0x8875,0xf338}, {0x8876,0xf339}, {0x8877,0xf33a}, {0x8878,0xf33b}, {0x8879,0xf33c}, {0x887a,0xf33d}, {0x887b,0xf33e}, {0x887c,0xf33f}, {0x887d,0xf340}, {0x887e,0xf341}, {0x88a1,0xf342}, {0x88a2,0xf343}, {0x88a3,0xf344}, {0x88a4,0xf345}, {0x88a5,0xf346}, {0x88a6,0xf347}, {0x88a7,0xf348}, {0x88a8,0xf349}, {0x88a9,0xf34a}, {0x88aa,0xf34b}, {0x88ab,0xf34c}, {0x88ac,0xf34d}, {0x88ad,0xf34e}, {0x88ae,0xf34f}, {0x88af,0xf350}, {0x88b0,0xf351}, {0x88b1,0xf352}, {0x88b2,0xf353}, {0x88b3,0xf354}, {0x88b4,0xf355}, {0x88b5,0xf356}, {0x88b6,0xf357}, {0x88b7,0xf358}, {0x88b8,0xf359}, {0x88b9,0xf35a}, {0x88ba,0xf35b}, {0x88bb,0xf35c}, {0x88bc,0xf35d}, {0x88bd,0xf35e}, {0x88be,0xf35f}, {0x88bf,0xf360}, {0x88c0,0xf361}, {0x88c1,0xf362}, {0x88c2,0xf363}, {0x88c3,0xf364}, {0x88c4,0xf365}, {0x88c5,0xf366}, {0x88c6,0xf367}, {0x88c7,0xf368}, {0x88c8,0xf369}, {0x88c9,0xf36a}, {0x88ca,0xf36b}, {0x88cb,0xf36c}, {0x88cc,0xf36d}, {0x88cd,0xf36e}, {0x88ce,0xf36f}, {0x88cf,0xf370}, {0x88d0,0xf371}, {0x88d1,0xf372}, {0x88d2,0xf373}, {0x88d3,0xf374}, {0x88d4,0xf375}, {0x88d5,0xf376}, {0x88d6,0xf377}, {0x88d7,0xf378}, {0x88d8,0xf379}, {0x88d9,0xf37a}, {0x88da,0xf37b}, {0x88db,0xf37c}, {0x88dc,0xf37d}, {0x88dd,0xf37e}, {0x88de,0xf37f}, {0x88df,0xf380}, {0x88e0,0xf381}, {0x88e1,0xf382}, {0x88e2,0xf383}, {0x88e3,0xf384}, {0x88e4,0xf385}, {0x88e5,0xf386}, {0x88e6,0xf387}, {0x88e7,0xf388}, {0x88e8,0xf389}, {0x88e9,0xf38a}, {0x88ea,0xf38b}, {0x88eb,0xf38c}, {0x88ec,0xf38d}, {0x88ed,0xf38e}, {0x88ee,0xf38f}, {0x88ef,0xf390}, {0x88f0,0xf391}, {0x88f1,0xf392}, {0x88f2,0xf393}, {0x88f3,0xf394}, {0x88f4,0xf395}, {0x88f5,0xf396}, {0x88f6,0xf397}, {0x88f7,0xf398}, {0x88f8,0xf399}, {0x88f9,0xf39a}, {0x88fa,0xf39b}, {0x88fb,0xf39c}, {0x88fc,0xf39d}, {0x88fd,0xf39e}, {0x88fe,0xf39f}, {0x8940,0xf3a0}, {0x8941,0xf3a1}, {0x8942,0xf3a2}, {0x8943,0xf3a3}, {0x8944,0xf3a4}, {0x8945,0xf3a5}, {0x8946,0xf3a6}, {0x8947,0xf3a7}, {0x8948,0xf3a8}, {0x8949,0xf3a9}, {0x894a,0xf3aa}, {0x894b,0xf3ab}, {0x894c,0xf3ac}, {0x894d,0xf3ad}, {0x894e,0xf3ae}, {0x894f,0xf3af}, {0x8950,0xf3b0}, {0x8951,0xf3b1}, {0x8952,0xf3b2}, {0x8953,0xf3b3}, {0x8954,0xf3b4}, {0x8955,0xf3b5}, {0x8956,0xf3b6}, {0x8957,0xf3b7}, {0x8958,0xf3b8}, {0x8959,0xf3b9}, {0x895a,0xf3ba}, {0x895b,0xf3bb}, {0x895c,0xf3bc}, {0x895d,0xf3bd}, {0x895e,0xf3be}, {0x895f,0xf3bf}, {0x8960,0xf3c0}, {0x8961,0xf3c1}, {0x8962,0xf3c2}, {0x8963,0xf3c3}, {0x8964,0xf3c4}, {0x8965,0xf3c5}, {0x8966,0xf3c6}, {0x8967,0xf3c7}, {0x8968,0xf3c8}, {0x8969,0xf3c9}, {0x896a,0xf3ca}, {0x896b,0xf3cb}, {0x896c,0xf3cc}, {0x896d,0xf3cd}, {0x896e,0xf3ce}, {0x896f,0xf3cf}, {0x8970,0xf3d0}, {0x8971,0xf3d1}, {0x8972,0xf3d2}, {0x8973,0xf3d3}, {0x8974,0xf3d4}, {0x8975,0xf3d5}, {0x8976,0xf3d6}, {0x8977,0xf3d7}, {0x8978,0xf3d8}, {0x8979,0xf3d9}, {0x897a,0xf3da}, {0x897b,0xf3db}, {0x897c,0xf3dc}, {0x897d,0xf3dd}, {0x897e,0xf3de}, {0x89a1,0xf3df}, {0x89a2,0xf3e0}, {0x89a3,0xf3e1}, {0x89a4,0xf3e2}, {0x89a5,0xf3e3}, {0x89a6,0xf3e4}, {0x89a7,0xf3e5}, {0x89a8,0xf3e6}, {0x89a9,0xf3e7}, {0x89aa,0xf3e8}, {0x89ab,0xf3e9}, {0x89ac,0xf3ea}, {0x89ad,0xf3eb}, {0x89ae,0xf3ec}, {0x89af,0xf3ed}, {0x89b0,0xf3ee}, {0x89b1,0xf3ef}, {0x89b2,0xf3f0}, {0x89b3,0xf3f1}, {0x89b4,0xf3f2}, {0x89b5,0xf3f3}, {0x89b6,0xf3f4}, {0x89b7,0xf3f5}, {0x89b8,0xf3f6}, {0x89b9,0xf3f7}, {0x89ba,0xf3f8}, {0x89bb,0xf3f9}, {0x89bc,0xf3fa}, {0x89bd,0xf3fb}, {0x89be,0xf3fc}, {0x89bf,0xf3fd}, {0x89c0,0xf3fe}, {0x89c1,0xf3ff}, {0x89c2,0xf400}, {0x89c3,0xf401}, {0x89c4,0xf402}, {0x89c5,0xf403}, {0x89c6,0xf404}, {0x89c7,0xf405}, {0x89c8,0xf406}, {0x89c9,0xf407}, {0x89ca,0xf408}, {0x89cb,0xf409}, {0x89cc,0xf40a}, {0x89cd,0xf40b}, {0x89ce,0xf40c}, {0x89cf,0xf40d}, {0x89d0,0xf40e}, {0x89d1,0xf40f}, {0x89d2,0xf410}, {0x89d3,0xf411}, {0x89d4,0xf412}, {0x89d5,0xf413}, {0x89d6,0xf414}, {0x89d7,0xf415}, {0x89d8,0xf416}, {0x89d9,0xf417}, {0x89da,0xf418}, {0x89db,0xf419}, {0x89dc,0xf41a}, {0x89dd,0xf41b}, {0x89de,0xf41c}, {0x89df,0xf41d}, {0x89e0,0xf41e}, {0x89e1,0xf41f}, {0x89e2,0xf420}, {0x89e3,0xf421}, {0x89e4,0xf422}, {0x89e5,0xf423}, {0x89e6,0xf424}, {0x89e7,0xf425}, {0x89e8,0xf426}, {0x89e9,0xf427}, {0x89ea,0xf428}, {0x89eb,0xf429}, {0x89ec,0xf42a}, {0x89ed,0xf42b}, {0x89ee,0xf42c}, {0x89ef,0xf42d}, {0x89f0,0xf42e}, {0x89f1,0xf42f}, {0x89f2,0xf430}, {0x89f3,0xf431}, {0x89f4,0xf432}, {0x89f5,0xf433}, {0x89f6,0xf434}, {0x89f7,0xf435}, {0x89f8,0xf436}, {0x89f9,0xf437}, {0x89fa,0xf438}, {0x89fb,0xf439}, {0x89fc,0xf43a}, {0x89fd,0xf43b}, {0x89fe,0xf43c}, {0x8a40,0xf43d}, {0x8a41,0xf43e}, {0x8a42,0xf43f}, {0x8a43,0xf440}, {0x8a44,0xf441}, {0x8a45,0xf442}, {0x8a46,0xf443}, {0x8a47,0xf444}, {0x8a48,0xf445}, {0x8a49,0xf446}, {0x8a4a,0xf447}, {0x8a4b,0xf448}, {0x8a4c,0xf449}, {0x8a4d,0xf44a}, {0x8a4e,0xf44b}, {0x8a4f,0xf44c}, {0x8a50,0xf44d}, {0x8a51,0xf44e}, {0x8a52,0xf44f}, {0x8a53,0xf450}, {0x8a54,0xf451}, {0x8a55,0xf452}, {0x8a56,0xf453}, {0x8a57,0xf454}, {0x8a58,0xf455}, {0x8a59,0xf456}, {0x8a5a,0xf457}, {0x8a5b,0xf458}, {0x8a5c,0xf459}, {0x8a5d,0xf45a}, {0x8a5e,0xf45b}, {0x8a5f,0xf45c}, {0x8a60,0xf45d}, {0x8a61,0xf45e}, {0x8a62,0xf45f}, {0x8a63,0xf460}, {0x8a64,0xf461}, {0x8a65,0xf462}, {0x8a66,0xf463}, {0x8a67,0xf464}, {0x8a68,0xf465}, {0x8a69,0xf466}, {0x8a6a,0xf467}, {0x8a6b,0xf468}, {0x8a6c,0xf469}, {0x8a6d,0xf46a}, {0x8a6e,0xf46b}, {0x8a6f,0xf46c}, {0x8a70,0xf46d}, {0x8a71,0xf46e}, {0x8a72,0xf46f}, {0x8a73,0xf470}, {0x8a74,0xf471}, {0x8a75,0xf472}, {0x8a76,0xf473}, {0x8a77,0xf474}, {0x8a78,0xf475}, {0x8a79,0xf476}, {0x8a7a,0xf477}, {0x8a7b,0xf478}, {0x8a7c,0xf479}, {0x8a7d,0xf47a}, {0x8a7e,0xf47b}, {0x8aa1,0xf47c}, {0x8aa2,0xf47d}, {0x8aa3,0xf47e}, {0x8aa4,0xf47f}, {0x8aa5,0xf480}, {0x8aa6,0xf481}, {0x8aa7,0xf482}, {0x8aa8,0xf483}, {0x8aa9,0xf484}, {0x8aaa,0xf485}, {0x8aab,0xf486}, {0x8aac,0xf487}, {0x8aad,0xf488}, {0x8aae,0xf489}, {0x8aaf,0xf48a}, {0x8ab0,0xf48b}, {0x8ab1,0xf48c}, {0x8ab2,0xf48d}, {0x8ab3,0xf48e}, {0x8ab4,0xf48f}, {0x8ab5,0xf490}, {0x8ab6,0xf491}, {0x8ab7,0xf492}, {0x8ab8,0xf493}, {0x8ab9,0xf494}, {0x8aba,0xf495}, {0x8abb,0xf496}, {0x8abc,0xf497}, {0x8abd,0xf498}, {0x8abe,0xf499}, {0x8abf,0xf49a}, {0x8ac0,0xf49b}, {0x8ac1,0xf49c}, {0x8ac2,0xf49d}, {0x8ac3,0xf49e}, {0x8ac4,0xf49f}, {0x8ac5,0xf4a0}, {0x8ac6,0xf4a1}, {0x8ac7,0xf4a2}, {0x8ac8,0xf4a3}, {0x8ac9,0xf4a4}, {0x8aca,0xf4a5}, {0x8acb,0xf4a6}, {0x8acc,0xf4a7}, {0x8acd,0xf4a8}, {0x8ace,0xf4a9}, {0x8acf,0xf4aa}, {0x8ad0,0xf4ab}, {0x8ad1,0xf4ac}, {0x8ad2,0xf4ad}, {0x8ad3,0xf4ae}, {0x8ad4,0xf4af}, {0x8ad5,0xf4b0}, {0x8ad6,0xf4b1}, {0x8ad7,0xf4b2}, {0x8ad8,0xf4b3}, {0x8ad9,0xf4b4}, {0x8ada,0xf4b5}, {0x8adb,0xf4b6}, {0x8adc,0xf4b7}, {0x8add,0xf4b8}, {0x8ade,0xf4b9}, {0x8adf,0xf4ba}, {0x8ae0,0xf4bb}, {0x8ae1,0xf4bc}, {0x8ae2,0xf4bd}, {0x8ae3,0xf4be}, {0x8ae4,0xf4bf}, {0x8ae5,0xf4c0}, {0x8ae6,0xf4c1}, {0x8ae7,0xf4c2}, {0x8ae8,0xf4c3}, {0x8ae9,0xf4c4}, {0x8aea,0xf4c5}, {0x8aeb,0xf4c6}, {0x8aec,0xf4c7}, {0x8aed,0xf4c8}, {0x8aee,0xf4c9}, {0x8aef,0xf4ca}, {0x8af0,0xf4cb}, {0x8af1,0xf4cc}, {0x8af2,0xf4cd}, {0x8af3,0xf4ce}, {0x8af4,0xf4cf}, {0x8af5,0xf4d0}, {0x8af6,0xf4d1}, {0x8af7,0xf4d2}, {0x8af8,0xf4d3}, {0x8af9,0xf4d4}, {0x8afa,0xf4d5}, {0x8afb,0xf4d6}, {0x8afc,0xf4d7}, {0x8afd,0xf4d8}, {0x8afe,0xf4d9}, {0x8b40,0xf4da}, {0x8b41,0xf4db}, {0x8b42,0xf4dc}, {0x8b43,0xf4dd}, {0x8b44,0xf4de}, {0x8b45,0xf4df}, {0x8b46,0xf4e0}, {0x8b47,0xf4e1}, {0x8b48,0xf4e2}, {0x8b49,0xf4e3}, {0x8b4a,0xf4e4}, {0x8b4b,0xf4e5}, {0x8b4c,0xf4e6}, {0x8b4d,0xf4e7}, {0x8b4e,0xf4e8}, {0x8b4f,0xf4e9}, {0x8b50,0xf4ea}, {0x8b51,0xf4eb}, {0x8b52,0xf4ec}, {0x8b53,0xf4ed}, {0x8b54,0xf4ee}, {0x8b55,0xf4ef}, {0x8b56,0xf4f0}, {0x8b57,0xf4f1}, {0x8b58,0xf4f2}, {0x8b59,0xf4f3}, {0x8b5a,0xf4f4}, {0x8b5b,0xf4f5}, {0x8b5c,0xf4f6}, {0x8b5d,0xf4f7}, {0x8b5e,0xf4f8}, {0x8b5f,0xf4f9}, {0x8b60,0xf4fa}, {0x8b61,0xf4fb}, {0x8b62,0xf4fc}, {0x8b63,0xf4fd}, {0x8b64,0xf4fe}, {0x8b65,0xf4ff}, {0x8b66,0xf500}, {0x8b67,0xf501}, {0x8b68,0xf502}, {0x8b69,0xf503}, {0x8b6a,0xf504}, {0x8b6b,0xf505}, {0x8b6c,0xf506}, {0x8b6d,0xf507}, {0x8b6e,0xf508}, {0x8b6f,0xf509}, {0x8b70,0xf50a}, {0x8b71,0xf50b}, {0x8b72,0xf50c}, {0x8b73,0xf50d}, {0x8b74,0xf50e}, {0x8b75,0xf50f}, {0x8b76,0xf510}, {0x8b77,0xf511}, {0x8b78,0xf512}, {0x8b79,0xf513}, {0x8b7a,0xf514}, {0x8b7b,0xf515}, {0x8b7c,0xf516}, {0x8b7d,0xf517}, {0x8b7e,0xf518}, {0x8ba1,0xf519}, {0x8ba2,0xf51a}, {0x8ba3,0xf51b}, {0x8ba4,0xf51c}, {0x8ba5,0xf51d}, {0x8ba6,0xf51e}, {0x8ba7,0xf51f}, {0x8ba8,0xf520}, {0x8ba9,0xf521}, {0x8baa,0xf522}, {0x8bab,0xf523}, {0x8bac,0xf524}, {0x8bad,0xf525}, {0x8bae,0xf526}, {0x8baf,0xf527}, {0x8bb0,0xf528}, {0x8bb1,0xf529}, {0x8bb2,0xf52a}, {0x8bb3,0xf52b}, {0x8bb4,0xf52c}, {0x8bb5,0xf52d}, {0x8bb6,0xf52e}, {0x8bb7,0xf52f}, {0x8bb8,0xf530}, {0x8bb9,0xf531}, {0x8bba,0xf532}, {0x8bbb,0xf533}, {0x8bbc,0xf534}, {0x8bbd,0xf535}, {0x8bbe,0xf536}, {0x8bbf,0xf537}, {0x8bc0,0xf538}, {0x8bc1,0xf539}, {0x8bc2,0xf53a}, {0x8bc3,0xf53b}, {0x8bc4,0xf53c}, {0x8bc5,0xf53d}, {0x8bc6,0xf53e}, {0x8bc7,0xf53f}, {0x8bc8,0xf540}, {0x8bc9,0xf541}, {0x8bca,0xf542}, {0x8bcb,0xf543}, {0x8bcc,0xf544}, {0x8bcd,0xf545}, {0x8bce,0xf546}, {0x8bcf,0xf547}, {0x8bd0,0xf548}, {0x8bd1,0xf549}, {0x8bd2,0xf54a}, {0x8bd3,0xf54b}, {0x8bd4,0xf54c}, {0x8bd5,0xf54d}, {0x8bd6,0xf54e}, {0x8bd7,0xf54f}, {0x8bd8,0xf550}, {0x8bd9,0xf551}, {0x8bda,0xf552}, {0x8bdb,0xf553}, {0x8bdc,0xf554}, {0x8bdd,0xf555}, {0x8bde,0xf556}, {0x8bdf,0xf557}, {0x8be0,0xf558}, {0x8be1,0xf559}, {0x8be2,0xf55a}, {0x8be3,0xf55b}, {0x8be4,0xf55c}, {0x8be5,0xf55d}, {0x8be6,0xf55e}, {0x8be7,0xf55f}, {0x8be8,0xf560}, {0x8be9,0xf561}, {0x8bea,0xf562}, {0x8beb,0xf563}, {0x8bec,0xf564}, {0x8bed,0xf565}, {0x8bee,0xf566}, {0x8bef,0xf567}, {0x8bf0,0xf568}, {0x8bf1,0xf569}, {0x8bf2,0xf56a}, {0x8bf3,0xf56b}, {0x8bf4,0xf56c}, {0x8bf5,0xf56d}, {0x8bf6,0xf56e}, {0x8bf7,0xf56f}, {0x8bf8,0xf570}, {0x8bf9,0xf571}, {0x8bfa,0xf572}, {0x8bfb,0xf573}, {0x8bfc,0xf574}, {0x8bfd,0xf575}, {0x8bfe,0xf576}, {0x8c40,0xf577}, {0x8c41,0xf578}, {0x8c42,0xf579}, {0x8c43,0xf57a}, {0x8c44,0xf57b}, {0x8c45,0xf57c}, {0x8c46,0xf57d}, {0x8c47,0xf57e}, {0x8c48,0xf57f}, {0x8c49,0xf580}, {0x8c4a,0xf581}, {0x8c4b,0xf582}, {0x8c4c,0xf583}, {0x8c4d,0xf584}, {0x8c4e,0xf585}, {0x8c4f,0xf586}, {0x8c50,0xf587}, {0x8c51,0xf588}, {0x8c52,0xf589}, {0x8c53,0xf58a}, {0x8c54,0xf58b}, {0x8c55,0xf58c}, {0x8c56,0xf58d}, {0x8c57,0xf58e}, {0x8c58,0xf58f}, {0x8c59,0xf590}, {0x8c5a,0xf591}, {0x8c5b,0xf592}, {0x8c5c,0xf593}, {0x8c5d,0xf594}, {0x8c5e,0xf595}, {0x8c5f,0xf596}, {0x8c60,0xf597}, {0x8c61,0xf598}, {0x8c62,0xf599}, {0x8c63,0xf59a}, {0x8c64,0xf59b}, {0x8c65,0xf59c}, {0x8c66,0xf59d}, {0x8c67,0xf59e}, {0x8c68,0xf59f}, {0x8c69,0xf5a0}, {0x8c6a,0xf5a1}, {0x8c6b,0xf5a2}, {0x8c6c,0xf5a3}, {0x8c6d,0xf5a4}, {0x8c6e,0xf5a5}, {0x8c6f,0xf5a6}, {0x8c70,0xf5a7}, {0x8c71,0xf5a8}, {0x8c72,0xf5a9}, {0x8c73,0xf5aa}, {0x8c74,0xf5ab}, {0x8c75,0xf5ac}, {0x8c76,0xf5ad}, {0x8c77,0xf5ae}, {0x8c78,0xf5af}, {0x8c79,0xf5b0}, {0x8c7a,0xf5b1}, {0x8c7b,0xf5b2}, {0x8c7c,0xf5b3}, {0x8c7d,0xf5b4}, {0x8c7e,0xf5b5}, {0x8ca1,0xf5b6}, {0x8ca2,0xf5b7}, {0x8ca3,0xf5b8}, {0x8ca4,0xf5b9}, {0x8ca5,0xf5ba}, {0x8ca6,0xf5bb}, {0x8ca7,0xf5bc}, {0x8ca8,0xf5bd}, {0x8ca9,0xf5be}, {0x8caa,0xf5bf}, {0x8cab,0xf5c0}, {0x8cac,0xf5c1}, {0x8cad,0xf5c2}, {0x8cae,0xf5c3}, {0x8caf,0xf5c4}, {0x8cb0,0xf5c5}, {0x8cb1,0xf5c6}, {0x8cb2,0xf5c7}, {0x8cb3,0xf5c8}, {0x8cb4,0xf5c9}, {0x8cb5,0xf5ca}, {0x8cb6,0xf5cb}, {0x8cb7,0xf5cc}, {0x8cb8,0xf5cd}, {0x8cb9,0xf5ce}, {0x8cba,0xf5cf}, {0x8cbb,0xf5d0}, {0x8cbc,0xf5d1}, {0x8cbd,0xf5d2}, {0x8cbe,0xf5d3}, {0x8cbf,0xf5d4}, {0x8cc0,0xf5d5}, {0x8cc1,0xf5d6}, {0x8cc2,0xf5d7}, {0x8cc3,0xf5d8}, {0x8cc4,0xf5d9}, {0x8cc5,0xf5da}, {0x8cc6,0xf5db}, {0x8cc7,0xf5dc}, {0x8cc8,0xf5dd}, {0x8cc9,0xf5de}, {0x8cca,0xf5df}, {0x8ccb,0xf5e0}, {0x8ccc,0xf5e1}, {0x8ccd,0xf5e2}, {0x8cce,0xf5e3}, {0x8ccf,0xf5e4}, {0x8cd0,0xf5e5}, {0x8cd1,0xf5e6}, {0x8cd2,0xf5e7}, {0x8cd3,0xf5e8}, {0x8cd4,0xf5e9}, {0x8cd5,0xf5ea}, {0x8cd6,0xf5eb}, {0x8cd7,0xf5ec}, {0x8cd8,0xf5ed}, {0x8cd9,0xf5ee}, {0x8cda,0xf5ef}, {0x8cdb,0xf5f0}, {0x8cdc,0xf5f1}, {0x8cdd,0xf5f2}, {0x8cde,0xf5f3}, {0x8cdf,0xf5f4}, {0x8ce0,0xf5f5}, {0x8ce1,0xf5f6}, {0x8ce2,0xf5f7}, {0x8ce3,0xf5f8}, {0x8ce4,0xf5f9}, {0x8ce5,0xf5fa}, {0x8ce6,0xf5fb}, {0x8ce7,0xf5fc}, {0x8ce8,0xf5fd}, {0x8ce9,0xf5fe}, {0x8cea,0xf5ff}, {0x8ceb,0xf600}, {0x8cec,0xf601}, {0x8ced,0xf602}, {0x8cee,0xf603}, {0x8cef,0xf604}, {0x8cf0,0xf605}, {0x8cf1,0xf606}, {0x8cf2,0xf607}, {0x8cf3,0xf608}, {0x8cf4,0xf609}, {0x8cf5,0xf60a}, {0x8cf6,0xf60b}, {0x8cf7,0xf60c}, {0x8cf8,0xf60d}, {0x8cf9,0xf60e}, {0x8cfa,0xf60f}, {0x8cfb,0xf610}, {0x8cfc,0xf611}, {0x8cfd,0xf612}, {0x8cfe,0xf613}, {0x8d40,0xf614}, {0x8d41,0xf615}, {0x8d42,0xf616}, {0x8d43,0xf617}, {0x8d44,0xf618}, {0x8d45,0xf619}, {0x8d46,0xf61a}, {0x8d47,0xf61b}, {0x8d48,0xf61c}, {0x8d49,0xf61d}, {0x8d4a,0xf61e}, {0x8d4b,0xf61f}, {0x8d4c,0xf620}, {0x8d4d,0xf621}, {0x8d4e,0xf622}, {0x8d4f,0xf623}, {0x8d50,0xf624}, {0x8d51,0xf625}, {0x8d52,0xf626}, {0x8d53,0xf627}, {0x8d54,0xf628}, {0x8d55,0xf629}, {0x8d56,0xf62a}, {0x8d57,0xf62b}, {0x8d58,0xf62c}, {0x8d59,0xf62d}, {0x8d5a,0xf62e}, {0x8d5b,0xf62f}, {0x8d5c,0xf630}, {0x8d5d,0xf631}, {0x8d5e,0xf632}, {0x8d5f,0xf633}, {0x8d60,0xf634}, {0x8d61,0xf635}, {0x8d62,0xf636}, {0x8d63,0xf637}, {0x8d64,0xf638}, {0x8d65,0xf639}, {0x8d66,0xf63a}, {0x8d67,0xf63b}, {0x8d68,0xf63c}, {0x8d69,0xf63d}, {0x8d6a,0xf63e}, {0x8d6b,0xf63f}, {0x8d6c,0xf640}, {0x8d6d,0xf641}, {0x8d6e,0xf642}, {0x8d6f,0xf643}, {0x8d70,0xf644}, {0x8d71,0xf645}, {0x8d72,0xf646}, {0x8d73,0xf647}, {0x8d74,0xf648}, {0x8d75,0xf649}, {0x8d76,0xf64a}, {0x8d77,0xf64b}, {0x8d78,0xf64c}, {0x8d79,0xf64d}, {0x8d7a,0xf64e}, {0x8d7b,0xf64f}, {0x8d7c,0xf650}, {0x8d7d,0xf651}, {0x8d7e,0xf652}, {0x8da1,0xf653}, {0x8da2,0xf654}, {0x8da3,0xf655}, {0x8da4,0xf656}, {0x8da5,0xf657}, {0x8da6,0xf658}, {0x8da7,0xf659}, {0x8da8,0xf65a}, {0x8da9,0xf65b}, {0x8daa,0xf65c}, {0x8dab,0xf65d}, {0x8dac,0xf65e}, {0x8dad,0xf65f}, {0x8dae,0xf660}, {0x8daf,0xf661}, {0x8db0,0xf662}, {0x8db1,0xf663}, {0x8db2,0xf664}, {0x8db3,0xf665}, {0x8db4,0xf666}, {0x8db5,0xf667}, {0x8db6,0xf668}, {0x8db7,0xf669}, {0x8db8,0xf66a}, {0x8db9,0xf66b}, {0x8dba,0xf66c}, {0x8dbb,0xf66d}, {0x8dbc,0xf66e}, {0x8dbd,0xf66f}, {0x8dbe,0xf670}, {0x8dbf,0xf671}, {0x8dc0,0xf672}, {0x8dc1,0xf673}, {0x8dc2,0xf674}, {0x8dc3,0xf675}, {0x8dc4,0xf676}, {0x8dc5,0xf677}, {0x8dc6,0xf678}, {0x8dc7,0xf679}, {0x8dc8,0xf67a}, {0x8dc9,0xf67b}, {0x8dca,0xf67c}, {0x8dcb,0xf67d}, {0x8dcc,0xf67e}, {0x8dcd,0xf67f}, {0x8dce,0xf680}, {0x8dcf,0xf681}, {0x8dd0,0xf682}, {0x8dd1,0xf683}, {0x8dd2,0xf684}, {0x8dd3,0xf685}, {0x8dd4,0xf686}, {0x8dd5,0xf687}, {0x8dd6,0xf688}, {0x8dd7,0xf689}, {0x8dd8,0xf68a}, {0x8dd9,0xf68b}, {0x8dda,0xf68c}, {0x8ddb,0xf68d}, {0x8ddc,0xf68e}, {0x8ddd,0xf68f}, {0x8dde,0xf690}, {0x8ddf,0xf691}, {0x8de0,0xf692}, {0x8de1,0xf693}, {0x8de2,0xf694}, {0x8de3,0xf695}, {0x8de4,0xf696}, {0x8de5,0xf697}, {0x8de6,0xf698}, {0x8de7,0xf699}, {0x8de8,0xf69a}, {0x8de9,0xf69b}, {0x8dea,0xf69c}, {0x8deb,0xf69d}, {0x8dec,0xf69e}, {0x8ded,0xf69f}, {0x8dee,0xf6a0}, {0x8def,0xf6a1}, {0x8df0,0xf6a2}, {0x8df1,0xf6a3}, {0x8df2,0xf6a4}, {0x8df3,0xf6a5}, {0x8df4,0xf6a6}, {0x8df5,0xf6a7}, {0x8df6,0xf6a8}, {0x8df7,0xf6a9}, {0x8df8,0xf6aa}, {0x8df9,0xf6ab}, {0x8dfa,0xf6ac}, {0x8dfb,0xf6ad}, {0x8dfc,0xf6ae}, {0x8dfd,0xf6af}, {0x8dfe,0xf6b0}, }; static const B5Map b5_8E40_to_uc_map[2983] = { {0x8e40,0xe311}, {0x8e41,0xe312}, {0x8e42,0xe313}, {0x8e43,0xe314}, {0x8e44,0xe315}, {0x8e45,0xe316}, {0x8e46,0xe317}, {0x8e47,0xe318}, {0x8e48,0xe319}, {0x8e49,0xe31a}, {0x8e4a,0xe31b}, {0x8e4b,0xe31c}, {0x8e4c,0xe31d}, {0x8e4d,0xe31e}, {0x8e4e,0xe31f}, {0x8e4f,0xe320}, {0x8e50,0xe321}, {0x8e51,0xe322}, {0x8e52,0xe323}, {0x8e53,0xe324}, {0x8e54,0xe325}, {0x8e55,0xe326}, {0x8e56,0xe327}, {0x8e57,0xe328}, {0x8e58,0xe329}, {0x8e59,0xe32a}, {0x8e5a,0xe32b}, {0x8e5b,0xe32c}, {0x8e5c,0xe32d}, {0x8e5d,0xe32e}, {0x8e5e,0xe32f}, {0x8e5f,0xe330}, {0x8e60,0xe331}, {0x8e61,0xe332}, {0x8e62,0xe333}, {0x8e63,0xe334}, {0x8e64,0xe335}, {0x8e65,0xe336}, {0x8e66,0xe337}, {0x8e67,0xe338}, {0x8e68,0xe339}, {0x8e69,0xe33a}, {0x8e6a,0xe33b}, {0x8e6b,0xe33c}, {0x8e6c,0xe33d}, {0x8e6d,0xe33e}, {0x8e6e,0xe33f}, {0x8e6f,0xe340}, {0x8e70,0xe341}, {0x8e71,0xe342}, {0x8e72,0xe343}, {0x8e73,0xe344}, {0x8e74,0xe345}, {0x8e75,0xe346}, {0x8e76,0xe347}, {0x8e77,0xe348}, {0x8e78,0xe349}, {0x8e79,0xe34a}, {0x8e7a,0xe34b}, {0x8e7b,0xe34c}, {0x8e7c,0xe34d}, {0x8e7d,0xe34e}, {0x8e7e,0xe34f}, {0x8ea1,0xe350}, {0x8ea2,0xe351}, {0x8ea3,0xe352}, {0x8ea4,0xe353}, {0x8ea5,0xe354}, {0x8ea6,0xe355}, {0x8ea7,0xe356}, {0x8ea8,0xe357}, {0x8ea9,0xe358}, {0x8eaa,0xe359}, {0x8eab,0xe35a}, {0x8eac,0xe35b}, {0x8ead,0xe35c}, {0x8eae,0xe35d}, {0x8eaf,0xe35e}, {0x8eb0,0xe35f}, {0x8eb1,0xe360}, {0x8eb2,0xe361}, {0x8eb3,0xe362}, {0x8eb4,0xe363}, {0x8eb5,0xe364}, {0x8eb6,0xe365}, {0x8eb7,0xe366}, {0x8eb8,0xe367}, {0x8eb9,0xe368}, {0x8eba,0xe369}, {0x8ebb,0xe36a}, {0x8ebc,0xe36b}, {0x8ebd,0xe36c}, {0x8ebe,0xe36d}, {0x8ebf,0xe36e}, {0x8ec0,0xe36f}, {0x8ec1,0xe370}, {0x8ec2,0xe371}, {0x8ec3,0xe372}, {0x8ec4,0xe373}, {0x8ec5,0xe374}, {0x8ec6,0xe375}, {0x8ec7,0xe376}, {0x8ec8,0xe377}, {0x8ec9,0xe378}, {0x8eca,0xe379}, {0x8ecb,0xe37a}, {0x8ecc,0xe37b}, {0x8ecd,0xe37c}, {0x8ece,0xe37d}, {0x8ecf,0xe37e}, {0x8ed0,0xe37f}, {0x8ed1,0xe380}, {0x8ed2,0xe381}, {0x8ed3,0xe382}, {0x8ed4,0xe383}, {0x8ed5,0xe384}, {0x8ed6,0xe385}, {0x8ed7,0xe386}, {0x8ed8,0xe387}, {0x8ed9,0xe388}, {0x8eda,0xe389}, {0x8edb,0xe38a}, {0x8edc,0xe38b}, {0x8edd,0xe38c}, {0x8ede,0xe38d}, {0x8edf,0xe38e}, {0x8ee0,0xe38f}, {0x8ee1,0xe390}, {0x8ee2,0xe391}, {0x8ee3,0xe392}, {0x8ee4,0xe393}, {0x8ee5,0xe394}, {0x8ee6,0xe395}, {0x8ee7,0xe396}, {0x8ee8,0xe397}, {0x8ee9,0xe398}, {0x8eea,0xe399}, {0x8eeb,0xe39a}, {0x8eec,0xe39b}, {0x8eed,0xe39c}, {0x8eee,0xe39d}, {0x8eef,0xe39e}, {0x8ef0,0xe39f}, {0x8ef1,0xe3a0}, {0x8ef2,0xe3a1}, {0x8ef3,0xe3a2}, {0x8ef4,0xe3a3}, {0x8ef5,0xe3a4}, {0x8ef6,0xe3a5}, {0x8ef7,0xe3a6}, {0x8ef8,0xe3a7}, {0x8ef9,0xe3a8}, {0x8efa,0xe3a9}, {0x8efb,0xe3aa}, {0x8efc,0xe3ab}, {0x8efd,0xe3ac}, {0x8efe,0xe3ad}, {0x8f40,0xe3ae}, {0x8f41,0xe3af}, {0x8f42,0xe3b0}, {0x8f43,0xe3b1}, {0x8f44,0xe3b2}, {0x8f45,0xe3b3}, {0x8f46,0xe3b4}, {0x8f47,0xe3b5}, {0x8f48,0xe3b6}, {0x8f49,0xe3b7}, {0x8f4a,0xe3b8}, {0x8f4b,0xe3b9}, {0x8f4c,0xe3ba}, {0x8f4d,0xe3bb}, {0x8f4e,0xe3bc}, {0x8f4f,0xe3bd}, {0x8f50,0xe3be}, {0x8f51,0xe3bf}, {0x8f52,0xe3c0}, {0x8f53,0xe3c1}, {0x8f54,0xe3c2}, {0x8f55,0xe3c3}, {0x8f56,0xe3c4}, {0x8f57,0xe3c5}, {0x8f58,0xe3c6}, {0x8f59,0xe3c7}, {0x8f5a,0xe3c8}, {0x8f5b,0xe3c9}, {0x8f5c,0xe3ca}, {0x8f5d,0xe3cb}, {0x8f5e,0xe3cc}, {0x8f5f,0xe3cd}, {0x8f60,0xe3ce}, {0x8f61,0xe3cf}, {0x8f62,0xe3d0}, {0x8f63,0xe3d1}, {0x8f64,0xe3d2}, {0x8f65,0xe3d3}, {0x8f66,0xe3d4}, {0x8f67,0xe3d5}, {0x8f68,0xe3d6}, {0x8f69,0xe3d7}, {0x8f6a,0xe3d8}, {0x8f6b,0xe3d9}, {0x8f6c,0xe3da}, {0x8f6d,0xe3db}, {0x8f6e,0xe3dc}, {0x8f6f,0xe3dd}, {0x8f70,0xe3de}, {0x8f71,0xe3df}, {0x8f72,0xe3e0}, {0x8f73,0xe3e1}, {0x8f74,0xe3e2}, {0x8f75,0xe3e3}, {0x8f76,0xe3e4}, {0x8f77,0xe3e5}, {0x8f78,0xe3e6}, {0x8f79,0xe3e7}, {0x8f7a,0xe3e8}, {0x8f7b,0xe3e9}, {0x8f7c,0xe3ea}, {0x8f7d,0xe3eb}, {0x8f7e,0xe3ec}, {0x8fa1,0xe3ed}, {0x8fa2,0xe3ee}, {0x8fa3,0xe3ef}, {0x8fa4,0xe3f0}, {0x8fa5,0xe3f1}, {0x8fa6,0xe3f2}, {0x8fa7,0xe3f3}, {0x8fa8,0xe3f4}, {0x8fa9,0xe3f5}, {0x8faa,0xe3f6}, {0x8fab,0xe3f7}, {0x8fac,0xe3f8}, {0x8fad,0xe3f9}, {0x8fae,0xe3fa}, {0x8faf,0xe3fb}, {0x8fb0,0xe3fc}, {0x8fb1,0xe3fd}, {0x8fb2,0xe3fe}, {0x8fb3,0xe3ff}, {0x8fb4,0xe400}, {0x8fb5,0xe401}, {0x8fb6,0xe402}, {0x8fb7,0xe403}, {0x8fb8,0xe404}, {0x8fb9,0xe405}, {0x8fba,0xe406}, {0x8fbb,0xe407}, {0x8fbc,0xe408}, {0x8fbd,0xe409}, {0x8fbe,0xe40a}, {0x8fbf,0xe40b}, {0x8fc0,0xe40c}, {0x8fc1,0xe40d}, {0x8fc2,0xe40e}, {0x8fc3,0xe40f}, {0x8fc4,0xe410}, {0x8fc5,0xe411}, {0x8fc6,0xe412}, {0x8fc7,0xe413}, {0x8fc8,0xe414}, {0x8fc9,0xe415}, {0x8fca,0xe416}, {0x8fcb,0xe417}, {0x8fcc,0xe418}, {0x8fcd,0xe419}, {0x8fce,0xe41a}, {0x8fcf,0xe41b}, {0x8fd0,0xe41c}, {0x8fd1,0xe41d}, {0x8fd2,0xe41e}, {0x8fd3,0xe41f}, {0x8fd4,0xe420}, {0x8fd5,0xe421}, {0x8fd6,0xe422}, {0x8fd7,0xe423}, {0x8fd8,0xe424}, {0x8fd9,0xe425}, {0x8fda,0xe426}, {0x8fdb,0xe427}, {0x8fdc,0xe428}, {0x8fdd,0xe429}, {0x8fde,0xe42a}, {0x8fdf,0xe42b}, {0x8fe0,0xe42c}, {0x8fe1,0xe42d}, {0x8fe2,0xe42e}, {0x8fe3,0xe42f}, {0x8fe4,0xe430}, {0x8fe5,0xe431}, {0x8fe6,0xe432}, {0x8fe7,0xe433}, {0x8fe8,0xe434}, {0x8fe9,0xe435}, {0x8fea,0xe436}, {0x8feb,0xe437}, {0x8fec,0xe438}, {0x8fed,0xe439}, {0x8fee,0xe43a}, {0x8fef,0xe43b}, {0x8ff0,0xe43c}, {0x8ff1,0xe43d}, {0x8ff2,0xe43e}, {0x8ff3,0xe43f}, {0x8ff4,0xe440}, {0x8ff5,0xe441}, {0x8ff6,0xe442}, {0x8ff7,0xe443}, {0x8ff8,0xe444}, {0x8ff9,0xe445}, {0x8ffa,0xe446}, {0x8ffb,0xe447}, {0x8ffc,0xe448}, {0x8ffd,0xe449}, {0x8ffe,0xe44a}, {0x9040,0xe44b}, {0x9041,0xe44c}, {0x9042,0xe44d}, {0x9043,0xe44e}, {0x9044,0xe44f}, {0x9045,0xe450}, {0x9046,0xe451}, {0x9047,0xe452}, {0x9048,0xe453}, {0x9049,0xe454}, {0x904a,0xe455}, {0x904b,0xe456}, {0x904c,0xe457}, {0x904d,0xe458}, {0x904e,0xe459}, {0x904f,0xe45a}, {0x9050,0xe45b}, {0x9051,0xe45c}, {0x9052,0xe45d}, {0x9053,0xe45e}, {0x9054,0xe45f}, {0x9055,0xe460}, {0x9056,0xe461}, {0x9057,0xe462}, {0x9058,0xe463}, {0x9059,0xe464}, {0x905a,0xe465}, {0x905b,0xe466}, {0x905c,0xe467}, {0x905d,0xe468}, {0x905e,0xe469}, {0x905f,0xe46a}, {0x9060,0xe46b}, {0x9061,0xe46c}, {0x9062,0xe46d}, {0x9063,0xe46e}, {0x9064,0xe46f}, {0x9065,0xe470}, {0x9066,0xe471}, {0x9067,0xe472}, {0x9068,0xe473}, {0x9069,0xe474}, {0x906a,0xe475}, {0x906b,0xe476}, {0x906c,0xe477}, {0x906d,0xe478}, {0x906e,0xe479}, {0x906f,0xe47a}, {0x9070,0xe47b}, {0x9071,0xe47c}, {0x9072,0xe47d}, {0x9073,0xe47e}, {0x9074,0xe47f}, {0x9075,0xe480}, {0x9076,0xe481}, {0x9077,0xe482}, {0x9078,0xe483}, {0x9079,0xe484}, {0x907a,0xe485}, {0x907b,0xe486}, {0x907c,0xe487}, {0x907d,0xe488}, {0x907e,0xe489}, {0x90a1,0xe48a}, {0x90a2,0xe48b}, {0x90a3,0xe48c}, {0x90a4,0xe48d}, {0x90a5,0xe48e}, {0x90a6,0xe48f}, {0x90a7,0xe490}, {0x90a8,0xe491}, {0x90a9,0xe492}, {0x90aa,0xe493}, {0x90ab,0xe494}, {0x90ac,0xe495}, {0x90ad,0xe496}, {0x90ae,0xe497}, {0x90af,0xe498}, {0x90b0,0xe499}, {0x90b1,0xe49a}, {0x90b2,0xe49b}, {0x90b3,0xe49c}, {0x90b4,0xe49d}, {0x90b5,0xe49e}, {0x90b6,0xe49f}, {0x90b7,0xe4a0}, {0x90b8,0xe4a1}, {0x90b9,0xe4a2}, {0x90ba,0xe4a3}, {0x90bb,0xe4a4}, {0x90bc,0xe4a5}, {0x90bd,0xe4a6}, {0x90be,0xe4a7}, {0x90bf,0xe4a8}, {0x90c0,0xe4a9}, {0x90c1,0xe4aa}, {0x90c2,0xe4ab}, {0x90c3,0xe4ac}, {0x90c4,0xe4ad}, {0x90c5,0xe4ae}, {0x90c6,0xe4af}, {0x90c7,0xe4b0}, {0x90c8,0xe4b1}, {0x90c9,0xe4b2}, {0x90ca,0xe4b3}, {0x90cb,0xe4b4}, {0x90cc,0xe4b5}, {0x90cd,0xe4b6}, {0x90ce,0xe4b7}, {0x90cf,0xe4b8}, {0x90d0,0xe4b9}, {0x90d1,0xe4ba}, {0x90d2,0xe4bb}, {0x90d3,0xe4bc}, {0x90d4,0xe4bd}, {0x90d5,0xe4be}, {0x90d6,0xe4bf}, {0x90d7,0xe4c0}, {0x90d8,0xe4c1}, {0x90d9,0xe4c2}, {0x90da,0xe4c3}, {0x90db,0xe4c4}, {0x90dc,0xe4c5}, {0x90dd,0xe4c6}, {0x90de,0xe4c7}, {0x90df,0xe4c8}, {0x90e0,0xe4c9}, {0x90e1,0xe4ca}, {0x90e2,0xe4cb}, {0x90e3,0xe4cc}, {0x90e4,0xe4cd}, {0x90e5,0xe4ce}, {0x90e6,0xe4cf}, {0x90e7,0xe4d0}, {0x90e8,0xe4d1}, {0x90e9,0xe4d2}, {0x90ea,0xe4d3}, {0x90eb,0xe4d4}, {0x90ec,0xe4d5}, {0x90ed,0xe4d6}, {0x90ee,0xe4d7}, {0x90ef,0xe4d8}, {0x90f0,0xe4d9}, {0x90f1,0xe4da}, {0x90f2,0xe4db}, {0x90f3,0xe4dc}, {0x90f4,0xe4dd}, {0x90f5,0xe4de}, {0x90f6,0xe4df}, {0x90f7,0xe4e0}, {0x90f8,0xe4e1}, {0x90f9,0xe4e2}, {0x90fa,0xe4e3}, {0x90fb,0xe4e4}, {0x90fc,0xe4e5}, {0x90fd,0xe4e6}, {0x90fe,0xe4e7}, {0x9140,0xe4e8}, {0x9141,0xe4e9}, {0x9142,0xe4ea}, {0x9143,0xe4eb}, {0x9144,0xe4ec}, {0x9145,0xe4ed}, {0x9146,0xe4ee}, {0x9147,0xe4ef}, {0x9148,0xe4f0}, {0x9149,0xe4f1}, {0x914a,0xe4f2}, {0x914b,0xe4f3}, {0x914c,0xe4f4}, {0x914d,0xe4f5}, {0x914e,0xe4f6}, {0x914f,0xe4f7}, {0x9150,0xe4f8}, {0x9151,0xe4f9}, {0x9152,0xe4fa}, {0x9153,0xe4fb}, {0x9154,0xe4fc}, {0x9155,0xe4fd}, {0x9156,0xe4fe}, {0x9157,0xe4ff}, {0x9158,0xe500}, {0x9159,0xe501}, {0x915a,0xe502}, {0x915b,0xe503}, {0x915c,0xe504}, {0x915d,0xe505}, {0x915e,0xe506}, {0x915f,0xe507}, {0x9160,0xe508}, {0x9161,0xe509}, {0x9162,0xe50a}, {0x9163,0xe50b}, {0x9164,0xe50c}, {0x9165,0xe50d}, {0x9166,0xe50e}, {0x9167,0xe50f}, {0x9168,0xe510}, {0x9169,0xe511}, {0x916a,0xe512}, {0x916b,0xe513}, {0x916c,0xe514}, {0x916d,0xe515}, {0x916e,0xe516}, {0x916f,0xe517}, {0x9170,0xe518}, {0x9171,0xe519}, {0x9172,0xe51a}, {0x9173,0xe51b}, {0x9174,0xe51c}, {0x9175,0xe51d}, {0x9176,0xe51e}, {0x9177,0xe51f}, {0x9178,0xe520}, {0x9179,0xe521}, {0x917a,0xe522}, {0x917b,0xe523}, {0x917c,0xe524}, {0x917d,0xe525}, {0x917e,0xe526}, {0x91a1,0xe527}, {0x91a2,0xe528}, {0x91a3,0xe529}, {0x91a4,0xe52a}, {0x91a5,0xe52b}, {0x91a6,0xe52c}, {0x91a7,0xe52d}, {0x91a8,0xe52e}, {0x91a9,0xe52f}, {0x91aa,0xe530}, {0x91ab,0xe531}, {0x91ac,0xe532}, {0x91ad,0xe533}, {0x91ae,0xe534}, {0x91af,0xe535}, {0x91b0,0xe536}, {0x91b1,0xe537}, {0x91b2,0xe538}, {0x91b3,0xe539}, {0x91b4,0xe53a}, {0x91b5,0xe53b}, {0x91b6,0xe53c}, {0x91b7,0xe53d}, {0x91b8,0xe53e}, {0x91b9,0xe53f}, {0x91ba,0xe540}, {0x91bb,0xe541}, {0x91bc,0xe542}, {0x91bd,0xe543}, {0x91be,0xe544}, {0x91bf,0xe545}, {0x91c0,0xe546}, {0x91c1,0xe547}, {0x91c2,0xe548}, {0x91c3,0xe549}, {0x91c4,0xe54a}, {0x91c5,0xe54b}, {0x91c6,0xe54c}, {0x91c7,0xe54d}, {0x91c8,0xe54e}, {0x91c9,0xe54f}, {0x91ca,0xe550}, {0x91cb,0xe551}, {0x91cc,0xe552}, {0x91cd,0xe553}, {0x91ce,0xe554}, {0x91cf,0xe555}, {0x91d0,0xe556}, {0x91d1,0xe557}, {0x91d2,0xe558}, {0x91d3,0xe559}, {0x91d4,0xe55a}, {0x91d5,0xe55b}, {0x91d6,0xe55c}, {0x91d7,0xe55d}, {0x91d8,0xe55e}, {0x91d9,0xe55f}, {0x91da,0xe560}, {0x91db,0xe561}, {0x91dc,0xe562}, {0x91dd,0xe563}, {0x91de,0xe564}, {0x91df,0xe565}, {0x91e0,0xe566}, {0x91e1,0xe567}, {0x91e2,0xe568}, {0x91e3,0xe569}, {0x91e4,0xe56a}, {0x91e5,0xe56b}, {0x91e6,0xe56c}, {0x91e7,0xe56d}, {0x91e8,0xe56e}, {0x91e9,0xe56f}, {0x91ea,0xe570}, {0x91eb,0xe571}, {0x91ec,0xe572}, {0x91ed,0xe573}, {0x91ee,0xe574}, {0x91ef,0xe575}, {0x91f0,0xe576}, {0x91f1,0xe577}, {0x91f2,0xe578}, {0x91f3,0xe579}, {0x91f4,0xe57a}, {0x91f5,0xe57b}, {0x91f6,0xe57c}, {0x91f7,0xe57d}, {0x91f8,0xe57e}, {0x91f9,0xe57f}, {0x91fa,0xe580}, {0x91fb,0xe581}, {0x91fc,0xe582}, {0x91fd,0xe583}, {0x91fe,0xe584}, {0x9240,0xe585}, {0x9241,0xe586}, {0x9242,0xe587}, {0x9243,0xe588}, {0x9244,0xe589}, {0x9245,0xe58a}, {0x9246,0xe58b}, {0x9247,0xe58c}, {0x9248,0xe58d}, {0x9249,0xe58e}, {0x924a,0xe58f}, {0x924b,0xe590}, {0x924c,0xe591}, {0x924d,0xe592}, {0x924e,0xe593}, {0x924f,0xe594}, {0x9250,0xe595}, {0x9251,0xe596}, {0x9252,0xe597}, {0x9253,0xe598}, {0x9254,0xe599}, {0x9255,0xe59a}, {0x9256,0xe59b}, {0x9257,0xe59c}, {0x9258,0xe59d}, {0x9259,0xe59e}, {0x925a,0xe59f}, {0x925b,0xe5a0}, {0x925c,0xe5a1}, {0x925d,0xe5a2}, {0x925e,0xe5a3}, {0x925f,0xe5a4}, {0x9260,0xe5a5}, {0x9261,0xe5a6}, {0x9262,0xe5a7}, {0x9263,0xe5a8}, {0x9264,0xe5a9}, {0x9265,0xe5aa}, {0x9266,0xe5ab}, {0x9267,0xe5ac}, {0x9268,0xe5ad}, {0x9269,0xe5ae}, {0x926a,0xe5af}, {0x926b,0xe5b0}, {0x926c,0xe5b1}, {0x926d,0xe5b2}, {0x926e,0xe5b3}, {0x926f,0xe5b4}, {0x9270,0xe5b5}, {0x9271,0xe5b6}, {0x9272,0xe5b7}, {0x9273,0xe5b8}, {0x9274,0xe5b9}, {0x9275,0xe5ba}, {0x9276,0xe5bb}, {0x9277,0xe5bc}, {0x9278,0xe5bd}, {0x9279,0xe5be}, {0x927a,0xe5bf}, {0x927b,0xe5c0}, {0x927c,0xe5c1}, {0x927d,0xe5c2}, {0x927e,0xe5c3}, {0x92a1,0xe5c4}, {0x92a2,0xe5c5}, {0x92a3,0xe5c6}, {0x92a4,0xe5c7}, {0x92a5,0xe5c8}, {0x92a6,0xe5c9}, {0x92a7,0xe5ca}, {0x92a8,0xe5cb}, {0x92a9,0xe5cc}, {0x92aa,0xe5cd}, {0x92ab,0xe5ce}, {0x92ac,0xe5cf}, {0x92ad,0xe5d0}, {0x92ae,0xe5d1}, {0x92af,0xe5d2}, {0x92b0,0xe5d3}, {0x92b1,0xe5d4}, {0x92b2,0xe5d5}, {0x92b3,0xe5d6}, {0x92b4,0xe5d7}, {0x92b5,0xe5d8}, {0x92b6,0xe5d9}, {0x92b7,0xe5da}, {0x92b8,0xe5db}, {0x92b9,0xe5dc}, {0x92ba,0xe5dd}, {0x92bb,0xe5de}, {0x92bc,0xe5df}, {0x92bd,0xe5e0}, {0x92be,0xe5e1}, {0x92bf,0xe5e2}, {0x92c0,0xe5e3}, {0x92c1,0xe5e4}, {0x92c2,0xe5e5}, {0x92c3,0xe5e6}, {0x92c4,0xe5e7}, {0x92c5,0xe5e8}, {0x92c6,0xe5e9}, {0x92c7,0xe5ea}, {0x92c8,0xe5eb}, {0x92c9,0xe5ec}, {0x92ca,0xe5ed}, {0x92cb,0xe5ee}, {0x92cc,0xe5ef}, {0x92cd,0xe5f0}, {0x92ce,0xe5f1}, {0x92cf,0xe5f2}, {0x92d0,0xe5f3}, {0x92d1,0xe5f4}, {0x92d2,0xe5f5}, {0x92d3,0xe5f6}, {0x92d4,0xe5f7}, {0x92d5,0xe5f8}, {0x92d6,0xe5f9}, {0x92d7,0xe5fa}, {0x92d8,0xe5fb}, {0x92d9,0xe5fc}, {0x92da,0xe5fd}, {0x92db,0xe5fe}, {0x92dc,0xe5ff}, {0x92dd,0xe600}, {0x92de,0xe601}, {0x92df,0xe602}, {0x92e0,0xe603}, {0x92e1,0xe604}, {0x92e2,0xe605}, {0x92e3,0xe606}, {0x92e4,0xe607}, {0x92e5,0xe608}, {0x92e6,0xe609}, {0x92e7,0xe60a}, {0x92e8,0xe60b}, {0x92e9,0xe60c}, {0x92ea,0xe60d}, {0x92eb,0xe60e}, {0x92ec,0xe60f}, {0x92ed,0xe610}, {0x92ee,0xe611}, {0x92ef,0xe612}, {0x92f0,0xe613}, {0x92f1,0xe614}, {0x92f2,0xe615}, {0x92f3,0xe616}, {0x92f4,0xe617}, {0x92f5,0xe618}, {0x92f6,0xe619}, {0x92f7,0xe61a}, {0x92f8,0xe61b}, {0x92f9,0xe61c}, {0x92fa,0xe61d}, {0x92fb,0xe61e}, {0x92fc,0xe61f}, {0x92fd,0xe620}, {0x92fe,0xe621}, {0x9340,0xe622}, {0x9341,0xe623}, {0x9342,0xe624}, {0x9343,0xe625}, {0x9344,0xe626}, {0x9345,0xe627}, {0x9346,0xe628}, {0x9347,0xe629}, {0x9348,0xe62a}, {0x9349,0xe62b}, {0x934a,0xe62c}, {0x934b,0xe62d}, {0x934c,0xe62e}, {0x934d,0xe62f}, {0x934e,0xe630}, {0x934f,0xe631}, {0x9350,0xe632}, {0x9351,0xe633}, {0x9352,0xe634}, {0x9353,0xe635}, {0x9354,0xe636}, {0x9355,0xe637}, {0x9356,0xe638}, {0x9357,0xe639}, {0x9358,0xe63a}, {0x9359,0xe63b}, {0x935a,0xe63c}, {0x935b,0xe63d}, {0x935c,0xe63e}, {0x935d,0xe63f}, {0x935e,0xe640}, {0x935f,0xe641}, {0x9360,0xe642}, {0x9361,0xe643}, {0x9362,0xe644}, {0x9363,0xe645}, {0x9364,0xe646}, {0x9365,0xe647}, {0x9366,0xe648}, {0x9367,0xe649}, {0x9368,0xe64a}, {0x9369,0xe64b}, {0x936a,0xe64c}, {0x936b,0xe64d}, {0x936c,0xe64e}, {0x936d,0xe64f}, {0x936e,0xe650}, {0x936f,0xe651}, {0x9370,0xe652}, {0x9371,0xe653}, {0x9372,0xe654}, {0x9373,0xe655}, {0x9374,0xe656}, {0x9375,0xe657}, {0x9376,0xe658}, {0x9377,0xe659}, {0x9378,0xe65a}, {0x9379,0xe65b}, {0x937a,0xe65c}, {0x937b,0xe65d}, {0x937c,0xe65e}, {0x937d,0xe65f}, {0x937e,0xe660}, {0x93a1,0xe661}, {0x93a2,0xe662}, {0x93a3,0xe663}, {0x93a4,0xe664}, {0x93a5,0xe665}, {0x93a6,0xe666}, {0x93a7,0xe667}, {0x93a8,0xe668}, {0x93a9,0xe669}, {0x93aa,0xe66a}, {0x93ab,0xe66b}, {0x93ac,0xe66c}, {0x93ad,0xe66d}, {0x93ae,0xe66e}, {0x93af,0xe66f}, {0x93b0,0xe670}, {0x93b1,0xe671}, {0x93b2,0xe672}, {0x93b3,0xe673}, {0x93b4,0xe674}, {0x93b5,0xe675}, {0x93b6,0xe676}, {0x93b7,0xe677}, {0x93b8,0xe678}, {0x93b9,0xe679}, {0x93ba,0xe67a}, {0x93bb,0xe67b}, {0x93bc,0xe67c}, {0x93bd,0xe67d}, {0x93be,0xe67e}, {0x93bf,0xe67f}, {0x93c0,0xe680}, {0x93c1,0xe681}, {0x93c2,0xe682}, {0x93c3,0xe683}, {0x93c4,0xe684}, {0x93c5,0xe685}, {0x93c6,0xe686}, {0x93c7,0xe687}, {0x93c8,0xe688}, {0x93c9,0xe689}, {0x93ca,0xe68a}, {0x93cb,0xe68b}, {0x93cc,0xe68c}, {0x93cd,0xe68d}, {0x93ce,0xe68e}, {0x93cf,0xe68f}, {0x93d0,0xe690}, {0x93d1,0xe691}, {0x93d2,0xe692}, {0x93d3,0xe693}, {0x93d4,0xe694}, {0x93d5,0xe695}, {0x93d6,0xe696}, {0x93d7,0xe697}, {0x93d8,0xe698}, {0x93d9,0xe699}, {0x93da,0xe69a}, {0x93db,0xe69b}, {0x93dc,0xe69c}, {0x93dd,0xe69d}, {0x93de,0xe69e}, {0x93df,0xe69f}, {0x93e0,0xe6a0}, {0x93e1,0xe6a1}, {0x93e2,0xe6a2}, {0x93e3,0xe6a3}, {0x93e4,0xe6a4}, {0x93e5,0xe6a5}, {0x93e6,0xe6a6}, {0x93e7,0xe6a7}, {0x93e8,0xe6a8}, {0x93e9,0xe6a9}, {0x93ea,0xe6aa}, {0x93eb,0xe6ab}, {0x93ec,0xe6ac}, {0x93ed,0xe6ad}, {0x93ee,0xe6ae}, {0x93ef,0xe6af}, {0x93f0,0xe6b0}, {0x93f1,0xe6b1}, {0x93f2,0xe6b2}, {0x93f3,0xe6b3}, {0x93f4,0xe6b4}, {0x93f5,0xe6b5}, {0x93f6,0xe6b6}, {0x93f7,0xe6b7}, {0x93f8,0xe6b8}, {0x93f9,0xe6b9}, {0x93fa,0xe6ba}, {0x93fb,0xe6bb}, {0x93fc,0xe6bc}, {0x93fd,0xe6bd}, {0x93fe,0xe6be}, {0x9440,0xe6bf}, {0x9441,0xe6c0}, {0x9442,0xe6c1}, {0x9443,0xe6c2}, {0x9444,0xe6c3}, {0x9445,0xe6c4}, {0x9446,0xe6c5}, {0x9447,0xe6c6}, {0x9448,0xe6c7}, {0x9449,0xe6c8}, {0x944a,0xe6c9}, {0x944b,0xe6ca}, {0x944c,0xe6cb}, {0x944d,0xe6cc}, {0x944e,0xe6cd}, {0x944f,0xe6ce}, {0x9450,0xe6cf}, {0x9451,0xe6d0}, {0x9452,0xe6d1}, {0x9453,0xe6d2}, {0x9454,0xe6d3}, {0x9455,0xe6d4}, {0x9456,0xe6d5}, {0x9457,0xe6d6}, {0x9458,0xe6d7}, {0x9459,0xe6d8}, {0x945a,0xe6d9}, {0x945b,0xe6da}, {0x945c,0xe6db}, {0x945d,0xe6dc}, {0x945e,0xe6dd}, {0x945f,0xe6de}, {0x9460,0xe6df}, {0x9461,0xe6e0}, {0x9462,0xe6e1}, {0x9463,0xe6e2}, {0x9464,0xe6e3}, {0x9465,0xe6e4}, {0x9466,0xe6e5}, {0x9467,0xe6e6}, {0x9468,0xe6e7}, {0x9469,0xe6e8}, {0x946a,0xe6e9}, {0x946b,0xe6ea}, {0x946c,0xe6eb}, {0x946d,0xe6ec}, {0x946e,0xe6ed}, {0x946f,0xe6ee}, {0x9470,0xe6ef}, {0x9471,0xe6f0}, {0x9472,0xe6f1}, {0x9473,0xe6f2}, {0x9474,0xe6f3}, {0x9475,0xe6f4}, {0x9476,0xe6f5}, {0x9477,0xe6f6}, {0x9478,0xe6f7}, {0x9479,0xe6f8}, {0x947a,0xe6f9}, {0x947b,0xe6fa}, {0x947c,0xe6fb}, {0x947d,0xe6fc}, {0x947e,0xe6fd}, {0x94a1,0xe6fe}, {0x94a2,0xe6ff}, {0x94a3,0xe700}, {0x94a4,0xe701}, {0x94a5,0xe702}, {0x94a6,0xe703}, {0x94a7,0xe704}, {0x94a8,0xe705}, {0x94a9,0xe706}, {0x94aa,0xe707}, {0x94ab,0xe708}, {0x94ac,0xe709}, {0x94ad,0xe70a}, {0x94ae,0xe70b}, {0x94af,0xe70c}, {0x94b0,0xe70d}, {0x94b1,0xe70e}, {0x94b2,0xe70f}, {0x94b3,0xe710}, {0x94b4,0xe711}, {0x94b5,0xe712}, {0x94b6,0xe713}, {0x94b7,0xe714}, {0x94b8,0xe715}, {0x94b9,0xe716}, {0x94ba,0xe717}, {0x94bb,0xe718}, {0x94bc,0xe719}, {0x94bd,0xe71a}, {0x94be,0xe71b}, {0x94bf,0xe71c}, {0x94c0,0xe71d}, {0x94c1,0xe71e}, {0x94c2,0xe71f}, {0x94c3,0xe720}, {0x94c4,0xe721}, {0x94c5,0xe722}, {0x94c6,0xe723}, {0x94c7,0xe724}, {0x94c8,0xe725}, {0x94c9,0xe726}, {0x94ca,0xe727}, {0x94cb,0xe728}, {0x94cc,0xe729}, {0x94cd,0xe72a}, {0x94ce,0xe72b}, {0x94cf,0xe72c}, {0x94d0,0xe72d}, {0x94d1,0xe72e}, {0x94d2,0xe72f}, {0x94d3,0xe730}, {0x94d4,0xe731}, {0x94d5,0xe732}, {0x94d6,0xe733}, {0x94d7,0xe734}, {0x94d8,0xe735}, {0x94d9,0xe736}, {0x94da,0xe737}, {0x94db,0xe738}, {0x94dc,0xe739}, {0x94dd,0xe73a}, {0x94de,0xe73b}, {0x94df,0xe73c}, {0x94e0,0xe73d}, {0x94e1,0xe73e}, {0x94e2,0xe73f}, {0x94e3,0xe740}, {0x94e4,0xe741}, {0x94e5,0xe742}, {0x94e6,0xe743}, {0x94e7,0xe744}, {0x94e8,0xe745}, {0x94e9,0xe746}, {0x94ea,0xe747}, {0x94eb,0xe748}, {0x94ec,0xe749}, {0x94ed,0xe74a}, {0x94ee,0xe74b}, {0x94ef,0xe74c}, {0x94f0,0xe74d}, {0x94f1,0xe74e}, {0x94f2,0xe74f}, {0x94f3,0xe750}, {0x94f4,0xe751}, {0x94f5,0xe752}, {0x94f6,0xe753}, {0x94f7,0xe754}, {0x94f8,0xe755}, {0x94f9,0xe756}, {0x94fa,0xe757}, {0x94fb,0xe758}, {0x94fc,0xe759}, {0x94fd,0xe75a}, {0x94fe,0xe75b}, {0x9540,0xe75c}, {0x9541,0xe75d}, {0x9542,0xe75e}, {0x9543,0xe75f}, {0x9544,0xe760}, {0x9545,0xe761}, {0x9546,0xe762}, {0x9547,0xe763}, {0x9548,0xe764}, {0x9549,0xe765}, {0x954a,0xe766}, {0x954b,0xe767}, {0x954c,0xe768}, {0x954d,0xe769}, {0x954e,0xe76a}, {0x954f,0xe76b}, {0x9550,0xe76c}, {0x9551,0xe76d}, {0x9552,0xe76e}, {0x9553,0xe76f}, {0x9554,0xe770}, {0x9555,0xe771}, {0x9556,0xe772}, {0x9557,0xe773}, {0x9558,0xe774}, {0x9559,0xe775}, {0x955a,0xe776}, {0x955b,0xe777}, {0x955c,0xe778}, {0x955d,0xe779}, {0x955e,0xe77a}, {0x955f,0xe77b}, {0x9560,0xe77c}, {0x9561,0xe77d}, {0x9562,0xe77e}, {0x9563,0xe77f}, {0x9564,0xe780}, {0x9565,0xe781}, {0x9566,0xe782}, {0x9567,0xe783}, {0x9568,0xe784}, {0x9569,0xe785}, {0x956a,0xe786}, {0x956b,0xe787}, {0x956c,0xe788}, {0x956d,0xe789}, {0x956e,0xe78a}, {0x956f,0xe78b}, {0x9570,0xe78c}, {0x9571,0xe78d}, {0x9572,0xe78e}, {0x9573,0xe78f}, {0x9574,0xe790}, {0x9575,0xe791}, {0x9576,0xe792}, {0x9577,0xe793}, {0x9578,0xe794}, {0x9579,0xe795}, {0x957a,0xe796}, {0x957b,0xe797}, {0x957c,0xe798}, {0x957d,0xe799}, {0x957e,0xe79a}, {0x95a1,0xe79b}, {0x95a2,0xe79c}, {0x95a3,0xe79d}, {0x95a4,0xe79e}, {0x95a5,0xe79f}, {0x95a6,0xe7a0}, {0x95a7,0xe7a1}, {0x95a8,0xe7a2}, {0x95a9,0xe7a3}, {0x95aa,0xe7a4}, {0x95ab,0xe7a5}, {0x95ac,0xe7a6}, {0x95ad,0xe7a7}, {0x95ae,0xe7a8}, {0x95af,0xe7a9}, {0x95b0,0xe7aa}, {0x95b1,0xe7ab}, {0x95b2,0xe7ac}, {0x95b3,0xe7ad}, {0x95b4,0xe7ae}, {0x95b5,0xe7af}, {0x95b6,0xe7b0}, {0x95b7,0xe7b1}, {0x95b8,0xe7b2}, {0x95b9,0xe7b3}, {0x95ba,0xe7b4}, {0x95bb,0xe7b5}, {0x95bc,0xe7b6}, {0x95bd,0xe7b7}, {0x95be,0xe7b8}, {0x95bf,0xe7b9}, {0x95c0,0xe7ba}, {0x95c1,0xe7bb}, {0x95c2,0xe7bc}, {0x95c3,0xe7bd}, {0x95c4,0xe7be}, {0x95c5,0xe7bf}, {0x95c6,0xe7c0}, {0x95c7,0xe7c1}, {0x95c8,0xe7c2}, {0x95c9,0xe7c3}, {0x95ca,0xe7c4}, {0x95cb,0xe7c5}, {0x95cc,0xe7c6}, {0x95cd,0xe7c7}, {0x95ce,0xe7c8}, {0x95cf,0xe7c9}, {0x95d0,0xe7ca}, {0x95d1,0xe7cb}, {0x95d2,0xe7cc}, {0x95d3,0xe7cd}, {0x95d4,0xe7ce}, {0x95d5,0xe7cf}, {0x95d6,0xe7d0}, {0x95d7,0xe7d1}, {0x95d8,0xe7d2}, {0x95d9,0xe7d3}, {0x95da,0xe7d4}, {0x95db,0xe7d5}, {0x95dc,0xe7d6}, {0x95dd,0xe7d7}, {0x95de,0xe7d8}, {0x95df,0xe7d9}, {0x95e0,0xe7da}, {0x95e1,0xe7db}, {0x95e2,0xe7dc}, {0x95e3,0xe7dd}, {0x95e4,0xe7de}, {0x95e5,0xe7df}, {0x95e6,0xe7e0}, {0x95e7,0xe7e1}, {0x95e8,0xe7e2}, {0x95e9,0xe7e3}, {0x95ea,0xe7e4}, {0x95eb,0xe7e5}, {0x95ec,0xe7e6}, {0x95ed,0xe7e7}, {0x95ee,0xe7e8}, {0x95ef,0xe7e9}, {0x95f0,0xe7ea}, {0x95f1,0xe7eb}, {0x95f2,0xe7ec}, {0x95f3,0xe7ed}, {0x95f4,0xe7ee}, {0x95f5,0xe7ef}, {0x95f6,0xe7f0}, {0x95f7,0xe7f1}, {0x95f8,0xe7f2}, {0x95f9,0xe7f3}, {0x95fa,0xe7f4}, {0x95fb,0xe7f5}, {0x95fc,0xe7f6}, {0x95fd,0xe7f7}, {0x95fe,0xe7f8}, {0x9640,0xe7f9}, {0x9641,0xe7fa}, {0x9642,0xe7fb}, {0x9643,0xe7fc}, {0x9644,0xe7fd}, {0x9645,0xe7fe}, {0x9646,0xe7ff}, {0x9647,0xe800}, {0x9648,0xe801}, {0x9649,0xe802}, {0x964a,0xe803}, {0x964b,0xe804}, {0x964c,0xe805}, {0x964d,0xe806}, {0x964e,0xe807}, {0x964f,0xe808}, {0x9650,0xe809}, {0x9651,0xe80a}, {0x9652,0xe80b}, {0x9653,0xe80c}, {0x9654,0xe80d}, {0x9655,0xe80e}, {0x9656,0xe80f}, {0x9657,0xe810}, {0x9658,0xe811}, {0x9659,0xe812}, {0x965a,0xe813}, {0x965b,0xe814}, {0x965c,0xe815}, {0x965d,0xe816}, {0x965e,0xe817}, {0x965f,0xe818}, {0x9660,0xe819}, {0x9661,0xe81a}, {0x9662,0xe81b}, {0x9663,0xe81c}, {0x9664,0xe81d}, {0x9665,0xe81e}, {0x9666,0xe81f}, {0x9667,0xe820}, {0x9668,0xe821}, {0x9669,0xe822}, {0x966a,0xe823}, {0x966b,0xe824}, {0x966c,0xe825}, {0x966d,0xe826}, {0x966e,0xe827}, {0x966f,0xe828}, {0x9670,0xe829}, {0x9671,0xe82a}, {0x9672,0xe82b}, {0x9673,0xe82c}, {0x9674,0xe82d}, {0x9675,0xe82e}, {0x9676,0xe82f}, {0x9677,0xe830}, {0x9678,0xe831}, {0x9679,0xe832}, {0x967a,0xe833}, {0x967b,0xe834}, {0x967c,0xe835}, {0x967d,0xe836}, {0x967e,0xe837}, {0x96a1,0xe838}, {0x96a2,0xe839}, {0x96a3,0xe83a}, {0x96a4,0xe83b}, {0x96a5,0xe83c}, {0x96a6,0xe83d}, {0x96a7,0xe83e}, {0x96a8,0xe83f}, {0x96a9,0xe840}, {0x96aa,0xe841}, {0x96ab,0xe842}, {0x96ac,0xe843}, {0x96ad,0xe844}, {0x96ae,0xe845}, {0x96af,0xe846}, {0x96b0,0xe847}, {0x96b1,0xe848}, {0x96b2,0xe849}, {0x96b3,0xe84a}, {0x96b4,0xe84b}, {0x96b5,0xe84c}, {0x96b6,0xe84d}, {0x96b7,0xe84e}, {0x96b8,0xe84f}, {0x96b9,0xe850}, {0x96ba,0xe851}, {0x96bb,0xe852}, {0x96bc,0xe853}, {0x96bd,0xe854}, {0x96be,0xe855}, {0x96bf,0xe856}, {0x96c0,0xe857}, {0x96c1,0xe858}, {0x96c2,0xe859}, {0x96c3,0xe85a}, {0x96c4,0xe85b}, {0x96c5,0xe85c}, {0x96c6,0xe85d}, {0x96c7,0xe85e}, {0x96c8,0xe85f}, {0x96c9,0xe860}, {0x96ca,0xe861}, {0x96cb,0xe862}, {0x96cc,0xe863}, {0x96cd,0xe864}, {0x96ce,0xe865}, {0x96cf,0xe866}, {0x96d0,0xe867}, {0x96d1,0xe868}, {0x96d2,0xe869}, {0x96d3,0xe86a}, {0x96d4,0xe86b}, {0x96d5,0xe86c}, {0x96d6,0xe86d}, {0x96d7,0xe86e}, {0x96d8,0xe86f}, {0x96d9,0xe870}, {0x96da,0xe871}, {0x96db,0xe872}, {0x96dc,0xe873}, {0x96dd,0xe874}, {0x96de,0xe875}, {0x96df,0xe876}, {0x96e0,0xe877}, {0x96e1,0xe878}, {0x96e2,0xe879}, {0x96e3,0xe87a}, {0x96e4,0xe87b}, {0x96e5,0xe87c}, {0x96e6,0xe87d}, {0x96e7,0xe87e}, {0x96e8,0xe87f}, {0x96e9,0xe880}, {0x96ea,0xe881}, {0x96eb,0xe882}, {0x96ec,0xe883}, {0x96ed,0xe884}, {0x96ee,0xe885}, {0x96ef,0xe886}, {0x96f0,0xe887}, {0x96f1,0xe888}, {0x96f2,0xe889}, {0x96f3,0xe88a}, {0x96f4,0xe88b}, {0x96f5,0xe88c}, {0x96f6,0xe88d}, {0x96f7,0xe88e}, {0x96f8,0xe88f}, {0x96f9,0xe890}, {0x96fa,0xe891}, {0x96fb,0xe892}, {0x96fc,0xe893}, {0x96fd,0xe894}, {0x96fe,0xe895}, {0x9740,0xe896}, {0x9741,0xe897}, {0x9742,0xe898}, {0x9743,0xe899}, {0x9744,0xe89a}, {0x9745,0xe89b}, {0x9746,0xe89c}, {0x9747,0xe89d}, {0x9748,0xe89e}, {0x9749,0xe89f}, {0x974a,0xe8a0}, {0x974b,0xe8a1}, {0x974c,0xe8a2}, {0x974d,0xe8a3}, {0x974e,0xe8a4}, {0x974f,0xe8a5}, {0x9750,0xe8a6}, {0x9751,0xe8a7}, {0x9752,0xe8a8}, {0x9753,0xe8a9}, {0x9754,0xe8aa}, {0x9755,0xe8ab}, {0x9756,0xe8ac}, {0x9757,0xe8ad}, {0x9758,0xe8ae}, {0x9759,0xe8af}, {0x975a,0xe8b0}, {0x975b,0xe8b1}, {0x975c,0xe8b2}, {0x975d,0xe8b3}, {0x975e,0xe8b4}, {0x975f,0xe8b5}, {0x9760,0xe8b6}, {0x9761,0xe8b7}, {0x9762,0xe8b8}, {0x9763,0xe8b9}, {0x9764,0xe8ba}, {0x9765,0xe8bb}, {0x9766,0xe8bc}, {0x9767,0xe8bd}, {0x9768,0xe8be}, {0x9769,0xe8bf}, {0x976a,0xe8c0}, {0x976b,0xe8c1}, {0x976c,0xe8c2}, {0x976d,0xe8c3}, {0x976e,0xe8c4}, {0x976f,0xe8c5}, {0x9770,0xe8c6}, {0x9771,0xe8c7}, {0x9772,0xe8c8}, {0x9773,0xe8c9}, {0x9774,0xe8ca}, {0x9775,0xe8cb}, {0x9776,0xe8cc}, {0x9777,0xe8cd}, {0x9778,0xe8ce}, {0x9779,0xe8cf}, {0x977a,0xe8d0}, {0x977b,0xe8d1}, {0x977c,0xe8d2}, {0x977d,0xe8d3}, {0x977e,0xe8d4}, {0x97a1,0xe8d5}, {0x97a2,0xe8d6}, {0x97a3,0xe8d7}, {0x97a4,0xe8d8}, {0x97a5,0xe8d9}, {0x97a6,0xe8da}, {0x97a7,0xe8db}, {0x97a8,0xe8dc}, {0x97a9,0xe8dd}, {0x97aa,0xe8de}, {0x97ab,0xe8df}, {0x97ac,0xe8e0}, {0x97ad,0xe8e1}, {0x97ae,0xe8e2}, {0x97af,0xe8e3}, {0x97b0,0xe8e4}, {0x97b1,0xe8e5}, {0x97b2,0xe8e6}, {0x97b3,0xe8e7}, {0x97b4,0xe8e8}, {0x97b5,0xe8e9}, {0x97b6,0xe8ea}, {0x97b7,0xe8eb}, {0x97b8,0xe8ec}, {0x97b9,0xe8ed}, {0x97ba,0xe8ee}, {0x97bb,0xe8ef}, {0x97bc,0xe8f0}, {0x97bd,0xe8f1}, {0x97be,0xe8f2}, {0x97bf,0xe8f3}, {0x97c0,0xe8f4}, {0x97c1,0xe8f5}, {0x97c2,0xe8f6}, {0x97c3,0xe8f7}, {0x97c4,0xe8f8}, {0x97c5,0xe8f9}, {0x97c6,0xe8fa}, {0x97c7,0xe8fb}, {0x97c8,0xe8fc}, {0x97c9,0xe8fd}, {0x97ca,0xe8fe}, {0x97cb,0xe8ff}, {0x97cc,0xe900}, {0x97cd,0xe901}, {0x97ce,0xe902}, {0x97cf,0xe903}, {0x97d0,0xe904}, {0x97d1,0xe905}, {0x97d2,0xe906}, {0x97d3,0xe907}, {0x97d4,0xe908}, {0x97d5,0xe909}, {0x97d6,0xe90a}, {0x97d7,0xe90b}, {0x97d8,0xe90c}, {0x97d9,0xe90d}, {0x97da,0xe90e}, {0x97db,0xe90f}, {0x97dc,0xe910}, {0x97dd,0xe911}, {0x97de,0xe912}, {0x97df,0xe913}, {0x97e0,0xe914}, {0x97e1,0xe915}, {0x97e2,0xe916}, {0x97e3,0xe917}, {0x97e4,0xe918}, {0x97e5,0xe919}, {0x97e6,0xe91a}, {0x97e7,0xe91b}, {0x97e8,0xe91c}, {0x97e9,0xe91d}, {0x97ea,0xe91e}, {0x97eb,0xe91f}, {0x97ec,0xe920}, {0x97ed,0xe921}, {0x97ee,0xe922}, {0x97ef,0xe923}, {0x97f0,0xe924}, {0x97f1,0xe925}, {0x97f2,0xe926}, {0x97f3,0xe927}, {0x97f4,0xe928}, {0x97f5,0xe929}, {0x97f6,0xe92a}, {0x97f7,0xe92b}, {0x97f8,0xe92c}, {0x97f9,0xe92d}, {0x97fa,0xe92e}, {0x97fb,0xe92f}, {0x97fc,0xe930}, {0x97fd,0xe931}, {0x97fe,0xe932}, {0x9840,0xe933}, {0x9841,0xe934}, {0x9842,0xe935}, {0x9843,0xe936}, {0x9844,0xe937}, {0x9845,0xe938}, {0x9846,0xe939}, {0x9847,0xe93a}, {0x9848,0xe93b}, {0x9849,0xe93c}, {0x984a,0xe93d}, {0x984b,0xe93e}, {0x984c,0xe93f}, {0x984d,0xe940}, {0x984e,0xe941}, {0x984f,0xe942}, {0x9850,0xe943}, {0x9851,0xe944}, {0x9852,0xe945}, {0x9853,0xe946}, {0x9854,0xe947}, {0x9855,0xe948}, {0x9856,0xe949}, {0x9857,0xe94a}, {0x9858,0xe94b}, {0x9859,0xe94c}, {0x985a,0xe94d}, {0x985b,0xe94e}, {0x985c,0xe94f}, {0x985d,0xe950}, {0x985e,0xe951}, {0x985f,0xe952}, {0x9860,0xe953}, {0x9861,0xe954}, {0x9862,0xe955}, {0x9863,0xe956}, {0x9864,0xe957}, {0x9865,0xe958}, {0x9866,0xe959}, {0x9867,0xe95a}, {0x9868,0xe95b}, {0x9869,0xe95c}, {0x986a,0xe95d}, {0x986b,0xe95e}, {0x986c,0xe95f}, {0x986d,0xe960}, {0x986e,0xe961}, {0x986f,0xe962}, {0x9870,0xe963}, {0x9871,0xe964}, {0x9872,0xe965}, {0x9873,0xe966}, {0x9874,0xe967}, {0x9875,0xe968}, {0x9876,0xe969}, {0x9877,0xe96a}, {0x9878,0xe96b}, {0x9879,0xe96c}, {0x987a,0xe96d}, {0x987b,0xe96e}, {0x987c,0xe96f}, {0x987d,0xe970}, {0x987e,0xe971}, {0x98a1,0xe972}, {0x98a2,0xe973}, {0x98a3,0xe974}, {0x98a4,0xe975}, {0x98a5,0xe976}, {0x98a6,0xe977}, {0x98a7,0xe978}, {0x98a8,0xe979}, {0x98a9,0xe97a}, {0x98aa,0xe97b}, {0x98ab,0xe97c}, {0x98ac,0xe97d}, {0x98ad,0xe97e}, {0x98ae,0xe97f}, {0x98af,0xe980}, {0x98b0,0xe981}, {0x98b1,0xe982}, {0x98b2,0xe983}, {0x98b3,0xe984}, {0x98b4,0xe985}, {0x98b5,0xe986}, {0x98b6,0xe987}, {0x98b7,0xe988}, {0x98b8,0xe989}, {0x98b9,0xe98a}, {0x98ba,0xe98b}, {0x98bb,0xe98c}, {0x98bc,0xe98d}, {0x98bd,0xe98e}, {0x98be,0xe98f}, {0x98bf,0xe990}, {0x98c0,0xe991}, {0x98c1,0xe992}, {0x98c2,0xe993}, {0x98c3,0xe994}, {0x98c4,0xe995}, {0x98c5,0xe996}, {0x98c6,0xe997}, {0x98c7,0xe998}, {0x98c8,0xe999}, {0x98c9,0xe99a}, {0x98ca,0xe99b}, {0x98cb,0xe99c}, {0x98cc,0xe99d}, {0x98cd,0xe99e}, {0x98ce,0xe99f}, {0x98cf,0xe9a0}, {0x98d0,0xe9a1}, {0x98d1,0xe9a2}, {0x98d2,0xe9a3}, {0x98d3,0xe9a4}, {0x98d4,0xe9a5}, {0x98d5,0xe9a6}, {0x98d6,0xe9a7}, {0x98d7,0xe9a8}, {0x98d8,0xe9a9}, {0x98d9,0xe9aa}, {0x98da,0xe9ab}, {0x98db,0xe9ac}, {0x98dc,0xe9ad}, {0x98dd,0xe9ae}, {0x98de,0xe9af}, {0x98df,0xe9b0}, {0x98e0,0xe9b1}, {0x98e1,0xe9b2}, {0x98e2,0xe9b3}, {0x98e3,0xe9b4}, {0x98e4,0xe9b5}, {0x98e5,0xe9b6}, {0x98e6,0xe9b7}, {0x98e7,0xe9b8}, {0x98e8,0xe9b9}, {0x98e9,0xe9ba}, {0x98ea,0xe9bb}, {0x98eb,0xe9bc}, {0x98ec,0xe9bd}, {0x98ed,0xe9be}, {0x98ee,0xe9bf}, {0x98ef,0xe9c0}, {0x98f0,0xe9c1}, {0x98f1,0xe9c2}, {0x98f2,0xe9c3}, {0x98f3,0xe9c4}, {0x98f4,0xe9c5}, {0x98f5,0xe9c6}, {0x98f6,0xe9c7}, {0x98f7,0xe9c8}, {0x98f8,0xe9c9}, {0x98f9,0xe9ca}, {0x98fa,0xe9cb}, {0x98fb,0xe9cc}, {0x98fc,0xe9cd}, {0x98fd,0xe9ce}, {0x98fe,0xe9cf}, {0x9940,0xe9d0}, {0x9941,0xe9d1}, {0x9942,0xe9d2}, {0x9943,0xe9d3}, {0x9944,0xe9d4}, {0x9945,0xe9d5}, {0x9946,0xe9d6}, {0x9947,0xe9d7}, {0x9948,0xe9d8}, {0x9949,0xe9d9}, {0x994a,0xe9da}, {0x994b,0xe9db}, {0x994c,0xe9dc}, {0x994d,0xe9dd}, {0x994e,0xe9de}, {0x994f,0xe9df}, {0x9950,0xe9e0}, {0x9951,0xe9e1}, {0x9952,0xe9e2}, {0x9953,0xe9e3}, {0x9954,0xe9e4}, {0x9955,0xe9e5}, {0x9956,0xe9e6}, {0x9957,0xe9e7}, {0x9958,0xe9e8}, {0x9959,0xe9e9}, {0x995a,0xe9ea}, {0x995b,0xe9eb}, {0x995c,0xe9ec}, {0x995d,0xe9ed}, {0x995e,0xe9ee}, {0x995f,0xe9ef}, {0x9960,0xe9f0}, {0x9961,0xe9f1}, {0x9962,0xe9f2}, {0x9963,0xe9f3}, {0x9964,0xe9f4}, {0x9965,0xe9f5}, {0x9966,0xe9f6}, {0x9967,0xe9f7}, {0x9968,0xe9f8}, {0x9969,0xe9f9}, {0x996a,0xe9fa}, {0x996b,0xe9fb}, {0x996c,0xe9fc}, {0x996d,0xe9fd}, {0x996e,0xe9fe}, {0x996f,0xe9ff}, {0x9970,0xea00}, {0x9971,0xea01}, {0x9972,0xea02}, {0x9973,0xea03}, {0x9974,0xea04}, {0x9975,0xea05}, {0x9976,0xea06}, {0x9977,0xea07}, {0x9978,0xea08}, {0x9979,0xea09}, {0x997a,0xea0a}, {0x997b,0xea0b}, {0x997c,0xea0c}, {0x997d,0xea0d}, {0x997e,0xea0e}, {0x99a1,0xea0f}, {0x99a2,0xea10}, {0x99a3,0xea11}, {0x99a4,0xea12}, {0x99a5,0xea13}, {0x99a6,0xea14}, {0x99a7,0xea15}, {0x99a8,0xea16}, {0x99a9,0xea17}, {0x99aa,0xea18}, {0x99ab,0xea19}, {0x99ac,0xea1a}, {0x99ad,0xea1b}, {0x99ae,0xea1c}, {0x99af,0xea1d}, {0x99b0,0xea1e}, {0x99b1,0xea1f}, {0x99b2,0xea20}, {0x99b3,0xea21}, {0x99b4,0xea22}, {0x99b5,0xea23}, {0x99b6,0xea24}, {0x99b7,0xea25}, {0x99b8,0xea26}, {0x99b9,0xea27}, {0x99ba,0xea28}, {0x99bb,0xea29}, {0x99bc,0xea2a}, {0x99bd,0xea2b}, {0x99be,0xea2c}, {0x99bf,0xea2d}, {0x99c0,0xea2e}, {0x99c1,0xea2f}, {0x99c2,0xea30}, {0x99c3,0xea31}, {0x99c4,0xea32}, {0x99c5,0xea33}, {0x99c6,0xea34}, {0x99c7,0xea35}, {0x99c8,0xea36}, {0x99c9,0xea37}, {0x99ca,0xea38}, {0x99cb,0xea39}, {0x99cc,0xea3a}, {0x99cd,0xea3b}, {0x99ce,0xea3c}, {0x99cf,0xea3d}, {0x99d0,0xea3e}, {0x99d1,0xea3f}, {0x99d2,0xea40}, {0x99d3,0xea41}, {0x99d4,0xea42}, {0x99d5,0xea43}, {0x99d6,0xea44}, {0x99d7,0xea45}, {0x99d8,0xea46}, {0x99d9,0xea47}, {0x99da,0xea48}, {0x99db,0xea49}, {0x99dc,0xea4a}, {0x99dd,0xea4b}, {0x99de,0xea4c}, {0x99df,0xea4d}, {0x99e0,0xea4e}, {0x99e1,0xea4f}, {0x99e2,0xea50}, {0x99e3,0xea51}, {0x99e4,0xea52}, {0x99e5,0xea53}, {0x99e6,0xea54}, {0x99e7,0xea55}, {0x99e8,0xea56}, {0x99e9,0xea57}, {0x99ea,0xea58}, {0x99eb,0xea59}, {0x99ec,0xea5a}, {0x99ed,0xea5b}, {0x99ee,0xea5c}, {0x99ef,0xea5d}, {0x99f0,0xea5e}, {0x99f1,0xea5f}, {0x99f2,0xea60}, {0x99f3,0xea61}, {0x99f4,0xea62}, {0x99f5,0xea63}, {0x99f6,0xea64}, {0x99f7,0xea65}, {0x99f8,0xea66}, {0x99f9,0xea67}, {0x99fa,0xea68}, {0x99fb,0xea69}, {0x99fc,0xea6a}, {0x99fd,0xea6b}, {0x99fe,0xea6c}, {0x9a40,0xea6d}, {0x9a41,0xea6e}, {0x9a42,0xea6f}, {0x9a43,0xea70}, {0x9a44,0xea71}, {0x9a45,0xea72}, {0x9a46,0xea73}, {0x9a47,0xea74}, {0x9a48,0xea75}, {0x9a49,0xea76}, {0x9a4a,0xea77}, {0x9a4b,0xea78}, {0x9a4c,0xea79}, {0x9a4d,0xea7a}, {0x9a4e,0xea7b}, {0x9a4f,0xea7c}, {0x9a50,0xea7d}, {0x9a51,0xea7e}, {0x9a52,0xea7f}, {0x9a53,0xea80}, {0x9a54,0xea81}, {0x9a55,0xea82}, {0x9a56,0xea83}, {0x9a57,0xea84}, {0x9a58,0xea85}, {0x9a59,0xea86}, {0x9a5a,0xea87}, {0x9a5b,0xea88}, {0x9a5c,0xea89}, {0x9a5d,0xea8a}, {0x9a5e,0xea8b}, {0x9a5f,0xea8c}, {0x9a60,0xea8d}, {0x9a61,0xea8e}, {0x9a62,0xea8f}, {0x9a63,0xea90}, {0x9a64,0xea91}, {0x9a65,0xea92}, {0x9a66,0xea93}, {0x9a67,0xea94}, {0x9a68,0xea95}, {0x9a69,0xea96}, {0x9a6a,0xea97}, {0x9a6b,0xea98}, {0x9a6c,0xea99}, {0x9a6d,0xea9a}, {0x9a6e,0xea9b}, {0x9a6f,0xea9c}, {0x9a70,0xea9d}, {0x9a71,0xea9e}, {0x9a72,0xea9f}, {0x9a73,0xeaa0}, {0x9a74,0xeaa1}, {0x9a75,0xeaa2}, {0x9a76,0xeaa3}, {0x9a77,0xeaa4}, {0x9a78,0xeaa5}, {0x9a79,0xeaa6}, {0x9a7a,0xeaa7}, {0x9a7b,0xeaa8}, {0x9a7c,0xeaa9}, {0x9a7d,0xeaaa}, {0x9a7e,0xeaab}, {0x9aa1,0xeaac}, {0x9aa2,0xeaad}, {0x9aa3,0xeaae}, {0x9aa4,0xeaaf}, {0x9aa5,0xeab0}, {0x9aa6,0xeab1}, {0x9aa7,0xeab2}, {0x9aa8,0xeab3}, {0x9aa9,0xeab4}, {0x9aaa,0xeab5}, {0x9aab,0xeab6}, {0x9aac,0xeab7}, {0x9aad,0xeab8}, {0x9aae,0xeab9}, {0x9aaf,0xeaba}, {0x9ab0,0xeabb}, {0x9ab1,0xeabc}, {0x9ab2,0xeabd}, {0x9ab3,0xeabe}, {0x9ab4,0xeabf}, {0x9ab5,0xeac0}, {0x9ab6,0xeac1}, {0x9ab7,0xeac2}, {0x9ab8,0xeac3}, {0x9ab9,0xeac4}, {0x9aba,0xeac5}, {0x9abb,0xeac6}, {0x9abc,0xeac7}, {0x9abd,0xeac8}, {0x9abe,0xeac9}, {0x9abf,0xeaca}, {0x9ac0,0xeacb}, {0x9ac1,0xeacc}, {0x9ac2,0xeacd}, {0x9ac3,0xeace}, {0x9ac4,0xeacf}, {0x9ac5,0xead0}, {0x9ac6,0xead1}, {0x9ac7,0xead2}, {0x9ac8,0xead3}, {0x9ac9,0xead4}, {0x9aca,0xead5}, {0x9acb,0xead6}, {0x9acc,0xead7}, {0x9acd,0xead8}, {0x9ace,0xead9}, {0x9acf,0xeada}, {0x9ad0,0xeadb}, {0x9ad1,0xeadc}, {0x9ad2,0xeadd}, {0x9ad3,0xeade}, {0x9ad4,0xeadf}, {0x9ad5,0xeae0}, {0x9ad6,0xeae1}, {0x9ad7,0xeae2}, {0x9ad8,0xeae3}, {0x9ad9,0xeae4}, {0x9ada,0xeae5}, {0x9adb,0xeae6}, {0x9adc,0xeae7}, {0x9add,0xeae8}, {0x9ade,0xeae9}, {0x9adf,0xeaea}, {0x9ae0,0xeaeb}, {0x9ae1,0xeaec}, {0x9ae2,0xeaed}, {0x9ae3,0xeaee}, {0x9ae4,0xeaef}, {0x9ae5,0xeaf0}, {0x9ae6,0xeaf1}, {0x9ae7,0xeaf2}, {0x9ae8,0xeaf3}, {0x9ae9,0xeaf4}, {0x9aea,0xeaf5}, {0x9aeb,0xeaf6}, {0x9aec,0xeaf7}, {0x9aed,0xeaf8}, {0x9aee,0xeaf9}, {0x9aef,0xeafa}, {0x9af0,0xeafb}, {0x9af1,0xeafc}, {0x9af2,0xeafd}, {0x9af3,0xeafe}, {0x9af4,0xeaff}, {0x9af5,0xeb00}, {0x9af6,0xeb01}, {0x9af7,0xeb02}, {0x9af8,0xeb03}, {0x9af9,0xeb04}, {0x9afa,0xeb05}, {0x9afb,0xeb06}, {0x9afc,0xeb07}, {0x9afd,0xeb08}, {0x9afe,0xeb09}, {0x9b40,0xeb0a}, {0x9b41,0xeb0b}, {0x9b42,0xeb0c}, {0x9b43,0xeb0d}, {0x9b44,0xeb0e}, {0x9b45,0xeb0f}, {0x9b46,0xeb10}, {0x9b47,0xeb11}, {0x9b48,0xeb12}, {0x9b49,0xeb13}, {0x9b4a,0xeb14}, {0x9b4b,0xeb15}, {0x9b4c,0xeb16}, {0x9b4d,0xeb17}, {0x9b4e,0xeb18}, {0x9b4f,0xeb19}, {0x9b50,0xeb1a}, {0x9b51,0xeb1b}, {0x9b52,0xeb1c}, {0x9b53,0xeb1d}, {0x9b54,0xeb1e}, {0x9b55,0xeb1f}, {0x9b56,0xeb20}, {0x9b57,0xeb21}, {0x9b58,0xeb22}, {0x9b59,0xeb23}, {0x9b5a,0xeb24}, {0x9b5b,0xeb25}, {0x9b5c,0xeb26}, {0x9b5d,0xeb27}, {0x9b5e,0xeb28}, {0x9b5f,0xeb29}, {0x9b60,0xeb2a}, {0x9b61,0xeb2b}, {0x9b62,0xeb2c}, {0x9b63,0xeb2d}, {0x9b64,0xeb2e}, {0x9b65,0xeb2f}, {0x9b66,0xeb30}, {0x9b67,0xeb31}, {0x9b68,0xeb32}, {0x9b69,0xeb33}, {0x9b6a,0xeb34}, {0x9b6b,0xeb35}, {0x9b6c,0xeb36}, {0x9b6d,0xeb37}, {0x9b6e,0xeb38}, {0x9b6f,0xeb39}, {0x9b70,0xeb3a}, {0x9b71,0xeb3b}, {0x9b72,0xeb3c}, {0x9b73,0xeb3d}, {0x9b74,0xeb3e}, {0x9b75,0xeb3f}, {0x9b76,0xeb40}, {0x9b77,0xeb41}, {0x9b78,0xeb42}, {0x9b79,0xeb43}, {0x9b7a,0xeb44}, {0x9b7b,0xeb45}, {0x9b7c,0xeb46}, {0x9b7d,0xeb47}, {0x9b7e,0xeb48}, {0x9ba1,0xeb49}, {0x9ba2,0xeb4a}, {0x9ba3,0xeb4b}, {0x9ba4,0xeb4c}, {0x9ba5,0xeb4d}, {0x9ba6,0xeb4e}, {0x9ba7,0xeb4f}, {0x9ba8,0xeb50}, {0x9ba9,0xeb51}, {0x9baa,0xeb52}, {0x9bab,0xeb53}, {0x9bac,0xeb54}, {0x9bad,0xeb55}, {0x9bae,0xeb56}, {0x9baf,0xeb57}, {0x9bb0,0xeb58}, {0x9bb1,0xeb59}, {0x9bb2,0xeb5a}, {0x9bb3,0xeb5b}, {0x9bb4,0xeb5c}, {0x9bb5,0xeb5d}, {0x9bb6,0xeb5e}, {0x9bb7,0xeb5f}, {0x9bb8,0xeb60}, {0x9bb9,0xeb61}, {0x9bba,0xeb62}, {0x9bbb,0xeb63}, {0x9bbc,0xeb64}, {0x9bbd,0xeb65}, {0x9bbe,0xeb66}, {0x9bbf,0xeb67}, {0x9bc0,0xeb68}, {0x9bc1,0xeb69}, {0x9bc2,0xeb6a}, {0x9bc3,0xeb6b}, {0x9bc4,0xeb6c}, {0x9bc5,0xeb6d}, {0x9bc6,0xeb6e}, {0x9bc7,0xeb6f}, {0x9bc8,0xeb70}, {0x9bc9,0xeb71}, {0x9bca,0xeb72}, {0x9bcb,0xeb73}, {0x9bcc,0xeb74}, {0x9bcd,0xeb75}, {0x9bce,0xeb76}, {0x9bcf,0xeb77}, {0x9bd0,0xeb78}, {0x9bd1,0xeb79}, {0x9bd2,0xeb7a}, {0x9bd3,0xeb7b}, {0x9bd4,0xeb7c}, {0x9bd5,0xeb7d}, {0x9bd6,0xeb7e}, {0x9bd7,0xeb7f}, {0x9bd8,0xeb80}, {0x9bd9,0xeb81}, {0x9bda,0xeb82}, {0x9bdb,0xeb83}, {0x9bdc,0xeb84}, {0x9bdd,0xeb85}, {0x9bde,0xeb86}, {0x9bdf,0xeb87}, {0x9be0,0xeb88}, {0x9be1,0xeb89}, {0x9be2,0xeb8a}, {0x9be3,0xeb8b}, {0x9be4,0xeb8c}, {0x9be5,0xeb8d}, {0x9be6,0xeb8e}, {0x9be7,0xeb8f}, {0x9be8,0xeb90}, {0x9be9,0xeb91}, {0x9bea,0xeb92}, {0x9beb,0xeb93}, {0x9bec,0xeb94}, {0x9bed,0xeb95}, {0x9bee,0xeb96}, {0x9bef,0xeb97}, {0x9bf0,0xeb98}, {0x9bf1,0xeb99}, {0x9bf2,0xeb9a}, {0x9bf3,0xeb9b}, {0x9bf4,0xeb9c}, {0x9bf5,0xeb9d}, {0x9bf6,0xeb9e}, {0x9bf7,0xeb9f}, {0x9bf8,0xeba0}, {0x9bf9,0xeba1}, {0x9bfa,0xeba2}, {0x9bfb,0xeba3}, {0x9bfc,0xeba4}, {0x9bfd,0xeba5}, {0x9bfe,0xeba6}, {0x9c40,0xeba7}, {0x9c41,0xeba8}, {0x9c42,0xeba9}, {0x9c43,0xebaa}, {0x9c44,0xebab}, {0x9c45,0xebac}, {0x9c46,0xebad}, {0x9c47,0xebae}, {0x9c48,0xebaf}, {0x9c49,0xebb0}, {0x9c4a,0xebb1}, {0x9c4b,0xebb2}, {0x9c4c,0xebb3}, {0x9c4d,0xebb4}, {0x9c4e,0xebb5}, {0x9c4f,0xebb6}, {0x9c50,0xebb7}, {0x9c51,0xebb8}, {0x9c52,0xebb9}, {0x9c53,0xebba}, {0x9c54,0xebbb}, {0x9c55,0xebbc}, {0x9c56,0xebbd}, {0x9c57,0xebbe}, {0x9c58,0xebbf}, {0x9c59,0xebc0}, {0x9c5a,0xebc1}, {0x9c5b,0xebc2}, {0x9c5c,0xebc3}, {0x9c5d,0xebc4}, {0x9c5e,0xebc5}, {0x9c5f,0xebc6}, {0x9c60,0xebc7}, {0x9c61,0xebc8}, {0x9c62,0xebc9}, {0x9c63,0xebca}, {0x9c64,0xebcb}, {0x9c65,0xebcc}, {0x9c66,0xebcd}, {0x9c67,0xebce}, {0x9c68,0xebcf}, {0x9c69,0xebd0}, {0x9c6a,0xebd1}, {0x9c6b,0xebd2}, {0x9c6c,0xebd3}, {0x9c6d,0xebd4}, {0x9c6e,0xebd5}, {0x9c6f,0xebd6}, {0x9c70,0xebd7}, {0x9c71,0xebd8}, {0x9c72,0xebd9}, {0x9c73,0xebda}, {0x9c74,0xebdb}, {0x9c75,0xebdc}, {0x9c76,0xebdd}, {0x9c77,0xebde}, {0x9c78,0xebdf}, {0x9c79,0xebe0}, {0x9c7a,0xebe1}, {0x9c7b,0xebe2}, {0x9c7c,0xebe3}, {0x9c7d,0xebe4}, {0x9c7e,0xebe5}, {0x9ca1,0xebe6}, {0x9ca2,0xebe7}, {0x9ca3,0xebe8}, {0x9ca4,0xebe9}, {0x9ca5,0xebea}, {0x9ca6,0xebeb}, {0x9ca7,0xebec}, {0x9ca8,0xebed}, {0x9ca9,0xebee}, {0x9caa,0xebef}, {0x9cab,0xebf0}, {0x9cac,0xebf1}, {0x9cad,0xebf2}, {0x9cae,0xebf3}, {0x9caf,0xebf4}, {0x9cb0,0xebf5}, {0x9cb1,0xebf6}, {0x9cb2,0xebf7}, {0x9cb3,0xebf8}, {0x9cb4,0xebf9}, {0x9cb5,0xebfa}, {0x9cb6,0xebfb}, {0x9cb7,0xebfc}, {0x9cb8,0xebfd}, {0x9cb9,0xebfe}, {0x9cba,0xebff}, {0x9cbb,0xec00}, {0x9cbc,0xec01}, {0x9cbd,0xec02}, {0x9cbe,0xec03}, {0x9cbf,0xec04}, {0x9cc0,0xec05}, {0x9cc1,0xec06}, {0x9cc2,0xec07}, {0x9cc3,0xec08}, {0x9cc4,0xec09}, {0x9cc5,0xec0a}, {0x9cc6,0xec0b}, {0x9cc7,0xec0c}, {0x9cc8,0xec0d}, {0x9cc9,0xec0e}, {0x9cca,0xec0f}, {0x9ccb,0xec10}, {0x9ccc,0xec11}, {0x9ccd,0xec12}, {0x9cce,0xec13}, {0x9ccf,0xec14}, {0x9cd0,0xec15}, {0x9cd1,0xec16}, {0x9cd2,0xec17}, {0x9cd3,0xec18}, {0x9cd4,0xec19}, {0x9cd5,0xec1a}, {0x9cd6,0xec1b}, {0x9cd7,0xec1c}, {0x9cd8,0xec1d}, {0x9cd9,0xec1e}, {0x9cda,0xec1f}, {0x9cdb,0xec20}, {0x9cdc,0xec21}, {0x9cdd,0xec22}, {0x9cde,0xec23}, {0x9cdf,0xec24}, {0x9ce0,0xec25}, {0x9ce1,0xec26}, {0x9ce2,0xec27}, {0x9ce3,0xec28}, {0x9ce4,0xec29}, {0x9ce5,0xec2a}, {0x9ce6,0xec2b}, {0x9ce7,0xec2c}, {0x9ce8,0xec2d}, {0x9ce9,0xec2e}, {0x9cea,0xec2f}, {0x9ceb,0xec30}, {0x9cec,0xec31}, {0x9ced,0xec32}, {0x9cee,0xec33}, {0x9cef,0xec34}, {0x9cf0,0xec35}, {0x9cf1,0xec36}, {0x9cf2,0xec37}, {0x9cf3,0xec38}, {0x9cf4,0xec39}, {0x9cf5,0xec3a}, {0x9cf6,0xec3b}, {0x9cf7,0xec3c}, {0x9cf8,0xec3d}, {0x9cf9,0xec3e}, {0x9cfa,0xec3f}, {0x9cfb,0xec40}, {0x9cfc,0xec41}, {0x9cfd,0xec42}, {0x9cfe,0xec43}, {0x9d40,0xec44}, {0x9d41,0xec45}, {0x9d42,0xec46}, {0x9d43,0xec47}, {0x9d44,0xec48}, {0x9d45,0xec49}, {0x9d46,0xec4a}, {0x9d47,0xec4b}, {0x9d48,0xec4c}, {0x9d49,0xec4d}, {0x9d4a,0xec4e}, {0x9d4b,0xec4f}, {0x9d4c,0xec50}, {0x9d4d,0xec51}, {0x9d4e,0xec52}, {0x9d4f,0xec53}, {0x9d50,0xec54}, {0x9d51,0xec55}, {0x9d52,0xec56}, {0x9d53,0xec57}, {0x9d54,0xec58}, {0x9d55,0xec59}, {0x9d56,0xec5a}, {0x9d57,0xec5b}, {0x9d58,0xec5c}, {0x9d59,0xec5d}, {0x9d5a,0xec5e}, {0x9d5b,0xec5f}, {0x9d5c,0xec60}, {0x9d5d,0xec61}, {0x9d5e,0xec62}, {0x9d5f,0xec63}, {0x9d60,0xec64}, {0x9d61,0xec65}, {0x9d62,0xec66}, {0x9d63,0xec67}, {0x9d64,0xec68}, {0x9d65,0xec69}, {0x9d66,0xec6a}, {0x9d67,0xec6b}, {0x9d68,0xec6c}, {0x9d69,0xec6d}, {0x9d6a,0xec6e}, {0x9d6b,0xec6f}, {0x9d6c,0xec70}, {0x9d6d,0xec71}, {0x9d6e,0xec72}, {0x9d6f,0xec73}, {0x9d70,0xec74}, {0x9d71,0xec75}, {0x9d72,0xec76}, {0x9d73,0xec77}, {0x9d74,0xec78}, {0x9d75,0xec79}, {0x9d76,0xec7a}, {0x9d77,0xec7b}, {0x9d78,0xec7c}, {0x9d79,0xec7d}, {0x9d7a,0xec7e}, {0x9d7b,0xec7f}, {0x9d7c,0xec80}, {0x9d7d,0xec81}, {0x9d7e,0xec82}, {0x9da1,0xec83}, {0x9da2,0xec84}, {0x9da3,0xec85}, {0x9da4,0xec86}, {0x9da5,0xec87}, {0x9da6,0xec88}, {0x9da7,0xec89}, {0x9da8,0xec8a}, {0x9da9,0xec8b}, {0x9daa,0xec8c}, {0x9dab,0xec8d}, {0x9dac,0xec8e}, {0x9dad,0xec8f}, {0x9dae,0xec90}, {0x9daf,0xec91}, {0x9db0,0xec92}, {0x9db1,0xec93}, {0x9db2,0xec94}, {0x9db3,0xec95}, {0x9db4,0xec96}, {0x9db5,0xec97}, {0x9db6,0xec98}, {0x9db7,0xec99}, {0x9db8,0xec9a}, {0x9db9,0xec9b}, {0x9dba,0xec9c}, {0x9dbb,0xec9d}, {0x9dbc,0xec9e}, {0x9dbd,0xec9f}, {0x9dbe,0xeca0}, {0x9dbf,0xeca1}, {0x9dc0,0xeca2}, {0x9dc1,0xeca3}, {0x9dc2,0xeca4}, {0x9dc3,0xeca5}, {0x9dc4,0xeca6}, {0x9dc5,0xeca7}, {0x9dc6,0xeca8}, {0x9dc7,0xeca9}, {0x9dc8,0xecaa}, {0x9dc9,0xecab}, {0x9dca,0xecac}, {0x9dcb,0xecad}, {0x9dcc,0xecae}, {0x9dcd,0xecaf}, {0x9dce,0xecb0}, {0x9dcf,0xecb1}, {0x9dd0,0xecb2}, {0x9dd1,0xecb3}, {0x9dd2,0xecb4}, {0x9dd3,0xecb5}, {0x9dd4,0xecb6}, {0x9dd5,0xecb7}, {0x9dd6,0xecb8}, {0x9dd7,0xecb9}, {0x9dd8,0xecba}, {0x9dd9,0xecbb}, {0x9dda,0xecbc}, {0x9ddb,0xecbd}, {0x9ddc,0xecbe}, {0x9ddd,0xecbf}, {0x9dde,0xecc0}, {0x9ddf,0xecc1}, {0x9de0,0xecc2}, {0x9de1,0xecc3}, {0x9de2,0xecc4}, {0x9de3,0xecc5}, {0x9de4,0xecc6}, {0x9de5,0xecc7}, {0x9de6,0xecc8}, {0x9de7,0xecc9}, {0x9de8,0xecca}, {0x9de9,0xeccb}, {0x9dea,0xeccc}, {0x9deb,0xeccd}, {0x9dec,0xecce}, {0x9ded,0xeccf}, {0x9dee,0xecd0}, {0x9def,0xecd1}, {0x9df0,0xecd2}, {0x9df1,0xecd3}, {0x9df2,0xecd4}, {0x9df3,0xecd5}, {0x9df4,0xecd6}, {0x9df5,0xecd7}, {0x9df6,0xecd8}, {0x9df7,0xecd9}, {0x9df8,0xecda}, {0x9df9,0xecdb}, {0x9dfa,0xecdc}, {0x9dfb,0xecdd}, {0x9dfc,0xecde}, {0x9dfd,0xecdf}, {0x9dfe,0xece0}, {0x9e40,0xece1}, {0x9e41,0xece2}, {0x9e42,0xece3}, {0x9e43,0xece4}, {0x9e44,0xece5}, {0x9e45,0xece6}, {0x9e46,0xece7}, {0x9e47,0xece8}, {0x9e48,0xece9}, {0x9e49,0xecea}, {0x9e4a,0xeceb}, {0x9e4b,0xecec}, {0x9e4c,0xeced}, {0x9e4d,0xecee}, {0x9e4e,0xecef}, {0x9e4f,0xecf0}, {0x9e50,0xecf1}, {0x9e51,0xecf2}, {0x9e52,0xecf3}, {0x9e53,0xecf4}, {0x9e54,0xecf5}, {0x9e55,0xecf6}, {0x9e56,0xecf7}, {0x9e57,0xecf8}, {0x9e58,0xecf9}, {0x9e59,0xecfa}, {0x9e5a,0xecfb}, {0x9e5b,0xecfc}, {0x9e5c,0xecfd}, {0x9e5d,0xecfe}, {0x9e5e,0xecff}, {0x9e5f,0xed00}, {0x9e60,0xed01}, {0x9e61,0xed02}, {0x9e62,0xed03}, {0x9e63,0xed04}, {0x9e64,0xed05}, {0x9e65,0xed06}, {0x9e66,0xed07}, {0x9e67,0xed08}, {0x9e68,0xed09}, {0x9e69,0xed0a}, {0x9e6a,0xed0b}, {0x9e6b,0xed0c}, {0x9e6c,0xed0d}, {0x9e6d,0xed0e}, {0x9e6e,0xed0f}, {0x9e6f,0xed10}, {0x9e70,0xed11}, {0x9e71,0xed12}, {0x9e72,0xed13}, {0x9e73,0xed14}, {0x9e74,0xed15}, {0x9e75,0xed16}, {0x9e76,0xed17}, {0x9e77,0xed18}, {0x9e78,0xed19}, {0x9e79,0xed1a}, {0x9e7a,0xed1b}, {0x9e7b,0xed1c}, {0x9e7c,0xed1d}, {0x9e7d,0xed1e}, {0x9e7e,0xed1f}, {0x9ea1,0xed20}, {0x9ea2,0xed21}, {0x9ea3,0xed22}, {0x9ea4,0xed23}, {0x9ea5,0xed24}, {0x9ea6,0xed25}, {0x9ea7,0xed26}, {0x9ea8,0xed27}, {0x9ea9,0xed28}, {0x9eaa,0xed29}, {0x9eab,0xed2a}, {0x9eac,0xed2b}, {0x9ead,0xed2c}, {0x9eae,0xed2d}, {0x9eaf,0xed2e}, {0x9eb0,0xed2f}, {0x9eb1,0xed30}, {0x9eb2,0xed31}, {0x9eb3,0xed32}, {0x9eb4,0xed33}, {0x9eb5,0xed34}, {0x9eb6,0xed35}, {0x9eb7,0xed36}, {0x9eb8,0xed37}, {0x9eb9,0xed38}, {0x9eba,0xed39}, {0x9ebb,0xed3a}, {0x9ebc,0xed3b}, {0x9ebd,0xed3c}, {0x9ebe,0xed3d}, {0x9ebf,0xed3e}, {0x9ec0,0xed3f}, {0x9ec1,0xed40}, {0x9ec2,0xed41}, {0x9ec3,0xed42}, {0x9ec4,0xed43}, {0x9ec5,0xed44}, {0x9ec6,0xed45}, {0x9ec7,0xed46}, {0x9ec8,0xed47}, {0x9ec9,0xed48}, {0x9eca,0xed49}, {0x9ecb,0xed4a}, {0x9ecc,0xed4b}, {0x9ecd,0xed4c}, {0x9ece,0xed4d}, {0x9ecf,0xed4e}, {0x9ed0,0xed4f}, {0x9ed1,0xed50}, {0x9ed2,0xed51}, {0x9ed3,0xed52}, {0x9ed4,0xed53}, {0x9ed5,0xed54}, {0x9ed6,0xed55}, {0x9ed7,0xed56}, {0x9ed8,0xed57}, {0x9ed9,0xed58}, {0x9eda,0xed59}, {0x9edb,0xed5a}, {0x9edc,0xed5b}, {0x9edd,0xed5c}, {0x9ede,0xed5d}, {0x9edf,0xed5e}, {0x9ee0,0xed5f}, {0x9ee1,0xed60}, {0x9ee2,0xed61}, {0x9ee3,0xed62}, {0x9ee4,0xed63}, {0x9ee5,0xed64}, {0x9ee6,0xed65}, {0x9ee7,0xed66}, {0x9ee8,0xed67}, {0x9ee9,0xed68}, {0x9eea,0xed69}, {0x9eeb,0xed6a}, {0x9eec,0xed6b}, {0x9eed,0xed6c}, {0x9eee,0xed6d}, {0x9eef,0xed6e}, {0x9ef0,0xed6f}, {0x9ef1,0xed70}, {0x9ef2,0xed71}, {0x9ef3,0xed72}, {0x9ef4,0xed73}, {0x9ef5,0xed74}, {0x9ef6,0xed75}, {0x9ef7,0xed76}, {0x9ef8,0xed77}, {0x9ef9,0xed78}, {0x9efa,0xed79}, {0x9efb,0xed7a}, {0x9efc,0xed7b}, {0x9efd,0xed7c}, {0x9efe,0xed7d}, {0x9f40,0xed7e}, {0x9f41,0xed7f}, {0x9f42,0xed80}, {0x9f43,0xed81}, {0x9f44,0xed82}, {0x9f45,0xed83}, {0x9f46,0xed84}, {0x9f47,0xed85}, {0x9f48,0xed86}, {0x9f49,0xed87}, {0x9f4a,0xed88}, {0x9f4b,0xed89}, {0x9f4c,0xed8a}, {0x9f4d,0xed8b}, {0x9f4e,0xed8c}, {0x9f4f,0xed8d}, {0x9f50,0xed8e}, {0x9f51,0xed8f}, {0x9f52,0xed90}, {0x9f53,0xed91}, {0x9f54,0xed92}, {0x9f55,0xed93}, {0x9f56,0xed94}, {0x9f57,0xed95}, {0x9f58,0xed96}, {0x9f59,0xed97}, {0x9f5a,0xed98}, {0x9f5b,0xed99}, {0x9f5c,0xed9a}, {0x9f5d,0xed9b}, {0x9f5e,0xed9c}, {0x9f5f,0xed9d}, {0x9f60,0xed9e}, {0x9f61,0xed9f}, {0x9f62,0xeda0}, {0x9f63,0xeda1}, {0x9f64,0xeda2}, {0x9f65,0xeda3}, {0x9f66,0xeda4}, {0x9f67,0xeda5}, {0x9f68,0xeda6}, {0x9f69,0xeda7}, {0x9f6a,0xeda8}, {0x9f6b,0xeda9}, {0x9f6c,0xedaa}, {0x9f6d,0xedab}, {0x9f6e,0xedac}, {0x9f6f,0xedad}, {0x9f70,0xedae}, {0x9f71,0xedaf}, {0x9f72,0xedb0}, {0x9f73,0xedb1}, {0x9f74,0xedb2}, {0x9f75,0xedb3}, {0x9f76,0xedb4}, {0x9f77,0xedb5}, {0x9f78,0xedb6}, {0x9f79,0xedb7}, {0x9f7a,0xedb8}, {0x9f7b,0xedb9}, {0x9f7c,0xedba}, {0x9f7d,0xedbb}, {0x9f7e,0xedbc}, {0x9fa1,0xedbd}, {0x9fa2,0xedbe}, {0x9fa3,0xedbf}, {0x9fa4,0xedc0}, {0x9fa5,0xedc1}, {0x9fa6,0xedc2}, {0x9fa7,0xedc3}, {0x9fa8,0xedc4}, {0x9fa9,0xedc5}, {0x9faa,0xedc6}, {0x9fab,0xedc7}, {0x9fac,0xedc8}, {0x9fad,0xedc9}, {0x9fae,0xedca}, {0x9faf,0xedcb}, {0x9fb0,0xedcc}, {0x9fb1,0xedcd}, {0x9fb2,0xedce}, {0x9fb3,0xedcf}, {0x9fb4,0xedd0}, {0x9fb5,0xedd1}, {0x9fb6,0xedd2}, {0x9fb7,0xedd3}, {0x9fb8,0xedd4}, {0x9fb9,0xedd5}, {0x9fba,0xedd6}, {0x9fbb,0xedd7}, {0x9fbc,0xedd8}, {0x9fbd,0xedd9}, {0x9fbe,0xedda}, {0x9fbf,0xeddb}, {0x9fc0,0xeddc}, {0x9fc1,0xeddd}, {0x9fc2,0xedde}, {0x9fc3,0xeddf}, {0x9fc4,0xede0}, {0x9fc5,0xede1}, {0x9fc6,0xede2}, {0x9fc7,0xede3}, {0x9fc8,0xede4}, {0x9fc9,0xede5}, {0x9fca,0xede6}, {0x9fcb,0xede7}, {0x9fcc,0xede8}, {0x9fcd,0xede9}, {0x9fce,0xedea}, {0x9fcf,0xedeb}, {0x9fd0,0xedec}, {0x9fd1,0xeded}, {0x9fd2,0xedee}, {0x9fd3,0xedef}, {0x9fd4,0xedf0}, {0x9fd5,0xedf1}, {0x9fd6,0xedf2}, {0x9fd7,0xedf3}, {0x9fd8,0xedf4}, {0x9fd9,0xedf5}, {0x9fda,0xedf6}, {0x9fdb,0xedf7}, {0x9fdc,0xedf8}, {0x9fdd,0xedf9}, {0x9fde,0xedfa}, {0x9fdf,0xedfb}, {0x9fe0,0xedfc}, {0x9fe1,0xedfd}, {0x9fe2,0xedfe}, {0x9fe3,0xedff}, {0x9fe4,0xee00}, {0x9fe5,0xee01}, {0x9fe6,0xee02}, {0x9fe7,0xee03}, {0x9fe8,0xee04}, {0x9fe9,0xee05}, {0x9fea,0xee06}, {0x9feb,0xee07}, {0x9fec,0xee08}, {0x9fed,0xee09}, {0x9fee,0xee0a}, {0x9fef,0xee0b}, {0x9ff0,0xee0c}, {0x9ff1,0xee0d}, {0x9ff2,0xee0e}, {0x9ff3,0xee0f}, {0x9ff4,0xee10}, {0x9ff5,0xee11}, {0x9ff6,0xee12}, {0x9ff7,0xee13}, {0x9ff8,0xee14}, {0x9ff9,0xee15}, {0x9ffa,0xee16}, {0x9ffb,0xee17}, {0x9ffc,0xee18}, {0x9ffd,0xee19}, {0x9ffe,0xee1a}, {0xa040,0xee1b}, {0xa041,0xee1c}, {0xa042,0xee1d}, {0xa043,0xee1e}, {0xa044,0xee1f}, {0xa045,0xee20}, {0xa046,0xee21}, {0xa047,0xee22}, {0xa048,0xee23}, {0xa049,0xee24}, {0xa04a,0xee25}, {0xa04b,0xee26}, {0xa04c,0xee27}, {0xa04d,0xee28}, {0xa04e,0xee29}, {0xa04f,0xee2a}, {0xa050,0xee2b}, {0xa051,0xee2c}, {0xa052,0xee2d}, {0xa053,0xee2e}, {0xa054,0xee2f}, {0xa055,0xee30}, {0xa056,0xee31}, {0xa057,0xee32}, {0xa058,0xee33}, {0xa059,0xee34}, {0xa05a,0xee35}, {0xa05b,0xee36}, {0xa05c,0xee37}, {0xa05d,0xee38}, {0xa05e,0xee39}, {0xa05f,0xee3a}, {0xa060,0xee3b}, {0xa061,0xee3c}, {0xa062,0xee3d}, {0xa063,0xee3e}, {0xa064,0xee3f}, {0xa065,0xee40}, {0xa066,0xee41}, {0xa067,0xee42}, {0xa068,0xee43}, {0xa069,0xee44}, {0xa06a,0xee45}, {0xa06b,0xee46}, {0xa06c,0xee47}, {0xa06d,0xee48}, {0xa06e,0xee49}, {0xa06f,0xee4a}, {0xa070,0xee4b}, {0xa071,0xee4c}, {0xa072,0xee4d}, {0xa073,0xee4e}, {0xa074,0xee4f}, {0xa075,0xee50}, {0xa076,0xee51}, {0xa077,0xee52}, {0xa078,0xee53}, {0xa079,0xee54}, {0xa07a,0xee55}, {0xa07b,0xee56}, {0xa07c,0xee57}, {0xa07d,0xee58}, {0xa07e,0xee59}, {0xa0a1,0xee5a}, {0xa0a2,0xee5b}, {0xa0a3,0xee5c}, {0xa0a4,0xee5d}, {0xa0a5,0xee5e}, {0xa0a6,0xee5f}, {0xa0a7,0xee60}, {0xa0a8,0xee61}, {0xa0a9,0xee62}, {0xa0aa,0xee63}, {0xa0ab,0xee64}, {0xa0ac,0xee65}, {0xa0ad,0xee66}, {0xa0ae,0xee67}, {0xa0af,0xee68}, {0xa0b0,0xee69}, {0xa0b1,0xee6a}, {0xa0b2,0xee6b}, {0xa0b3,0xee6c}, {0xa0b4,0xee6d}, {0xa0b5,0xee6e}, {0xa0b6,0xee6f}, {0xa0b7,0xee70}, {0xa0b8,0xee71}, {0xa0b9,0xee72}, {0xa0ba,0xee73}, {0xa0bb,0xee74}, {0xa0bc,0xee75}, {0xa0bd,0xee76}, {0xa0be,0xee77}, {0xa0bf,0xee78}, {0xa0c0,0xee79}, {0xa0c1,0xee7a}, {0xa0c2,0xee7b}, {0xa0c3,0xee7c}, {0xa0c4,0xee7d}, {0xa0c5,0xee7e}, {0xa0c6,0xee7f}, {0xa0c7,0xee80}, {0xa0c8,0xee81}, {0xa0c9,0xee82}, {0xa0ca,0xee83}, {0xa0cb,0xee84}, {0xa0cc,0xee85}, {0xa0cd,0xee86}, {0xa0ce,0xee87}, {0xa0cf,0xee88}, {0xa0d0,0xee89}, {0xa0d1,0xee8a}, {0xa0d2,0xee8b}, {0xa0d3,0xee8c}, {0xa0d4,0xee8d}, {0xa0d5,0xee8e}, {0xa0d6,0xee8f}, {0xa0d7,0xee90}, {0xa0d8,0xee91}, {0xa0d9,0xee92}, {0xa0da,0xee93}, {0xa0db,0xee94}, {0xa0dc,0xee95}, {0xa0dd,0xee96}, {0xa0de,0xee97}, {0xa0df,0xee98}, {0xa0e0,0xee99}, {0xa0e1,0xee9a}, {0xa0e2,0xee9b}, {0xa0e3,0xee9c}, {0xa0e4,0xee9d}, {0xa0e5,0xee9e}, {0xa0e6,0xee9f}, {0xa0e7,0xeea0}, {0xa0e8,0xeea1}, {0xa0e9,0xeea2}, {0xa0ea,0xeea3}, {0xa0eb,0xeea4}, {0xa0ec,0xeea5}, {0xa0ed,0xeea6}, {0xa0ee,0xeea7}, {0xa0ef,0xeea8}, {0xa0f0,0xeea9}, {0xa0f1,0xeeaa}, {0xa0f2,0xeeab}, {0xa0f3,0xeeac}, {0xa0f4,0xeead}, {0xa0f5,0xeeae}, {0xa0f6,0xeeaf}, {0xa0f7,0xeeb0}, {0xa0f8,0xeeb1}, {0xa0f9,0xeeb2}, {0xa0fa,0xeeb3}, {0xa0fb,0xeeb4}, {0xa0fc,0xeeb5}, {0xa0fd,0xeeb6}, {0xa0fe,0xeeb7}, }; static const B5Map b5_C6A1_to_uc_map[408] = { {0xc6a1,0xf6b1}, {0xc6a2,0xf6b2}, {0xc6a3,0xf6b3}, {0xc6a4,0xf6b4}, {0xc6a5,0xf6b5}, {0xc6a6,0xf6b6}, {0xc6a7,0xf6b7}, {0xc6a8,0xf6b8}, {0xc6a9,0xf6b9}, {0xc6aa,0xf6ba}, {0xc6ab,0xf6bb}, {0xc6ac,0xf6bc}, {0xc6ad,0xf6bd}, {0xc6ae,0xf6be}, {0xc6af,0xf6bf}, {0xc6b0,0xf6c0}, {0xc6b1,0xf6c1}, {0xc6b2,0xf6c2}, {0xc6b3,0xf6c3}, {0xc6b4,0xf6c4}, {0xc6b5,0xf6c5}, {0xc6b6,0xf6c6}, {0xc6b7,0xf6c7}, {0xc6b8,0xf6c8}, {0xc6b9,0xf6c9}, {0xc6ba,0xf6ca}, {0xc6bb,0xf6cb}, {0xc6bc,0xf6cc}, {0xc6bd,0xf6cd}, {0xc6be,0xf6ce}, {0xc6bf,0xf6cf}, {0xc6c0,0xf6d0}, {0xc6c1,0xf6d1}, {0xc6c2,0xf6d2}, {0xc6c3,0xf6d3}, {0xc6c4,0xf6d4}, {0xc6c5,0xf6d5}, {0xc6c6,0xf6d6}, {0xc6c7,0xf6d7}, {0xc6c8,0xf6d8}, {0xc6c9,0xf6d9}, {0xc6ca,0xf6da}, {0xc6cb,0xf6db}, {0xc6cc,0xf6dc}, {0xc6cd,0xf6dd}, {0xc6ce,0xf6de}, {0xc6cf,0xf6df}, {0xc6d0,0xf6e0}, {0xc6d1,0xf6e1}, {0xc6d2,0xf6e2}, {0xc6d3,0xf6e3}, {0xc6d4,0xf6e4}, {0xc6d5,0xf6e5}, {0xc6d6,0xf6e6}, {0xc6d7,0xf6e7}, {0xc6d8,0xf6e8}, {0xc6d9,0xf6e9}, {0xc6da,0xf6ea}, {0xc6db,0xf6eb}, {0xc6dc,0xf6ec}, {0xc6dd,0xf6ed}, {0xc6de,0xf6ee}, {0xc6df,0xf6ef}, {0xc6e0,0xf6f0}, {0xc6e1,0xf6f1}, {0xc6e2,0xf6f2}, {0xc6e3,0xf6f3}, {0xc6e4,0xf6f4}, {0xc6e5,0xf6f5}, {0xc6e6,0xf6f6}, {0xc6e7,0xf6f7}, {0xc6e8,0xf6f8}, {0xc6e9,0xf6f9}, {0xc6ea,0xf6fa}, {0xc6eb,0xf6fb}, {0xc6ec,0xf6fc}, {0xc6ed,0xf6fd}, {0xc6ee,0xf6fe}, {0xc6ef,0xf6ff}, {0xc6f0,0xf700}, {0xc6f1,0xf701}, {0xc6f2,0xf702}, {0xc6f3,0xf703}, {0xc6f4,0xf704}, {0xc6f5,0xf705}, {0xc6f6,0xf706}, {0xc6f7,0xf707}, {0xc6f8,0xf708}, {0xc6f9,0xf709}, {0xc6fa,0xf70a}, {0xc6fb,0xf70b}, {0xc6fc,0xf70c}, {0xc6fd,0xf70d}, {0xc6fe,0xf70e}, {0xc740,0xf70f}, {0xc741,0xf710}, {0xc742,0xf711}, {0xc743,0xf712}, {0xc744,0xf713}, {0xc745,0xf714}, {0xc746,0xf715}, {0xc747,0xf716}, {0xc748,0xf717}, {0xc749,0xf718}, {0xc74a,0xf719}, {0xc74b,0xf71a}, {0xc74c,0xf71b}, {0xc74d,0xf71c}, {0xc74e,0xf71d}, {0xc74f,0xf71e}, {0xc750,0xf71f}, {0xc751,0xf720}, {0xc752,0xf721}, {0xc753,0xf722}, {0xc754,0xf723}, {0xc755,0xf724}, {0xc756,0xf725}, {0xc757,0xf726}, {0xc758,0xf727}, {0xc759,0xf728}, {0xc75a,0xf729}, {0xc75b,0xf72a}, {0xc75c,0xf72b}, {0xc75d,0xf72c}, {0xc75e,0xf72d}, {0xc75f,0xf72e}, {0xc760,0xf72f}, {0xc761,0xf730}, {0xc762,0xf731}, {0xc763,0xf732}, {0xc764,0xf733}, {0xc765,0xf734}, {0xc766,0xf735}, {0xc767,0xf736}, {0xc768,0xf737}, {0xc769,0xf738}, {0xc76a,0xf739}, {0xc76b,0xf73a}, {0xc76c,0xf73b}, {0xc76d,0xf73c}, {0xc76e,0xf73d}, {0xc76f,0xf73e}, {0xc770,0xf73f}, {0xc771,0xf740}, {0xc772,0xf741}, {0xc773,0xf742}, {0xc774,0xf743}, {0xc775,0xf744}, {0xc776,0xf745}, {0xc777,0xf746}, {0xc778,0xf747}, {0xc779,0xf748}, {0xc77a,0xf749}, {0xc77b,0xf74a}, {0xc77c,0xf74b}, {0xc77d,0xf74c}, {0xc77e,0xf74d}, {0xc7a1,0xf74e}, {0xc7a2,0xf74f}, {0xc7a3,0xf750}, {0xc7a4,0xf751}, {0xc7a5,0xf752}, {0xc7a6,0xf753}, {0xc7a7,0xf754}, {0xc7a8,0xf755}, {0xc7a9,0xf756}, {0xc7aa,0xf757}, {0xc7ab,0xf758}, {0xc7ac,0xf759}, {0xc7ad,0xf75a}, {0xc7ae,0xf75b}, {0xc7af,0xf75c}, {0xc7b0,0xf75d}, {0xc7b1,0xf75e}, {0xc7b2,0xf75f}, {0xc7b3,0xf760}, {0xc7b4,0xf761}, {0xc7b5,0xf762}, {0xc7b6,0xf763}, {0xc7b7,0xf764}, {0xc7b8,0xf765}, {0xc7b9,0xf766}, {0xc7ba,0xf767}, {0xc7bb,0xf768}, {0xc7bc,0xf769}, {0xc7bd,0xf76a}, {0xc7be,0xf76b}, {0xc7bf,0xf76c}, {0xc7c0,0xf76d}, {0xc7c1,0xf76e}, {0xc7c2,0xf76f}, {0xc7c3,0xf770}, {0xc7c4,0xf771}, {0xc7c5,0xf772}, {0xc7c6,0xf773}, {0xc7c7,0xf774}, {0xc7c8,0xf775}, {0xc7c9,0xf776}, {0xc7ca,0xf777}, {0xc7cb,0xf778}, {0xc7cc,0xf779}, {0xc7cd,0xf77a}, {0xc7ce,0xf77b}, {0xc7cf,0xf77c}, {0xc7d0,0xf77d}, {0xc7d1,0xf77e}, {0xc7d2,0xf77f}, {0xc7d3,0xf780}, {0xc7d4,0xf781}, {0xc7d5,0xf782}, {0xc7d6,0xf783}, {0xc7d7,0xf784}, {0xc7d8,0xf785}, {0xc7d9,0xf786}, {0xc7da,0xf787}, {0xc7db,0xf788}, {0xc7dc,0xf789}, {0xc7dd,0xf78a}, {0xc7de,0xf78b}, {0xc7df,0xf78c}, {0xc7e0,0xf78d}, {0xc7e1,0xf78e}, {0xc7e2,0xf78f}, {0xc7e3,0xf790}, {0xc7e4,0xf791}, {0xc7e5,0xf792}, {0xc7e6,0xf793}, {0xc7e7,0xf794}, {0xc7e8,0xf795}, {0xc7e9,0xf796}, {0xc7ea,0xf797}, {0xc7eb,0xf798}, {0xc7ec,0xf799}, {0xc7ed,0xf79a}, {0xc7ee,0xf79b}, {0xc7ef,0xf79c}, {0xc7f0,0xf79d}, {0xc7f1,0xf79e}, {0xc7f2,0xf79f}, {0xc7f3,0xf7a0}, {0xc7f4,0xf7a1}, {0xc7f5,0xf7a2}, {0xc7f6,0xf7a3}, {0xc7f7,0xf7a4}, {0xc7f8,0xf7a5}, {0xc7f9,0xf7a6}, {0xc7fa,0xf7a7}, {0xc7fb,0xf7a8}, {0xc7fc,0xf7a9}, {0xc7fd,0xf7aa}, {0xc7fe,0xf7ab}, {0xc840,0xf7ac}, {0xc841,0xf7ad}, {0xc842,0xf7ae}, {0xc843,0xf7af}, {0xc844,0xf7b0}, {0xc845,0xf7b1}, {0xc846,0xf7b2}, {0xc847,0xf7b3}, {0xc848,0xf7b4}, {0xc849,0xf7b5}, {0xc84a,0xf7b6}, {0xc84b,0xf7b7}, {0xc84c,0xf7b8}, {0xc84d,0xf7b9}, {0xc84e,0xf7ba}, {0xc84f,0xf7bb}, {0xc850,0xf7bc}, {0xc851,0xf7bd}, {0xc852,0xf7be}, {0xc853,0xf7bf}, {0xc854,0xf7c0}, {0xc855,0xf7c1}, {0xc856,0xf7c2}, {0xc857,0xf7c3}, {0xc858,0xf7c4}, {0xc859,0xf7c5}, {0xc85a,0xf7c6}, {0xc85b,0xf7c7}, {0xc85c,0xf7c8}, {0xc85d,0xf7c9}, {0xc85e,0xf7ca}, {0xc85f,0xf7cb}, {0xc860,0xf7cc}, {0xc861,0xf7cd}, {0xc862,0xf7ce}, {0xc863,0xf7cf}, {0xc864,0xf7d0}, {0xc865,0xf7d1}, {0xc866,0xf7d2}, {0xc867,0xf7d3}, {0xc868,0xf7d4}, {0xc869,0xf7d5}, {0xc86a,0xf7d6}, {0xc86b,0xf7d7}, {0xc86c,0xf7d8}, {0xc86d,0xf7d9}, {0xc86e,0xf7da}, {0xc86f,0xf7db}, {0xc870,0xf7dc}, {0xc871,0xf7dd}, {0xc872,0xf7de}, {0xc873,0xf7df}, {0xc874,0xf7e0}, {0xc875,0xf7e1}, {0xc876,0xf7e2}, {0xc877,0xf7e3}, {0xc878,0xf7e4}, {0xc879,0xf7e5}, {0xc87a,0xf7e6}, {0xc87b,0xf7e7}, {0xc87c,0xf7e8}, {0xc87d,0xf7e9}, {0xc87e,0xf7ea}, {0xc8a1,0xf7eb}, {0xc8a2,0xf7ec}, {0xc8a3,0xf7ed}, {0xc8a4,0xf7ee}, {0xc8a5,0xf7ef}, {0xc8a6,0xf7f0}, {0xc8a7,0xf7f1}, {0xc8a8,0xf7f2}, {0xc8a9,0xf7f3}, {0xc8aa,0xf7f4}, {0xc8ab,0xf7f5}, {0xc8ac,0xf7f6}, {0xc8ad,0xf7f7}, {0xc8ae,0xf7f8}, {0xc8af,0xf7f9}, {0xc8b0,0xf7fa}, {0xc8b1,0xf7fb}, {0xc8b2,0xf7fc}, {0xc8b3,0xf7fd}, {0xc8b4,0xf7fe}, {0xc8b5,0xf7ff}, {0xc8b6,0xf800}, {0xc8b7,0xf801}, {0xc8b8,0xf802}, {0xc8b9,0xf803}, {0xc8ba,0xf804}, {0xc8bb,0xf805}, {0xc8bc,0xf806}, {0xc8bd,0xf807}, {0xc8be,0xf808}, {0xc8bf,0xf809}, {0xc8c0,0xf80a}, {0xc8c1,0xf80b}, {0xc8c2,0xf80c}, {0xc8c3,0xf80d}, {0xc8c4,0xf80e}, {0xc8c5,0xf80f}, {0xc8c6,0xf810}, {0xc8c7,0xf811}, {0xc8c8,0xf812}, {0xc8c9,0xf813}, {0xc8ca,0xf814}, {0xc8cb,0xf815}, {0xc8cc,0xf816}, {0xc8cd,0xf817}, {0xc8ce,0xf818}, {0xc8cf,0xf819}, {0xc8d0,0xf81a}, {0xc8d1,0xf81b}, {0xc8d2,0xf81c}, {0xc8d3,0xf81d}, {0xc8d4,0xf81e}, {0xc8d5,0xf81f}, {0xc8d6,0xf820}, {0xc8d7,0xf821}, {0xc8d8,0xf822}, {0xc8d9,0xf823}, {0xc8da,0xf824}, {0xc8db,0xf825}, {0xc8dc,0xf826}, {0xc8dd,0xf827}, {0xc8de,0xf828}, {0xc8df,0xf829}, {0xc8e0,0xf82a}, {0xc8e1,0xf82b}, {0xc8e2,0xf82c}, {0xc8e3,0xf82d}, {0xc8e4,0xf82e}, {0xc8e5,0xf82f}, {0xc8e6,0xf830}, {0xc8e7,0xf831}, {0xc8e8,0xf832}, {0xc8e9,0xf833}, {0xc8ea,0xf834}, {0xc8eb,0xf835}, {0xc8ec,0xf836}, {0xc8ed,0xf837}, {0xc8ee,0xf838}, {0xc8ef,0xf839}, {0xc8f0,0xf83a}, {0xc8f1,0xf83b}, {0xc8f2,0xf83c}, {0xc8f3,0xf83d}, {0xc8f4,0xf83e}, {0xc8f5,0xf83f}, {0xc8f6,0xf840}, {0xc8f7,0xf841}, {0xc8f8,0xf842}, {0xc8f9,0xf843}, {0xc8fa,0xf844}, {0xc8fb,0xf845}, {0xc8fc,0xf846}, {0xc8fd,0xf847}, {0xc8fe,0xf848}, }; static const B5Map b5_FA40_to_uc_map[786] = { {0xf9fe,0x2593}, {0xfa40,0xe000}, {0xfa41,0xe001}, {0xfa42,0xe002}, {0xfa43,0xe003}, {0xfa44,0xe004}, {0xfa45,0xe005}, {0xfa46,0xe006}, {0xfa47,0xe007}, {0xfa48,0xe008}, {0xfa49,0xe009}, {0xfa4a,0xe00a}, {0xfa4b,0xe00b}, {0xfa4c,0xe00c}, {0xfa4d,0xe00d}, {0xfa4e,0xe00e}, {0xfa4f,0xe00f}, {0xfa50,0xe010}, {0xfa51,0xe011}, {0xfa52,0xe012}, {0xfa53,0xe013}, {0xfa54,0xe014}, {0xfa55,0xe015}, {0xfa56,0xe016}, {0xfa57,0xe017}, {0xfa58,0xe018}, {0xfa59,0xe019}, {0xfa5a,0xe01a}, {0xfa5b,0xe01b}, {0xfa5c,0xe01c}, {0xfa5d,0xe01d}, {0xfa5e,0xe01e}, {0xfa5f,0xe01f}, {0xfa60,0xe020}, {0xfa61,0xe021}, {0xfa62,0xe022}, {0xfa63,0xe023}, {0xfa64,0xe024}, {0xfa65,0xe025}, {0xfa66,0xe026}, {0xfa67,0xe027}, {0xfa68,0xe028}, {0xfa69,0xe029}, {0xfa6a,0xe02a}, {0xfa6b,0xe02b}, {0xfa6c,0xe02c}, {0xfa6d,0xe02d}, {0xfa6e,0xe02e}, {0xfa6f,0xe02f}, {0xfa70,0xe030}, {0xfa71,0xe031}, {0xfa72,0xe032}, {0xfa73,0xe033}, {0xfa74,0xe034}, {0xfa75,0xe035}, {0xfa76,0xe036}, {0xfa77,0xe037}, {0xfa78,0xe038}, {0xfa79,0xe039}, {0xfa7a,0xe03a}, {0xfa7b,0xe03b}, {0xfa7c,0xe03c}, {0xfa7d,0xe03d}, {0xfa7e,0xe03e}, {0xfaa1,0xe03f}, {0xfaa2,0xe040}, {0xfaa3,0xe041}, {0xfaa4,0xe042}, {0xfaa5,0xe043}, {0xfaa6,0xe044}, {0xfaa7,0xe045}, {0xfaa8,0xe046}, {0xfaa9,0xe047}, {0xfaaa,0xe048}, {0xfaab,0xe049}, {0xfaac,0xe04a}, {0xfaad,0xe04b}, {0xfaae,0xe04c}, {0xfaaf,0xe04d}, {0xfab0,0xe04e}, {0xfab1,0xe04f}, {0xfab2,0xe050}, {0xfab3,0xe051}, {0xfab4,0xe052}, {0xfab5,0xe053}, {0xfab6,0xe054}, {0xfab7,0xe055}, {0xfab8,0xe056}, {0xfab9,0xe057}, {0xfaba,0xe058}, {0xfabb,0xe059}, {0xfabc,0xe05a}, {0xfabd,0xe05b}, {0xfabe,0xe05c}, {0xfabf,0xe05d}, {0xfac0,0xe05e}, {0xfac1,0xe05f}, {0xfac2,0xe060}, {0xfac3,0xe061}, {0xfac4,0xe062}, {0xfac5,0xe063}, {0xfac6,0xe064}, {0xfac7,0xe065}, {0xfac8,0xe066}, {0xfac9,0xe067}, {0xfaca,0xe068}, {0xfacb,0xe069}, {0xfacc,0xe06a}, {0xfacd,0xe06b}, {0xface,0xe06c}, {0xfacf,0xe06d}, {0xfad0,0xe06e}, {0xfad1,0xe06f}, {0xfad2,0xe070}, {0xfad3,0xe071}, {0xfad4,0xe072}, {0xfad5,0xe073}, {0xfad6,0xe074}, {0xfad7,0xe075}, {0xfad8,0xe076}, {0xfad9,0xe077}, {0xfada,0xe078}, {0xfadb,0xe079}, {0xfadc,0xe07a}, {0xfadd,0xe07b}, {0xfade,0xe07c}, {0xfadf,0xe07d}, {0xfae0,0xe07e}, {0xfae1,0xe07f}, {0xfae2,0xe080}, {0xfae3,0xe081}, {0xfae4,0xe082}, {0xfae5,0xe083}, {0xfae6,0xe084}, {0xfae7,0xe085}, {0xfae8,0xe086}, {0xfae9,0xe087}, {0xfaea,0xe088}, {0xfaeb,0xe089}, {0xfaec,0xe08a}, {0xfaed,0xe08b}, {0xfaee,0xe08c}, {0xfaef,0xe08d}, {0xfaf0,0xe08e}, {0xfaf1,0xe08f}, {0xfaf2,0xe090}, {0xfaf3,0xe091}, {0xfaf4,0xe092}, {0xfaf5,0xe093}, {0xfaf6,0xe094}, {0xfaf7,0xe095}, {0xfaf8,0xe096}, {0xfaf9,0xe097}, {0xfafa,0xe098}, {0xfafb,0xe099}, {0xfafc,0xe09a}, {0xfafd,0xe09b}, {0xfafe,0xe09c}, {0xfb40,0xe09d}, {0xfb41,0xe09e}, {0xfb42,0xe09f}, {0xfb43,0xe0a0}, {0xfb44,0xe0a1}, {0xfb45,0xe0a2}, {0xfb46,0xe0a3}, {0xfb47,0xe0a4}, {0xfb48,0xe0a5}, {0xfb49,0xe0a6}, {0xfb4a,0xe0a7}, {0xfb4b,0xe0a8}, {0xfb4c,0xe0a9}, {0xfb4d,0xe0aa}, {0xfb4e,0xe0ab}, {0xfb4f,0xe0ac}, {0xfb50,0xe0ad}, {0xfb51,0xe0ae}, {0xfb52,0xe0af}, {0xfb53,0xe0b0}, {0xfb54,0xe0b1}, {0xfb55,0xe0b2}, {0xfb56,0xe0b3}, {0xfb57,0xe0b4}, {0xfb58,0xe0b5}, {0xfb59,0xe0b6}, {0xfb5a,0xe0b7}, {0xfb5b,0xe0b8}, {0xfb5c,0xe0b9}, {0xfb5d,0xe0ba}, {0xfb5e,0xe0bb}, {0xfb5f,0xe0bc}, {0xfb60,0xe0bd}, {0xfb61,0xe0be}, {0xfb62,0xe0bf}, {0xfb63,0xe0c0}, {0xfb64,0xe0c1}, {0xfb65,0xe0c2}, {0xfb66,0xe0c3}, {0xfb67,0xe0c4}, {0xfb68,0xe0c5}, {0xfb69,0xe0c6}, {0xfb6a,0xe0c7}, {0xfb6b,0xe0c8}, {0xfb6c,0xe0c9}, {0xfb6d,0xe0ca}, {0xfb6e,0xe0cb}, {0xfb6f,0xe0cc}, {0xfb70,0xe0cd}, {0xfb71,0xe0ce}, {0xfb72,0xe0cf}, {0xfb73,0xe0d0}, {0xfb74,0xe0d1}, {0xfb75,0xe0d2}, {0xfb76,0xe0d3}, {0xfb77,0xe0d4}, {0xfb78,0xe0d5}, {0xfb79,0xe0d6}, {0xfb7a,0xe0d7}, {0xfb7b,0xe0d8}, {0xfb7c,0xe0d9}, {0xfb7d,0xe0da}, {0xfb7e,0xe0db}, {0xfba1,0xe0dc}, {0xfba2,0xe0dd}, {0xfba3,0xe0de}, {0xfba4,0xe0df}, {0xfba5,0xe0e0}, {0xfba6,0xe0e1}, {0xfba7,0xe0e2}, {0xfba8,0xe0e3}, {0xfba9,0xe0e4}, {0xfbaa,0xe0e5}, {0xfbab,0xe0e6}, {0xfbac,0xe0e7}, {0xfbad,0xe0e8}, {0xfbae,0xe0e9}, {0xfbaf,0xe0ea}, {0xfbb0,0xe0eb}, {0xfbb1,0xe0ec}, {0xfbb2,0xe0ed}, {0xfbb3,0xe0ee}, {0xfbb4,0xe0ef}, {0xfbb5,0xe0f0}, {0xfbb6,0xe0f1}, {0xfbb7,0xe0f2}, {0xfbb8,0xe0f3}, {0xfbb9,0xe0f4}, {0xfbba,0xe0f5}, {0xfbbb,0xe0f6}, {0xfbbc,0xe0f7}, {0xfbbd,0xe0f8}, {0xfbbe,0xe0f9}, {0xfbbf,0xe0fa}, {0xfbc0,0xe0fb}, {0xfbc1,0xe0fc}, {0xfbc2,0xe0fd}, {0xfbc3,0xe0fe}, {0xfbc4,0xe0ff}, {0xfbc5,0xe100}, {0xfbc6,0xe101}, {0xfbc7,0xe102}, {0xfbc8,0xe103}, {0xfbc9,0xe104}, {0xfbca,0xe105}, {0xfbcb,0xe106}, {0xfbcc,0xe107}, {0xfbcd,0xe108}, {0xfbce,0xe109}, {0xfbcf,0xe10a}, {0xfbd0,0xe10b}, {0xfbd1,0xe10c}, {0xfbd2,0xe10d}, {0xfbd3,0xe10e}, {0xfbd4,0xe10f}, {0xfbd5,0xe110}, {0xfbd6,0xe111}, {0xfbd7,0xe112}, {0xfbd8,0xe113}, {0xfbd9,0xe114}, {0xfbda,0xe115}, {0xfbdb,0xe116}, {0xfbdc,0xe117}, {0xfbdd,0xe118}, {0xfbde,0xe119}, {0xfbdf,0xe11a}, {0xfbe0,0xe11b}, {0xfbe1,0xe11c}, {0xfbe2,0xe11d}, {0xfbe3,0xe11e}, {0xfbe4,0xe11f}, {0xfbe5,0xe120}, {0xfbe6,0xe121}, {0xfbe7,0xe122}, {0xfbe8,0xe123}, {0xfbe9,0xe124}, {0xfbea,0xe125}, {0xfbeb,0xe126}, {0xfbec,0xe127}, {0xfbed,0xe128}, {0xfbee,0xe129}, {0xfbef,0xe12a}, {0xfbf0,0xe12b}, {0xfbf1,0xe12c}, {0xfbf2,0xe12d}, {0xfbf3,0xe12e}, {0xfbf4,0xe12f}, {0xfbf5,0xe130}, {0xfbf6,0xe131}, {0xfbf7,0xe132}, {0xfbf8,0xe133}, {0xfbf9,0xe134}, {0xfbfa,0xe135}, {0xfbfb,0xe136}, {0xfbfc,0xe137}, {0xfbfd,0xe138}, {0xfbfe,0xe139}, {0xfc40,0xe13a}, {0xfc41,0xe13b}, {0xfc42,0xe13c}, {0xfc43,0xe13d}, {0xfc44,0xe13e}, {0xfc45,0xe13f}, {0xfc46,0xe140}, {0xfc47,0xe141}, {0xfc48,0xe142}, {0xfc49,0xe143}, {0xfc4a,0xe144}, {0xfc4b,0xe145}, {0xfc4c,0xe146}, {0xfc4d,0xe147}, {0xfc4e,0xe148}, {0xfc4f,0xe149}, {0xfc50,0xe14a}, {0xfc51,0xe14b}, {0xfc52,0xe14c}, {0xfc53,0xe14d}, {0xfc54,0xe14e}, {0xfc55,0xe14f}, {0xfc56,0xe150}, {0xfc57,0xe151}, {0xfc58,0xe152}, {0xfc59,0xe153}, {0xfc5a,0xe154}, {0xfc5b,0xe155}, {0xfc5c,0xe156}, {0xfc5d,0xe157}, {0xfc5e,0xe158}, {0xfc5f,0xe159}, {0xfc60,0xe15a}, {0xfc61,0xe15b}, {0xfc62,0xe15c}, {0xfc63,0xe15d}, {0xfc64,0xe15e}, {0xfc65,0xe15f}, {0xfc66,0xe160}, {0xfc67,0xe161}, {0xfc68,0xe162}, {0xfc69,0xe163}, {0xfc6a,0xe164}, {0xfc6b,0xe165}, {0xfc6c,0xe166}, {0xfc6d,0xe167}, {0xfc6e,0xe168}, {0xfc6f,0xe169}, {0xfc70,0xe16a}, {0xfc71,0xe16b}, {0xfc72,0xe16c}, {0xfc73,0xe16d}, {0xfc74,0xe16e}, {0xfc75,0xe16f}, {0xfc76,0xe170}, {0xfc77,0xe171}, {0xfc78,0xe172}, {0xfc79,0xe173}, {0xfc7a,0xe174}, {0xfc7b,0xe175}, {0xfc7c,0xe176}, {0xfc7d,0xe177}, {0xfc7e,0xe178}, {0xfca1,0xe179}, {0xfca2,0xe17a}, {0xfca3,0xe17b}, {0xfca4,0xe17c}, {0xfca5,0xe17d}, {0xfca6,0xe17e}, {0xfca7,0xe17f}, {0xfca8,0xe180}, {0xfca9,0xe181}, {0xfcaa,0xe182}, {0xfcab,0xe183}, {0xfcac,0xe184}, {0xfcad,0xe185}, {0xfcae,0xe186}, {0xfcaf,0xe187}, {0xfcb0,0xe188}, {0xfcb1,0xe189}, {0xfcb2,0xe18a}, {0xfcb3,0xe18b}, {0xfcb4,0xe18c}, {0xfcb5,0xe18d}, {0xfcb6,0xe18e}, {0xfcb7,0xe18f}, {0xfcb8,0xe190}, {0xfcb9,0xe191}, {0xfcba,0xe192}, {0xfcbb,0xe193}, {0xfcbc,0xe194}, {0xfcbd,0xe195}, {0xfcbe,0xe196}, {0xfcbf,0xe197}, {0xfcc0,0xe198}, {0xfcc1,0xe199}, {0xfcc2,0xe19a}, {0xfcc3,0xe19b}, {0xfcc4,0xe19c}, {0xfcc5,0xe19d}, {0xfcc6,0xe19e}, {0xfcc7,0xe19f}, {0xfcc8,0xe1a0}, {0xfcc9,0xe1a1}, {0xfcca,0xe1a2}, {0xfccb,0xe1a3}, {0xfccc,0xe1a4}, {0xfccd,0xe1a5}, {0xfcce,0xe1a6}, {0xfccf,0xe1a7}, {0xfcd0,0xe1a8}, {0xfcd1,0xe1a9}, {0xfcd2,0xe1aa}, {0xfcd3,0xe1ab}, {0xfcd4,0xe1ac}, {0xfcd5,0xe1ad}, {0xfcd6,0xe1ae}, {0xfcd7,0xe1af}, {0xfcd8,0xe1b0}, {0xfcd9,0xe1b1}, {0xfcda,0xe1b2}, {0xfcdb,0xe1b3}, {0xfcdc,0xe1b4}, {0xfcdd,0xe1b5}, {0xfcde,0xe1b6}, {0xfcdf,0xe1b7}, {0xfce0,0xe1b8}, {0xfce1,0xe1b9}, {0xfce2,0xe1ba}, {0xfce3,0xe1bb}, {0xfce4,0xe1bc}, {0xfce5,0xe1bd}, {0xfce6,0xe1be}, {0xfce7,0xe1bf}, {0xfce8,0xe1c0}, {0xfce9,0xe1c1}, {0xfcea,0xe1c2}, {0xfceb,0xe1c3}, {0xfcec,0xe1c4}, {0xfced,0xe1c5}, {0xfcee,0xe1c6}, {0xfcef,0xe1c7}, {0xfcf0,0xe1c8}, {0xfcf1,0xe1c9}, {0xfcf2,0xe1ca}, {0xfcf3,0xe1cb}, {0xfcf4,0xe1cc}, {0xfcf5,0xe1cd}, {0xfcf6,0xe1ce}, {0xfcf7,0xe1cf}, {0xfcf8,0xe1d0}, {0xfcf9,0xe1d1}, {0xfcfa,0xe1d2}, {0xfcfb,0xe1d3}, {0xfcfc,0xe1d4}, {0xfcfd,0xe1d5}, {0xfcfe,0xe1d6}, {0xfd40,0xe1d7}, {0xfd41,0xe1d8}, {0xfd42,0xe1d9}, {0xfd43,0xe1da}, {0xfd44,0xe1db}, {0xfd45,0xe1dc}, {0xfd46,0xe1dd}, {0xfd47,0xe1de}, {0xfd48,0xe1df}, {0xfd49,0xe1e0}, {0xfd4a,0xe1e1}, {0xfd4b,0xe1e2}, {0xfd4c,0xe1e3}, {0xfd4d,0xe1e4}, {0xfd4e,0xe1e5}, {0xfd4f,0xe1e6}, {0xfd50,0xe1e7}, {0xfd51,0xe1e8}, {0xfd52,0xe1e9}, {0xfd53,0xe1ea}, {0xfd54,0xe1eb}, {0xfd55,0xe1ec}, {0xfd56,0xe1ed}, {0xfd57,0xe1ee}, {0xfd58,0xe1ef}, {0xfd59,0xe1f0}, {0xfd5a,0xe1f1}, {0xfd5b,0xe1f2}, {0xfd5c,0xe1f3}, {0xfd5d,0xe1f4}, {0xfd5e,0xe1f5}, {0xfd5f,0xe1f6}, {0xfd60,0xe1f7}, {0xfd61,0xe1f8}, {0xfd62,0xe1f9}, {0xfd63,0xe1fa}, {0xfd64,0xe1fb}, {0xfd65,0xe1fc}, {0xfd66,0xe1fd}, {0xfd67,0xe1fe}, {0xfd68,0xe1ff}, {0xfd69,0xe200}, {0xfd6a,0xe201}, {0xfd6b,0xe202}, {0xfd6c,0xe203}, {0xfd6d,0xe204}, {0xfd6e,0xe205}, {0xfd6f,0xe206}, {0xfd70,0xe207}, {0xfd71,0xe208}, {0xfd72,0xe209}, {0xfd73,0xe20a}, {0xfd74,0xe20b}, {0xfd75,0xe20c}, {0xfd76,0xe20d}, {0xfd77,0xe20e}, {0xfd78,0xe20f}, {0xfd79,0xe210}, {0xfd7a,0xe211}, {0xfd7b,0xe212}, {0xfd7c,0xe213}, {0xfd7d,0xe214}, {0xfd7e,0xe215}, {0xfda1,0xe216}, {0xfda2,0xe217}, {0xfda3,0xe218}, {0xfda4,0xe219}, {0xfda5,0xe21a}, {0xfda6,0xe21b}, {0xfda7,0xe21c}, {0xfda8,0xe21d}, {0xfda9,0xe21e}, {0xfdaa,0xe21f}, {0xfdab,0xe220}, {0xfdac,0xe221}, {0xfdad,0xe222}, {0xfdae,0xe223}, {0xfdaf,0xe224}, {0xfdb0,0xe225}, {0xfdb1,0xe226}, {0xfdb2,0xe227}, {0xfdb3,0xe228}, {0xfdb4,0xe229}, {0xfdb5,0xe22a}, {0xfdb6,0xe22b}, {0xfdb7,0xe22c}, {0xfdb8,0xe22d}, {0xfdb9,0xe22e}, {0xfdba,0xe22f}, {0xfdbb,0xe230}, {0xfdbc,0xe231}, {0xfdbd,0xe232}, {0xfdbe,0xe233}, {0xfdbf,0xe234}, {0xfdc0,0xe235}, {0xfdc1,0xe236}, {0xfdc2,0xe237}, {0xfdc3,0xe238}, {0xfdc4,0xe239}, {0xfdc5,0xe23a}, {0xfdc6,0xe23b}, {0xfdc7,0xe23c}, {0xfdc8,0xe23d}, {0xfdc9,0xe23e}, {0xfdca,0xe23f}, {0xfdcb,0xe240}, {0xfdcc,0xe241}, {0xfdcd,0xe242}, {0xfdce,0xe243}, {0xfdcf,0xe244}, {0xfdd0,0xe245}, {0xfdd1,0xe246}, {0xfdd2,0xe247}, {0xfdd3,0xe248}, {0xfdd4,0xe249}, {0xfdd5,0xe24a}, {0xfdd6,0xe24b}, {0xfdd7,0xe24c}, {0xfdd8,0xe24d}, {0xfdd9,0xe24e}, {0xfdda,0xe24f}, {0xfddb,0xe250}, {0xfddc,0xe251}, {0xfddd,0xe252}, {0xfdde,0xe253}, {0xfddf,0xe254}, {0xfde0,0xe255}, {0xfde1,0xe256}, {0xfde2,0xe257}, {0xfde3,0xe258}, {0xfde4,0xe259}, {0xfde5,0xe25a}, {0xfde6,0xe25b}, {0xfde7,0xe25c}, {0xfde8,0xe25d}, {0xfde9,0xe25e}, {0xfdea,0xe25f}, {0xfdeb,0xe260}, {0xfdec,0xe261}, {0xfded,0xe262}, {0xfdee,0xe263}, {0xfdef,0xe264}, {0xfdf0,0xe265}, {0xfdf1,0xe266}, {0xfdf2,0xe267}, {0xfdf3,0xe268}, {0xfdf4,0xe269}, {0xfdf5,0xe26a}, {0xfdf6,0xe26b}, {0xfdf7,0xe26c}, {0xfdf8,0xe26d}, {0xfdf9,0xe26e}, {0xfdfa,0xe26f}, {0xfdfb,0xe270}, {0xfdfc,0xe271}, {0xfdfd,0xe272}, {0xfdfe,0xe273}, {0xfe40,0xe274}, {0xfe41,0xe275}, {0xfe42,0xe276}, {0xfe43,0xe277}, {0xfe44,0xe278}, {0xfe45,0xe279}, {0xfe46,0xe27a}, {0xfe47,0xe27b}, {0xfe48,0xe27c}, {0xfe49,0xe27d}, {0xfe4a,0xe27e}, {0xfe4b,0xe27f}, {0xfe4c,0xe280}, {0xfe4d,0xe281}, {0xfe4e,0xe282}, {0xfe4f,0xe283}, {0xfe50,0xe284}, {0xfe51,0xe285}, {0xfe52,0xe286}, {0xfe53,0xe287}, {0xfe54,0xe288}, {0xfe55,0xe289}, {0xfe56,0xe28a}, {0xfe57,0xe28b}, {0xfe58,0xe28c}, {0xfe59,0xe28d}, {0xfe5a,0xe28e}, {0xfe5b,0xe28f}, {0xfe5c,0xe290}, {0xfe5d,0xe291}, {0xfe5e,0xe292}, {0xfe5f,0xe293}, {0xfe60,0xe294}, {0xfe61,0xe295}, {0xfe62,0xe296}, {0xfe63,0xe297}, {0xfe64,0xe298}, {0xfe65,0xe299}, {0xfe66,0xe29a}, {0xfe67,0xe29b}, {0xfe68,0xe29c}, {0xfe69,0xe29d}, {0xfe6a,0xe29e}, {0xfe6b,0xe29f}, {0xfe6c,0xe2a0}, {0xfe6d,0xe2a1}, {0xfe6e,0xe2a2}, {0xfe6f,0xe2a3}, {0xfe70,0xe2a4}, {0xfe71,0xe2a5}, {0xfe72,0xe2a6}, {0xfe73,0xe2a7}, {0xfe74,0xe2a8}, {0xfe75,0xe2a9}, {0xfe76,0xe2aa}, {0xfe77,0xe2ab}, {0xfe78,0xe2ac}, {0xfe79,0xe2ad}, {0xfe7a,0xe2ae}, {0xfe7b,0xe2af}, {0xfe7c,0xe2b0}, {0xfe7d,0xe2b1}, {0xfe7e,0xe2b2}, {0xfea1,0xe2b3}, {0xfea2,0xe2b4}, {0xfea3,0xe2b5}, {0xfea4,0xe2b6}, {0xfea5,0xe2b7}, {0xfea6,0xe2b8}, {0xfea7,0xe2b9}, {0xfea8,0xe2ba}, {0xfea9,0xe2bb}, {0xfeaa,0xe2bc}, {0xfeab,0xe2bd}, {0xfeac,0xe2be}, {0xfead,0xe2bf}, {0xfeae,0xe2c0}, {0xfeaf,0xe2c1}, {0xfeb0,0xe2c2}, {0xfeb1,0xe2c3}, {0xfeb2,0xe2c4}, {0xfeb3,0xe2c5}, {0xfeb4,0xe2c6}, {0xfeb5,0xe2c7}, {0xfeb6,0xe2c8}, {0xfeb7,0xe2c9}, {0xfeb8,0xe2ca}, {0xfeb9,0xe2cb}, {0xfeba,0xe2cc}, {0xfebb,0xe2cd}, {0xfebc,0xe2ce}, {0xfebd,0xe2cf}, {0xfebe,0xe2d0}, {0xfebf,0xe2d1}, {0xfec0,0xe2d2}, {0xfec1,0xe2d3}, {0xfec2,0xe2d4}, {0xfec3,0xe2d5}, {0xfec4,0xe2d6}, {0xfec5,0xe2d7}, {0xfec6,0xe2d8}, {0xfec7,0xe2d9}, {0xfec8,0xe2da}, {0xfec9,0xe2db}, {0xfeca,0xe2dc}, {0xfecb,0xe2dd}, {0xfecc,0xe2de}, {0xfecd,0xe2df}, {0xfece,0xe2e0}, {0xfecf,0xe2e1}, {0xfed0,0xe2e2}, {0xfed1,0xe2e3}, {0xfed2,0xe2e4}, {0xfed3,0xe2e5}, {0xfed4,0xe2e6}, {0xfed5,0xe2e7}, {0xfed6,0xe2e8}, {0xfed7,0xe2e9}, {0xfed8,0xe2ea}, {0xfed9,0xe2eb}, {0xfeda,0xe2ec}, {0xfedb,0xe2ed}, {0xfedc,0xe2ee}, {0xfedd,0xe2ef}, {0xfede,0xe2f0}, {0xfedf,0xe2f1}, {0xfee0,0xe2f2}, {0xfee1,0xe2f3}, {0xfee2,0xe2f4}, {0xfee3,0xe2f5}, {0xfee4,0xe2f6}, {0xfee5,0xe2f7}, {0xfee6,0xe2f8}, {0xfee7,0xe2f9}, {0xfee8,0xe2fa}, {0xfee9,0xe2fb}, {0xfeea,0xe2fc}, {0xfeeb,0xe2fd}, {0xfeec,0xe2fe}, {0xfeed,0xe2ff}, {0xfeee,0xe300}, {0xfeef,0xe301}, {0xfef0,0xe302}, {0xfef1,0xe303}, {0xfef2,0xe304}, {0xfef3,0xe305}, {0xfef4,0xe306}, {0xfef5,0xe307}, {0xfef6,0xe308}, {0xfef7,0xe309}, {0xfef8,0xe30a}, {0xfef9,0xe30b}, {0xfefa,0xe30c}, {0xfefb,0xe30d}, {0xfefc,0xe30e}, {0xfefd,0xe30f}, {0xfefe,0xe310}, }; static const B5Map uc_to_b5_map[8] = { {0xa2a4,0x2550}, {0xa2a5,0x255e}, {0xa2a7,0x2561}, {0xa2a6,0x256a}, {0xa27e,0x256d}, {0xa2a1,0x256e}, {0xa2a3,0x256f}, {0xa2a2,0x2570}, }; //All the tables are sorted on both x and y, so can be used for binary search const B5Index b5_map_table[5] = { { b5_8140_to_uc_map , std::extent::value }, { b5_8E40_to_uc_map , std::extent::value }, { b5_C6A1_to_uc_map , std::extent::value }, { b5_FA40_to_uc_map , std::extent::value }, { uc_to_b5_map , std::extent::value }, }; zxing-cpp-1.0.8+ds2/core/src/textcodec/Big5MapTable.h000066400000000000000000000033411361167020700221750ustar00rootroot00000000000000#pragma once /**************************************************************************** ** ** Copyright (C) 2015 The Qt Company Ltd. ** Contact: http://www.qt.io/licensing/ ** ** This file is part of the QtCore module of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:LGPL21$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and The Qt Company. For licensing terms ** and conditions see http://www.qt.io/terms-conditions. For further ** information use the contact form at http://www.qt.io/contact-us. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 or version 3 as published by the Free ** Software Foundation and appearing in the file LICENSE.LGPLv21 and ** LICENSE.LGPLv3 included in the packaging of this file. Please review the ** following information to ensure the GNU Lesser General Public License ** requirements will be met: https://www.gnu.org/licenses/lgpl.html and ** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** As a special exception, The Qt Company gives you certain additional ** rights. These rights are described in The Qt Company LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** $QT_END_LICENSE$ ** ****************************************************************************/ #include struct B5Map { uint16_t x; uint16_t y; }; struct B5Index { const B5Map * table; uint16_t tableSize; }; extern const B5Index b5_map_table[5]; zxing-cpp-1.0.8+ds2/core/src/textcodec/Big5TextDecoder.cpp000066400000000000000000005207511361167020700232660ustar00rootroot00000000000000/**************************************************************************** ** ** Copyright (C) 2015 The Qt Company Ltd. ** Contact: http://www.qt.io/licensing/ ** ** This file is part of the QtCore module of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:LGPL21$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and The Qt Company. For licensing terms ** and conditions see http://www.qt.io/terms-conditions. For further ** information use the contact form at http://www.qt.io/contact-us. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 or version 3 as published by the Free ** Software Foundation and appearing in the file LICENSE.LGPLv21 and ** LICENSE.LGPLv3 included in the packaging of this file. Please review the ** following information to ensure the GNU Lesser General Public License ** requirements will be met: https://www.gnu.org/licenses/lgpl.html and ** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** As a special exception, The Qt Company gives you certain additional ** rights. These rights are described in The Qt Company LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** $QT_END_LICENSE$ ** ****************************************************************************/ #include "Big5TextDecoder.h" #include "Big5MapTable.h" static const uint16_t big5hkscs_to_ucs[] = { /* Big5-HKSCS 0x8140 .. 0x817E */ 0xEEB8, 0xEEB9, 0xEEBA, 0xEEBB, 0xEEBC, 0xEEBD, 0xEEBE, 0xEEBF, 0xEEC0, 0xEEC1, 0xEEC2, 0xEEC3, 0xEEC4, 0xEEC5, 0xEEC6, 0xEEC7, 0xEEC8, 0xEEC9, 0xEECA, 0xEECB, 0xEECC, 0xEECD, 0xEECE, 0xEECF, 0xEED0, 0xEED1, 0xEED2, 0xEED3, 0xEED4, 0xEED5, 0xEED6, 0xEED7, 0xEED8, 0xEED9, 0xEEDA, 0xEEDB, 0xEEDC, 0xEEDD, 0xEEDE, 0xEEDF, 0xEEE0, 0xEEE1, 0xEEE2, 0xEEE3, 0xEEE4, 0xEEE5, 0xEEE6, 0xEEE7, 0xEEE8, 0xEEE9, 0xEEEA, 0xEEEB, 0xEEEC, 0xEEED, 0xEEEE, 0xEEEF, 0xEEF0, 0xEEF1, 0xEEF2, 0xEEF3, 0xEEF4, 0xEEF5, 0xEEF6, /* Big5-HKSCS 0x81A1 .. 0x81FE */ 0xEEF7, 0xEEF8, 0xEEF9, 0xEEFA, 0xEEFB, 0xEEFC, 0xEEFD, 0xEEFE, 0xEEFF, 0xEF00, 0xEF01, 0xEF02, 0xEF03, 0xEF04, 0xEF05, 0xEF06, 0xEF07, 0xEF08, 0xEF09, 0xEF0A, 0xEF0B, 0xEF0C, 0xEF0D, 0xEF0E, 0xEF0F, 0xEF10, 0xEF11, 0xEF12, 0xEF13, 0xEF14, 0xEF15, 0xEF16, 0xEF17, 0xEF18, 0xEF19, 0xEF1A, 0xEF1B, 0xEF1C, 0xEF1D, 0xEF1E, 0xEF1F, 0xEF20, 0xEF21, 0xEF22, 0xEF23, 0xEF24, 0xEF25, 0xEF26, 0xEF27, 0xEF28, 0xEF29, 0xEF2A, 0xEF2B, 0xEF2C, 0xEF2D, 0xEF2E, 0xEF2F, 0xEF30, 0xEF31, 0xEF32, 0xEF33, 0xEF34, 0xEF35, 0xEF36, 0xEF37, 0xEF38, 0xEF39, 0xEF3A, 0xEF3B, 0xEF3C, 0xEF3D, 0xEF3E, 0xEF3F, 0xEF40, 0xEF41, 0xEF42, 0xEF43, 0xEF44, 0xEF45, 0xEF46, 0xEF47, 0xEF48, 0xEF49, 0xEF4A, 0xEF4B, 0xEF4C, 0xEF4D, 0xEF4E, 0xEF4F, 0xEF50, 0xEF51, 0xEF52, 0xEF53, 0xEF54, /* Big5-HKSCS 0x8240 .. 0x827E */ 0xEF55, 0xEF56, 0xEF57, 0xEF58, 0xEF59, 0xEF5A, 0xEF5B, 0xEF5C, 0xEF5D, 0xEF5E, 0xEF5F, 0xEF60, 0xEF61, 0xEF62, 0xEF63, 0xEF64, 0xEF65, 0xEF66, 0xEF67, 0xEF68, 0xEF69, 0xEF6A, 0xEF6B, 0xEF6C, 0xEF6D, 0xEF6E, 0xEF6F, 0xEF70, 0xEF71, 0xEF72, 0xEF73, 0xEF74, 0xEF75, 0xEF76, 0xEF77, 0xEF78, 0xEF79, 0xEF7A, 0xEF7B, 0xEF7C, 0xEF7D, 0xEF7E, 0xEF7F, 0xEF80, 0xEF81, 0xEF82, 0xEF83, 0xEF84, 0xEF85, 0xEF86, 0xEF87, 0xEF88, 0xEF89, 0xEF8A, 0xEF8B, 0xEF8C, 0xEF8D, 0xEF8E, 0xEF8F, 0xEF90, 0xEF91, 0xEF92, 0xEF93, /* Big5-HKSCS 0x82A1 .. 0x82FE */ 0xEF94, 0xEF95, 0xEF96, 0xEF97, 0xEF98, 0xEF99, 0xEF9A, 0xEF9B, 0xEF9C, 0xEF9D, 0xEF9E, 0xEF9F, 0xEFA0, 0xEFA1, 0xEFA2, 0xEFA3, 0xEFA4, 0xEFA5, 0xEFA6, 0xEFA7, 0xEFA8, 0xEFA9, 0xEFAA, 0xEFAB, 0xEFAC, 0xEFAD, 0xEFAE, 0xEFAF, 0xEFB0, 0xEFB1, 0xEFB2, 0xEFB3, 0xEFB4, 0xEFB5, 0xEFB6, 0xEFB7, 0xEFB8, 0xEFB9, 0xEFBA, 0xEFBB, 0xEFBC, 0xEFBD, 0xEFBE, 0xEFBF, 0xEFC0, 0xEFC1, 0xEFC2, 0xEFC3, 0xEFC4, 0xEFC5, 0xEFC6, 0xEFC7, 0xEFC8, 0xEFC9, 0xEFCA, 0xEFCB, 0xEFCC, 0xEFCD, 0xEFCE, 0xEFCF, 0xEFD0, 0xEFD1, 0xEFD2, 0xEFD3, 0xEFD4, 0xEFD5, 0xEFD6, 0xEFD7, 0xEFD8, 0xEFD9, 0xEFDA, 0xEFDB, 0xEFDC, 0xEFDD, 0xEFDE, 0xEFDF, 0xEFE0, 0xEFE1, 0xEFE2, 0xEFE3, 0xEFE4, 0xEFE5, 0xEFE6, 0xEFE7, 0xEFE8, 0xEFE9, 0xEFEA, 0xEFEB, 0xEFEC, 0xEFED, 0xEFEE, 0xEFEF, 0xEFF0, 0xEFF1, /* Big5-HKSCS 0x8340 .. 0x837E */ 0xEFF2, 0xEFF3, 0xEFF4, 0xEFF5, 0xEFF6, 0xEFF7, 0xEFF8, 0xEFF9, 0xEFFA, 0xEFFB, 0xEFFC, 0xEFFD, 0xEFFE, 0xEFFF, 0xF000, 0xF001, 0xF002, 0xF003, 0xF004, 0xF005, 0xF006, 0xF007, 0xF008, 0xF009, 0xF00A, 0xF00B, 0xF00C, 0xF00D, 0xF00E, 0xF00F, 0xF010, 0xF011, 0xF012, 0xF013, 0xF014, 0xF015, 0xF016, 0xF017, 0xF018, 0xF019, 0xF01A, 0xF01B, 0xF01C, 0xF01D, 0xF01E, 0xF01F, 0xF020, 0xF021, 0xF022, 0xF023, 0xF024, 0xF025, 0xF026, 0xF027, 0xF028, 0xF029, 0xF02A, 0xF02B, 0xF02C, 0xF02D, 0xF02E, 0xF02F, 0xF030, /* Big5-HKSCS 0x83A1 .. 0x83FE */ 0xF031, 0xF032, 0xF033, 0xF034, 0xF035, 0xF036, 0xF037, 0xF038, 0xF039, 0xF03A, 0xF03B, 0xF03C, 0xF03D, 0xF03E, 0xF03F, 0xF040, 0xF041, 0xF042, 0xF043, 0xF044, 0xF045, 0xF046, 0xF047, 0xF048, 0xF049, 0xF04A, 0xF04B, 0xF04C, 0xF04D, 0xF04E, 0xF04F, 0xF050, 0xF051, 0xF052, 0xF053, 0xF054, 0xF055, 0xF056, 0xF057, 0xF058, 0xF059, 0xF05A, 0xF05B, 0xF05C, 0xF05D, 0xF05E, 0xF05F, 0xF060, 0xF061, 0xF062, 0xF063, 0xF064, 0xF065, 0xF066, 0xF067, 0xF068, 0xF069, 0xF06A, 0xF06B, 0xF06C, 0xF06D, 0xF06E, 0xF06F, 0xF070, 0xF071, 0xF072, 0xF073, 0xF074, 0xF075, 0xF076, 0xF077, 0xF078, 0xF079, 0xF07A, 0xF07B, 0xF07C, 0xF07D, 0xF07E, 0xF07F, 0xF080, 0xF081, 0xF082, 0xF083, 0xF084, 0xF085, 0xF086, 0xF087, 0xF088, 0xF089, 0xF08A, 0xF08B, 0xF08C, 0xF08D, 0xF08E, /* Big5-HKSCS 0x8440 .. 0x847E */ 0xF08F, 0xF090, 0xF091, 0xF092, 0xF093, 0xF094, 0xF095, 0xF096, 0xF097, 0xF098, 0xF099, 0xF09A, 0xF09B, 0xF09C, 0xF09D, 0xF09E, 0xF09F, 0xF0A0, 0xF0A1, 0xF0A2, 0xF0A3, 0xF0A4, 0xF0A5, 0xF0A6, 0xF0A7, 0xF0A8, 0xF0A9, 0xF0AA, 0xF0AB, 0xF0AC, 0xF0AD, 0xF0AE, 0xF0AF, 0xF0B0, 0xF0B1, 0xF0B2, 0xF0B3, 0xF0B4, 0xF0B5, 0xF0B6, 0xF0B7, 0xF0B8, 0xF0B9, 0xF0BA, 0xF0BB, 0xF0BC, 0xF0BD, 0xF0BE, 0xF0BF, 0xF0C0, 0xF0C1, 0xF0C2, 0xF0C3, 0xF0C4, 0xF0C5, 0xF0C6, 0xF0C7, 0xF0C8, 0xF0C9, 0xF0CA, 0xF0CB, 0xF0CC, 0xF0CD, /* Big5-HKSCS 0x84A1 .. 0x84FE */ 0xF0CE, 0xF0CF, 0xF0D0, 0xF0D1, 0xF0D2, 0xF0D3, 0xF0D4, 0xF0D5, 0xF0D6, 0xF0D7, 0xF0D8, 0xF0D9, 0xF0DA, 0xF0DB, 0xF0DC, 0xF0DD, 0xF0DE, 0xF0DF, 0xF0E0, 0xF0E1, 0xF0E2, 0xF0E3, 0xF0E4, 0xF0E5, 0xF0E6, 0xF0E7, 0xF0E8, 0xF0E9, 0xF0EA, 0xF0EB, 0xF0EC, 0xF0ED, 0xF0EE, 0xF0EF, 0xF0F0, 0xF0F1, 0xF0F2, 0xF0F3, 0xF0F4, 0xF0F5, 0xF0F6, 0xF0F7, 0xF0F8, 0xF0F9, 0xF0FA, 0xF0FB, 0xF0FC, 0xF0FD, 0xF0FE, 0xF0FF, 0xF100, 0xF101, 0xF102, 0xF103, 0xF104, 0xF105, 0xF106, 0xF107, 0xF108, 0xF109, 0xF10A, 0xF10B, 0xF10C, 0xF10D, 0xF10E, 0xF10F, 0xF110, 0xF111, 0xF112, 0xF113, 0xF114, 0xF115, 0xF116, 0xF117, 0xF118, 0xF119, 0xF11A, 0xF11B, 0xF11C, 0xF11D, 0xF11E, 0xF11F, 0xF120, 0xF121, 0xF122, 0xF123, 0xF124, 0xF125, 0xF126, 0xF127, 0xF128, 0xF129, 0xF12A, 0xF12B, /* Big5-HKSCS 0x8540 .. 0x857E */ 0xF12C, 0xF12D, 0xF12E, 0xF12F, 0xF130, 0xF131, 0xF132, 0xF133, 0xF134, 0xF135, 0xF136, 0xF137, 0xF138, 0xF139, 0xF13A, 0xF13B, 0xF13C, 0xF13D, 0xF13E, 0xF13F, 0xF140, 0xF141, 0xF142, 0xF143, 0xF144, 0xF145, 0xF146, 0xF147, 0xF148, 0xF149, 0xF14A, 0xF14B, 0xF14C, 0xF14D, 0xF14E, 0xF14F, 0xF150, 0xF151, 0xF152, 0xF153, 0xF154, 0xF155, 0xF156, 0xF157, 0xF158, 0xF159, 0xF15A, 0xF15B, 0xF15C, 0xF15D, 0xF15E, 0xF15F, 0xF160, 0xF161, 0xF162, 0xF163, 0xF164, 0xF165, 0xF166, 0xF167, 0xF168, 0xF169, 0xF16A, /* Big5-HKSCS 0x85A1 .. 0x85FE */ 0xF16B, 0xF16C, 0xF16D, 0xF16E, 0xF16F, 0xF170, 0xF171, 0xF172, 0xF173, 0xF174, 0xF175, 0xF176, 0xF177, 0xF178, 0xF179, 0xF17A, 0xF17B, 0xF17C, 0xF17D, 0xF17E, 0xF17F, 0xF180, 0xF181, 0xF182, 0xF183, 0xF184, 0xF185, 0xF186, 0xF187, 0xF188, 0xF189, 0xF18A, 0xF18B, 0xF18C, 0xF18D, 0xF18E, 0xF18F, 0xF190, 0xF191, 0xF192, 0xF193, 0xF194, 0xF195, 0xF196, 0xF197, 0xF198, 0xF199, 0xF19A, 0xF19B, 0xF19C, 0xF19D, 0xF19E, 0xF19F, 0xF1A0, 0xF1A1, 0xF1A2, 0xF1A3, 0xF1A4, 0xF1A5, 0xF1A6, 0xF1A7, 0xF1A8, 0xF1A9, 0xF1AA, 0xF1AB, 0xF1AC, 0xF1AD, 0xF1AE, 0xF1AF, 0xF1B0, 0xF1B1, 0xF1B2, 0xF1B3, 0xF1B4, 0xF1B5, 0xF1B6, 0xF1B7, 0xF1B8, 0xF1B9, 0xF1BA, 0xF1BB, 0xF1BC, 0xF1BD, 0xF1BE, 0xF1BF, 0xF1C0, 0xF1C1, 0xF1C2, 0xF1C3, 0xF1C4, 0xF1C5, 0xF1C6, 0xF1C7, 0xF1C8, /* Big5-HKSCS 0x8640 .. 0x867E */ 0xF1C9, 0xF1CA, 0xF1CB, 0xF1CC, 0xF1CD, 0xF1CE, 0xF1CF, 0xF1D0, 0xF1D1, 0xF1D2, 0xF1D3, 0xF1D4, 0xF1D5, 0xF1D6, 0xF1D7, 0xF1D8, 0xF1D9, 0xF1DA, 0xF1DB, 0xF1DC, 0xF1DD, 0xF1DE, 0xF1DF, 0xF1E0, 0xF1E1, 0xF1E2, 0xF1E3, 0xF1E4, 0xF1E5, 0xF1E6, 0xF1E7, 0xF1E8, 0xF1E9, 0xF1EA, 0xF1EB, 0xF1EC, 0xF1ED, 0xF1EE, 0xF1EF, 0xF1F0, 0xF1F1, 0xF1F2, 0xF1F3, 0xF1F4, 0xF1F5, 0xF1F6, 0xF1F7, 0xF1F8, 0xF1F9, 0xF1FA, 0xF1FB, 0xF1FC, 0xF1FD, 0xF1FE, 0xF1FF, 0xF200, 0xF201, 0xF202, 0xF203, 0xF204, 0xF205, 0xF206, 0xF207, /* Big5-HKSCS 0x86A1 .. 0x86FE */ 0xF208, 0xF209, 0xF20A, 0xF20B, 0xF20C, 0xF20D, 0xF20E, 0xF20F, 0xF210, 0xF211, 0xF212, 0xF213, 0xF214, 0xF215, 0xF216, 0xF217, 0xF218, 0xF219, 0xF21A, 0xF21B, 0xF21C, 0xF21D, 0xF21E, 0xF21F, 0xF220, 0xF221, 0xF222, 0xF223, 0xF224, 0xF225, 0xF226, 0xF227, 0xF228, 0xF229, 0xF22A, 0xF22B, 0xF22C, 0xF22D, 0xF22E, 0xF22F, 0xF230, 0xF231, 0xF232, 0xF233, 0xF234, 0xF235, 0xF236, 0xF237, 0xF238, 0xF239, 0xF23A, 0xF23B, 0xF23C, 0xF23D, 0xF23E, 0xF23F, 0xF240, 0xF241, 0xF242, 0xF243, 0xF244, 0xF245, 0xF246, 0xF247, 0xF248, 0xF249, 0xF24A, 0xF24B, 0xF24C, 0xF24D, 0xF24E, 0xF24F, 0xF250, 0xF251, 0xF252, 0xF253, 0xF254, 0xF255, 0xF256, 0xF257, 0xF258, 0xF259, 0xF25A, 0xF25B, 0xF25C, 0xF25D, 0xF25E, 0xF25F, 0xF260, 0xF261, 0xF262, 0xF263, 0xF264, 0xF265, /* Big5-HKSCS 0x8740 .. 0x877E */ 0xF266, 0xF267, 0xF268, 0xF269, 0xF26A, 0xF26B, 0xF26C, 0xF26D, 0xF26E, 0xF26F, 0xF270, 0xF271, 0xF272, 0xF273, 0xF274, 0xF275, 0xF276, 0xF277, 0xF278, 0xF279, 0xF27A, 0xF27B, 0xF27C, 0xF27D, 0xF27E, 0xF27F, 0xF280, 0xF281, 0xF282, 0xF283, 0xF284, 0xF285, 0xF286, 0xF287, 0xF288, 0xF289, 0xF28A, 0xF28B, 0xF28C, 0xF28D, 0xF28E, 0xF28F, 0xF290, 0xF291, 0xF292, 0xF293, 0xF294, 0xF295, 0xF296, 0xF297, 0xF298, 0xF299, 0xF29A, 0xF29B, 0xF29C, 0xF29D, 0xF29E, 0xF29F, 0xF2A0, 0xF2A1, 0xF2A2, 0xF2A3, 0xF2A4, /* Big5-HKSCS 0x87A1 .. 0x87FE */ 0xF2A5, 0xF2A6, 0xF2A7, 0xF2A8, 0xF2A9, 0xF2AA, 0xF2AB, 0xF2AC, 0xF2AD, 0xF2AE, 0xF2AF, 0xF2B0, 0xF2B1, 0xF2B2, 0xF2B3, 0xF2B4, 0xF2B5, 0xF2B6, 0xF2B7, 0xF2B8, 0xF2B9, 0xF2BA, 0xF2BB, 0xF2BC, 0xF2BD, 0xF2BE, 0xF2BF, 0xF2C0, 0xF2C1, 0xF2C2, 0xF2C3, 0xF2C4, 0xF2C5, 0xF2C6, 0xF2C7, 0xF2C8, 0xF2C9, 0xF2CA, 0xF2CB, 0xF2CC, 0xF2CD, 0xF2CE, 0xF2CF, 0xF2D0, 0xF2D1, 0xF2D2, 0xF2D3, 0xF2D4, 0xF2D5, 0xF2D6, 0xF2D7, 0xF2D8, 0xF2D9, 0xF2DA, 0xF2DB, 0xF2DC, 0xF2DD, 0xF2DE, 0xF2DF, 0xF2E0, 0xF2E1, 0xF2E2, 0xF2E3, 0xF2E4, 0xF2E5, 0xF2E6, 0xF2E7, 0xF2E8, 0xF2E9, 0xF2EA, 0xF2EB, 0xF2EC, 0xF2ED, 0xF2EE, 0xF2EF, 0xF2F0, 0xF2F1, 0xF2F2, 0xF2F3, 0xF2F4, 0xF2F5, 0xF2F6, 0xF2F7, 0xF2F8, 0xF2F9, 0xF2FA, 0xF2FB, 0xF2FC, 0xF2FD, 0xF2FE, 0xF2FF, 0xF300, 0xF301, 0xF302, /* Big5-HKSCS 0x8840 .. 0x887E */ 0xF303, 0xF304, 0xF305, 0xF306, 0xF307, 0xF308, 0xF309, 0xF30A, 0xF30B, 0xF30C, 0xF30D, 0xF30E, 0xF30F, 0xF310, 0xF311, 0xF312, 0xF313, 0xF314, 0xF315, 0xF316, 0xF317, 0xF318, 0x0100, 0x00C1, 0x01CD, 0x00C0, 0x0112, 0x00C9, 0x011A, 0x00C8, 0x014C, 0x00D3, 0x01D1, 0x00D2, 0xF325, 0x1EBE, 0xF327, 0x1EC0, 0x00CA, 0x0101, 0x00E1, 0x01CE, 0x00E0, 0x0251, 0x0113, 0x00E9, 0x011B, 0x00E8, 0x012B, 0x00ED, 0x01D0, 0x00EC, 0x014D, 0x00F3, 0x01D2, 0x00F2, 0x016B, 0x00FA, 0x01D4, 0x00F9, 0x01D6, 0x01D8, 0x01DA, /* Big5-HKSCS 0x88A1 .. 0x88FE */ 0x01DC, 0x00FC, 0xF344, 0x1EBF, 0xF346, 0x1EC1, 0x00EA, 0x0261, 0xF34A, 0xF34B, 0xF34C, 0xF34D, 0xF34E, 0xF34F, 0xF350, 0xF351, 0xF352, 0xF353, 0xF354, 0xF355, 0xF356, 0xF357, 0xF358, 0xF359, 0xF35A, 0xF35B, 0xF35C, 0xF35D, 0xF35E, 0xF35F, 0xF360, 0xF361, 0xF362, 0xF363, 0xF364, 0xF365, 0xF366, 0xF367, 0xF368, 0xF369, 0xF36A, 0xF36B, 0xF36C, 0xF36D, 0xF36E, 0xF36F, 0xF370, 0xF371, 0xF372, 0xF373, 0xF374, 0xF375, 0xF376, 0xF377, 0xF378, 0xF379, 0xF37A, 0xF37B, 0xF37C, 0xF37D, 0xF37E, 0xF37F, 0xF380, 0xF381, 0xF382, 0xF383, 0xF384, 0xF385, 0xF386, 0xF387, 0xF388, 0xF389, 0xF38A, 0xF38B, 0xF38C, 0xF38D, 0xF38E, 0xF38F, 0xF390, 0xF391, 0xF392, 0xF393, 0xF394, 0xF395, 0xF396, 0xF397, 0xF398, 0xF399, 0xF39A, 0xF39B, 0xF39C, 0xF39D, 0xF39E, 0xF39F, /* Big5-HKSCS 0x8940 .. 0x897E */ 0xF3A0, 0xF3A1, 0xF3A2, 0x650A, 0xF3A4, 0xF3A5, 0x4E3D, 0x6EDD, 0x9D4E, 0x91DF, 0xF3AA, 0xF3AB, 0xF3AC, 0x6491, 0x4F1A, 0x4F28, 0x4FA8, 0x5156, 0x5174, 0x519C, 0x51E4, 0x52A1, 0x52A8, 0x533B, 0x534E, 0x53D1, 0x53D8, 0x56E2, 0x58F0, 0x5904, 0x5907, 0x5932, 0x5934, 0x5B66, 0x5B9E, 0x5B9F, 0x5C9A, 0x5E86, 0x603B, 0x6589, 0x67FE, 0x6804, 0x6865, 0x6D4E, 0x70BC, 0x7535, 0x7EA4, 0x7EAC, 0x7EBA, 0x7EC7, 0x7ECF, 0x7EDF, 0x7F06, 0x7F37, 0x827A, 0x82CF, 0x836F, 0x89C6, 0x8BBE, 0x8BE2, 0x8F66, 0x8F67, 0x8F6E, /* Big5-HKSCS 0x89A1 .. 0x89FE */ 0x7411, 0x7CFC, 0x7DCD, 0x6946, 0x7AC9, 0x5227, 0xF3E5, 0xF3E6, 0xF3E7, 0xF3E8, 0x918C, 0x78B8, 0x915E, 0x80BC, 0xF3ED, 0x8D0B, 0x80F6, 0xF3F0, 0xF3F1, 0xF3F2, 0x809F, 0x9EC7, 0x4CCD, 0x9DC9, 0x9E0C, 0x4C3E, 0xF3F9, 0xF3FA, 0x9E0A, 0xF3FC, 0x35C1, 0xF3FE, 0x6E9A, 0x823E, 0x7519, 0xF402, 0x4911, 0x9A6C, 0x9A8F, 0x9F99, 0x7987, 0xF408, 0xF409, 0xF40A, 0xF40B, 0x4E24, 0x4E81, 0x4E80, 0x4E87, 0x4EBF, 0x4EEB, 0x4F37, 0x344C, 0x4FBD, 0x3E48, 0x5003, 0x5088, 0x347D, 0x3493, 0x34A5, 0x5186, 0x5905, 0x51DB, 0x51FC, 0x5205, 0x4E89, 0x5279, 0x5290, 0x5327, 0x35C7, 0x53A9, 0x3551, 0x53B0, 0x3553, 0x53C2, 0x5423, 0x356D, 0x3572, 0x3681, 0x5493, 0x54A3, 0x54B4, 0x54B9, 0x54D0, 0x54EF, 0x5518, 0x5523, 0x5528, 0x3598, 0x553F, 0x35A5, 0x35BF, 0x55D7, 0x35C5, /* Big5-HKSCS 0x8A40 .. 0x8A7E */ 0xF43D, 0x5525, 0xF43F, 0xF440, 0xF441, 0xF442, 0x5590, 0xF444, 0x39EC, 0xF446, 0x8E46, 0xF448, 0xF449, 0x4053, 0xF44B, 0x777A, 0xF44D, 0x3A34, 0x47D5, 0xF450, 0xF451, 0xF452, 0x64DD, 0xF454, 0xF455, 0xF456, 0xF457, 0x648D, 0x8E7E, 0xF45A, 0xF45B, 0xF45C, 0xF45D, 0xF45E, 0xF45F, 0xF460, 0xF461, 0xF462, 0xF463, 0x47F4, 0xF465, 0xF466, 0x9AB2, 0x3A67, 0xF469, 0x3FED, 0x3506, 0xF46C, 0xF46D, 0xF46E, 0xF46F, 0x9D6E, 0x9815, 0xF472, 0x43D9, 0xF474, 0x64B4, 0x54E3, 0xF477, 0xF478, 0xF479, 0x39FB, 0xF47B, /* Big5-HKSCS 0x8AA1 .. 0x8AFE */ 0xF47C, 0xF47D, 0xF47E, 0x64EA, 0xF480, 0xF481, 0x8E68, 0xF483, 0xF484, 0xF485, 0xF486, 0x480B, 0xF488, 0x3FFA, 0x5873, 0xF48B, 0xF48C, 0xF48D, 0xF48E, 0xF48F, 0xF490, 0xF491, 0x5579, 0x40BB, 0x43BA, 0xF495, 0x4AB4, 0xF497, 0xF498, 0x81AA, 0x98F5, 0xF49B, 0x6379, 0x39FE, 0xF49E, 0x8DC0, 0x56A1, 0x647C, 0x3E43, 0xF4A3, 0xF4A4, 0xF4A5, 0xF4A6, 0xF4A7, 0xF4A8, 0xF4A9, 0xF4AA, 0x3992, 0x3A06, 0xF4AD, 0x3578, 0xF4AF, 0xF4B0, 0x5652, 0xF4B2, 0xF4B3, 0xF4B4, 0x34BC, 0x6C3D, 0xF4B7, 0xF4B8, 0xF4B9, 0xF4BA, 0xF4BB, 0xF4BC, 0xF4BD, 0xF4BE, 0xF4BF, 0xF4C0, 0xF4C1, 0x7F93, 0xF4C3, 0xF4C4, 0xF4C5, 0x35FB, 0xF4C7, 0xF4C8, 0xF4C9, 0xF4CA, 0x3F93, 0xF4CC, 0xF4CD, 0xF4CE, 0xF4CF, 0xF4D0, 0xF4D1, 0xF4D2, 0xF4D3, 0xF4D4, 0xF4D5, 0x3FF9, 0xF4D7, 0x6432, 0xF4D9, /* Big5-HKSCS 0x8B40 .. 0x8B7E */ 0xF4DA, 0xF4DB, 0xF4DC, 0xF4DD, 0xF4DE, 0xF4DF, 0xF4E0, 0x3A18, 0xF4E2, 0xF4E3, 0xF4E4, 0xF4E5, 0xF4E6, 0xF4E7, 0xF4E8, 0xF4E9, 0x95AA, 0x54CC, 0x82C4, 0x55B9, 0xF4EE, 0xF4EF, 0x9C26, 0x9AB6, 0xF4F2, 0xF4F3, 0x7140, 0x816D, 0x80EC, 0x5C1C, 0xF4F8, 0x8134, 0x3797, 0x535F, 0xF4FC, 0x91B6, 0xF4FE, 0xF4FF, 0xF500, 0xF501, 0x35DD, 0xF503, 0x3609, 0xF505, 0x56AF, 0xF507, 0xF508, 0xF509, 0xF50A, 0xF50B, 0xF50C, 0xF50D, 0xF50E, 0xF50F, 0xF510, 0xF511, 0x5A54, 0xF513, 0xF514, 0xF515, 0xF516, 0x579C, 0xF518, /* Big5-HKSCS 0x8BA1 .. 0x8BFE */ 0xF519, 0xF51A, 0xF51B, 0xF51C, 0xF51D, 0x3703, 0xF51F, 0xF520, 0xF521, 0xF522, 0xF523, 0xF524, 0xF525, 0xF526, 0x5899, 0x5268, 0x361A, 0xF52A, 0x7BB2, 0x5B68, 0x4800, 0x4B2C, 0x9F27, 0x49E7, 0x9C1F, 0x9B8D, 0xF533, 0xF534, 0x55FB, 0x35F2, 0x5689, 0x4E28, 0x5902, 0xF53A, 0xF53B, 0x9751, 0xF53D, 0x4E5B, 0x4EBB, 0x353E, 0x5C23, 0x5F51, 0x5FC4, 0x38FA, 0x624C, 0x6535, 0x6B7A, 0x6C35, 0x6C3A, 0x706C, 0x722B, 0x4E2C, 0x72AD, 0xF54E, 0x7F52, 0x793B, 0x7CF9, 0x7F53, 0xF553, 0x34C1, 0xF555, 0xF556, 0x8002, 0x8080, 0xF559, 0xF55A, 0x535D, 0x8864, 0x89C1, 0xF55E, 0x8BA0, 0x8D1D, 0x9485, 0x9578, 0x957F, 0x95E8, 0xF565, 0x97E6, 0x9875, 0x98CE, 0x98DE, 0x9963, 0xF56B, 0x9C7C, 0x9E1F, 0x9EC4, 0x6B6F, 0xF907, 0x4E37, 0xF572, 0x961D, 0x6237, 0x94A2, 0xF576, /* Big5-HKSCS 0x8C40 .. 0x8C7E */ 0x503B, 0x6DFE, 0xF579, 0xF57A, 0x3DC9, 0x888F, 0xF57D, 0x7077, 0x5CF5, 0x4B20, 0xF581, 0x3559, 0xF583, 0x6122, 0xF585, 0x8FA7, 0x91F6, 0x7191, 0x6719, 0x73BA, 0xF58B, 0xF58C, 0x3C8B, 0xF58E, 0x4B10, 0x78E4, 0x7402, 0x51AE, 0xF593, 0x4009, 0x6A63, 0xF596, 0x4223, 0x860F, 0xF599, 0x7A2A, 0xF59B, 0xF59C, 0x9755, 0x704D, 0x5324, 0xF5A0, 0x93F4, 0x76D9, 0xF5A3, 0xF5A4, 0x77DD, 0x4EA3, 0x4FF0, 0x50BC, 0x4E2F, 0x4F17, 0xF5AB, 0x5434, 0x7D8B, 0x5892, 0x58D0, 0xF5B0, 0x5E92, 0x5E99, 0x5FC2, 0xF5B4, 0x658B, /* Big5-HKSCS 0x8CA1 .. 0x8CFE */ 0xF5B6, 0x6919, 0x6A43, 0xF5B9, 0x6CFF, 0xF5BB, 0x7200, 0xF5BD, 0x738C, 0x3EDB, 0xF5C0, 0x5B15, 0x74B9, 0x8B83, 0xF5C4, 0xF5C5, 0x7A93, 0x7BEC, 0x7CC3, 0x7E6C, 0x82F8, 0x8597, 0xF5CC, 0x8890, 0xF5CE, 0x8EB9, 0xF5D0, 0x8FCF, 0x855F, 0x99E0, 0x9221, 0xF5D5, 0xF5D6, 0xF5D7, 0x4071, 0x42A2, 0x5A1A, 0xF5DB, 0xF5DC, 0xF5DD, 0x9868, 0x676B, 0x4276, 0x573D, 0xF5E2, 0x85D6, 0xF5E4, 0x82BF, 0xF5E6, 0x4C81, 0xF5E8, 0x5D7B, 0xF5EA, 0xF5EB, 0xF5EC, 0xF5ED, 0x5B96, 0xF5EF, 0xF5F0, 0x7E5B, 0xF5F2, 0xF5F3, 0xF5F4, 0xF5F5, 0xF5F6, 0xF5F7, 0xF5F8, 0xF5F9, 0xF5FA, 0xF5FB, 0xF5FC, 0xF5FD, 0xF5FE, 0xF5FF, 0xF600, 0xF601, 0xF602, 0xF603, 0xF604, 0xF605, 0xF606, 0xF607, 0xF608, 0xF609, 0xF60A, 0xF60B, 0xF60C, 0xF60D, 0xF60E, 0xF60F, 0xF610, 0xF611, 0xF612, 0xF613, /* Big5-HKSCS 0x8D40 .. 0x8D7E */ 0xF614, 0xF615, 0xF616, 0xF617, 0xF618, 0xF619, 0xF61A, 0xF61B, 0xF61C, 0xF61D, 0xF61E, 0xF61F, 0xF620, 0xF621, 0xF622, 0xF623, 0xF624, 0xF625, 0xF626, 0xF627, 0xF628, 0xF629, 0xF62A, 0xF62B, 0xF62C, 0xF62D, 0xF62E, 0xF62F, 0xF630, 0xF631, 0xF632, 0xF633, 0x5D3E, 0x5D48, 0x5D56, 0x3DFC, 0x380F, 0x5DA4, 0x5DB9, 0x3820, 0x3838, 0x5E42, 0x5EBD, 0x5F25, 0x5F83, 0x3908, 0x3914, 0x393F, 0x394D, 0x60D7, 0x613D, 0x5CE5, 0x3989, 0x61B7, 0x61B9, 0x61CF, 0x39B8, 0x622C, 0x6290, 0x62E5, 0x6318, 0x39F8, 0x56B1, /* Big5-HKSCS 0x8DA1 .. 0x8DFE */ 0x3A03, 0x63E2, 0x63FB, 0x6407, 0x645A, 0x3A4B, 0x64C0, 0x5D15, 0x5621, 0x9F9F, 0x3A97, 0x6586, 0x3ABD, 0x65FF, 0x6653, 0x3AF2, 0x6692, 0x3B22, 0x6716, 0x3B42, 0x67A4, 0x6800, 0x3B58, 0x684A, 0x6884, 0x3B72, 0x3B71, 0x3B7B, 0x6909, 0x6943, 0x725C, 0x6964, 0x699F, 0x6985, 0x3BBC, 0x69D6, 0x3BDD, 0x6A65, 0x6A74, 0x6A71, 0x6A82, 0x3BEC, 0x6A99, 0x3BF2, 0x6AAB, 0x6AB5, 0x6AD4, 0x6AF6, 0x6B81, 0x6BC1, 0x6BEA, 0x6C75, 0x6CAA, 0x3CCB, 0x6D02, 0x6D06, 0x6D26, 0x6D81, 0x3CEF, 0x6DA4, 0x6DB1, 0x6E15, 0x6E18, 0x6E29, 0x6E86, 0xF694, 0x6EBB, 0x6EE2, 0x6EDA, 0x9F7F, 0x6EE8, 0x6EE9, 0x6F24, 0x6F34, 0x3D46, 0xF69E, 0x6F81, 0x6FBE, 0x3D6A, 0x3D75, 0x71B7, 0x5C99, 0x3D8A, 0x702C, 0x3D91, 0x7050, 0x7054, 0x706F, 0x707F, 0x7089, 0xF6AD, 0x43C1, 0x35F1, 0xF6B0, /* Big5-HKSCS 0x8E40 .. 0x8E7E */ 0xE311, 0x57BE, 0xE313, 0x713E, 0xE315, 0x364E, 0x69A2, 0xE318, 0x5B74, 0x7A49, 0xE31B, 0xE31C, 0x7A65, 0x7A7D, 0xE31F, 0x7ABB, 0x7AB0, 0x7AC2, 0x7AC3, 0x71D1, 0xE325, 0x41CA, 0x7ADA, 0x7ADD, 0x7AEA, 0x41EF, 0x54B2, 0xE32C, 0x7B0B, 0x7B55, 0x7B29, 0xE330, 0xE331, 0x7BA2, 0x7B6F, 0x839C, 0xE335, 0xE336, 0x7BD0, 0x8421, 0x7B92, 0x7BB8, 0xE33B, 0x3DAD, 0xE33D, 0x8492, 0x7BFA, 0x7C06, 0x7C35, 0xE342, 0x7C44, 0x7C83, 0xE345, 0x7CA6, 0x667D, 0xE348, 0x7CC9, 0x7CC7, 0x7CE6, 0x7C74, 0x7CF3, 0x7CF5, 0x7CCE, /* Big5-HKSCS 0x8EA1 .. 0x8EFE */ 0x7E67, 0x451D, 0xE352, 0x7D5D, 0xE354, 0x748D, 0x7D89, 0x7DAB, 0x7135, 0x7DB3, 0x7DD2, 0xE35B, 0xE35C, 0x7DE4, 0x3D13, 0x7DF5, 0xE360, 0x7DE5, 0xE362, 0x7E1D, 0xE364, 0xE365, 0x7E6E, 0x7E92, 0x432B, 0x946C, 0x7E27, 0x7F40, 0x7F41, 0x7F47, 0x7936, 0xE36F, 0x99E1, 0x7F97, 0xE372, 0x7FA3, 0xE374, 0xE375, 0x455C, 0xE377, 0x4503, 0xE379, 0x7FFA, 0xE37B, 0x8005, 0x8008, 0x801D, 0x8028, 0x802F, 0xE381, 0xE382, 0x803B, 0x803C, 0x8061, 0xE386, 0x4989, 0xE388, 0xE389, 0xE38A, 0x6725, 0x80A7, 0xE38D, 0x8107, 0x811A, 0x58B0, 0xE391, 0x6C7F, 0xE393, 0xE394, 0x64E7, 0xE396, 0x8218, 0xE398, 0x6A53, 0xE39A, 0xE39B, 0x447A, 0x8229, 0xE39E, 0xE39F, 0xE3A0, 0x4FF9, 0xE3A2, 0x84E2, 0x8362, 0xE3A5, 0xE3A6, 0xE3A7, 0xE3A8, 0xE3A9, 0x82AA, 0x691B, 0xE3AC, 0x41DB, /* Big5-HKSCS 0x8F40 .. 0x8F7E */ 0x854B, 0x82D0, 0x831A, 0xE3B1, 0xE3B2, 0x36C1, 0xE3B4, 0xE3B5, 0x827B, 0x82E2, 0x8318, 0xE3B9, 0xE3BA, 0xE3BB, 0xE3BC, 0xE3BD, 0x3DBF, 0x831D, 0x55EC, 0x8385, 0x450B, 0xE3C3, 0x83AC, 0x83C1, 0x83D3, 0x347E, 0xE3C8, 0x6A57, 0x855A, 0x3496, 0xE3CC, 0xE3CD, 0x8458, 0xE3CF, 0x8471, 0x3DD3, 0x44E4, 0x6AA7, 0x844A, 0xE3D5, 0x7958, 0x84A8, 0xE3D8, 0xE3D9, 0xE3DA, 0x84DE, 0x840F, 0x8391, 0x44A0, 0x8493, 0x84E4, 0xE3E1, 0x4240, 0xE3E3, 0x4543, 0x8534, 0x5AF2, 0xE3E7, 0x4527, 0x8573, 0x4516, 0x67BF, 0x8616, /* Big5-HKSCS 0x8FA1 .. 0x8FFE */ 0xE3ED, 0xE3EE, 0x85C1, 0xE3F0, 0x8602, 0xE3F2, 0xE3F3, 0xE3F4, 0x456A, 0x8628, 0x3648, 0xE3F8, 0x53F7, 0xE3FA, 0x867E, 0x8771, 0xE3FD, 0x87EE, 0xE3FF, 0x87B1, 0x87DA, 0x880F, 0x5661, 0x866C, 0x6856, 0x460F, 0x8845, 0x8846, 0xE409, 0xE40A, 0xE40B, 0x885E, 0x889C, 0x465B, 0x88B4, 0x88B5, 0x63C1, 0x88C5, 0x7777, 0xE414, 0x8987, 0x898A, 0x89A6, 0x89A9, 0x89A7, 0x89BC, 0xE41B, 0x89E7, 0xE41D, 0xE41E, 0x8A9C, 0x7793, 0x91FE, 0x8A90, 0xE423, 0x7AE9, 0xE425, 0xE426, 0x4713, 0xE428, 0x717C, 0x8B0C, 0x8B1F, 0xE42C, 0xE42D, 0x8B3F, 0x8B4C, 0x8B4D, 0x8AA9, 0xE432, 0x8B90, 0x8B9B, 0x8AAF, 0xE436, 0x4615, 0x884F, 0x8C9B, 0xE43A, 0xE43B, 0xE43C, 0x3725, 0xE43E, 0x8CD6, 0xE440, 0xE441, 0x8D12, 0x8D03, 0xE444, 0x8CDB, 0x705C, 0x8D11, 0xE448, 0x3ED0, 0x8D77, /* Big5-HKSCS 0x9040 .. 0x907E */ 0x8DA9, 0xE44C, 0xE44D, 0xE44E, 0x3B7C, 0xE450, 0xE451, 0x7AE7, 0x8EAD, 0x8EB6, 0x8EC3, 0x92D4, 0x8F19, 0x8F2D, 0xE459, 0xE45A, 0x8FA5, 0x9303, 0xE45D, 0xE45E, 0x8FB3, 0x492A, 0xE461, 0xE462, 0xE463, 0x5EF8, 0xE465, 0x8FF9, 0xE467, 0xE468, 0xE469, 0xE46A, 0x3980, 0xE46C, 0x9037, 0xE46E, 0xE46F, 0x9061, 0xE471, 0xE472, 0x90A8, 0xE474, 0x90C4, 0xE476, 0x90AE, 0x90FD, 0x9167, 0x3AF0, 0x91A9, 0x91C4, 0x7CAC, 0xE47E, 0xE47F, 0x920E, 0x6C9F, 0x9241, 0x9262, 0xE484, 0x92B9, 0xE486, 0xE487, 0xE488, 0xE489, /* Big5-HKSCS 0x90A1 .. 0x90FE */ 0xE48A, 0x932C, 0x936B, 0xE48D, 0xE48E, 0x708F, 0x5AC3, 0xE491, 0xE492, 0x4965, 0x9244, 0xE495, 0xE496, 0xE497, 0x9373, 0x945B, 0x8EBC, 0x9585, 0x95A6, 0x9426, 0x95A0, 0x6FF6, 0x42B9, 0xE4A1, 0xE4A2, 0xE4A3, 0xE4A4, 0x49DF, 0x6C1C, 0x967B, 0x9696, 0x416C, 0x96A3, 0xE4AB, 0x61DA, 0x96B6, 0x78F5, 0xE4AF, 0x96BD, 0x53CC, 0x49A1, 0xE4B3, 0xE4B4, 0xE4B5, 0xE4B6, 0xE4B7, 0xE4B8, 0xE4B9, 0xE4BA, 0x9731, 0x8642, 0x9736, 0x4A0F, 0x453D, 0x4585, 0xE4C1, 0x7075, 0x5B41, 0x971B, 0x975C, 0xE4C6, 0x9757, 0x5B4A, 0xE4C9, 0x975F, 0x9425, 0x50D0, 0xE4CD, 0xE4CE, 0x9789, 0x979F, 0x97B1, 0x97BE, 0x97C0, 0x97D2, 0x97E0, 0xE4D6, 0x97EE, 0x741C, 0xE4D9, 0x97FF, 0x97F5, 0xE4DC, 0xE4DD, 0x4AD1, 0x9834, 0x9833, 0x984B, 0x9866, 0x3B0E, 0xE4E4, 0x3D51, 0xE4E6, 0xE4E7, /* Big5-HKSCS 0x9140 .. 0x917E */ 0xE4E8, 0x98CA, 0x98B7, 0x98C8, 0x98C7, 0x4AFF, 0xE4EE, 0xE4EF, 0x55B0, 0x98E1, 0x98E6, 0x98EC, 0x9378, 0x9939, 0xE4F6, 0x4B72, 0xE4F8, 0xE4F9, 0x99F5, 0x9A0C, 0x9A3B, 0x9A10, 0x9A58, 0xE4FF, 0x36C4, 0xE501, 0xE502, 0x9AE0, 0x9AE2, 0xE505, 0x9AF4, 0x4C0E, 0x9B14, 0x9B2D, 0xE50A, 0x5034, 0x9B34, 0xE50D, 0x38C3, 0xE50F, 0x9B50, 0x9B40, 0xE512, 0x5A45, 0xE514, 0x9B8E, 0xE516, 0x9C02, 0x9BFF, 0x9C0C, 0xE51A, 0x9DD4, 0xE51C, 0xE51D, 0xE51E, 0xE51F, 0xE520, 0xE521, 0x9D7E, 0x9D83, 0xE524, 0x9E0E, 0x6888, /* Big5-HKSCS 0x91A1 .. 0x91FE */ 0x9DC4, 0xE528, 0xE529, 0xE52A, 0xE52B, 0xE52C, 0x9D39, 0xE52E, 0xE52F, 0x9E90, 0x9E95, 0x9E9E, 0x9EA2, 0x4D34, 0x9EAA, 0x9EAF, 0xE537, 0x9EC1, 0x3B60, 0x39E5, 0x3D1D, 0x4F32, 0x37BE, 0xE53E, 0x9F02, 0x9F08, 0x4B96, 0x9424, 0xE543, 0x9F17, 0x9F16, 0x9F39, 0x569F, 0x568A, 0x9F45, 0x99B8, 0xE54B, 0x97F2, 0x847F, 0x9F62, 0x9F69, 0x7ADC, 0x9F8E, 0x7216, 0x4BBE, 0xE554, 0xE555, 0x7177, 0xE557, 0xE558, 0xE559, 0x739E, 0xE55B, 0xE55C, 0x799F, 0xE55E, 0xE55F, 0x9369, 0x93F3, 0xE562, 0x92EC, 0x9381, 0x93CB, 0xE566, 0xE567, 0x7217, 0x3EEB, 0x7772, 0x7A43, 0x70D0, 0xE56D, 0xE56E, 0x717E, 0xE570, 0x70A3, 0xE572, 0xE573, 0x3EC7, 0xE575, 0xE576, 0xE577, 0x3722, 0xE579, 0xE57A, 0x36E1, 0xE57C, 0xE57D, 0xE57E, 0x3723, 0xE580, 0x575B, 0xE582, 0xE583, 0xE584, /* Big5-HKSCS 0x9240 .. 0x927E */ 0xE585, 0xE586, 0x8503, 0xE588, 0x8503, 0x8455, 0xE58B, 0xE58C, 0xE58D, 0xE58E, 0xE58F, 0xE590, 0x44F4, 0xE592, 0xE593, 0xE594, 0x67F9, 0x3733, 0x3C15, 0x3DE7, 0x586C, 0xE59A, 0x6810, 0x4057, 0xE59D, 0xE59E, 0xE59F, 0xE5A0, 0xE5A1, 0x54CB, 0x569E, 0xE5A4, 0x5692, 0xE5A6, 0xE5A7, 0xE5A8, 0x93C6, 0xE5AA, 0x939C, 0x4EF8, 0x512B, 0x3819, 0xE5AF, 0x4EBC, 0xE5B1, 0xE5B2, 0x4F4B, 0x4F8A, 0xE5B5, 0x5A68, 0xE5B7, 0xE5B8, 0x3999, 0xE5BA, 0xE5BB, 0x3435, 0x4F29, 0xE5BE, 0xE5BF, 0xE5C0, 0x8ADA, 0xE5C2, 0x4E98, /* Big5-HKSCS 0x92A1 .. 0x92FE */ 0x50CD, 0x510D, 0x4FA2, 0x4F03, 0xE5C8, 0xE5C9, 0x4F42, 0x502E, 0x506C, 0x5081, 0x4FCC, 0x4FE5, 0x5058, 0x50FC, 0x5159, 0x515B, 0x515D, 0x515E, 0x6E76, 0xE5D7, 0xE5D8, 0xE5D9, 0x6D72, 0xE5DB, 0xE5DC, 0x51A8, 0x51C3, 0xE5DF, 0x44DD, 0xE5E1, 0xE5E2, 0xE5E3, 0x8D7A, 0xE5E5, 0xE5E6, 0x5259, 0x52A4, 0xE5E9, 0x52E1, 0x936E, 0x467A, 0x718C, 0xE5EE, 0xE5EF, 0xE5F0, 0xE5F1, 0x69D1, 0xE5F3, 0x7479, 0x3EDE, 0x7499, 0x7414, 0x7456, 0x7398, 0x4B8E, 0xE5FB, 0xE5FC, 0x53D0, 0x3584, 0x720F, 0xE600, 0x55B4, 0xE602, 0x54CD, 0xE604, 0x571D, 0x925D, 0x96F4, 0x9366, 0x57DD, 0x578D, 0x577F, 0x363E, 0x58CB, 0x5A99, 0xE60F, 0xE610, 0xE611, 0xE612, 0x5A2C, 0x59B8, 0x928F, 0x5A7E, 0x5ACF, 0x5A12, 0xE619, 0xE61A, 0xE61B, 0xE61C, 0x36F5, 0x6D05, 0x7443, 0x5A21, 0xE621, /* Big5-HKSCS 0x9340 .. 0x937E */ 0x5A81, 0xE623, 0xE624, 0x93E0, 0x748C, 0xE627, 0x7105, 0x4972, 0x9408, 0xE62B, 0x93BD, 0x37A0, 0x5C1E, 0x5C9E, 0x5E5E, 0x5E48, 0xE632, 0xE633, 0xE634, 0x5ECD, 0x5B4F, 0xE637, 0xE638, 0x3701, 0xE63A, 0x36DD, 0xE63C, 0x36D3, 0x812A, 0xE63F, 0xE640, 0xE641, 0xE642, 0x5F0C, 0x5F0E, 0xE645, 0xE646, 0x5A6B, 0xE648, 0x5B44, 0x8614, 0xE64B, 0x8860, 0x607E, 0xE64E, 0xE64F, 0x5FDB, 0x3EB8, 0xE652, 0xE653, 0xE654, 0xE655, 0x61C0, 0xE657, 0xE658, 0xE659, 0x6199, 0x6198, 0x6075, 0xE65D, 0xE65E, 0xE65F, 0xE660, /* Big5-HKSCS 0x93A1 .. 0x93FE */ 0x6471, 0xE662, 0xE663, 0x3A29, 0xE665, 0xE666, 0xE667, 0xE668, 0x6337, 0xE66A, 0x64B6, 0x6331, 0x63D1, 0xE66E, 0xE66F, 0x62A4, 0xE671, 0x643B, 0x656B, 0x6972, 0x3BF4, 0xE676, 0xE677, 0xE678, 0xE679, 0x550D, 0xE67B, 0xE67C, 0xE67D, 0x66CE, 0xE67F, 0xE680, 0x3AE0, 0x4190, 0xE683, 0xE684, 0xE685, 0xE686, 0xE687, 0xE688, 0x78EE, 0xE68A, 0xE68B, 0xE68C, 0x3464, 0xE68E, 0xE68F, 0xE690, 0x668E, 0xE692, 0x666B, 0x4B93, 0x6630, 0xE696, 0xE697, 0x6663, 0xE699, 0xE69A, 0x661E, 0xE69C, 0x38D1, 0xE69E, 0xE69F, 0x3B99, 0xE6A1, 0xE6A2, 0x74D0, 0x3B96, 0x678F, 0xE6A6, 0x68B6, 0x681E, 0x3BC4, 0x6ABE, 0x3863, 0xE6AC, 0xE6AD, 0x6A33, 0x6A52, 0x6AC9, 0x6B05, 0xE6B2, 0x6511, 0x6898, 0x6A4C, 0x3BD7, 0x6A7A, 0x6B57, 0xE6B9, 0xE6BA, 0x93A0, 0x92F2, 0xE6BD, 0xE6BE, /* Big5-HKSCS 0x9440 .. 0x947E */ 0x9289, 0xE6C0, 0xE6C1, 0x9467, 0x6DA5, 0x6F0B, 0xE6C5, 0x6D67, 0xE6C7, 0x3D8F, 0x6E04, 0xE6CA, 0x5A3D, 0x6E0A, 0x5847, 0x6D24, 0x7842, 0x713B, 0xE6D1, 0xE6D2, 0x70F1, 0x7250, 0x7287, 0x7294, 0xE6D7, 0xE6D8, 0x5179, 0xE6DA, 0xE6DB, 0x747A, 0xE6DD, 0xE6DE, 0xE6DF, 0xE6E0, 0xE6E1, 0x3F06, 0x3EB1, 0xE6E4, 0xE6E5, 0xE6E6, 0x60A7, 0x3EF3, 0x74CC, 0x743C, 0x9387, 0x7437, 0x449F, 0xE6EE, 0x4551, 0x7583, 0x3F63, 0xE6F2, 0xE6F3, 0x3F58, 0x7555, 0x7673, 0xE6F7, 0x3B19, 0x7468, 0xE6FA, 0xE6FB, 0xE6FC, 0x3AFB, /* Big5-HKSCS 0x94A1 .. 0x94FE */ 0x3DCD, 0xE6FF, 0x3EFF, 0xE701, 0xE702, 0x91FA, 0x5732, 0x9342, 0xE706, 0xE707, 0x50DF, 0xE709, 0xE70A, 0x7778, 0xE70C, 0x770E, 0x770F, 0x777B, 0xE710, 0xE711, 0x3A5E, 0xE713, 0x7438, 0x749B, 0x3EBF, 0xE717, 0xE718, 0x40C8, 0xE71A, 0xE71B, 0x9307, 0xE71D, 0x781E, 0x788D, 0x7888, 0x78D2, 0x73D0, 0x7959, 0xE724, 0xE725, 0x410E, 0x799B, 0x8496, 0x79A5, 0x6A2D, 0xE72B, 0x7A3A, 0x79F4, 0x416E, 0xE72F, 0x4132, 0x9235, 0x79F1, 0xE733, 0xE734, 0xE735, 0xE736, 0xE737, 0x3597, 0x556B, 0x3570, 0x36AA, 0xE73C, 0xE73D, 0x7AE2, 0x5A59, 0xE740, 0xE741, 0xE742, 0x5A0D, 0xE744, 0x78F0, 0x5A2A, 0xE747, 0x7AFE, 0x41F9, 0x7C5D, 0x7C6D, 0x4211, 0xE74D, 0xE74E, 0xE74F, 0x7CCD, 0xE751, 0xE752, 0x7C8E, 0x7C7C, 0x7CAE, 0x6AB2, 0x7DDC, 0x7E07, 0x7DD3, 0x7F4E, 0xE75B, /* Big5-HKSCS 0x9540 .. 0x957E */ 0xE75C, 0xE75D, 0x7D97, 0xE75F, 0x426A, 0xE761, 0xE762, 0x67D6, 0xE764, 0xE765, 0x57C4, 0xE767, 0xE768, 0xE769, 0x7FDD, 0x7B27, 0xE76C, 0xE76D, 0xE76E, 0x7B0C, 0xE770, 0x99E6, 0x8645, 0x9A63, 0x6A1C, 0xE775, 0x39E2, 0xE777, 0xE778, 0x9A1F, 0xE77A, 0x8480, 0xE77C, 0xE77D, 0x44EA, 0x8137, 0x4402, 0x80C6, 0x8109, 0x8142, 0xE784, 0x98C3, 0xE786, 0x8262, 0x8265, 0xE789, 0x8453, 0xE78B, 0x8610, 0xE78D, 0x5A86, 0x417F, 0xE790, 0x5B2B, 0xE792, 0x5AE4, 0xE794, 0x86A0, 0xE796, 0xE797, 0x882D, 0xE799, 0x5A02, /* Big5-HKSCS 0x95A1 .. 0x95FE */ 0x886E, 0x4F45, 0x8887, 0x88BF, 0x88E6, 0x8965, 0x894D, 0xE7A2, 0x8954, 0xE7A4, 0xE7A5, 0xE7A6, 0xE7A7, 0xE7A8, 0xE7A9, 0x3EAD, 0x84A3, 0x46F5, 0x46CF, 0x37F2, 0x8A3D, 0x8A1C, 0xE7B1, 0x5F4D, 0x922B, 0xE7B4, 0x65D4, 0x7129, 0x70C4, 0xE7B8, 0x9D6D, 0x8C9F, 0x8CE9, 0xE7BC, 0x599A, 0x77C3, 0x59F0, 0x436E, 0x36D4, 0x8E2A, 0x8EA7, 0xE7C4, 0x8F30, 0x8F4A, 0x42F4, 0x6C58, 0x6FBB, 0xE7CA, 0x489B, 0x6F79, 0x6E8B, 0xE7CE, 0x9BE9, 0x36B5, 0xE7D1, 0x90BB, 0x9097, 0x5571, 0x4906, 0x91BB, 0x9404, 0xE7D8, 0x4062, 0xE7DA, 0x9427, 0xE7DC, 0xE7DD, 0x84E5, 0x8A2B, 0x9599, 0x95A7, 0x9597, 0x9596, 0xE7E4, 0x7445, 0x3EC2, 0xE7E7, 0xE7E8, 0xE7E9, 0x3EE7, 0xE7EB, 0x968F, 0xE7ED, 0xE7EE, 0xE7EF, 0x3ECC, 0xE7F1, 0xE7F2, 0xE7F3, 0x7412, 0x746B, 0x3EFC, 0x9741, 0xE7F8, /* Big5-HKSCS 0x9640 .. 0x967E */ 0x6847, 0x4A1D, 0xE7FB, 0xE7FC, 0x975D, 0x9368, 0xE7FF, 0xE800, 0xE801, 0xE802, 0x92BA, 0x5B11, 0x8B69, 0x493C, 0x73F9, 0xE808, 0x979B, 0x9771, 0x9938, 0xE80C, 0x5DC1, 0xE80E, 0xE80F, 0x981F, 0xE811, 0x92F6, 0xE813, 0x91E5, 0x44C0, 0xE816, 0xE817, 0xE818, 0x98DC, 0xE81A, 0x3F00, 0x922A, 0x4925, 0x8414, 0x993B, 0x994D, 0xE821, 0x3DFD, 0x999B, 0x4B6F, 0x99AA, 0x9A5C, 0xE827, 0xE828, 0x6A8F, 0x9A21, 0x5AFE, 0x9A2F, 0xE82D, 0x4B90, 0xE82F, 0x99BC, 0x4BBD, 0x4B97, 0x937D, 0x5872, 0xE835, 0x5822, 0xE837, /* Big5-HKSCS 0x96A1 .. 0x96FE */ 0xE838, 0x7844, 0xE83A, 0xE83B, 0x68C5, 0x3D7D, 0x9458, 0x3927, 0x6150, 0xE841, 0xE842, 0x6107, 0x9C4F, 0x9C53, 0x9C7B, 0x9C35, 0x9C10, 0x9B7F, 0x9BCF, 0xE84B, 0x9B9F, 0xE84D, 0xE84E, 0x9D21, 0x4CAE, 0xE851, 0x9E18, 0x4CB0, 0x9D0C, 0xE855, 0xE856, 0xE857, 0xE858, 0x9DA5, 0x84BD, 0xE85B, 0xE85C, 0xE85D, 0x85FC, 0x4533, 0xE860, 0xE861, 0xE862, 0x8420, 0x85EE, 0xE865, 0xE866, 0xE867, 0x79E2, 0xE869, 0xE86A, 0x492D, 0xE86C, 0x3D62, 0x93DB, 0x92BE, 0x9348, 0xE871, 0x78B9, 0x9277, 0x944D, 0x4FE4, 0x3440, 0x9064, 0xE878, 0x783D, 0x7854, 0x78B6, 0x784B, 0xE87D, 0xE87E, 0xE87F, 0x369A, 0x4F72, 0x6FDA, 0x6FD9, 0x701E, 0x701E, 0x5414, 0xE887, 0x57BB, 0x58F3, 0x578A, 0x9D16, 0x57D7, 0x7134, 0x34AF, 0xE88F, 0x71EB, 0xE891, 0xE892, 0x5B28, 0xE894, 0xE895, /* Big5-HKSCS 0x9740 .. 0x977E */ 0x610C, 0x5ACE, 0x5A0B, 0x42BC, 0xE89A, 0x372C, 0x4B7B, 0xE89D, 0x93BB, 0x93B8, 0xE8A0, 0xE8A1, 0x8472, 0xE8A3, 0xE8A4, 0xE8A5, 0xE8A6, 0xE8A7, 0x5994, 0xE8A9, 0xE8AA, 0x7DA8, 0xE8AC, 0xE8AD, 0xE8AE, 0xE8AF, 0xE8B0, 0x92E5, 0x73E2, 0x3EE9, 0x74B4, 0xE8B5, 0xE8B6, 0x3EE1, 0xE8B8, 0x6AD8, 0x73F3, 0x73FB, 0x3ED6, 0xE8BD, 0xE8BE, 0xE8BF, 0xE8C0, 0xE8C1, 0xE8C2, 0xE8C3, 0x7448, 0xE8C5, 0x70A5, 0xE8C7, 0x9284, 0x73E6, 0x935F, 0xE8CB, 0x9331, 0xE8CD, 0xE8CE, 0x9386, 0xE8D0, 0xE8D1, 0x4935, 0xE8D3, 0x716B, /* Big5-HKSCS 0x97A1 .. 0x97FE */ 0xE8D5, 0xE8D6, 0x56A4, 0xE8D8, 0xE8D9, 0xE8DA, 0x5502, 0x79C4, 0xE8DD, 0x7DFE, 0xE8DF, 0xE8E0, 0xE8E1, 0x452E, 0x9401, 0x370A, 0xE8E5, 0xE8E6, 0x59B0, 0xE8E8, 0xE8E9, 0xE8EA, 0x5AA1, 0x36E2, 0xE8ED, 0x36B0, 0x925F, 0x5A79, 0xE8F1, 0xE8F2, 0x9374, 0x3CCD, 0xE8F5, 0x4A96, 0x398A, 0x50F4, 0x3D69, 0x3D4C, 0xE8FB, 0x7175, 0x42FB, 0xE8FE, 0x6E0F, 0xE900, 0x44EB, 0x6D57, 0xE903, 0x7067, 0x6CAF, 0x3CD6, 0xE907, 0xE908, 0x6E02, 0x6F0C, 0x3D6F, 0xE90C, 0x7551, 0x36BC, 0x34C8, 0x4680, 0x3EDA, 0x4871, 0x59C4, 0x926E, 0x493E, 0x8F41, 0xE917, 0xE918, 0x5812, 0x57C8, 0x36D6, 0xE91C, 0x70FE, 0xE91E, 0xE91F, 0xE920, 0xE921, 0xE922, 0x68B9, 0x6967, 0xE925, 0xE926, 0xE927, 0xE928, 0xE929, 0xE92A, 0xE92B, 0xE92C, 0x6A1A, 0xE92E, 0xE92F, 0x843E, 0x44DF, 0x44CE, /* Big5-HKSCS 0x9840 .. 0x987E */ 0xE933, 0xE934, 0xE935, 0xE936, 0x6F17, 0xE938, 0x833D, 0xE93A, 0x83ED, 0xE93C, 0xE93D, 0xE93E, 0x5989, 0x5A82, 0xE941, 0x5A61, 0x5A71, 0xE944, 0xE945, 0x372D, 0x59EF, 0xE948, 0x36C7, 0x718E, 0x9390, 0x669A, 0xE94D, 0x5A6E, 0x5A2B, 0xE950, 0x6A2B, 0xE952, 0xE953, 0xE954, 0xE955, 0x711D, 0xE957, 0xE958, 0x4FB0, 0xE95A, 0x5CC2, 0xE95C, 0xE95D, 0xE95E, 0x6A0C, 0xE960, 0xE961, 0x70A6, 0x7133, 0xE964, 0x3DA5, 0x6CDF, 0xE967, 0xE968, 0x7E65, 0x59EB, 0x5D2F, 0x3DF3, 0x5F5C, 0xE96E, 0xE96F, 0x7DA4, 0x8426, /* Big5-HKSCS 0x98A1 .. 0x98FE */ 0x5485, 0xE973, 0xE974, 0xE975, 0x577E, 0xE977, 0xE978, 0x3FE5, 0xE97A, 0xE97B, 0x7003, 0xE97D, 0x5D70, 0x738F, 0x7CD3, 0xE981, 0xE982, 0x4FC8, 0x7FE7, 0x72CD, 0x7310, 0xE987, 0x7338, 0x7339, 0xE98A, 0x7341, 0x7348, 0x3EA9, 0xE98E, 0x906C, 0x71F5, 0xE991, 0x73E1, 0x81F6, 0x3ECA, 0x770C, 0x3ED1, 0x6CA2, 0x56FD, 0x7419, 0x741E, 0x741F, 0x3EE2, 0x3EF0, 0x3EF4, 0x3EFA, 0x74D3, 0x3F0E, 0x3F53, 0x7542, 0x756D, 0x7572, 0x758D, 0x3F7C, 0x75C8, 0x75DC, 0x3FC0, 0x764D, 0x3FD7, 0x7674, 0x3FDC, 0x767A, 0xE9B0, 0x7188, 0x5623, 0x8980, 0x5869, 0x401D, 0x7743, 0x4039, 0x6761, 0x4045, 0x35DB, 0x7798, 0x406A, 0x406F, 0x5C5E, 0x77BE, 0x77CB, 0x58F2, 0x7818, 0x70B9, 0x781C, 0x40A8, 0x7839, 0x7847, 0x7851, 0x7866, 0x8448, 0xE9CB, 0x7933, 0x6803, 0x7932, 0x4103, /* Big5-HKSCS 0x9940 .. 0x997E */ 0x4109, 0x7991, 0x7999, 0x8FBB, 0x7A06, 0x8FBC, 0x4167, 0x7A91, 0x41B2, 0x7ABC, 0x8279, 0x41C4, 0x7ACF, 0x7ADB, 0x41CF, 0x4E21, 0x7B62, 0x7B6C, 0x7B7B, 0x7C12, 0x7C1B, 0x4260, 0x427A, 0x7C7B, 0x7C9C, 0x428C, 0x7CB8, 0x4294, 0x7CED, 0x8F93, 0x70C0, 0xE9EF, 0x7DCF, 0x7DD4, 0x7DD0, 0x7DFD, 0x7FAE, 0x7FB4, 0x729F, 0x4397, 0x8020, 0x8025, 0x7B39, 0x802E, 0x8031, 0x8054, 0x3DCC, 0x57B4, 0x70A0, 0x80B7, 0x80E9, 0x43ED, 0x810C, 0x732A, 0x810E, 0x8112, 0x7560, 0x8114, 0x4401, 0x3B39, 0x8156, 0x8159, 0x815A, /* Big5-HKSCS 0x99A1 .. 0x99FE */ 0x4413, 0x583A, 0x817C, 0x8184, 0x4425, 0x8193, 0x442D, 0x81A5, 0x57EF, 0x81C1, 0x81E4, 0x8254, 0x448F, 0x82A6, 0x8276, 0x82CA, 0x82D8, 0x82FF, 0x44B0, 0x8357, 0x9669, 0x698A, 0x8405, 0x70F5, 0x8464, 0x60E3, 0x8488, 0x4504, 0x84BE, 0x84E1, 0x84F8, 0x8510, 0x8538, 0x8552, 0x453B, 0x856F, 0x8570, 0x85E0, 0x4577, 0x8672, 0x8692, 0x86B2, 0x86EF, 0x9645, 0x878B, 0x4606, 0x4617, 0x88AE, 0x88FF, 0x8924, 0x8947, 0x8991, 0xEA43, 0x8A29, 0x8A38, 0x8A94, 0x8AB4, 0x8C51, 0x8CD4, 0x8CF2, 0x8D1C, 0x4798, 0x585F, 0x8DC3, 0x47ED, 0x4EEE, 0x8E3A, 0x55D8, 0x5754, 0x8E71, 0x55F5, 0x8EB0, 0x4837, 0x8ECE, 0x8EE2, 0x8EE4, 0x8EED, 0x8EF2, 0x8FB7, 0x8FC1, 0x8FCA, 0x8FCC, 0x9033, 0x99C4, 0x48AD, 0x98E0, 0x9213, 0x491E, 0x9228, 0x9258, 0x926B, 0x92B1, 0x92AE, 0x92BF, /* Big5-HKSCS 0x9A40 .. 0x9A7E */ 0x92E3, 0x92EB, 0x92F3, 0x92F4, 0x92FD, 0x9343, 0x9384, 0x93AD, 0x4945, 0x4951, 0x9EBF, 0x9417, 0x5301, 0x941D, 0x942D, 0x943E, 0x496A, 0x9454, 0x9479, 0x952D, 0x95A2, 0x49A7, 0x95F4, 0x9633, 0x49E5, 0x67A0, 0x4A24, 0x9740, 0x4A35, 0x97B2, 0x97C2, 0x5654, 0x4AE4, 0x60E8, 0x98B9, 0x4B19, 0x98F1, 0x5844, 0x990E, 0x9919, 0x51B4, 0x991C, 0x9937, 0x9942, 0x995D, 0x9962, 0x4B70, 0x99C5, 0x4B9D, 0x9A3C, 0x9B0F, 0x7A83, 0x9B69, 0x9B81, 0x9BDD, 0x9BF1, 0x9BF4, 0x4C6D, 0x9C20, 0x376F, 0xEAA9, 0x9D49, 0x9C3A, /* Big5-HKSCS 0x9AA1 .. 0x9AFE */ 0x9EFE, 0x5650, 0x9D93, 0x9DBD, 0x9DC0, 0x9DFC, 0x94F6, 0x8FB6, 0x9E7B, 0x9EAC, 0x9EB1, 0x9EBD, 0x9EC6, 0x94DC, 0x9EE2, 0x9EF1, 0x9EF8, 0x7AC8, 0x9F44, 0xEABF, 0xEAC0, 0xEAC1, 0x691A, 0x94C3, 0x59AC, 0xEAC5, 0x5840, 0x94C1, 0x37B9, 0xEAC9, 0xEACA, 0xEACB, 0xEACC, 0x5757, 0x7173, 0xEACF, 0xEAD0, 0xEAD1, 0x546A, 0xEAD3, 0xEAD4, 0x549E, 0xEAD6, 0xEAD7, 0xEAD8, 0xEAD9, 0xEADA, 0x60E7, 0xEADC, 0x567A, 0xEADE, 0xEADF, 0xEAE0, 0xEAE1, 0xEAE2, 0xEAE3, 0x6955, 0x9C2F, 0x87A5, 0xEAE7, 0xEAE8, 0xEAE9, 0xEAEA, 0xEAEB, 0xEAEC, 0x5C20, 0xEAEE, 0x5E0B, 0xEAF0, 0xEAF1, 0xEAF2, 0x671E, 0xEAF4, 0xEAF5, 0xEAF6, 0x3647, 0xEAF8, 0xEAF9, 0xEAFA, 0xEAFB, 0x5364, 0x84AD, 0xEAFE, 0xEAFF, 0xEB00, 0x8B81, 0xEB02, 0xEB03, 0xEB04, 0xEB05, 0x4E78, 0x70BB, 0xEB08, 0xEB09, /* Big5-HKSCS 0x9B40 .. 0x9B7E */ 0xEB0A, 0xEB0B, 0xEB0C, 0xEB0D, 0xEB0E, 0xEB0F, 0x62C3, 0xEB11, 0xEB12, 0x7198, 0x6855, 0xEB15, 0x69E9, 0x36C8, 0xEB18, 0xEB19, 0xEB1A, 0xEB1B, 0xEB1C, 0xEB1D, 0x82FD, 0xEB1F, 0xEB20, 0xEB21, 0x89A5, 0xEB23, 0x8FA0, 0xEB25, 0x97B8, 0xEB27, 0x9847, 0x9ABD, 0xEB2A, 0xEB2B, 0xEB2C, 0xEB2D, 0xEB2E, 0xEB2F, 0xEB30, 0xEB31, 0xEB32, 0xEB33, 0xEB34, 0xEB35, 0xEB36, 0xEB37, 0xEB38, 0xEB39, 0x5FB1, 0x6648, 0x66BF, 0xEB3D, 0xEB3E, 0xEB3F, 0x7201, 0xEB41, 0x77D7, 0xEB43, 0xEB44, 0x7E87, 0xEB46, 0x58B5, 0x670E, /* Big5-HKSCS 0x9BA1 .. 0x9BFE */ 0x6918, 0xEB4A, 0xEB4B, 0xEB4C, 0xEB4D, 0xEB4E, 0xEB4F, 0xEB50, 0x48D0, 0x4AB8, 0xEB53, 0xEB54, 0xEB55, 0xEB56, 0xEB57, 0xEB58, 0xEB59, 0xEB5A, 0xEB5B, 0x51D2, 0xEB5D, 0x599F, 0xEB5F, 0x3BBE, 0xEB61, 0xEB62, 0xEB63, 0x5788, 0xEB65, 0x399B, 0xEB67, 0xEB68, 0xEB69, 0x3762, 0xEB6B, 0x8B5E, 0xEB6D, 0x99D6, 0xEB6F, 0xEB70, 0xEB71, 0x7209, 0xEB73, 0xEB74, 0x5965, 0xEB76, 0xEB77, 0xEB78, 0x8EDA, 0xEB7A, 0x528F, 0x573F, 0x7171, 0xEB7E, 0xEB7F, 0xEB80, 0xEB81, 0x55BC, 0xEB83, 0xEB84, 0xEB85, 0x91D4, 0x3473, 0xEB88, 0xEB89, 0xEB8A, 0x4718, 0xEB8C, 0xEB8D, 0xEB8E, 0xEB8F, 0xEB90, 0x5066, 0x34FB, 0xEB93, 0x60DE, 0xEB95, 0x477C, 0xEB97, 0xEB98, 0xEB99, 0xEB9A, 0xEB9B, 0x57A1, 0x7151, 0x6FB6, 0xEB9F, 0xEBA0, 0x9056, 0xEBA2, 0xEBA3, 0x8B62, 0xEBA5, 0xEBA6, /* Big5-HKSCS 0x9C40 .. 0x9C7E */ 0x5D5B, 0xEBA8, 0x8F36, 0xEBAA, 0xEBAB, 0x8AEA, 0xEBAD, 0xEBAE, 0xEBAF, 0xEBB0, 0x4BC0, 0xEBB2, 0xEBB3, 0xEBB4, 0x9465, 0xEBB6, 0x6195, 0x5A27, 0xEBB9, 0x4FBB, 0x56B9, 0xEBBC, 0xEBBD, 0x4E6A, 0xEBBF, 0x9656, 0x6D8F, 0xEBC2, 0x3618, 0x8977, 0xEBC5, 0xEBC6, 0xEBC7, 0xEBC8, 0x71DF, 0xEBCA, 0x7B42, 0xEBCC, 0xEBCD, 0xEBCE, 0x9104, 0xEBD0, 0x7A45, 0x9DF0, 0xEBD3, 0x9A26, 0xEBD5, 0x365F, 0xEBD7, 0xEBD8, 0x7983, 0xEBDA, 0xEBDB, 0x5D2C, 0xEBDD, 0x83CF, 0xEBDF, 0x46D0, 0xEBE1, 0x753B, 0x8865, 0xEBE4, 0x58B6, /* Big5-HKSCS 0x9CA1 .. 0x9CFE */ 0x371C, 0xEBE7, 0xEBE8, 0xEBE9, 0x3C54, 0xEBEB, 0xEBEC, 0x9281, 0xEBEE, 0xEBEF, 0x9330, 0xEBF1, 0xEBF2, 0x6C39, 0x949F, 0xEBF5, 0xEBF6, 0x8827, 0x88F5, 0xEBF9, 0xEBFA, 0xEBFB, 0x6EB8, 0xEBFD, 0xEBFE, 0x39A4, 0x36B9, 0x5C10, 0x79E3, 0x453F, 0x66B6, 0xEC05, 0xEC06, 0x8943, 0xEC08, 0xEC09, 0x56D6, 0x40DF, 0xEC0C, 0x39A1, 0xEC0E, 0xEC0F, 0xEC10, 0x71AD, 0x8366, 0xEC13, 0xEC14, 0x5A67, 0x4CB7, 0xEC17, 0xEC18, 0xEC19, 0xEC1A, 0xEC1B, 0xEC1C, 0xEC1D, 0x7B43, 0x797E, 0xEC20, 0x6FB5, 0xEC22, 0x6A03, 0xEC24, 0x53A2, 0xEC26, 0x93BF, 0x6836, 0x975D, 0xEC2A, 0xEC2B, 0xEC2C, 0xEC2D, 0xEC2E, 0xEC2F, 0x5D85, 0xEC31, 0xEC32, 0x5715, 0x9823, 0xEC35, 0x5DAB, 0xEC37, 0x65BE, 0x69D5, 0x53D2, 0xEC3B, 0xEC3C, 0x3C11, 0x6736, 0xEC3F, 0xEC40, 0xEC41, 0xEC42, 0xEC43, /* Big5-HKSCS 0x9D40 .. 0x9D7E */ 0xEC44, 0xEC45, 0xEC46, 0xEC47, 0xEC48, 0xEC49, 0x35CA, 0xEC4B, 0xEC4C, 0x48FA, 0x63E6, 0xEC4F, 0x7808, 0x9255, 0xEC52, 0x43F2, 0xEC54, 0x43DF, 0xEC56, 0xEC57, 0xEC58, 0x59F8, 0xEC5A, 0x8F0B, 0xEC5C, 0xEC5D, 0x7B51, 0xEC5F, 0xEC60, 0x3DF7, 0xEC62, 0xEC63, 0x8FD0, 0x728F, 0x568B, 0xEC67, 0xEC68, 0xEC69, 0xEC6A, 0xEC6B, 0xEC6C, 0xEC6D, 0xEC6E, 0xEC6F, 0xEC70, 0xEC71, 0xEC72, 0xEC73, 0x7E9F, 0xEC75, 0xEC76, 0x4CA4, 0x9547, 0xEC79, 0x71A2, 0xEC7B, 0x4D91, 0x9012, 0xEC7E, 0x4D9C, 0xEC80, 0x8FBE, 0x55C1, /* Big5-HKSCS 0x9DA1 .. 0x9DFE */ 0x8FBA, 0xEC84, 0x8FB9, 0xEC86, 0x4509, 0x7E7F, 0x6F56, 0x6AB1, 0x4EEA, 0x34E4, 0xEC8D, 0xEC8E, 0x373A, 0x8E80, 0xEC91, 0xEC92, 0xEC93, 0xEC94, 0xEC95, 0xEC96, 0x3DEB, 0xEC98, 0xEC99, 0xEC9A, 0xEC9B, 0x4E9A, 0xEC9D, 0xEC9E, 0x56BF, 0xECA0, 0x8E0E, 0x5B6D, 0xECA3, 0xECA4, 0x63DE, 0x62D0, 0xECA7, 0xECA8, 0x6530, 0x562D, 0xECAB, 0x541A, 0xECAD, 0x3DC6, 0xECAF, 0x4C7D, 0x5622, 0x561E, 0x7F49, 0xECB4, 0x5975, 0xECB6, 0x8770, 0x4E1C, 0xECB9, 0xECBA, 0xECBB, 0x8117, 0x9D5E, 0x8D18, 0x763B, 0x9C45, 0x764E, 0x77B9, 0x9345, 0x5432, 0x8148, 0x82F7, 0x5625, 0x8132, 0x8418, 0x80BD, 0x55EA, 0x7962, 0x5643, 0x5416, 0xECCF, 0x35CE, 0x5605, 0x55F1, 0x66F1, 0xECD4, 0x362D, 0x7534, 0x55F0, 0x55BA, 0x5497, 0x5572, 0xECDB, 0xECDC, 0x5ED0, 0xECDE, 0xECDF, 0xECE0, /* Big5-HKSCS 0x9E40 .. 0x9E7E */ 0xECE1, 0x9EAB, 0x7D5A, 0x55DE, 0xECE5, 0x629D, 0x976D, 0x5494, 0x8CCD, 0x71F6, 0x9176, 0x63FC, 0x63B9, 0x63FE, 0x5569, 0xECF0, 0x9C72, 0xECF2, 0x519A, 0x34DF, 0xECF5, 0x51A7, 0x544D, 0x551E, 0x5513, 0x7666, 0x8E2D, 0xECFC, 0x75B1, 0x80B6, 0x8804, 0x8786, 0x88C7, 0x81B6, 0x841C, 0xED04, 0x44EC, 0x7304, 0xED07, 0x5B90, 0x830B, 0xED0A, 0x567B, 0xED0C, 0xED0D, 0xED0E, 0xED0F, 0xED10, 0xED11, 0x9170, 0xED13, 0x9208, 0xED15, 0xED16, 0xED17, 0xED18, 0x7266, 0xED1A, 0x474E, 0xED1C, 0xED1D, 0xED1E, 0x40FA, /* Big5-HKSCS 0x9EA1 .. 0x9EFE */ 0x9C5D, 0x651F, 0xED22, 0x48F3, 0xED24, 0xED25, 0xED26, 0xED27, 0x6062, 0xED29, 0xED2A, 0xED2B, 0xED2C, 0xED2D, 0x71A3, 0x7E8E, 0x9D50, 0x4E1A, 0x4E04, 0x3577, 0x5B0D, 0x6CB2, 0x5367, 0x36AC, 0x39DC, 0x537D, 0x36A5, 0xED3B, 0x589A, 0xED3D, 0x822D, 0x544B, 0x57AA, 0xED41, 0xED42, 0xED43, 0x3A52, 0xED45, 0x7374, 0xED47, 0x4D09, 0x9BED, 0xED4A, 0xED4B, 0x4C5B, 0xED4D, 0xED4E, 0xED4F, 0x845C, 0xED51, 0xED52, 0xED53, 0xED54, 0x632E, 0x7D25, 0xED57, 0xED58, 0x3A2A, 0x9008, 0x52CC, 0x3E74, 0x367A, 0x45E9, 0xED5F, 0x7640, 0x5AF0, 0xED62, 0x787A, 0x47B6, 0x58A7, 0x40BF, 0x567C, 0x9B8B, 0x5D74, 0x7654, 0xED6B, 0x9E85, 0x4CE1, 0x75F9, 0x37FB, 0x6119, 0xED71, 0xED72, 0xED73, 0x565D, 0xED75, 0x57A7, 0xED77, 0xED78, 0x5234, 0xED7A, 0x35AD, 0x6C4A, 0x9D7C, /* Big5-HKSCS 0x9F40 .. 0x9F7E */ 0x7C56, 0x9B39, 0x57DE, 0xED81, 0x5C53, 0x64D3, 0xED84, 0xED85, 0xED86, 0x86AD, 0xED88, 0xED89, 0xED8A, 0xED8B, 0xED8C, 0x51FE, 0xED8E, 0x5D8E, 0x9703, 0xED91, 0x9E81, 0x904C, 0x7B1F, 0x9B02, 0x5CD1, 0x7BA3, 0x6268, 0x6335, 0x9AFF, 0x7BCF, 0x9B2A, 0x7C7E, 0x9B2E, 0x7C42, 0x7C86, 0x9C15, 0x7BFC, 0x9B09, 0x9F17, 0x9C1B, 0xEDA6, 0x9F5A, 0x5573, 0x5BC3, 0x4FFD, 0x9E98, 0x4FF2, 0x5260, 0x3E06, 0x52D1, 0x5767, 0x5056, 0x59B7, 0x5E12, 0x97C8, 0x9DAB, 0x8F5C, 0x5469, 0x97B4, 0x9940, 0x97BA, 0x532C, 0x6130, /* Big5-HKSCS 0x9FA1 .. 0x9FFE */ 0x692C, 0x53DA, 0x9C0A, 0x9D02, 0x4C3B, 0x9641, 0x6980, 0x50A6, 0x7546, 0xEDC6, 0x99DA, 0x5273, 0xEDC9, 0x9159, 0x9681, 0x915C, 0xEDCD, 0x9151, 0xEDCF, 0x637F, 0xEDD1, 0x6ACA, 0x5611, 0x918E, 0x757A, 0x6285, 0xEDD7, 0x734F, 0x7C70, 0xEDDA, 0xEDDB, 0xEDDC, 0xEDDD, 0x76D6, 0x9B9D, 0x4E2A, 0xEDE1, 0x83BE, 0x8842, 0xEDE4, 0x5C4A, 0x69C0, 0x50ED, 0x577A, 0x521F, 0x5DF5, 0x4ECE, 0x6C31, 0xEDED, 0x4F39, 0x549C, 0x54DA, 0x529A, 0x8D82, 0x35FE, 0x5F0C, 0x35F3, 0xEDF6, 0x6B52, 0x917C, 0x9FA5, 0x9B97, 0x982E, 0x98B4, 0x9ABA, 0x9EA8, 0x9E84, 0x717A, 0x7B14, 0xEE02, 0x6BFA, 0x8818, 0x7F78, 0xEE06, 0x5620, 0xEE08, 0x8E77, 0x9F53, 0xEE0B, 0x8DD4, 0x8E4F, 0x9E1C, 0x8E01, 0x6282, 0xEE11, 0x8E28, 0x8E75, 0x7AD3, 0xEE15, 0x7A3E, 0x78D8, 0x6CEA, 0x8A67, 0x7607, /* Big5-HKSCS 0xA040 .. 0xA07E */ 0xEE1B, 0x9F26, 0x6CCE, 0x87D6, 0x75C3, 0xEE20, 0x7853, 0xEE22, 0x8D0C, 0x72E2, 0x7371, 0x8B2D, 0x7302, 0x74F1, 0x8CEB, 0xEE2A, 0x862F, 0x5FBA, 0x88A0, 0x44B7, 0xEE2F, 0xEE30, 0xEE31, 0xEE32, 0x8A7E, 0xEE34, 0xEE35, 0x60FD, 0x7667, 0x9AD7, 0x9D44, 0x936E, 0x9B8F, 0x87F5, 0xEE3D, 0x880F, 0x8CF7, 0x732C, 0x9721, 0x9BB0, 0x35D6, 0x72B2, 0x4C07, 0x7C51, 0x994A, 0xEE48, 0x6159, 0x4C04, 0x9E96, 0x617D, 0xEE4D, 0x575F, 0x616F, 0x62A6, 0x6239, 0x62CE, 0x3A5C, 0x61E2, 0x53AA, 0xEE56, 0x6364, 0x6802, 0x35D2, /* Big5-HKSCS 0xA0A1 .. 0xA0FE */ 0x5D57, 0xEE5B, 0x8FDA, 0xEE5D, 0xEE5E, 0x50D9, 0xEE60, 0x7906, 0x5332, 0x9638, 0xEE64, 0x4065, 0xEE66, 0x77FE, 0xEE68, 0x7CC2, 0xEE6A, 0x7CDA, 0x7A2D, 0x8066, 0x8063, 0x7D4D, 0x7505, 0x74F2, 0x8994, 0x821A, 0x670C, 0x8062, 0xEE76, 0x805B, 0x74F0, 0x8103, 0x7724, 0x8989, 0xEE7C, 0x7553, 0xEE7E, 0x87A9, 0x87CE, 0x81C8, 0x878C, 0x8A49, 0x8CAD, 0x8B43, 0x772B, 0x74F8, 0x84DA, 0x3635, 0x69B2, 0x8DA6, 0xEE8C, 0x89A9, 0x7468, 0x6DB9, 0x87C1, 0xEE91, 0x74E7, 0x3DDB, 0x7176, 0x60A4, 0x619C, 0x3CD1, 0x7162, 0x6077, 0xEE9A, 0x7F71, 0xEE9C, 0x7250, 0x60E9, 0x4B7E, 0x5220, 0x3C18, 0xEEA2, 0xEEA3, 0xEEA4, 0xEEA5, 0xEEA6, 0xEEA7, 0xEEA8, 0xEEA9, 0xEEAA, 0x5CC1, 0xEEAC, 0xEEAD, 0xEEAE, 0xEEAF, 0xEEB0, 0xEEB1, 0x4562, 0x5B1F, 0xEEB4, 0x9F50, 0x9EA6, 0xEEB7, /* Big5-HKSCS 0xA140 .. 0xA17E */ 0x3000, 0xFF0C, 0x3001, 0x3002, 0xFF0E, 0x2027, 0xFF1B, 0xFF1A, 0xFF1F, 0xFF01, 0xFE30, 0x2026, 0x2025, 0xFE50, 0xFE51, 0xFE52, 0x00B7, 0xFE54, 0xFE55, 0xFE56, 0xFE57, 0xFF5C, 0x2013, 0xFE31, 0x2014, 0xFE33, 0x2574, 0xFE34, 0xFE4F, 0xFF08, 0xFF09, 0xFE35, 0xFE36, 0xFF5B, 0xFF5D, 0xFE37, 0xFE38, 0x3014, 0x3015, 0xFE39, 0xFE3A, 0x3010, 0x3011, 0xFE3B, 0xFE3C, 0x300A, 0x300B, 0xFE3D, 0xFE3E, 0x3008, 0x3009, 0xFE3F, 0xFE40, 0x300C, 0x300D, 0xFE41, 0xFE42, 0x300E, 0x300F, 0xFE43, 0xFE44, 0xFE59, 0xFE5A, /* Big5-HKSCS 0xA1A1 .. 0xA1FE */ 0xFE5B, 0xFE5C, 0xFE5D, 0xFE5E, 0x2018, 0x2019, 0x201C, 0x201D, 0x301D, 0x301E, 0x2035, 0x2032, 0xFF03, 0xFF06, 0xFF0A, 0x203B, 0x00A7, 0x3003, 0x25CB, 0x25CF, 0x25B3, 0x25B2, 0x25CE, 0x2606, 0x2605, 0x25C7, 0x25C6, 0x25A1, 0x25A0, 0x25BD, 0x25BC, 0x32A3, 0x2105, 0x00AF, 0xFFE3, 0xFF3F, 0x02CD, 0xFE49, 0xFE4A, 0xFE4D, 0xFE4E, 0xFE4B, 0xFE4C, 0xFE5F, 0xFE60, 0xFE61, 0xFF0B, 0xFF0D, 0x00D7, 0x00F7, 0x00B1, 0x221A, 0xFF1C, 0xFF1E, 0xFF1D, 0x2266, 0x2267, 0x2260, 0x221E, 0x2252, 0x2261, 0xFE62, 0xFE63, 0xFE64, 0xFE65, 0xFE66, 0xFF5E, 0x2229, 0x222A, 0x22A5, 0x2220, 0x221F, 0x22BF, 0x33D2, 0x33D1, 0x222B, 0x222E, 0x2235, 0x2234, 0x2640, 0x2642, 0x2295, 0x2299, 0x2191, 0x2193, 0x2190, 0x2192, 0x2196, 0x2197, 0x2199, 0x2198, 0x2225, 0x2223, 0xFF0F, /* Big5-HKSCS 0xA240 .. 0xA27E */ 0xFF3C, 0x2215, 0xFE68, 0xFF04, 0xFFE5, 0x3012, 0xFFE0, 0xFFE1, 0xFF05, 0xFF20, 0x2103, 0x2109, 0xFE69, 0xFE6A, 0xFE6B, 0x33D5, 0x339C, 0x339D, 0x339E, 0x33CE, 0x33A1, 0x338E, 0x338F, 0x33C4, 0x00B0, 0x5159, 0x515B, 0x515E, 0x515D, 0x5161, 0x5163, 0x55E7, 0x74E9, 0x7CCE, 0x2581, 0x2582, 0x2583, 0x2584, 0x2585, 0x2586, 0x2587, 0x2588, 0x258F, 0x258E, 0x258D, 0x258C, 0x258B, 0x258A, 0x2589, 0x253C, 0x2534, 0x252C, 0x2524, 0x251C, 0x2594, 0x2500, 0x2502, 0x2595, 0x250C, 0x2510, 0x2514, 0x2518, 0x256D, /* Big5-HKSCS 0xA2A1 .. 0xA2FE */ 0x256E, 0x2570, 0x256F, 0x2550, 0x255E, 0x256A, 0x2561, 0x25E2, 0x25E3, 0x25E5, 0x25E4, 0x2571, 0x2572, 0x2573, 0xFF10, 0xFF11, 0xFF12, 0xFF13, 0xFF14, 0xFF15, 0xFF16, 0xFF17, 0xFF18, 0xFF19, 0x2160, 0x2161, 0x2162, 0x2163, 0x2164, 0x2165, 0x2166, 0x2167, 0x2168, 0x2169, 0x3021, 0x3022, 0x3023, 0x3024, 0x3025, 0x3026, 0x3027, 0x3028, 0x3029, 0x5341, 0x5344, 0x5345, 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, 0xFF41, 0xFF42, 0xFF43, 0xFF44, 0xFF45, 0xFF46, 0xFF47, 0xFF48, 0xFF49, 0xFF4A, 0xFF4B, 0xFF4C, 0xFF4D, 0xFF4E, 0xFF4F, 0xFF50, 0xFF51, 0xFF52, 0xFF53, 0xFF54, 0xFF55, 0xFF56, /* Big5-HKSCS 0xA340 .. 0xA37E */ 0xFF57, 0xFF58, 0xFF59, 0xFF5A, 0x0391, 0x0392, 0x0393, 0x0394, 0x0395, 0x0396, 0x0397, 0x0398, 0x0399, 0x039A, 0x039B, 0x039C, 0x039D, 0x039E, 0x039F, 0x03A0, 0x03A1, 0x03A3, 0x03A4, 0x03A5, 0x03A6, 0x03A7, 0x03A8, 0x03A9, 0x03B1, 0x03B2, 0x03B3, 0x03B4, 0x03B5, 0x03B6, 0x03B7, 0x03B8, 0x03B9, 0x03BA, 0x03BB, 0x03BC, 0x03BD, 0x03BE, 0x03BF, 0x03C0, 0x03C1, 0x03C3, 0x03C4, 0x03C5, 0x03C6, 0x03C7, 0x03C8, 0x03C9, 0x3105, 0x3106, 0x3107, 0x3108, 0x3109, 0x310A, 0x310B, 0x310C, 0x310D, 0x310E, 0x310F, /* Big5-HKSCS 0xA3A1 .. 0xA3FE */ 0x3110, 0x3111, 0x3112, 0x3113, 0x3114, 0x3115, 0x3116, 0x3117, 0x3118, 0x3119, 0x311A, 0x311B, 0x311C, 0x311D, 0x311E, 0x311F, 0x3120, 0x3121, 0x3122, 0x3123, 0x3124, 0x3125, 0x3126, 0x3127, 0x3128, 0x3129, 0x02D9, 0x02C9, 0x02CA, 0x02C7, 0x02CB, 0xFFFD, 0xFFFD, 0xFFFD, 0xFFFD, 0xFFFD, 0xFFFD, 0xFFFD, 0xFFFD, 0xFFFD, 0xFFFD, 0xFFFD, 0xFFFD, 0xFFFD, 0xFFFD, 0xFFFD, 0xFFFD, 0xFFFD, 0xFFFD, 0xFFFD, 0xFFFD, 0xFFFD, 0xFFFD, 0xFFFD, 0xFFFD, 0xFFFD, 0xFFFD, 0xFFFD, 0xFFFD, 0xFFFD, 0xFFFD, 0xFFFD, 0xFFFD, 0xFFFD, 0x20AC, 0xFFFD, 0xFFFD, 0xFFFD, 0xFFFD, 0xFFFD, 0xFFFD, 0xFFFD, 0xFFFD, 0xFFFD, 0xFFFD, 0xFFFD, 0xFFFD, 0xFFFD, 0xFFFD, 0xFFFD, 0xFFFD, 0xFFFD, 0xFFFD, 0xFFFD, 0xFFFD, 0xFFFD, 0xFFFD, 0xFFFD, 0xFFFD, 0xFFFD, 0xFFFD, 0xFFFD, 0xFFFD, 0xFFFD, /* Big5-HKSCS 0xA440 .. 0xA47E */ 0x4E00, 0x4E59, 0x4E01, 0x4E03, 0x4E43, 0x4E5D, 0x4E86, 0x4E8C, 0x4EBA, 0x513F, 0x5165, 0x516B, 0x51E0, 0x5200, 0x5201, 0x529B, 0x5315, 0x5341, 0x535C, 0x53C8, 0x4E09, 0x4E0B, 0x4E08, 0x4E0A, 0x4E2B, 0x4E38, 0x51E1, 0x4E45, 0x4E48, 0x4E5F, 0x4E5E, 0x4E8E, 0x4EA1, 0x5140, 0x5203, 0x52FA, 0x5343, 0x53C9, 0x53E3, 0x571F, 0x58EB, 0x5915, 0x5927, 0x5973, 0x5B50, 0x5B51, 0x5B53, 0x5BF8, 0x5C0F, 0x5C22, 0x5C38, 0x5C71, 0x5DDD, 0x5DE5, 0x5DF1, 0x5DF2, 0x5DF3, 0x5DFE, 0x5E72, 0x5EFE, 0x5F0B, 0x5F13, 0x624D, /* Big5-HKSCS 0xA4A1 .. 0xA4FE */ 0x4E11, 0x4E10, 0x4E0D, 0x4E2D, 0x4E30, 0x4E39, 0x4E4B, 0x5C39, 0x4E88, 0x4E91, 0x4E95, 0x4E92, 0x4E94, 0x4EA2, 0x4EC1, 0x4EC0, 0x4EC3, 0x4EC6, 0x4EC7, 0x4ECD, 0x4ECA, 0x4ECB, 0x4EC4, 0x5143, 0x5141, 0x5167, 0x516D, 0x516E, 0x516C, 0x5197, 0x51F6, 0x5206, 0x5207, 0x5208, 0x52FB, 0x52FE, 0x52FF, 0x5316, 0x5339, 0x5348, 0x5347, 0x5345, 0x535E, 0x5384, 0x53CB, 0x53CA, 0x53CD, 0x58EC, 0x5929, 0x592B, 0x592A, 0x592D, 0x5B54, 0x5C11, 0x5C24, 0x5C3A, 0x5C6F, 0x5DF4, 0x5E7B, 0x5EFF, 0x5F14, 0x5F15, 0x5FC3, 0x6208, 0x6236, 0x624B, 0x624E, 0x652F, 0x6587, 0x6597, 0x65A4, 0x65B9, 0x65E5, 0x66F0, 0x6708, 0x6728, 0x6B20, 0x6B62, 0x6B79, 0x6BCB, 0x6BD4, 0x6BDB, 0x6C0F, 0x6C34, 0x706B, 0x722A, 0x7236, 0x723B, 0x7247, 0x7259, 0x725B, 0x72AC, 0x738B, 0x4E19, /* Big5-HKSCS 0xA540 .. 0xA57E */ 0x4E16, 0x4E15, 0x4E14, 0x4E18, 0x4E3B, 0x4E4D, 0x4E4F, 0x4E4E, 0x4EE5, 0x4ED8, 0x4ED4, 0x4ED5, 0x4ED6, 0x4ED7, 0x4EE3, 0x4EE4, 0x4ED9, 0x4EDE, 0x5145, 0x5144, 0x5189, 0x518A, 0x51AC, 0x51F9, 0x51FA, 0x51F8, 0x520A, 0x52A0, 0x529F, 0x5305, 0x5306, 0x5317, 0x531D, 0x4EDF, 0x534A, 0x5349, 0x5361, 0x5360, 0x536F, 0x536E, 0x53BB, 0x53EF, 0x53E4, 0x53F3, 0x53EC, 0x53EE, 0x53E9, 0x53E8, 0x53FC, 0x53F8, 0x53F5, 0x53EB, 0x53E6, 0x53EA, 0x53F2, 0x53F1, 0x53F0, 0x53E5, 0x53ED, 0x53FB, 0x56DB, 0x56DA, 0x5916, /* Big5-HKSCS 0xA5A1 .. 0xA5FE */ 0x592E, 0x5931, 0x5974, 0x5976, 0x5B55, 0x5B83, 0x5C3C, 0x5DE8, 0x5DE7, 0x5DE6, 0x5E02, 0x5E03, 0x5E73, 0x5E7C, 0x5F01, 0x5F18, 0x5F17, 0x5FC5, 0x620A, 0x6253, 0x6254, 0x6252, 0x6251, 0x65A5, 0x65E6, 0x672E, 0x672C, 0x672A, 0x672B, 0x672D, 0x6B63, 0x6BCD, 0x6C11, 0x6C10, 0x6C38, 0x6C41, 0x6C40, 0x6C3E, 0x72AF, 0x7384, 0x7389, 0x74DC, 0x74E6, 0x7518, 0x751F, 0x7528, 0x7529, 0x7530, 0x7531, 0x7532, 0x7533, 0x758B, 0x767D, 0x76AE, 0x76BF, 0x76EE, 0x77DB, 0x77E2, 0x77F3, 0x793A, 0x79BE, 0x7A74, 0x7ACB, 0x4E1E, 0x4E1F, 0x4E52, 0x4E53, 0x4E69, 0x4E99, 0x4EA4, 0x4EA6, 0x4EA5, 0x4EFF, 0x4F09, 0x4F19, 0x4F0A, 0x4F15, 0x4F0D, 0x4F10, 0x4F11, 0x4F0F, 0x4EF2, 0x4EF6, 0x4EFB, 0x4EF0, 0x4EF3, 0x4EFD, 0x4F01, 0x4F0B, 0x5149, 0x5147, 0x5146, 0x5148, 0x5168, /* Big5-HKSCS 0xA640 .. 0xA67E */ 0x5171, 0x518D, 0x51B0, 0x5217, 0x5211, 0x5212, 0x520E, 0x5216, 0x52A3, 0x5308, 0x5321, 0x5320, 0x5370, 0x5371, 0x5409, 0x540F, 0x540C, 0x540A, 0x5410, 0x5401, 0x540B, 0x5404, 0x5411, 0x540D, 0x5408, 0x5403, 0x540E, 0x5406, 0x5412, 0x56E0, 0x56DE, 0x56DD, 0x5733, 0x5730, 0x5728, 0x572D, 0x572C, 0x572F, 0x5729, 0x5919, 0x591A, 0x5937, 0x5938, 0x5984, 0x5978, 0x5983, 0x597D, 0x5979, 0x5982, 0x5981, 0x5B57, 0x5B58, 0x5B87, 0x5B88, 0x5B85, 0x5B89, 0x5BFA, 0x5C16, 0x5C79, 0x5DDE, 0x5E06, 0x5E76, 0x5E74, /* Big5-HKSCS 0xA6A1 .. 0xA6FE */ 0x5F0F, 0x5F1B, 0x5FD9, 0x5FD6, 0x620E, 0x620C, 0x620D, 0x6210, 0x6263, 0x625B, 0x6258, 0x6536, 0x65E9, 0x65E8, 0x65EC, 0x65ED, 0x66F2, 0x66F3, 0x6709, 0x673D, 0x6734, 0x6731, 0x6735, 0x6B21, 0x6B64, 0x6B7B, 0x6C16, 0x6C5D, 0x6C57, 0x6C59, 0x6C5F, 0x6C60, 0x6C50, 0x6C55, 0x6C61, 0x6C5B, 0x6C4D, 0x6C4E, 0x7070, 0x725F, 0x725D, 0x767E, 0x7AF9, 0x7C73, 0x7CF8, 0x7F36, 0x7F8A, 0x7FBD, 0x8001, 0x8003, 0x800C, 0x8012, 0x8033, 0x807F, 0x8089, 0x808B, 0x808C, 0x81E3, 0x81EA, 0x81F3, 0x81FC, 0x820C, 0x821B, 0x821F, 0x826E, 0x8272, 0x827E, 0x866B, 0x8840, 0x884C, 0x8863, 0x897F, 0x9621, 0x4E32, 0x4EA8, 0x4F4D, 0x4F4F, 0x4F47, 0x4F57, 0x4F5E, 0x4F34, 0x4F5B, 0x4F55, 0x4F30, 0x4F50, 0x4F51, 0x4F3D, 0x4F3A, 0x4F38, 0x4F43, 0x4F54, 0x4F3C, 0x4F46, 0x4F63, /* Big5-HKSCS 0xA740 .. 0xA77E */ 0x4F5C, 0x4F60, 0x4F2F, 0x4F4E, 0x4F36, 0x4F59, 0x4F5D, 0x4F48, 0x4F5A, 0x514C, 0x514B, 0x514D, 0x5175, 0x51B6, 0x51B7, 0x5225, 0x5224, 0x5229, 0x522A, 0x5228, 0x52AB, 0x52A9, 0x52AA, 0x52AC, 0x5323, 0x5373, 0x5375, 0x541D, 0x542D, 0x541E, 0x543E, 0x5426, 0x544E, 0x5427, 0x5446, 0x5443, 0x5433, 0x5448, 0x5442, 0x541B, 0x5429, 0x544A, 0x5439, 0x543B, 0x5438, 0x542E, 0x5435, 0x5436, 0x5420, 0x543C, 0x5440, 0x5431, 0x542B, 0x541F, 0x542C, 0x56EA, 0x56F0, 0x56E4, 0x56EB, 0x574A, 0x5751, 0x5740, 0x574D, /* Big5-HKSCS 0xA7A1 .. 0xA7FE */ 0x5747, 0x574E, 0x573E, 0x5750, 0x574F, 0x573B, 0x58EF, 0x593E, 0x599D, 0x5992, 0x59A8, 0x599E, 0x59A3, 0x5999, 0x5996, 0x598D, 0x59A4, 0x5993, 0x598A, 0x59A5, 0x5B5D, 0x5B5C, 0x5B5A, 0x5B5B, 0x5B8C, 0x5B8B, 0x5B8F, 0x5C2C, 0x5C40, 0x5C41, 0x5C3F, 0x5C3E, 0x5C90, 0x5C91, 0x5C94, 0x5C8C, 0x5DEB, 0x5E0C, 0x5E8F, 0x5E87, 0x5E8A, 0x5EF7, 0x5F04, 0x5F1F, 0x5F64, 0x5F62, 0x5F77, 0x5F79, 0x5FD8, 0x5FCC, 0x5FD7, 0x5FCD, 0x5FF1, 0x5FEB, 0x5FF8, 0x5FEA, 0x6212, 0x6211, 0x6284, 0x6297, 0x6296, 0x6280, 0x6276, 0x6289, 0x626D, 0x628A, 0x627C, 0x627E, 0x6279, 0x6273, 0x6292, 0x626F, 0x6298, 0x626E, 0x6295, 0x6293, 0x6291, 0x6286, 0x6539, 0x653B, 0x6538, 0x65F1, 0x66F4, 0x675F, 0x674E, 0x674F, 0x6750, 0x6751, 0x675C, 0x6756, 0x675E, 0x6749, 0x6746, 0x6760, /* Big5-HKSCS 0xA840 .. 0xA87E */ 0x6753, 0x6757, 0x6B65, 0x6BCF, 0x6C42, 0x6C5E, 0x6C99, 0x6C81, 0x6C88, 0x6C89, 0x6C85, 0x6C9B, 0x6C6A, 0x6C7A, 0x6C90, 0x6C70, 0x6C8C, 0x6C68, 0x6C96, 0x6C92, 0x6C7D, 0x6C83, 0x6C72, 0x6C7E, 0x6C74, 0x6C86, 0x6C76, 0x6C8D, 0x6C94, 0x6C98, 0x6C82, 0x7076, 0x707C, 0x707D, 0x7078, 0x7262, 0x7261, 0x7260, 0x72C4, 0x72C2, 0x7396, 0x752C, 0x752B, 0x7537, 0x7538, 0x7682, 0x76EF, 0x77E3, 0x79C1, 0x79C0, 0x79BF, 0x7A76, 0x7CFB, 0x7F55, 0x8096, 0x8093, 0x809D, 0x8098, 0x809B, 0x809A, 0x80B2, 0x826F, 0x8292, /* Big5-HKSCS 0xA8A1 .. 0xA8FE */ 0x828B, 0x828D, 0x898B, 0x89D2, 0x8A00, 0x8C37, 0x8C46, 0x8C55, 0x8C9D, 0x8D64, 0x8D70, 0x8DB3, 0x8EAB, 0x8ECA, 0x8F9B, 0x8FB0, 0x8FC2, 0x8FC6, 0x8FC5, 0x8FC4, 0x5DE1, 0x9091, 0x90A2, 0x90AA, 0x90A6, 0x90A3, 0x9149, 0x91C6, 0x91CC, 0x9632, 0x962E, 0x9631, 0x962A, 0x962C, 0x4E26, 0x4E56, 0x4E73, 0x4E8B, 0x4E9B, 0x4E9E, 0x4EAB, 0x4EAC, 0x4F6F, 0x4F9D, 0x4F8D, 0x4F73, 0x4F7F, 0x4F6C, 0x4F9B, 0x4F8B, 0x4F86, 0x4F83, 0x4F70, 0x4F75, 0x4F88, 0x4F69, 0x4F7B, 0x4F96, 0x4F7E, 0x4F8F, 0x4F91, 0x4F7A, 0x5154, 0x5152, 0x5155, 0x5169, 0x5177, 0x5176, 0x5178, 0x51BD, 0x51FD, 0x523B, 0x5238, 0x5237, 0x523A, 0x5230, 0x522E, 0x5236, 0x5241, 0x52BE, 0x52BB, 0x5352, 0x5354, 0x5353, 0x5351, 0x5366, 0x5377, 0x5378, 0x5379, 0x53D6, 0x53D4, 0x53D7, 0x5473, 0x5475, /* Big5-HKSCS 0xA940 .. 0xA97E */ 0x5496, 0x5478, 0x5495, 0x5480, 0x547B, 0x5477, 0x5484, 0x5492, 0x5486, 0x547C, 0x5490, 0x5471, 0x5476, 0x548C, 0x549A, 0x5462, 0x5468, 0x548B, 0x547D, 0x548E, 0x56FA, 0x5783, 0x5777, 0x576A, 0x5769, 0x5761, 0x5766, 0x5764, 0x577C, 0x591C, 0x5949, 0x5947, 0x5948, 0x5944, 0x5954, 0x59BE, 0x59BB, 0x59D4, 0x59B9, 0x59AE, 0x59D1, 0x59C6, 0x59D0, 0x59CD, 0x59CB, 0x59D3, 0x59CA, 0x59AF, 0x59B3, 0x59D2, 0x59C5, 0x5B5F, 0x5B64, 0x5B63, 0x5B97, 0x5B9A, 0x5B98, 0x5B9C, 0x5B99, 0x5B9B, 0x5C1A, 0x5C48, 0x5C45, /* Big5-HKSCS 0xA9A1 .. 0xA9FE */ 0x5C46, 0x5CB7, 0x5CA1, 0x5CB8, 0x5CA9, 0x5CAB, 0x5CB1, 0x5CB3, 0x5E18, 0x5E1A, 0x5E16, 0x5E15, 0x5E1B, 0x5E11, 0x5E78, 0x5E9A, 0x5E97, 0x5E9C, 0x5E95, 0x5E96, 0x5EF6, 0x5F26, 0x5F27, 0x5F29, 0x5F80, 0x5F81, 0x5F7F, 0x5F7C, 0x5FDD, 0x5FE0, 0x5FFD, 0x5FF5, 0x5FFF, 0x600F, 0x6014, 0x602F, 0x6035, 0x6016, 0x602A, 0x6015, 0x6021, 0x6027, 0x6029, 0x602B, 0x601B, 0x6216, 0x6215, 0x623F, 0x623E, 0x6240, 0x627F, 0x62C9, 0x62CC, 0x62C4, 0x62BF, 0x62C2, 0x62B9, 0x62D2, 0x62DB, 0x62AB, 0x62D3, 0x62D4, 0x62CB, 0x62C8, 0x62A8, 0x62BD, 0x62BC, 0x62D0, 0x62D9, 0x62C7, 0x62CD, 0x62B5, 0x62DA, 0x62B1, 0x62D8, 0x62D6, 0x62D7, 0x62C6, 0x62AC, 0x62CE, 0x653E, 0x65A7, 0x65BC, 0x65FA, 0x6614, 0x6613, 0x660C, 0x6606, 0x6602, 0x660E, 0x6600, 0x660F, 0x6615, 0x660A, /* Big5-HKSCS 0xAA40 .. 0xAA7E */ 0x6607, 0x670D, 0x670B, 0x676D, 0x678B, 0x6795, 0x6771, 0x679C, 0x6773, 0x6777, 0x6787, 0x679D, 0x6797, 0x676F, 0x6770, 0x677F, 0x6789, 0x677E, 0x6790, 0x6775, 0x679A, 0x6793, 0x677C, 0x676A, 0x6772, 0x6B23, 0x6B66, 0x6B67, 0x6B7F, 0x6C13, 0x6C1B, 0x6CE3, 0x6CE8, 0x6CF3, 0x6CB1, 0x6CCC, 0x6CE5, 0x6CB3, 0x6CBD, 0x6CBE, 0x6CBC, 0x6CE2, 0x6CAB, 0x6CD5, 0x6CD3, 0x6CB8, 0x6CC4, 0x6CB9, 0x6CC1, 0x6CAE, 0x6CD7, 0x6CC5, 0x6CF1, 0x6CBF, 0x6CBB, 0x6CE1, 0x6CDB, 0x6CCA, 0x6CAC, 0x6CEF, 0x6CDC, 0x6CD6, 0x6CE0, /* Big5-HKSCS 0xAAA1 .. 0xAAFE */ 0x7095, 0x708E, 0x7092, 0x708A, 0x7099, 0x722C, 0x722D, 0x7238, 0x7248, 0x7267, 0x7269, 0x72C0, 0x72CE, 0x72D9, 0x72D7, 0x72D0, 0x73A9, 0x73A8, 0x739F, 0x73AB, 0x73A5, 0x753D, 0x759D, 0x7599, 0x759A, 0x7684, 0x76C2, 0x76F2, 0x76F4, 0x77E5, 0x77FD, 0x793E, 0x7940, 0x7941, 0x79C9, 0x79C8, 0x7A7A, 0x7A79, 0x7AFA, 0x7CFE, 0x7F54, 0x7F8C, 0x7F8B, 0x8005, 0x80BA, 0x80A5, 0x80A2, 0x80B1, 0x80A1, 0x80AB, 0x80A9, 0x80B4, 0x80AA, 0x80AF, 0x81E5, 0x81FE, 0x820D, 0x82B3, 0x829D, 0x8299, 0x82AD, 0x82BD, 0x829F, 0x82B9, 0x82B1, 0x82AC, 0x82A5, 0x82AF, 0x82B8, 0x82A3, 0x82B0, 0x82BE, 0x82B7, 0x864E, 0x8671, 0x521D, 0x8868, 0x8ECB, 0x8FCE, 0x8FD4, 0x8FD1, 0x90B5, 0x90B8, 0x90B1, 0x90B6, 0x91C7, 0x91D1, 0x9577, 0x9580, 0x961C, 0x9640, 0x963F, 0x963B, 0x9644, /* Big5-HKSCS 0xAB40 .. 0xAB7E */ 0x9642, 0x96B9, 0x96E8, 0x9752, 0x975E, 0x4E9F, 0x4EAD, 0x4EAE, 0x4FE1, 0x4FB5, 0x4FAF, 0x4FBF, 0x4FE0, 0x4FD1, 0x4FCF, 0x4FDD, 0x4FC3, 0x4FB6, 0x4FD8, 0x4FDF, 0x4FCA, 0x4FD7, 0x4FAE, 0x4FD0, 0x4FC4, 0x4FC2, 0x4FDA, 0x4FCE, 0x4FDE, 0x4FB7, 0x5157, 0x5192, 0x5191, 0x51A0, 0x524E, 0x5243, 0x524A, 0x524D, 0x524C, 0x524B, 0x5247, 0x52C7, 0x52C9, 0x52C3, 0x52C1, 0x530D, 0x5357, 0x537B, 0x539A, 0x53DB, 0x54AC, 0x54C0, 0x54A8, 0x54CE, 0x54C9, 0x54B8, 0x54A6, 0x54B3, 0x54C7, 0x54C2, 0x54BD, 0x54AA, 0x54C1, /* Big5-HKSCS 0xABA1 .. 0xABFE */ 0x54C4, 0x54C8, 0x54AF, 0x54AB, 0x54B1, 0x54BB, 0x54A9, 0x54A7, 0x54BF, 0x56FF, 0x5782, 0x578B, 0x57A0, 0x57A3, 0x57A2, 0x57CE, 0x57AE, 0x5793, 0x5955, 0x5951, 0x594F, 0x594E, 0x5950, 0x59DC, 0x59D8, 0x59FF, 0x59E3, 0x59E8, 0x5A03, 0x59E5, 0x59EA, 0x59DA, 0x59E6, 0x5A01, 0x59FB, 0x5B69, 0x5BA3, 0x5BA6, 0x5BA4, 0x5BA2, 0x5BA5, 0x5C01, 0x5C4E, 0x5C4F, 0x5C4D, 0x5C4B, 0x5CD9, 0x5CD2, 0x5DF7, 0x5E1D, 0x5E25, 0x5E1F, 0x5E7D, 0x5EA0, 0x5EA6, 0x5EFA, 0x5F08, 0x5F2D, 0x5F65, 0x5F88, 0x5F85, 0x5F8A, 0x5F8B, 0x5F87, 0x5F8C, 0x5F89, 0x6012, 0x601D, 0x6020, 0x6025, 0x600E, 0x6028, 0x604D, 0x6070, 0x6068, 0x6062, 0x6046, 0x6043, 0x606C, 0x606B, 0x606A, 0x6064, 0x6241, 0x62DC, 0x6316, 0x6309, 0x62FC, 0x62ED, 0x6301, 0x62EE, 0x62FD, 0x6307, 0x62F1, 0x62F7, /* Big5-HKSCS 0xAC40 .. 0xAC7E */ 0x62EF, 0x62EC, 0x62FE, 0x62F4, 0x6311, 0x6302, 0x653F, 0x6545, 0x65AB, 0x65BD, 0x65E2, 0x6625, 0x662D, 0x6620, 0x6627, 0x662F, 0x661F, 0x6628, 0x6631, 0x6624, 0x66F7, 0x67FF, 0x67D3, 0x67F1, 0x67D4, 0x67D0, 0x67EC, 0x67B6, 0x67AF, 0x67F5, 0x67E9, 0x67EF, 0x67C4, 0x67D1, 0x67B4, 0x67DA, 0x67E5, 0x67B8, 0x67CF, 0x67DE, 0x67F3, 0x67B0, 0x67D9, 0x67E2, 0x67DD, 0x67D2, 0x6B6A, 0x6B83, 0x6B86, 0x6BB5, 0x6BD2, 0x6BD7, 0x6C1F, 0x6CC9, 0x6D0B, 0x6D32, 0x6D2A, 0x6D41, 0x6D25, 0x6D0C, 0x6D31, 0x6D1E, 0x6D17, /* Big5-HKSCS 0xACA1 .. 0xACFE */ 0x6D3B, 0x6D3D, 0x6D3E, 0x6D36, 0x6D1B, 0x6CF5, 0x6D39, 0x6D27, 0x6D38, 0x6D29, 0x6D2E, 0x6D35, 0x6D0E, 0x6D2B, 0x70AB, 0x70BA, 0x70B3, 0x70AC, 0x70AF, 0x70AD, 0x70B8, 0x70AE, 0x70A4, 0x7230, 0x7272, 0x726F, 0x7274, 0x72E9, 0x72E0, 0x72E1, 0x73B7, 0x73CA, 0x73BB, 0x73B2, 0x73CD, 0x73C0, 0x73B3, 0x751A, 0x752D, 0x754F, 0x754C, 0x754E, 0x754B, 0x75AB, 0x75A4, 0x75A5, 0x75A2, 0x75A3, 0x7678, 0x7686, 0x7687, 0x7688, 0x76C8, 0x76C6, 0x76C3, 0x76C5, 0x7701, 0x76F9, 0x76F8, 0x7709, 0x770B, 0x76FE, 0x76FC, 0x7707, 0x77DC, 0x7802, 0x7814, 0x780C, 0x780D, 0x7946, 0x7949, 0x7948, 0x7947, 0x79B9, 0x79BA, 0x79D1, 0x79D2, 0x79CB, 0x7A7F, 0x7A81, 0x7AFF, 0x7AFD, 0x7C7D, 0x7D02, 0x7D05, 0x7D00, 0x7D09, 0x7D07, 0x7D04, 0x7D06, 0x7F38, 0x7F8E, 0x7FBF, 0x8004, /* Big5-HKSCS 0xAD40 .. 0xAD7E */ 0x8010, 0x800D, 0x8011, 0x8036, 0x80D6, 0x80E5, 0x80DA, 0x80C3, 0x80C4, 0x80CC, 0x80E1, 0x80DB, 0x80CE, 0x80DE, 0x80E4, 0x80DD, 0x81F4, 0x8222, 0x82E7, 0x8303, 0x8305, 0x82E3, 0x82DB, 0x82E6, 0x8304, 0x82E5, 0x8302, 0x8309, 0x82D2, 0x82D7, 0x82F1, 0x8301, 0x82DC, 0x82D4, 0x82D1, 0x82DE, 0x82D3, 0x82DF, 0x82EF, 0x8306, 0x8650, 0x8679, 0x867B, 0x867A, 0x884D, 0x886B, 0x8981, 0x89D4, 0x8A08, 0x8A02, 0x8A03, 0x8C9E, 0x8CA0, 0x8D74, 0x8D73, 0x8DB4, 0x8ECD, 0x8ECC, 0x8FF0, 0x8FE6, 0x8FE2, 0x8FEA, 0x8FE5, /* Big5-HKSCS 0xADA1 .. 0xADFE */ 0x8FED, 0x8FEB, 0x8FE4, 0x8FE8, 0x90CA, 0x90CE, 0x90C1, 0x90C3, 0x914B, 0x914A, 0x91CD, 0x9582, 0x9650, 0x964B, 0x964C, 0x964D, 0x9762, 0x9769, 0x97CB, 0x97ED, 0x97F3, 0x9801, 0x98A8, 0x98DB, 0x98DF, 0x9996, 0x9999, 0x4E58, 0x4EB3, 0x500C, 0x500D, 0x5023, 0x4FEF, 0x5026, 0x5025, 0x4FF8, 0x5029, 0x5016, 0x5006, 0x503C, 0x501F, 0x501A, 0x5012, 0x5011, 0x4FFA, 0x5000, 0x5014, 0x5028, 0x4FF1, 0x5021, 0x500B, 0x5019, 0x5018, 0x4FF3, 0x4FEE, 0x502D, 0x502A, 0x4FFE, 0x502B, 0x5009, 0x517C, 0x51A4, 0x51A5, 0x51A2, 0x51CD, 0x51CC, 0x51C6, 0x51CB, 0x5256, 0x525C, 0x5254, 0x525B, 0x525D, 0x532A, 0x537F, 0x539F, 0x539D, 0x53DF, 0x54E8, 0x5510, 0x5501, 0x5537, 0x54FC, 0x54E5, 0x54F2, 0x5506, 0x54FA, 0x5514, 0x54E9, 0x54ED, 0x54E1, 0x5509, 0x54EE, 0x54EA, /* Big5-HKSCS 0xAE40 .. 0xAE7E */ 0x54E6, 0x5527, 0x5507, 0x54FD, 0x550F, 0x5703, 0x5704, 0x57C2, 0x57D4, 0x57CB, 0x57C3, 0x5809, 0x590F, 0x5957, 0x5958, 0x595A, 0x5A11, 0x5A18, 0x5A1C, 0x5A1F, 0x5A1B, 0x5A13, 0x59EC, 0x5A20, 0x5A23, 0x5A29, 0x5A25, 0x5A0C, 0x5A09, 0x5B6B, 0x5C58, 0x5BB0, 0x5BB3, 0x5BB6, 0x5BB4, 0x5BAE, 0x5BB5, 0x5BB9, 0x5BB8, 0x5C04, 0x5C51, 0x5C55, 0x5C50, 0x5CED, 0x5CFD, 0x5CFB, 0x5CEA, 0x5CE8, 0x5CF0, 0x5CF6, 0x5D01, 0x5CF4, 0x5DEE, 0x5E2D, 0x5E2B, 0x5EAB, 0x5EAD, 0x5EA7, 0x5F31, 0x5F92, 0x5F91, 0x5F90, 0x6059, /* Big5-HKSCS 0xAEA1 .. 0xAEFE */ 0x6063, 0x6065, 0x6050, 0x6055, 0x606D, 0x6069, 0x606F, 0x6084, 0x609F, 0x609A, 0x608D, 0x6094, 0x608C, 0x6085, 0x6096, 0x6247, 0x62F3, 0x6308, 0x62FF, 0x634E, 0x633E, 0x632F, 0x6355, 0x6342, 0x6346, 0x634F, 0x6349, 0x633A, 0x6350, 0x633D, 0x632A, 0x632B, 0x6328, 0x634D, 0x634C, 0x6548, 0x6549, 0x6599, 0x65C1, 0x65C5, 0x6642, 0x6649, 0x664F, 0x6643, 0x6652, 0x664C, 0x6645, 0x6641, 0x66F8, 0x6714, 0x6715, 0x6717, 0x6821, 0x6838, 0x6848, 0x6846, 0x6853, 0x6839, 0x6842, 0x6854, 0x6829, 0x68B3, 0x6817, 0x684C, 0x6851, 0x683D, 0x67F4, 0x6850, 0x6840, 0x683C, 0x6843, 0x682A, 0x6845, 0x6813, 0x6818, 0x6841, 0x6B8A, 0x6B89, 0x6BB7, 0x6C23, 0x6C27, 0x6C28, 0x6C26, 0x6C24, 0x6CF0, 0x6D6A, 0x6D95, 0x6D88, 0x6D87, 0x6D66, 0x6D78, 0x6D77, 0x6D59, 0x6D93, /* Big5-HKSCS 0xAF40 .. 0xAF7E */ 0x6D6C, 0x6D89, 0x6D6E, 0x6D5A, 0x6D74, 0x6D69, 0x6D8C, 0x6D8A, 0x6D79, 0x6D85, 0x6D65, 0x6D94, 0x70CA, 0x70D8, 0x70E4, 0x70D9, 0x70C8, 0x70CF, 0x7239, 0x7279, 0x72FC, 0x72F9, 0x72FD, 0x72F8, 0x72F7, 0x7386, 0x73ED, 0x7409, 0x73EE, 0x73E0, 0x73EA, 0x73DE, 0x7554, 0x755D, 0x755C, 0x755A, 0x7559, 0x75BE, 0x75C5, 0x75C7, 0x75B2, 0x75B3, 0x75BD, 0x75BC, 0x75B9, 0x75C2, 0x75B8, 0x768B, 0x76B0, 0x76CA, 0x76CD, 0x76CE, 0x7729, 0x771F, 0x7720, 0x7728, 0x77E9, 0x7830, 0x7827, 0x7838, 0x781D, 0x7834, 0x7837, /* Big5-HKSCS 0xAFA1 .. 0xAFFE */ 0x7825, 0x782D, 0x7820, 0x781F, 0x7832, 0x7955, 0x7950, 0x7960, 0x795F, 0x7956, 0x795E, 0x795D, 0x7957, 0x795A, 0x79E4, 0x79E3, 0x79E7, 0x79DF, 0x79E6, 0x79E9, 0x79D8, 0x7A84, 0x7A88, 0x7AD9, 0x7B06, 0x7B11, 0x7C89, 0x7D21, 0x7D17, 0x7D0B, 0x7D0A, 0x7D20, 0x7D22, 0x7D14, 0x7D10, 0x7D15, 0x7D1A, 0x7D1C, 0x7D0D, 0x7D19, 0x7D1B, 0x7F3A, 0x7F5F, 0x7F94, 0x7FC5, 0x7FC1, 0x8006, 0x8018, 0x8015, 0x8019, 0x8017, 0x803D, 0x803F, 0x80F1, 0x8102, 0x80F0, 0x8105, 0x80ED, 0x80F4, 0x8106, 0x80F8, 0x80F3, 0x8108, 0x80FD, 0x810A, 0x80FC, 0x80EF, 0x81ED, 0x81EC, 0x8200, 0x8210, 0x822A, 0x822B, 0x8228, 0x822C, 0x82BB, 0x832B, 0x8352, 0x8354, 0x834A, 0x8338, 0x8350, 0x8349, 0x8335, 0x8334, 0x834F, 0x8332, 0x8339, 0x8336, 0x8317, 0x8340, 0x8331, 0x8328, 0x8343, /* Big5-HKSCS 0xB040 .. 0xB07E */ 0x8654, 0x868A, 0x86AA, 0x8693, 0x86A4, 0x86A9, 0x868C, 0x86A3, 0x869C, 0x8870, 0x8877, 0x8881, 0x8882, 0x887D, 0x8879, 0x8A18, 0x8A10, 0x8A0E, 0x8A0C, 0x8A15, 0x8A0A, 0x8A17, 0x8A13, 0x8A16, 0x8A0F, 0x8A11, 0x8C48, 0x8C7A, 0x8C79, 0x8CA1, 0x8CA2, 0x8D77, 0x8EAC, 0x8ED2, 0x8ED4, 0x8ECF, 0x8FB1, 0x9001, 0x9006, 0x8FF7, 0x9000, 0x8FFA, 0x8FF4, 0x9003, 0x8FFD, 0x9005, 0x8FF8, 0x9095, 0x90E1, 0x90DD, 0x90E2, 0x9152, 0x914D, 0x914C, 0x91D8, 0x91DD, 0x91D7, 0x91DC, 0x91D9, 0x9583, 0x9662, 0x9663, 0x9661, /* Big5-HKSCS 0xB0A1 .. 0xB0FE */ 0x965B, 0x965D, 0x9664, 0x9658, 0x965E, 0x96BB, 0x98E2, 0x99AC, 0x9AA8, 0x9AD8, 0x9B25, 0x9B32, 0x9B3C, 0x4E7E, 0x507A, 0x507D, 0x505C, 0x5047, 0x5043, 0x504C, 0x505A, 0x5049, 0x5065, 0x5076, 0x504E, 0x5055, 0x5075, 0x5074, 0x5077, 0x504F, 0x500F, 0x506F, 0x506D, 0x515C, 0x5195, 0x51F0, 0x526A, 0x526F, 0x52D2, 0x52D9, 0x52D8, 0x52D5, 0x5310, 0x530F, 0x5319, 0x533F, 0x5340, 0x533E, 0x53C3, 0x66FC, 0x5546, 0x556A, 0x5566, 0x5544, 0x555E, 0x5561, 0x5543, 0x554A, 0x5531, 0x5556, 0x554F, 0x5555, 0x552F, 0x5564, 0x5538, 0x552E, 0x555C, 0x552C, 0x5563, 0x5533, 0x5541, 0x5557, 0x5708, 0x570B, 0x5709, 0x57DF, 0x5805, 0x580A, 0x5806, 0x57E0, 0x57E4, 0x57FA, 0x5802, 0x5835, 0x57F7, 0x57F9, 0x5920, 0x5962, 0x5A36, 0x5A41, 0x5A49, 0x5A66, 0x5A6A, 0x5A40, /* Big5-HKSCS 0xB140 .. 0xB17E */ 0x5A3C, 0x5A62, 0x5A5A, 0x5A46, 0x5A4A, 0x5B70, 0x5BC7, 0x5BC5, 0x5BC4, 0x5BC2, 0x5BBF, 0x5BC6, 0x5C09, 0x5C08, 0x5C07, 0x5C60, 0x5C5C, 0x5C5D, 0x5D07, 0x5D06, 0x5D0E, 0x5D1B, 0x5D16, 0x5D22, 0x5D11, 0x5D29, 0x5D14, 0x5D19, 0x5D24, 0x5D27, 0x5D17, 0x5DE2, 0x5E38, 0x5E36, 0x5E33, 0x5E37, 0x5EB7, 0x5EB8, 0x5EB6, 0x5EB5, 0x5EBE, 0x5F35, 0x5F37, 0x5F57, 0x5F6C, 0x5F69, 0x5F6B, 0x5F97, 0x5F99, 0x5F9E, 0x5F98, 0x5FA1, 0x5FA0, 0x5F9C, 0x607F, 0x60A3, 0x6089, 0x60A0, 0x60A8, 0x60CB, 0x60B4, 0x60E6, 0x60BD, /* Big5-HKSCS 0xB1A1 .. 0xB1FE */ 0x60C5, 0x60BB, 0x60B5, 0x60DC, 0x60BC, 0x60D8, 0x60D5, 0x60C6, 0x60DF, 0x60B8, 0x60DA, 0x60C7, 0x621A, 0x621B, 0x6248, 0x63A0, 0x63A7, 0x6372, 0x6396, 0x63A2, 0x63A5, 0x6377, 0x6367, 0x6398, 0x63AA, 0x6371, 0x63A9, 0x6389, 0x6383, 0x639B, 0x636B, 0x63A8, 0x6384, 0x6388, 0x6399, 0x63A1, 0x63AC, 0x6392, 0x638F, 0x6380, 0x637B, 0x6369, 0x6368, 0x637A, 0x655D, 0x6556, 0x6551, 0x6559, 0x6557, 0x555F, 0x654F, 0x6558, 0x6555, 0x6554, 0x659C, 0x659B, 0x65AC, 0x65CF, 0x65CB, 0x65CC, 0x65CE, 0x665D, 0x665A, 0x6664, 0x6668, 0x6666, 0x665E, 0x66F9, 0x52D7, 0x671B, 0x6881, 0x68AF, 0x68A2, 0x6893, 0x68B5, 0x687F, 0x6876, 0x68B1, 0x68A7, 0x6897, 0x68B0, 0x6883, 0x68C4, 0x68AD, 0x6886, 0x6885, 0x6894, 0x689D, 0x68A8, 0x689F, 0x68A1, 0x6882, 0x6B32, 0x6BBA, /* Big5-HKSCS 0xB240 .. 0xB27E */ 0x6BEB, 0x6BEC, 0x6C2B, 0x6D8E, 0x6DBC, 0x6DF3, 0x6DD9, 0x6DB2, 0x6DE1, 0x6DCC, 0x6DE4, 0x6DFB, 0x6DFA, 0x6E05, 0x6DC7, 0x6DCB, 0x6DAF, 0x6DD1, 0x6DAE, 0x6DDE, 0x6DF9, 0x6DB8, 0x6DF7, 0x6DF5, 0x6DC5, 0x6DD2, 0x6E1A, 0x6DB5, 0x6DDA, 0x6DEB, 0x6DD8, 0x6DEA, 0x6DF1, 0x6DEE, 0x6DE8, 0x6DC6, 0x6DC4, 0x6DAA, 0x6DEC, 0x6DBF, 0x6DE6, 0x70F9, 0x7109, 0x710A, 0x70FD, 0x70EF, 0x723D, 0x727D, 0x7281, 0x731C, 0x731B, 0x7316, 0x7313, 0x7319, 0x7387, 0x7405, 0x740A, 0x7403, 0x7406, 0x73FE, 0x740D, 0x74E0, 0x74F6, /* Big5-HKSCS 0xB2A1 .. 0xB2FE */ 0x74F7, 0x751C, 0x7522, 0x7565, 0x7566, 0x7562, 0x7570, 0x758F, 0x75D4, 0x75D5, 0x75B5, 0x75CA, 0x75CD, 0x768E, 0x76D4, 0x76D2, 0x76DB, 0x7737, 0x773E, 0x773C, 0x7736, 0x7738, 0x773A, 0x786B, 0x7843, 0x784E, 0x7965, 0x7968, 0x796D, 0x79FB, 0x7A92, 0x7A95, 0x7B20, 0x7B28, 0x7B1B, 0x7B2C, 0x7B26, 0x7B19, 0x7B1E, 0x7B2E, 0x7C92, 0x7C97, 0x7C95, 0x7D46, 0x7D43, 0x7D71, 0x7D2E, 0x7D39, 0x7D3C, 0x7D40, 0x7D30, 0x7D33, 0x7D44, 0x7D2F, 0x7D42, 0x7D32, 0x7D31, 0x7F3D, 0x7F9E, 0x7F9A, 0x7FCC, 0x7FCE, 0x7FD2, 0x801C, 0x804A, 0x8046, 0x812F, 0x8116, 0x8123, 0x812B, 0x8129, 0x8130, 0x8124, 0x8202, 0x8235, 0x8237, 0x8236, 0x8239, 0x838E, 0x839E, 0x8398, 0x8378, 0x83A2, 0x8396, 0x83BD, 0x83AB, 0x8392, 0x838A, 0x8393, 0x8389, 0x83A0, 0x8377, 0x837B, 0x837C, /* Big5-HKSCS 0xB340 .. 0xB37E */ 0x8386, 0x83A7, 0x8655, 0x5F6A, 0x86C7, 0x86C0, 0x86B6, 0x86C4, 0x86B5, 0x86C6, 0x86CB, 0x86B1, 0x86AF, 0x86C9, 0x8853, 0x889E, 0x8888, 0x88AB, 0x8892, 0x8896, 0x888D, 0x888B, 0x8993, 0x898F, 0x8A2A, 0x8A1D, 0x8A23, 0x8A25, 0x8A31, 0x8A2D, 0x8A1F, 0x8A1B, 0x8A22, 0x8C49, 0x8C5A, 0x8CA9, 0x8CAC, 0x8CAB, 0x8CA8, 0x8CAA, 0x8CA7, 0x8D67, 0x8D66, 0x8DBE, 0x8DBA, 0x8EDB, 0x8EDF, 0x9019, 0x900D, 0x901A, 0x9017, 0x9023, 0x901F, 0x901D, 0x9010, 0x9015, 0x901E, 0x9020, 0x900F, 0x9022, 0x9016, 0x901B, 0x9014, /* Big5-HKSCS 0xB3A1 .. 0xB3FE */ 0x90E8, 0x90ED, 0x90FD, 0x9157, 0x91CE, 0x91F5, 0x91E6, 0x91E3, 0x91E7, 0x91ED, 0x91E9, 0x9589, 0x966A, 0x9675, 0x9673, 0x9678, 0x9670, 0x9674, 0x9676, 0x9677, 0x966C, 0x96C0, 0x96EA, 0x96E9, 0x7AE0, 0x7ADF, 0x9802, 0x9803, 0x9B5A, 0x9CE5, 0x9E75, 0x9E7F, 0x9EA5, 0x9EBB, 0x50A2, 0x508D, 0x5085, 0x5099, 0x5091, 0x5080, 0x5096, 0x5098, 0x509A, 0x6700, 0x51F1, 0x5272, 0x5274, 0x5275, 0x5269, 0x52DE, 0x52DD, 0x52DB, 0x535A, 0x53A5, 0x557B, 0x5580, 0x55A7, 0x557C, 0x558A, 0x559D, 0x5598, 0x5582, 0x559C, 0x55AA, 0x5594, 0x5587, 0x558B, 0x5583, 0x55B3, 0x55AE, 0x559F, 0x553E, 0x55B2, 0x559A, 0x55BB, 0x55AC, 0x55B1, 0x557E, 0x5589, 0x55AB, 0x5599, 0x570D, 0x582F, 0x582A, 0x5834, 0x5824, 0x5830, 0x5831, 0x5821, 0x581D, 0x5820, 0x58F9, 0x58FA, 0x5960, /* Big5-HKSCS 0xB440 .. 0xB47E */ 0x5A77, 0x5A9A, 0x5A7F, 0x5A92, 0x5A9B, 0x5AA7, 0x5B73, 0x5B71, 0x5BD2, 0x5BCC, 0x5BD3, 0x5BD0, 0x5C0A, 0x5C0B, 0x5C31, 0x5D4C, 0x5D50, 0x5D34, 0x5D47, 0x5DFD, 0x5E45, 0x5E3D, 0x5E40, 0x5E43, 0x5E7E, 0x5ECA, 0x5EC1, 0x5EC2, 0x5EC4, 0x5F3C, 0x5F6D, 0x5FA9, 0x5FAA, 0x5FA8, 0x60D1, 0x60E1, 0x60B2, 0x60B6, 0x60E0, 0x611C, 0x6123, 0x60FA, 0x6115, 0x60F0, 0x60FB, 0x60F4, 0x6168, 0x60F1, 0x610E, 0x60F6, 0x6109, 0x6100, 0x6112, 0x621F, 0x6249, 0x63A3, 0x638C, 0x63CF, 0x63C0, 0x63E9, 0x63C9, 0x63C6, 0x63CD, /* Big5-HKSCS 0xB4A1 .. 0xB4FE */ 0x63D2, 0x63E3, 0x63D0, 0x63E1, 0x63D6, 0x63ED, 0x63EE, 0x6376, 0x63F4, 0x63EA, 0x63DB, 0x6452, 0x63DA, 0x63F9, 0x655E, 0x6566, 0x6562, 0x6563, 0x6591, 0x6590, 0x65AF, 0x666E, 0x6670, 0x6674, 0x6676, 0x666F, 0x6691, 0x667A, 0x667E, 0x6677, 0x66FE, 0x66FF, 0x671F, 0x671D, 0x68FA, 0x68D5, 0x68E0, 0x68D8, 0x68D7, 0x6905, 0x68DF, 0x68F5, 0x68EE, 0x68E7, 0x68F9, 0x68D2, 0x68F2, 0x68E3, 0x68CB, 0x68CD, 0x690D, 0x6912, 0x690E, 0x68C9, 0x68DA, 0x696E, 0x68FB, 0x6B3E, 0x6B3A, 0x6B3D, 0x6B98, 0x6B96, 0x6BBC, 0x6BEF, 0x6C2E, 0x6C2F, 0x6C2C, 0x6E2F, 0x6E38, 0x6E54, 0x6E21, 0x6E32, 0x6E67, 0x6E4A, 0x6E20, 0x6E25, 0x6E23, 0x6E1B, 0x6E5B, 0x6E58, 0x6E24, 0x6E56, 0x6E6E, 0x6E2D, 0x6E26, 0x6E6F, 0x6E34, 0x6E4D, 0x6E3A, 0x6E2C, 0x6E43, 0x6E1D, 0x6E3E, 0x6ECB, /* Big5-HKSCS 0xB540 .. 0xB57E */ 0x6E89, 0x6E19, 0x6E4E, 0x6E63, 0x6E44, 0x6E72, 0x6E69, 0x6E5F, 0x7119, 0x711A, 0x7126, 0x7130, 0x7121, 0x7136, 0x716E, 0x711C, 0x724C, 0x7284, 0x7280, 0x7336, 0x7325, 0x7334, 0x7329, 0x743A, 0x742A, 0x7433, 0x7422, 0x7425, 0x7435, 0x7436, 0x7434, 0x742F, 0x741B, 0x7426, 0x7428, 0x7525, 0x7526, 0x756B, 0x756A, 0x75E2, 0x75DB, 0x75E3, 0x75D9, 0x75D8, 0x75DE, 0x75E0, 0x767B, 0x767C, 0x7696, 0x7693, 0x76B4, 0x76DC, 0x774F, 0x77ED, 0x785D, 0x786C, 0x786F, 0x7A0D, 0x7A08, 0x7A0B, 0x7A05, 0x7A00, 0x7A98, /* Big5-HKSCS 0xB5A1 .. 0xB5FE */ 0x7A97, 0x7A96, 0x7AE5, 0x7AE3, 0x7B49, 0x7B56, 0x7B46, 0x7B50, 0x7B52, 0x7B54, 0x7B4D, 0x7B4B, 0x7B4F, 0x7B51, 0x7C9F, 0x7CA5, 0x7D5E, 0x7D50, 0x7D68, 0x7D55, 0x7D2B, 0x7D6E, 0x7D72, 0x7D61, 0x7D66, 0x7D62, 0x7D70, 0x7D73, 0x5584, 0x7FD4, 0x7FD5, 0x800B, 0x8052, 0x8085, 0x8155, 0x8154, 0x814B, 0x8151, 0x814E, 0x8139, 0x8146, 0x813E, 0x814C, 0x8153, 0x8174, 0x8212, 0x821C, 0x83E9, 0x8403, 0x83F8, 0x840D, 0x83E0, 0x83C5, 0x840B, 0x83C1, 0x83EF, 0x83F1, 0x83F4, 0x8457, 0x840A, 0x83F0, 0x840C, 0x83CC, 0x83FD, 0x83F2, 0x83CA, 0x8438, 0x840E, 0x8404, 0x83DC, 0x8407, 0x83D4, 0x83DF, 0x865B, 0x86DF, 0x86D9, 0x86ED, 0x86D4, 0x86DB, 0x86E4, 0x86D0, 0x86DE, 0x8857, 0x88C1, 0x88C2, 0x88B1, 0x8983, 0x8996, 0x8A3B, 0x8A60, 0x8A55, 0x8A5E, 0x8A3C, 0x8A41, /* Big5-HKSCS 0xB640 .. 0xB67E */ 0x8A54, 0x8A5B, 0x8A50, 0x8A46, 0x8A34, 0x8A3A, 0x8A36, 0x8A56, 0x8C61, 0x8C82, 0x8CAF, 0x8CBC, 0x8CB3, 0x8CBD, 0x8CC1, 0x8CBB, 0x8CC0, 0x8CB4, 0x8CB7, 0x8CB6, 0x8CBF, 0x8CB8, 0x8D8A, 0x8D85, 0x8D81, 0x8DCE, 0x8DDD, 0x8DCB, 0x8DDA, 0x8DD1, 0x8DCC, 0x8DDB, 0x8DC6, 0x8EFB, 0x8EF8, 0x8EFC, 0x8F9C, 0x902E, 0x9035, 0x9031, 0x9038, 0x9032, 0x9036, 0x9102, 0x90F5, 0x9109, 0x90FE, 0x9163, 0x9165, 0x91CF, 0x9214, 0x9215, 0x9223, 0x9209, 0x921E, 0x920D, 0x9210, 0x9207, 0x9211, 0x9594, 0x958F, 0x958B, 0x9591, /* Big5-HKSCS 0xB6A1 .. 0xB6FE */ 0x9593, 0x9592, 0x958E, 0x968A, 0x968E, 0x968B, 0x967D, 0x9685, 0x9686, 0x968D, 0x9672, 0x9684, 0x96C1, 0x96C5, 0x96C4, 0x96C6, 0x96C7, 0x96EF, 0x96F2, 0x97CC, 0x9805, 0x9806, 0x9808, 0x98E7, 0x98EA, 0x98EF, 0x98E9, 0x98F2, 0x98ED, 0x99AE, 0x99AD, 0x9EC3, 0x9ECD, 0x9ED1, 0x4E82, 0x50AD, 0x50B5, 0x50B2, 0x50B3, 0x50C5, 0x50BE, 0x50AC, 0x50B7, 0x50BB, 0x50AF, 0x50C7, 0x527F, 0x5277, 0x527D, 0x52DF, 0x52E6, 0x52E4, 0x52E2, 0x52E3, 0x532F, 0x55DF, 0x55E8, 0x55D3, 0x55E6, 0x55CE, 0x55DC, 0x55C7, 0x55D1, 0x55E3, 0x55E4, 0x55EF, 0x55DA, 0x55E1, 0x55C5, 0x55C6, 0x55E5, 0x55C9, 0x5712, 0x5713, 0x585E, 0x5851, 0x5858, 0x5857, 0x585A, 0x5854, 0x586B, 0x584C, 0x586D, 0x584A, 0x5862, 0x5852, 0x584B, 0x5967, 0x5AC1, 0x5AC9, 0x5ACC, 0x5ABE, 0x5ABD, 0x5ABC, /* Big5-HKSCS 0xB740 .. 0xB77E */ 0x5AB3, 0x5AC2, 0x5AB2, 0x5D69, 0x5D6F, 0x5E4C, 0x5E79, 0x5EC9, 0x5EC8, 0x5F12, 0x5F59, 0x5FAC, 0x5FAE, 0x611A, 0x610F, 0x6148, 0x611F, 0x60F3, 0x611B, 0x60F9, 0x6101, 0x6108, 0x614E, 0x614C, 0x6144, 0x614D, 0x613E, 0x6134, 0x6127, 0x610D, 0x6106, 0x6137, 0x6221, 0x6222, 0x6413, 0x643E, 0x641E, 0x642A, 0x642D, 0x643D, 0x642C, 0x640F, 0x641C, 0x6414, 0x640D, 0x6436, 0x6416, 0x6417, 0x6406, 0x656C, 0x659F, 0x65B0, 0x6697, 0x6689, 0x6687, 0x6688, 0x6696, 0x6684, 0x6698, 0x668D, 0x6703, 0x6994, 0x696D, /* Big5-HKSCS 0xB7A1 .. 0xB7FE */ 0x695A, 0x6977, 0x6960, 0x6954, 0x6975, 0x6930, 0x6982, 0x694A, 0x6968, 0x696B, 0x695E, 0x6953, 0x6979, 0x6986, 0x695D, 0x6963, 0x695B, 0x6B47, 0x6B72, 0x6BC0, 0x6BBF, 0x6BD3, 0x6BFD, 0x6EA2, 0x6EAF, 0x6ED3, 0x6EB6, 0x6EC2, 0x6E90, 0x6E9D, 0x6EC7, 0x6EC5, 0x6EA5, 0x6E98, 0x6EBC, 0x6EBA, 0x6EAB, 0x6ED1, 0x6E96, 0x6E9C, 0x6EC4, 0x6ED4, 0x6EAA, 0x6EA7, 0x6EB4, 0x714E, 0x7159, 0x7169, 0x7164, 0x7149, 0x7167, 0x715C, 0x716C, 0x7166, 0x714C, 0x7165, 0x715E, 0x7146, 0x7168, 0x7156, 0x723A, 0x7252, 0x7337, 0x7345, 0x733F, 0x733E, 0x746F, 0x745A, 0x7455, 0x745F, 0x745E, 0x7441, 0x743F, 0x7459, 0x745B, 0x745C, 0x7576, 0x7578, 0x7600, 0x75F0, 0x7601, 0x75F2, 0x75F1, 0x75FA, 0x75FF, 0x75F4, 0x75F3, 0x76DE, 0x76DF, 0x775B, 0x776B, 0x7766, 0x775E, 0x7763, /* Big5-HKSCS 0xB840 .. 0xB87E */ 0x7779, 0x776A, 0x776C, 0x775C, 0x7765, 0x7768, 0x7762, 0x77EE, 0x788E, 0x78B0, 0x7897, 0x7898, 0x788C, 0x7889, 0x787C, 0x7891, 0x7893, 0x787F, 0x797A, 0x797F, 0x7981, 0x842C, 0x79BD, 0x7A1C, 0x7A1A, 0x7A20, 0x7A14, 0x7A1F, 0x7A1E, 0x7A9F, 0x7AA0, 0x7B77, 0x7BC0, 0x7B60, 0x7B6E, 0x7B67, 0x7CB1, 0x7CB3, 0x7CB5, 0x7D93, 0x7D79, 0x7D91, 0x7D81, 0x7D8F, 0x7D5B, 0x7F6E, 0x7F69, 0x7F6A, 0x7F72, 0x7FA9, 0x7FA8, 0x7FA4, 0x8056, 0x8058, 0x8086, 0x8084, 0x8171, 0x8170, 0x8178, 0x8165, 0x816E, 0x8173, 0x816B, /* Big5-HKSCS 0xB8A1 .. 0xB8FE */ 0x8179, 0x817A, 0x8166, 0x8205, 0x8247, 0x8482, 0x8477, 0x843D, 0x8431, 0x8475, 0x8466, 0x846B, 0x8449, 0x846C, 0x845B, 0x843C, 0x8435, 0x8461, 0x8463, 0x8469, 0x846D, 0x8446, 0x865E, 0x865C, 0x865F, 0x86F9, 0x8713, 0x8708, 0x8707, 0x8700, 0x86FE, 0x86FB, 0x8702, 0x8703, 0x8706, 0x870A, 0x8859, 0x88DF, 0x88D4, 0x88D9, 0x88DC, 0x88D8, 0x88DD, 0x88E1, 0x88CA, 0x88D5, 0x88D2, 0x899C, 0x89E3, 0x8A6B, 0x8A72, 0x8A73, 0x8A66, 0x8A69, 0x8A70, 0x8A87, 0x8A7C, 0x8A63, 0x8AA0, 0x8A71, 0x8A85, 0x8A6D, 0x8A62, 0x8A6E, 0x8A6C, 0x8A79, 0x8A7B, 0x8A3E, 0x8A68, 0x8C62, 0x8C8A, 0x8C89, 0x8CCA, 0x8CC7, 0x8CC8, 0x8CC4, 0x8CB2, 0x8CC3, 0x8CC2, 0x8CC5, 0x8DE1, 0x8DDF, 0x8DE8, 0x8DEF, 0x8DF3, 0x8DFA, 0x8DEA, 0x8DE4, 0x8DE6, 0x8EB2, 0x8F03, 0x8F09, 0x8EFE, 0x8F0A, /* Big5-HKSCS 0xB940 .. 0xB97E */ 0x8F9F, 0x8FB2, 0x904B, 0x904A, 0x9053, 0x9042, 0x9054, 0x903C, 0x9055, 0x9050, 0x9047, 0x904F, 0x904E, 0x904D, 0x9051, 0x903E, 0x9041, 0x9112, 0x9117, 0x916C, 0x916A, 0x9169, 0x91C9, 0x9237, 0x9257, 0x9238, 0x923D, 0x9240, 0x923E, 0x925B, 0x924B, 0x9264, 0x9251, 0x9234, 0x9249, 0x924D, 0x9245, 0x9239, 0x923F, 0x925A, 0x9598, 0x9698, 0x9694, 0x9695, 0x96CD, 0x96CB, 0x96C9, 0x96CA, 0x96F7, 0x96FB, 0x96F9, 0x96F6, 0x9756, 0x9774, 0x9776, 0x9810, 0x9811, 0x9813, 0x980A, 0x9812, 0x980C, 0x98FC, 0x98F4, /* Big5-HKSCS 0xB9A1 .. 0xB9FE */ 0x98FD, 0x98FE, 0x99B3, 0x99B1, 0x99B4, 0x9AE1, 0x9CE9, 0x9E82, 0x9F0E, 0x9F13, 0x9F20, 0x50E7, 0x50EE, 0x50E5, 0x50D6, 0x50ED, 0x50DA, 0x50D5, 0x50CF, 0x50D1, 0x50F1, 0x50CE, 0x50E9, 0x5162, 0x51F3, 0x5283, 0x5282, 0x5331, 0x53AD, 0x55FE, 0x5600, 0x561B, 0x5617, 0x55FD, 0x5614, 0x5606, 0x5609, 0x560D, 0x560E, 0x55F7, 0x5616, 0x561F, 0x5608, 0x5610, 0x55F6, 0x5718, 0x5716, 0x5875, 0x587E, 0x5883, 0x5893, 0x588A, 0x5879, 0x5885, 0x587D, 0x58FD, 0x5925, 0x5922, 0x5924, 0x596A, 0x5969, 0x5AE1, 0x5AE6, 0x5AE9, 0x5AD7, 0x5AD6, 0x5AD8, 0x5AE3, 0x5B75, 0x5BDE, 0x5BE7, 0x5BE1, 0x5BE5, 0x5BE6, 0x5BE8, 0x5BE2, 0x5BE4, 0x5BDF, 0x5C0D, 0x5C62, 0x5D84, 0x5D87, 0x5E5B, 0x5E63, 0x5E55, 0x5E57, 0x5E54, 0x5ED3, 0x5ED6, 0x5F0A, 0x5F46, 0x5F70, 0x5FB9, 0x6147, /* Big5-HKSCS 0xBA40 .. 0xBA7E */ 0x613F, 0x614B, 0x6177, 0x6162, 0x6163, 0x615F, 0x615A, 0x6158, 0x6175, 0x622A, 0x6487, 0x6458, 0x6454, 0x64A4, 0x6478, 0x645F, 0x647A, 0x6451, 0x6467, 0x6434, 0x646D, 0x647B, 0x6572, 0x65A1, 0x65D7, 0x65D6, 0x66A2, 0x66A8, 0x669D, 0x699C, 0x69A8, 0x6995, 0x69C1, 0x69AE, 0x69D3, 0x69CB, 0x699B, 0x69B7, 0x69BB, 0x69AB, 0x69B4, 0x69D0, 0x69CD, 0x69AD, 0x69CC, 0x69A6, 0x69C3, 0x69A3, 0x6B49, 0x6B4C, 0x6C33, 0x6F33, 0x6F14, 0x6EFE, 0x6F13, 0x6EF4, 0x6F29, 0x6F3E, 0x6F20, 0x6F2C, 0x6F0F, 0x6F02, 0x6F22, /* Big5-HKSCS 0xBAA1 .. 0xBAFE */ 0x6EFF, 0x6EEF, 0x6F06, 0x6F31, 0x6F38, 0x6F32, 0x6F23, 0x6F15, 0x6F2B, 0x6F2F, 0x6F88, 0x6F2A, 0x6EEC, 0x6F01, 0x6EF2, 0x6ECC, 0x6EF7, 0x7194, 0x7199, 0x717D, 0x718A, 0x7184, 0x7192, 0x723E, 0x7292, 0x7296, 0x7344, 0x7350, 0x7464, 0x7463, 0x746A, 0x7470, 0x746D, 0x7504, 0x7591, 0x7627, 0x760D, 0x760B, 0x7609, 0x7613, 0x76E1, 0x76E3, 0x7784, 0x777D, 0x777F, 0x7761, 0x78C1, 0x789F, 0x78A7, 0x78B3, 0x78A9, 0x78A3, 0x798E, 0x798F, 0x798D, 0x7A2E, 0x7A31, 0x7AAA, 0x7AA9, 0x7AED, 0x7AEF, 0x7BA1, 0x7B95, 0x7B8B, 0x7B75, 0x7B97, 0x7B9D, 0x7B94, 0x7B8F, 0x7BB8, 0x7B87, 0x7B84, 0x7CB9, 0x7CBD, 0x7CBE, 0x7DBB, 0x7DB0, 0x7D9C, 0x7DBD, 0x7DBE, 0x7DA0, 0x7DCA, 0x7DB4, 0x7DB2, 0x7DB1, 0x7DBA, 0x7DA2, 0x7DBF, 0x7DB5, 0x7DB8, 0x7DAD, 0x7DD2, 0x7DC7, 0x7DAC, /* Big5-HKSCS 0xBB40 .. 0xBB7E */ 0x7F70, 0x7FE0, 0x7FE1, 0x7FDF, 0x805E, 0x805A, 0x8087, 0x8150, 0x8180, 0x818F, 0x8188, 0x818A, 0x817F, 0x8182, 0x81E7, 0x81FA, 0x8207, 0x8214, 0x821E, 0x824B, 0x84C9, 0x84BF, 0x84C6, 0x84C4, 0x8499, 0x849E, 0x84B2, 0x849C, 0x84CB, 0x84B8, 0x84C0, 0x84D3, 0x8490, 0x84BC, 0x84D1, 0x84CA, 0x873F, 0x871C, 0x873B, 0x8722, 0x8725, 0x8734, 0x8718, 0x8755, 0x8737, 0x8729, 0x88F3, 0x8902, 0x88F4, 0x88F9, 0x88F8, 0x88FD, 0x88E8, 0x891A, 0x88EF, 0x8AA6, 0x8A8C, 0x8A9E, 0x8AA3, 0x8A8D, 0x8AA1, 0x8A93, 0x8AA4, /* Big5-HKSCS 0xBBA1 .. 0xBBFE */ 0x8AAA, 0x8AA5, 0x8AA8, 0x8A98, 0x8A91, 0x8A9A, 0x8AA7, 0x8C6A, 0x8C8D, 0x8C8C, 0x8CD3, 0x8CD1, 0x8CD2, 0x8D6B, 0x8D99, 0x8D95, 0x8DFC, 0x8F14, 0x8F12, 0x8F15, 0x8F13, 0x8FA3, 0x9060, 0x9058, 0x905C, 0x9063, 0x9059, 0x905E, 0x9062, 0x905D, 0x905B, 0x9119, 0x9118, 0x911E, 0x9175, 0x9178, 0x9177, 0x9174, 0x9278, 0x9280, 0x9285, 0x9298, 0x9296, 0x927B, 0x9293, 0x929C, 0x92A8, 0x927C, 0x9291, 0x95A1, 0x95A8, 0x95A9, 0x95A3, 0x95A5, 0x95A4, 0x9699, 0x969C, 0x969B, 0x96CC, 0x96D2, 0x9700, 0x977C, 0x9785, 0x97F6, 0x9817, 0x9818, 0x98AF, 0x98B1, 0x9903, 0x9905, 0x990C, 0x9909, 0x99C1, 0x9AAF, 0x9AB0, 0x9AE6, 0x9B41, 0x9B42, 0x9CF4, 0x9CF6, 0x9CF3, 0x9EBC, 0x9F3B, 0x9F4A, 0x5104, 0x5100, 0x50FB, 0x50F5, 0x50F9, 0x5102, 0x5108, 0x5109, 0x5105, 0x51DC, /* Big5-HKSCS 0xBC40 .. 0xBC7E */ 0x5287, 0x5288, 0x5289, 0x528D, 0x528A, 0x52F0, 0x53B2, 0x562E, 0x563B, 0x5639, 0x5632, 0x563F, 0x5634, 0x5629, 0x5653, 0x564E, 0x5657, 0x5674, 0x5636, 0x562F, 0x5630, 0x5880, 0x589F, 0x589E, 0x58B3, 0x589C, 0x58AE, 0x58A9, 0x58A6, 0x596D, 0x5B09, 0x5AFB, 0x5B0B, 0x5AF5, 0x5B0C, 0x5B08, 0x5BEE, 0x5BEC, 0x5BE9, 0x5BEB, 0x5C64, 0x5C65, 0x5D9D, 0x5D94, 0x5E62, 0x5E5F, 0x5E61, 0x5EE2, 0x5EDA, 0x5EDF, 0x5EDD, 0x5EE3, 0x5EE0, 0x5F48, 0x5F71, 0x5FB7, 0x5FB5, 0x6176, 0x6167, 0x616E, 0x615D, 0x6155, 0x6182, /* Big5-HKSCS 0xBCA1 .. 0xBCFE */ 0x617C, 0x6170, 0x616B, 0x617E, 0x61A7, 0x6190, 0x61AB, 0x618E, 0x61AC, 0x619A, 0x61A4, 0x6194, 0x61AE, 0x622E, 0x6469, 0x646F, 0x6479, 0x649E, 0x64B2, 0x6488, 0x6490, 0x64B0, 0x64A5, 0x6493, 0x6495, 0x64A9, 0x6492, 0x64AE, 0x64AD, 0x64AB, 0x649A, 0x64AC, 0x6499, 0x64A2, 0x64B3, 0x6575, 0x6577, 0x6578, 0x66AE, 0x66AB, 0x66B4, 0x66B1, 0x6A23, 0x6A1F, 0x69E8, 0x6A01, 0x6A1E, 0x6A19, 0x69FD, 0x6A21, 0x6A13, 0x6A0A, 0x69F3, 0x6A02, 0x6A05, 0x69ED, 0x6A11, 0x6B50, 0x6B4E, 0x6BA4, 0x6BC5, 0x6BC6, 0x6F3F, 0x6F7C, 0x6F84, 0x6F51, 0x6F66, 0x6F54, 0x6F86, 0x6F6D, 0x6F5B, 0x6F78, 0x6F6E, 0x6F8E, 0x6F7A, 0x6F70, 0x6F64, 0x6F97, 0x6F58, 0x6ED5, 0x6F6F, 0x6F60, 0x6F5F, 0x719F, 0x71AC, 0x71B1, 0x71A8, 0x7256, 0x729B, 0x734E, 0x7357, 0x7469, 0x748B, 0x7483, /* Big5-HKSCS 0xBD40 .. 0xBD7E */ 0x747E, 0x7480, 0x757F, 0x7620, 0x7629, 0x761F, 0x7624, 0x7626, 0x7621, 0x7622, 0x769A, 0x76BA, 0x76E4, 0x778E, 0x7787, 0x778C, 0x7791, 0x778B, 0x78CB, 0x78C5, 0x78BA, 0x78CA, 0x78BE, 0x78D5, 0x78BC, 0x78D0, 0x7A3F, 0x7A3C, 0x7A40, 0x7A3D, 0x7A37, 0x7A3B, 0x7AAF, 0x7AAE, 0x7BAD, 0x7BB1, 0x7BC4, 0x7BB4, 0x7BC6, 0x7BC7, 0x7BC1, 0x7BA0, 0x7BCC, 0x7CCA, 0x7DE0, 0x7DF4, 0x7DEF, 0x7DFB, 0x7DD8, 0x7DEC, 0x7DDD, 0x7DE8, 0x7DE3, 0x7DDA, 0x7DDE, 0x7DE9, 0x7D9E, 0x7DD9, 0x7DF2, 0x7DF9, 0x7F75, 0x7F77, 0x7FAF, /* Big5-HKSCS 0xBDA1 .. 0xBDFE */ 0x7FE9, 0x8026, 0x819B, 0x819C, 0x819D, 0x81A0, 0x819A, 0x8198, 0x8517, 0x853D, 0x851A, 0x84EE, 0x852C, 0x852D, 0x8513, 0x8511, 0x8523, 0x8521, 0x8514, 0x84EC, 0x8525, 0x84FF, 0x8506, 0x8782, 0x8774, 0x8776, 0x8760, 0x8766, 0x8778, 0x8768, 0x8759, 0x8757, 0x874C, 0x8753, 0x885B, 0x885D, 0x8910, 0x8907, 0x8912, 0x8913, 0x8915, 0x890A, 0x8ABC, 0x8AD2, 0x8AC7, 0x8AC4, 0x8A95, 0x8ACB, 0x8AF8, 0x8AB2, 0x8AC9, 0x8AC2, 0x8ABF, 0x8AB0, 0x8AD6, 0x8ACD, 0x8AB6, 0x8AB9, 0x8ADB, 0x8C4C, 0x8C4E, 0x8C6C, 0x8CE0, 0x8CDE, 0x8CE6, 0x8CE4, 0x8CEC, 0x8CED, 0x8CE2, 0x8CE3, 0x8CDC, 0x8CEA, 0x8CE1, 0x8D6D, 0x8D9F, 0x8DA3, 0x8E2B, 0x8E10, 0x8E1D, 0x8E22, 0x8E0F, 0x8E29, 0x8E1F, 0x8E21, 0x8E1E, 0x8EBA, 0x8F1D, 0x8F1B, 0x8F1F, 0x8F29, 0x8F26, 0x8F2A, 0x8F1C, 0x8F1E, /* Big5-HKSCS 0xBE40 .. 0xBE7E */ 0x8F25, 0x9069, 0x906E, 0x9068, 0x906D, 0x9077, 0x9130, 0x912D, 0x9127, 0x9131, 0x9187, 0x9189, 0x918B, 0x9183, 0x92C5, 0x92BB, 0x92B7, 0x92EA, 0x92AC, 0x92E4, 0x92C1, 0x92B3, 0x92BC, 0x92D2, 0x92C7, 0x92F0, 0x92B2, 0x95AD, 0x95B1, 0x9704, 0x9706, 0x9707, 0x9709, 0x9760, 0x978D, 0x978B, 0x978F, 0x9821, 0x982B, 0x981C, 0x98B3, 0x990A, 0x9913, 0x9912, 0x9918, 0x99DD, 0x99D0, 0x99DF, 0x99DB, 0x99D1, 0x99D5, 0x99D2, 0x99D9, 0x9AB7, 0x9AEE, 0x9AEF, 0x9B27, 0x9B45, 0x9B44, 0x9B77, 0x9B6F, 0x9D06, 0x9D09, /* Big5-HKSCS 0xBEA1 .. 0xBEFE */ 0x9D03, 0x9EA9, 0x9EBE, 0x9ECE, 0x58A8, 0x9F52, 0x5112, 0x5118, 0x5114, 0x5110, 0x5115, 0x5180, 0x51AA, 0x51DD, 0x5291, 0x5293, 0x52F3, 0x5659, 0x566B, 0x5679, 0x5669, 0x5664, 0x5678, 0x566A, 0x5668, 0x5665, 0x5671, 0x566F, 0x566C, 0x5662, 0x5676, 0x58C1, 0x58BE, 0x58C7, 0x58C5, 0x596E, 0x5B1D, 0x5B34, 0x5B78, 0x5BF0, 0x5C0E, 0x5F4A, 0x61B2, 0x6191, 0x61A9, 0x618A, 0x61CD, 0x61B6, 0x61BE, 0x61CA, 0x61C8, 0x6230, 0x64C5, 0x64C1, 0x64CB, 0x64BB, 0x64BC, 0x64DA, 0x64C4, 0x64C7, 0x64C2, 0x64CD, 0x64BF, 0x64D2, 0x64D4, 0x64BE, 0x6574, 0x66C6, 0x66C9, 0x66B9, 0x66C4, 0x66C7, 0x66B8, 0x6A3D, 0x6A38, 0x6A3A, 0x6A59, 0x6A6B, 0x6A58, 0x6A39, 0x6A44, 0x6A62, 0x6A61, 0x6A4B, 0x6A47, 0x6A35, 0x6A5F, 0x6A48, 0x6B59, 0x6B77, 0x6C05, 0x6FC2, 0x6FB1, 0x6FA1, /* Big5-HKSCS 0xBF40 .. 0xBF7E */ 0x6FC3, 0x6FA4, 0x6FC1, 0x6FA7, 0x6FB3, 0x6FC0, 0x6FB9, 0x6FB6, 0x6FA6, 0x6FA0, 0x6FB4, 0x71BE, 0x71C9, 0x71D0, 0x71D2, 0x71C8, 0x71D5, 0x71B9, 0x71CE, 0x71D9, 0x71DC, 0x71C3, 0x71C4, 0x7368, 0x749C, 0x74A3, 0x7498, 0x749F, 0x749E, 0x74E2, 0x750C, 0x750D, 0x7634, 0x7638, 0x763A, 0x76E7, 0x76E5, 0x77A0, 0x779E, 0x779F, 0x77A5, 0x78E8, 0x78DA, 0x78EC, 0x78E7, 0x79A6, 0x7A4D, 0x7A4E, 0x7A46, 0x7A4C, 0x7A4B, 0x7ABA, 0x7BD9, 0x7C11, 0x7BC9, 0x7BE4, 0x7BDB, 0x7BE1, 0x7BE9, 0x7BE6, 0x7CD5, 0x7CD6, 0x7E0A, /* Big5-HKSCS 0xBFA1 .. 0xBFFE */ 0x7E11, 0x7E08, 0x7E1B, 0x7E23, 0x7E1E, 0x7E1D, 0x7E09, 0x7E10, 0x7F79, 0x7FB2, 0x7FF0, 0x7FF1, 0x7FEE, 0x8028, 0x81B3, 0x81A9, 0x81A8, 0x81FB, 0x8208, 0x8258, 0x8259, 0x854A, 0x8559, 0x8548, 0x8568, 0x8569, 0x8543, 0x8549, 0x856D, 0x856A, 0x855E, 0x8783, 0x879F, 0x879E, 0x87A2, 0x878D, 0x8861, 0x892A, 0x8932, 0x8925, 0x892B, 0x8921, 0x89AA, 0x89A6, 0x8AE6, 0x8AFA, 0x8AEB, 0x8AF1, 0x8B00, 0x8ADC, 0x8AE7, 0x8AEE, 0x8AFE, 0x8B01, 0x8B02, 0x8AF7, 0x8AED, 0x8AF3, 0x8AF6, 0x8AFC, 0x8C6B, 0x8C6D, 0x8C93, 0x8CF4, 0x8E44, 0x8E31, 0x8E34, 0x8E42, 0x8E39, 0x8E35, 0x8F3B, 0x8F2F, 0x8F38, 0x8F33, 0x8FA8, 0x8FA6, 0x9075, 0x9074, 0x9078, 0x9072, 0x907C, 0x907A, 0x9134, 0x9192, 0x9320, 0x9336, 0x92F8, 0x9333, 0x932F, 0x9322, 0x92FC, 0x932B, 0x9304, 0x931A, /* Big5-HKSCS 0xC040 .. 0xC07E */ 0x9310, 0x9326, 0x9321, 0x9315, 0x932E, 0x9319, 0x95BB, 0x96A7, 0x96A8, 0x96AA, 0x96D5, 0x970E, 0x9711, 0x9716, 0x970D, 0x9713, 0x970F, 0x975B, 0x975C, 0x9766, 0x9798, 0x9830, 0x9838, 0x983B, 0x9837, 0x982D, 0x9839, 0x9824, 0x9910, 0x9928, 0x991E, 0x991B, 0x9921, 0x991A, 0x99ED, 0x99E2, 0x99F1, 0x9AB8, 0x9ABC, 0x9AFB, 0x9AED, 0x9B28, 0x9B91, 0x9D15, 0x9D23, 0x9D26, 0x9D28, 0x9D12, 0x9D1B, 0x9ED8, 0x9ED4, 0x9F8D, 0x9F9C, 0x512A, 0x511F, 0x5121, 0x5132, 0x52F5, 0x568E, 0x5680, 0x5690, 0x5685, 0x5687, /* Big5-HKSCS 0xC0A1 .. 0xC0FE */ 0x568F, 0x58D5, 0x58D3, 0x58D1, 0x58CE, 0x5B30, 0x5B2A, 0x5B24, 0x5B7A, 0x5C37, 0x5C68, 0x5DBC, 0x5DBA, 0x5DBD, 0x5DB8, 0x5E6B, 0x5F4C, 0x5FBD, 0x61C9, 0x61C2, 0x61C7, 0x61E6, 0x61CB, 0x6232, 0x6234, 0x64CE, 0x64CA, 0x64D8, 0x64E0, 0x64F0, 0x64E6, 0x64EC, 0x64F1, 0x64E2, 0x64ED, 0x6582, 0x6583, 0x66D9, 0x66D6, 0x6A80, 0x6A94, 0x6A84, 0x6AA2, 0x6A9C, 0x6ADB, 0x6AA3, 0x6A7E, 0x6A97, 0x6A90, 0x6AA0, 0x6B5C, 0x6BAE, 0x6BDA, 0x6C08, 0x6FD8, 0x6FF1, 0x6FDF, 0x6FE0, 0x6FDB, 0x6FE4, 0x6FEB, 0x6FEF, 0x6F80, 0x6FEC, 0x6FE1, 0x6FE9, 0x6FD5, 0x6FEE, 0x6FF0, 0x71E7, 0x71DF, 0x71EE, 0x71E6, 0x71E5, 0x71ED, 0x71EC, 0x71F4, 0x71E0, 0x7235, 0x7246, 0x7370, 0x7372, 0x74A9, 0x74B0, 0x74A6, 0x74A8, 0x7646, 0x7642, 0x764C, 0x76EA, 0x77B3, 0x77AA, 0x77B0, 0x77AC, /* Big5-HKSCS 0xC140 .. 0xC17E */ 0x77A7, 0x77AD, 0x77EF, 0x78F7, 0x78FA, 0x78F4, 0x78EF, 0x7901, 0x79A7, 0x79AA, 0x7A57, 0x7ABF, 0x7C07, 0x7C0D, 0x7BFE, 0x7BF7, 0x7C0C, 0x7BE0, 0x7CE0, 0x7CDC, 0x7CDE, 0x7CE2, 0x7CDF, 0x7CD9, 0x7CDD, 0x7E2E, 0x7E3E, 0x7E46, 0x7E37, 0x7E32, 0x7E43, 0x7E2B, 0x7E3D, 0x7E31, 0x7E45, 0x7E41, 0x7E34, 0x7E39, 0x7E48, 0x7E35, 0x7E3F, 0x7E2F, 0x7F44, 0x7FF3, 0x7FFC, 0x8071, 0x8072, 0x8070, 0x806F, 0x8073, 0x81C6, 0x81C3, 0x81BA, 0x81C2, 0x81C0, 0x81BF, 0x81BD, 0x81C9, 0x81BE, 0x81E8, 0x8209, 0x8271, 0x85AA, /* Big5-HKSCS 0xC1A1 .. 0xC1FE */ 0x8584, 0x857E, 0x859C, 0x8591, 0x8594, 0x85AF, 0x859B, 0x8587, 0x85A8, 0x858A, 0x8667, 0x87C0, 0x87D1, 0x87B3, 0x87D2, 0x87C6, 0x87AB, 0x87BB, 0x87BA, 0x87C8, 0x87CB, 0x893B, 0x8936, 0x8944, 0x8938, 0x893D, 0x89AC, 0x8B0E, 0x8B17, 0x8B19, 0x8B1B, 0x8B0A, 0x8B20, 0x8B1D, 0x8B04, 0x8B10, 0x8C41, 0x8C3F, 0x8C73, 0x8CFA, 0x8CFD, 0x8CFC, 0x8CF8, 0x8CFB, 0x8DA8, 0x8E49, 0x8E4B, 0x8E48, 0x8E4A, 0x8F44, 0x8F3E, 0x8F42, 0x8F45, 0x8F3F, 0x907F, 0x907D, 0x9084, 0x9081, 0x9082, 0x9080, 0x9139, 0x91A3, 0x919E, 0x919C, 0x934D, 0x9382, 0x9328, 0x9375, 0x934A, 0x9365, 0x934B, 0x9318, 0x937E, 0x936C, 0x935B, 0x9370, 0x935A, 0x9354, 0x95CA, 0x95CB, 0x95CC, 0x95C8, 0x95C6, 0x96B1, 0x96B8, 0x96D6, 0x971C, 0x971E, 0x97A0, 0x97D3, 0x9846, 0x98B6, 0x9935, 0x9A01, /* Big5-HKSCS 0xC240 .. 0xC27E */ 0x99FF, 0x9BAE, 0x9BAB, 0x9BAA, 0x9BAD, 0x9D3B, 0x9D3F, 0x9E8B, 0x9ECF, 0x9EDE, 0x9EDC, 0x9EDD, 0x9EDB, 0x9F3E, 0x9F4B, 0x53E2, 0x5695, 0x56AE, 0x58D9, 0x58D8, 0x5B38, 0x5F5D, 0x61E3, 0x6233, 0x64F4, 0x64F2, 0x64FE, 0x6506, 0x64FA, 0x64FB, 0x64F7, 0x65B7, 0x66DC, 0x6726, 0x6AB3, 0x6AAC, 0x6AC3, 0x6ABB, 0x6AB8, 0x6AC2, 0x6AAE, 0x6AAF, 0x6B5F, 0x6B78, 0x6BAF, 0x7009, 0x700B, 0x6FFE, 0x7006, 0x6FFA, 0x7011, 0x700F, 0x71FB, 0x71FC, 0x71FE, 0x71F8, 0x7377, 0x7375, 0x74A7, 0x74BF, 0x7515, 0x7656, 0x7658, /* Big5-HKSCS 0xC2A1 .. 0xC2FE */ 0x7652, 0x77BD, 0x77BF, 0x77BB, 0x77BC, 0x790E, 0x79AE, 0x7A61, 0x7A62, 0x7A60, 0x7AC4, 0x7AC5, 0x7C2B, 0x7C27, 0x7C2A, 0x7C1E, 0x7C23, 0x7C21, 0x7CE7, 0x7E54, 0x7E55, 0x7E5E, 0x7E5A, 0x7E61, 0x7E52, 0x7E59, 0x7F48, 0x7FF9, 0x7FFB, 0x8077, 0x8076, 0x81CD, 0x81CF, 0x820A, 0x85CF, 0x85A9, 0x85CD, 0x85D0, 0x85C9, 0x85B0, 0x85BA, 0x85B9, 0x85A6, 0x87EF, 0x87EC, 0x87F2, 0x87E0, 0x8986, 0x89B2, 0x89F4, 0x8B28, 0x8B39, 0x8B2C, 0x8B2B, 0x8C50, 0x8D05, 0x8E59, 0x8E63, 0x8E66, 0x8E64, 0x8E5F, 0x8E55, 0x8EC0, 0x8F49, 0x8F4D, 0x9087, 0x9083, 0x9088, 0x91AB, 0x91AC, 0x91D0, 0x9394, 0x938A, 0x9396, 0x93A2, 0x93B3, 0x93AE, 0x93AC, 0x93B0, 0x9398, 0x939A, 0x9397, 0x95D4, 0x95D6, 0x95D0, 0x95D5, 0x96E2, 0x96DC, 0x96D9, 0x96DB, 0x96DE, 0x9724, 0x97A3, 0x97A6, /* Big5-HKSCS 0xC340 .. 0xC37E */ 0x97AD, 0x97F9, 0x984D, 0x984F, 0x984C, 0x984E, 0x9853, 0x98BA, 0x993E, 0x993F, 0x993D, 0x992E, 0x99A5, 0x9A0E, 0x9AC1, 0x9B03, 0x9B06, 0x9B4F, 0x9B4E, 0x9B4D, 0x9BCA, 0x9BC9, 0x9BFD, 0x9BC8, 0x9BC0, 0x9D51, 0x9D5D, 0x9D60, 0x9EE0, 0x9F15, 0x9F2C, 0x5133, 0x56A5, 0x58DE, 0x58DF, 0x58E2, 0x5BF5, 0x9F90, 0x5EEC, 0x61F2, 0x61F7, 0x61F6, 0x61F5, 0x6500, 0x650F, 0x66E0, 0x66DD, 0x6AE5, 0x6ADD, 0x6ADA, 0x6AD3, 0x701B, 0x701F, 0x7028, 0x701A, 0x701D, 0x7015, 0x7018, 0x7206, 0x720D, 0x7258, 0x72A2, 0x7378, /* Big5-HKSCS 0xC3A1 .. 0xC3FE */ 0x737A, 0x74BD, 0x74CA, 0x74E3, 0x7587, 0x7586, 0x765F, 0x7661, 0x77C7, 0x7919, 0x79B1, 0x7A6B, 0x7A69, 0x7C3E, 0x7C3F, 0x7C38, 0x7C3D, 0x7C37, 0x7C40, 0x7E6B, 0x7E6D, 0x7E79, 0x7E69, 0x7E6A, 0x7F85, 0x7E73, 0x7FB6, 0x7FB9, 0x7FB8, 0x81D8, 0x85E9, 0x85DD, 0x85EA, 0x85D5, 0x85E4, 0x85E5, 0x85F7, 0x87FB, 0x8805, 0x880D, 0x87F9, 0x87FE, 0x8960, 0x895F, 0x8956, 0x895E, 0x8B41, 0x8B5C, 0x8B58, 0x8B49, 0x8B5A, 0x8B4E, 0x8B4F, 0x8B46, 0x8B59, 0x8D08, 0x8D0A, 0x8E7C, 0x8E72, 0x8E87, 0x8E76, 0x8E6C, 0x8E7A, 0x8E74, 0x8F54, 0x8F4E, 0x8FAD, 0x908A, 0x908B, 0x91B1, 0x91AE, 0x93E1, 0x93D1, 0x93DF, 0x93C3, 0x93C8, 0x93DC, 0x93DD, 0x93D6, 0x93E2, 0x93CD, 0x93D8, 0x93E4, 0x93D7, 0x93E8, 0x95DC, 0x96B4, 0x96E3, 0x972A, 0x9727, 0x9761, 0x97DC, 0x97FB, 0x985E, /* Big5-HKSCS 0xC440 .. 0xC47E */ 0x9858, 0x985B, 0x98BC, 0x9945, 0x9949, 0x9A16, 0x9A19, 0x9B0D, 0x9BE8, 0x9BE7, 0x9BD6, 0x9BDB, 0x9D89, 0x9D61, 0x9D72, 0x9D6A, 0x9D6C, 0x9E92, 0x9E97, 0x9E93, 0x9EB4, 0x52F8, 0x56A8, 0x56B7, 0x56B6, 0x56B4, 0x56BC, 0x58E4, 0x5B40, 0x5B43, 0x5B7D, 0x5BF6, 0x5DC9, 0x61F8, 0x61FA, 0x6518, 0x6514, 0x6519, 0x66E6, 0x6727, 0x6AEC, 0x703E, 0x7030, 0x7032, 0x7210, 0x737B, 0x74CF, 0x7662, 0x7665, 0x7926, 0x792A, 0x792C, 0x792B, 0x7AC7, 0x7AF6, 0x7C4C, 0x7C43, 0x7C4D, 0x7CEF, 0x7CF0, 0x8FAE, 0x7E7D, 0x7E7C, /* Big5-HKSCS 0xC4A1 .. 0xC4FE */ 0x7E82, 0x7F4C, 0x8000, 0x81DA, 0x8266, 0x85FB, 0x85F9, 0x8611, 0x85FA, 0x8606, 0x860B, 0x8607, 0x860A, 0x8814, 0x8815, 0x8964, 0x89BA, 0x89F8, 0x8B70, 0x8B6C, 0x8B66, 0x8B6F, 0x8B5F, 0x8B6B, 0x8D0F, 0x8D0D, 0x8E89, 0x8E81, 0x8E85, 0x8E82, 0x91B4, 0x91CB, 0x9418, 0x9403, 0x93FD, 0x95E1, 0x9730, 0x98C4, 0x9952, 0x9951, 0x99A8, 0x9A2B, 0x9A30, 0x9A37, 0x9A35, 0x9C13, 0x9C0D, 0x9E79, 0x9EB5, 0x9EE8, 0x9F2F, 0x9F5F, 0x9F63, 0x9F61, 0x5137, 0x5138, 0x56C1, 0x56C0, 0x56C2, 0x5914, 0x5C6C, 0x5DCD, 0x61FC, 0x61FE, 0x651D, 0x651C, 0x6595, 0x66E9, 0x6AFB, 0x6B04, 0x6AFA, 0x6BB2, 0x704C, 0x721B, 0x72A7, 0x74D6, 0x74D4, 0x7669, 0x77D3, 0x7C50, 0x7E8F, 0x7E8C, 0x7FBC, 0x8617, 0x862D, 0x861A, 0x8823, 0x8822, 0x8821, 0x881F, 0x896A, 0x896C, 0x89BD, 0x8B74, /* Big5-HKSCS 0xC540 .. 0xC57E */ 0x8B77, 0x8B7D, 0x8D13, 0x8E8A, 0x8E8D, 0x8E8B, 0x8F5F, 0x8FAF, 0x91BA, 0x942E, 0x9433, 0x9435, 0x943A, 0x9438, 0x9432, 0x942B, 0x95E2, 0x9738, 0x9739, 0x9732, 0x97FF, 0x9867, 0x9865, 0x9957, 0x9A45, 0x9A43, 0x9A40, 0x9A3E, 0x9ACF, 0x9B54, 0x9B51, 0x9C2D, 0x9C25, 0x9DAF, 0x9DB4, 0x9DC2, 0x9DB8, 0x9E9D, 0x9EEF, 0x9F19, 0x9F5C, 0x9F66, 0x9F67, 0x513C, 0x513B, 0x56C8, 0x56CA, 0x56C9, 0x5B7F, 0x5DD4, 0x5DD2, 0x5F4E, 0x61FF, 0x6524, 0x6B0A, 0x6B61, 0x7051, 0x7058, 0x7380, 0x74E4, 0x758A, 0x766E, 0x766C, /* Big5-HKSCS 0xC5A1 .. 0xC5FE */ 0x79B3, 0x7C60, 0x7C5F, 0x807E, 0x807D, 0x81DF, 0x8972, 0x896F, 0x89FC, 0x8B80, 0x8D16, 0x8D17, 0x8E91, 0x8E93, 0x8F61, 0x9148, 0x9444, 0x9451, 0x9452, 0x973D, 0x973E, 0x97C3, 0x97C1, 0x986B, 0x9955, 0x9A55, 0x9A4D, 0x9AD2, 0x9B1A, 0x9C49, 0x9C31, 0x9C3E, 0x9C3B, 0x9DD3, 0x9DD7, 0x9F34, 0x9F6C, 0x9F6A, 0x9F94, 0x56CC, 0x5DD6, 0x6200, 0x6523, 0x652B, 0x652A, 0x66EC, 0x6B10, 0x74DA, 0x7ACA, 0x7C64, 0x7C63, 0x7C65, 0x7E93, 0x7E96, 0x7E94, 0x81E2, 0x8638, 0x863F, 0x8831, 0x8B8A, 0x9090, 0x908F, 0x9463, 0x9460, 0x9464, 0x9768, 0x986F, 0x995C, 0x9A5A, 0x9A5B, 0x9A57, 0x9AD3, 0x9AD4, 0x9AD1, 0x9C54, 0x9C57, 0x9C56, 0x9DE5, 0x9E9F, 0x9EF4, 0x56D1, 0x58E9, 0x652C, 0x705E, 0x7671, 0x7672, 0x77D7, 0x7F50, 0x7F88, 0x8836, 0x8839, 0x8862, 0x8B93, 0x8B92, /* Big5-HKSCS 0xC640 .. 0xC67E */ 0x8B96, 0x8277, 0x8D1B, 0x91C0, 0x946A, 0x9742, 0x9748, 0x9744, 0x97C6, 0x9870, 0x9A5F, 0x9B22, 0x9B58, 0x9C5F, 0x9DF9, 0x9DFA, 0x9E7C, 0x9E7D, 0x9F07, 0x9F77, 0x9F72, 0x5EF3, 0x6B16, 0x7063, 0x7C6C, 0x7C6E, 0x883B, 0x89C0, 0x8EA1, 0x91C1, 0x9472, 0x9470, 0x9871, 0x995E, 0x9AD6, 0x9B23, 0x9ECC, 0x7064, 0x77DA, 0x8B9A, 0x9477, 0x97C9, 0x9A62, 0x9A65, 0x7E9C, 0x8B9C, 0x8EAA, 0x91C5, 0x947D, 0x947E, 0x947C, 0x9C77, 0x9C78, 0x9EF7, 0x8C54, 0x947F, 0x9E1A, 0x7228, 0x9A6A, 0x9B31, 0x9E1B, 0x9E1E, 0x7C72, /* Big5-HKSCS 0xC6A1 .. 0xC6FE */ 0x2460, 0x2461, 0x2462, 0x2463, 0x2464, 0x2465, 0x2466, 0x2467, 0x2468, 0x2469, 0x2474, 0x2475, 0x2476, 0x2477, 0x2478, 0x2479, 0x247A, 0x247B, 0x247C, 0x247D, 0x2170, 0x2171, 0x2172, 0x2173, 0x2174, 0x2175, 0x2176, 0x2177, 0x2178, 0x2179, 0x4E36, 0x4E3F, 0x4E85, 0x4EA0, 0x5182, 0x5196, 0x51AB, 0x52F9, 0x5338, 0x5369, 0x53B6, 0x590A, 0x5B80, 0x5DDB, 0x2F33, 0x5E7F, 0xF6DF, 0x5F50, 0x5F61, 0x6534, 0xF6E3, 0x7592, 0xF6E5, 0x8FB5, 0xF6E7, 0x00A8, 0x02C6, 0x30FD, 0x30FE, 0x309D, 0x309E, 0xF6EE, 0xF6EF, 0x3005, 0x3006, 0x3007, 0x30FC, 0xFF3B, 0xFF3D, 0x273D, 0x3041, 0x3042, 0x3043, 0x3044, 0x3045, 0x3046, 0x3047, 0x3048, 0x3049, 0x304A, 0x304B, 0x304C, 0x304D, 0x304E, 0x304F, 0x3050, 0x3051, 0x3052, 0x3053, 0x3054, 0x3055, 0x3056, 0x3057, 0x3058, /* Big5-HKSCS 0xC740 .. 0xC77E */ 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, /* Big5-HKSCS 0xC7A1 .. 0xC7FE */ 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, 0x0410, 0x0411, 0x0412, 0x0413, 0x0414, 0x0415, 0x0401, 0x0416, 0x0417, 0x0418, 0x0419, 0x041A, /* Big5-HKSCS 0xC840 .. 0xC87E */ 0x041B, 0x041C, 0x041D, 0x041E, 0x041F, 0x0420, 0x0421, 0x0422, 0x0423, 0x0424, 0x0425, 0x0426, 0x0427, 0x0428, 0x0429, 0x042A, 0x042B, 0x042C, 0x042D, 0x042E, 0x042F, 0x0430, 0x0431, 0x0432, 0x0433, 0x0434, 0x0435, 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, 0x21E7, 0x21B8, 0x21B9, 0xF7E5, 0xF7E6, 0x4E5A, 0xF7E8, 0x5202, 0xF7EA, /* Big5-HKSCS 0xC8A1 .. 0xC8FE */ 0xF7EB, 0x5188, 0xF7ED, 0xF7EE, 0xF7EF, 0xF7F0, 0xF7F1, 0xF7F2, 0xF7F3, 0xF7F4, 0xF7F5, 0xF7F6, 0xF7F7, 0xF7F8, 0xF7F9, 0xF7FA, 0xF7FB, 0xF7FC, 0xF7FD, 0xF7FE, 0xF7FF, 0xF800, 0xF801, 0xF802, 0xF803, 0xF804, 0xF805, 0xF806, 0xF807, 0xF808, 0xF809, 0xF80A, 0xF80B, 0xF80C, 0xF80D, 0xF80E, 0xF80F, 0xF810, 0xF811, 0xF812, 0xF813, 0xF814, 0xF815, 0xF816, 0xFFE2, 0xFFE4, 0xFF07, 0xFF02, 0x3231, 0x2116, 0x2121, 0x309B, 0x309C, 0x2E80, 0x2E84, 0x2E86, 0x2E87, 0x2E88, 0x2E8A, 0x2E8C, 0x2E8D, 0x2E95, 0x2E9C, 0x2E9D, 0x2EA5, 0x2EA7, 0x2EAA, 0x2EAC, 0x2EAE, 0x2EB6, 0x2EBC, 0x2EBE, 0x2EC6, 0x2ECA, 0x2ECC, 0x2ECD, 0x2ECF, 0x2ED6, 0x2ED7, 0x2EDE, 0x2EE3, 0xF83C, 0xF83D, 0xF83E, 0x0283, 0x0250, 0x025B, 0x0254, 0x0275, 0x0153, 0x00F8, 0x014B, 0x028A, 0x026A, /* Big5-HKSCS 0xC940 .. 0xC97E */ 0x4E42, 0x4E5C, 0x51F5, 0x531A, 0x5382, 0x4E07, 0x4E0C, 0x4E47, 0x4E8D, 0x56D7, 0xFA0C, 0x5C6E, 0x5F73, 0x4E0F, 0x5187, 0x4E0E, 0x4E2E, 0x4E93, 0x4EC2, 0x4EC9, 0x4EC8, 0x5198, 0x52FC, 0x536C, 0x53B9, 0x5720, 0x5903, 0x592C, 0x5C10, 0x5DFF, 0x65E1, 0x6BB3, 0x6BCC, 0x6C14, 0x723F, 0x4E31, 0x4E3C, 0x4EE8, 0x4EDC, 0x4EE9, 0x4EE1, 0x4EDD, 0x4EDA, 0x520C, 0x531C, 0x534C, 0x5722, 0x5723, 0x5917, 0x592F, 0x5B81, 0x5B84, 0x5C12, 0x5C3B, 0x5C74, 0x5C73, 0x5E04, 0x5E80, 0x5E82, 0x5FC9, 0x6209, 0x6250, 0x6C15, /* Big5-HKSCS 0xC9A1 .. 0xC9FE */ 0x6C36, 0x6C43, 0x6C3F, 0x6C3B, 0x72AE, 0x72B0, 0x738A, 0x79B8, 0x808A, 0x961E, 0x4F0E, 0x4F18, 0x4F2C, 0x4EF5, 0x4F14, 0x4EF1, 0x4F00, 0x4EF7, 0x4F08, 0x4F1D, 0x4F02, 0x4F05, 0x4F22, 0x4F13, 0x4F04, 0x4EF4, 0x4F12, 0x51B1, 0x5213, 0x5209, 0x5210, 0x52A6, 0x5322, 0x531F, 0x534D, 0x538A, 0x5407, 0x56E1, 0x56DF, 0x572E, 0x572A, 0x5734, 0x593C, 0x5980, 0x597C, 0x5985, 0x597B, 0x597E, 0x5977, 0x597F, 0x5B56, 0x5C15, 0x5C25, 0x5C7C, 0x5C7A, 0x5C7B, 0x5C7E, 0x5DDF, 0x5E75, 0x5E84, 0x5F02, 0x5F1A, 0x5F74, 0x5FD5, 0x5FD4, 0x5FCF, 0x625C, 0x625E, 0x6264, 0x6261, 0x6266, 0x6262, 0x6259, 0x6260, 0x625A, 0x6265, 0x65EF, 0x65EE, 0x673E, 0x6739, 0x6738, 0x673B, 0x673A, 0x673F, 0x673C, 0x6733, 0x6C18, 0x6C46, 0x6C52, 0x6C5C, 0x6C4F, 0x6C4A, 0x6C54, 0x6C4B, /* Big5-HKSCS 0xCA40 .. 0xCA7E */ 0x6C4C, 0x7071, 0x725E, 0x72B4, 0x72B5, 0x738E, 0x752A, 0x767F, 0x7A75, 0x7F51, 0x8278, 0x827C, 0x8280, 0x827D, 0x827F, 0x864D, 0x897E, 0x9099, 0x9097, 0x9098, 0x909B, 0x9094, 0x9622, 0x9624, 0x9620, 0x9623, 0x4F56, 0x4F3B, 0x4F62, 0x4F49, 0x4F53, 0x4F64, 0x4F3E, 0x4F67, 0x4F52, 0x4F5F, 0x4F41, 0x4F58, 0x4F2D, 0x4F33, 0x4F3F, 0x4F61, 0x518F, 0x51B9, 0x521C, 0x521E, 0x5221, 0x52AD, 0x52AE, 0x5309, 0x5363, 0x5372, 0x538E, 0x538F, 0x5430, 0x5437, 0x542A, 0x5454, 0x5445, 0x5419, 0x541C, 0x5425, 0x5418, /* Big5-HKSCS 0xCAA1 .. 0xCAFE */ 0x543D, 0x544F, 0x5441, 0x5428, 0x5424, 0x5447, 0x56EE, 0x56E7, 0x56E5, 0x5741, 0x5745, 0x574C, 0x5749, 0x574B, 0x5752, 0x5906, 0x5940, 0x59A6, 0x5998, 0x59A0, 0x5997, 0x598E, 0x59A2, 0x5990, 0x598F, 0x59A7, 0x59A1, 0x5B8E, 0x5B92, 0x5C28, 0x5C2A, 0x5C8D, 0x5C8F, 0x5C88, 0x5C8B, 0x5C89, 0x5C92, 0x5C8A, 0x5C86, 0x5C93, 0x5C95, 0x5DE0, 0x5E0A, 0x5E0E, 0x5E8B, 0x5E89, 0x5E8C, 0x5E88, 0x5E8D, 0x5F05, 0x5F1D, 0x5F78, 0x5F76, 0x5FD2, 0x5FD1, 0x5FD0, 0x5FED, 0x5FE8, 0x5FEE, 0x5FF3, 0x5FE1, 0x5FE4, 0x5FE3, 0x5FFA, 0x5FEF, 0x5FF7, 0x5FFB, 0x6000, 0x5FF4, 0x623A, 0x6283, 0x628C, 0x628E, 0x628F, 0x6294, 0x6287, 0x6271, 0x627B, 0x627A, 0x6270, 0x6281, 0x6288, 0x6277, 0x627D, 0x6272, 0x6274, 0x6537, 0x65F0, 0x65F4, 0x65F3, 0x65F2, 0x65F5, 0x6745, 0x6747, /* Big5-HKSCS 0xCB40 .. 0xCB7E */ 0x6759, 0x6755, 0x674C, 0x6748, 0x675D, 0x674D, 0x675A, 0x674B, 0x6BD0, 0x6C19, 0x6C1A, 0x6C78, 0x6C67, 0x6C6B, 0x6C84, 0x6C8B, 0x6C8F, 0x6C71, 0x6C6F, 0x6C69, 0x6C9A, 0x6C6D, 0x6C87, 0x6C95, 0x6C9C, 0x6C66, 0x6C73, 0x6C65, 0x6C7B, 0x6C8E, 0x7074, 0x707A, 0x7263, 0x72BF, 0x72BD, 0x72C3, 0x72C6, 0x72C1, 0x72BA, 0x72C5, 0x7395, 0x7397, 0x7393, 0x7394, 0x7392, 0x753A, 0x7539, 0x7594, 0x7595, 0x7681, 0x793D, 0x8034, 0x8095, 0x8099, 0x8090, 0x8092, 0x809C, 0x8290, 0x828F, 0x8285, 0x828E, 0x8291, 0x8293, /* Big5-HKSCS 0xCBA1 .. 0xCBFE */ 0x828A, 0x8283, 0x8284, 0x8C78, 0x8FC9, 0x8FBF, 0x909F, 0x90A1, 0x90A5, 0x909E, 0x90A7, 0x90A0, 0x9630, 0x9628, 0x962F, 0x962D, 0x4E33, 0x4F98, 0x4F7C, 0x4F85, 0x4F7D, 0x4F80, 0x4F87, 0x4F76, 0x4F74, 0x4F89, 0x4F84, 0x4F77, 0x4F4C, 0x4F97, 0x4F6A, 0x4F9A, 0x4F79, 0x4F81, 0x4F78, 0x4F90, 0x4F9C, 0x4F94, 0x4F9E, 0x4F92, 0x4F82, 0x4F95, 0x4F6B, 0x4F6E, 0x519E, 0x51BC, 0x51BE, 0x5235, 0x5232, 0x5233, 0x5246, 0x5231, 0x52BC, 0x530A, 0x530B, 0x533C, 0x5392, 0x5394, 0x5487, 0x547F, 0x5481, 0x5491, 0x5482, 0x5488, 0x546B, 0x547A, 0x547E, 0x5465, 0x546C, 0x5474, 0x5466, 0x548D, 0x546F, 0x5461, 0x5460, 0x5498, 0x5463, 0x5467, 0x5464, 0x56F7, 0x56F9, 0x576F, 0x5772, 0x576D, 0x576B, 0x5771, 0x5770, 0x5776, 0x5780, 0x5775, 0x577B, 0x5773, 0x5774, 0x5762, /* Big5-HKSCS 0xCC40 .. 0xCC7E */ 0x5768, 0x577D, 0x590C, 0x5945, 0x59B5, 0x59BA, 0x59CF, 0x59CE, 0x59B2, 0x59CC, 0x59C1, 0x59B6, 0x59BC, 0x59C3, 0x59D6, 0x59B1, 0x59BD, 0x59C0, 0x59C8, 0x59B4, 0x59C7, 0x5B62, 0x5B65, 0x5B93, 0x5B95, 0x5C44, 0x5C47, 0x5CAE, 0x5CA4, 0x5CA0, 0x5CB5, 0x5CAF, 0x5CA8, 0x5CAC, 0x5C9F, 0x5CA3, 0x5CAD, 0x5CA2, 0x5CAA, 0x5CA7, 0x5C9D, 0x5CA5, 0x5CB6, 0x5CB0, 0x5CA6, 0x5E17, 0x5E14, 0x5E19, 0x5F28, 0x5F22, 0x5F23, 0x5F24, 0x5F54, 0x5F82, 0x5F7E, 0x5F7D, 0x5FDE, 0x5FE5, 0x602D, 0x6026, 0x6019, 0x6032, 0x600B, /* Big5-HKSCS 0xCCA1 .. 0xCCFE */ 0x6034, 0x600A, 0x6017, 0x6033, 0x601A, 0x601E, 0x602C, 0x6022, 0x600D, 0x6010, 0x602E, 0x6013, 0x6011, 0x600C, 0x6009, 0x601C, 0x6214, 0x623D, 0x62AD, 0x62B4, 0x62D1, 0x62BE, 0x62AA, 0x62B6, 0x62CA, 0x62AE, 0x62B3, 0x62AF, 0x62BB, 0x62A9, 0x62B0, 0x62B8, 0x653D, 0x65A8, 0x65BB, 0x6609, 0x65FC, 0x6604, 0x6612, 0x6608, 0x65FB, 0x6603, 0x660B, 0x660D, 0x6605, 0x65FD, 0x6611, 0x6610, 0x66F6, 0x670A, 0x6785, 0x676C, 0x678E, 0x6792, 0x6776, 0x677B, 0x6798, 0x6786, 0x6784, 0x6774, 0x678D, 0x678C, 0x677A, 0x679F, 0x6791, 0x6799, 0x6783, 0x677D, 0x6781, 0x6778, 0x6779, 0x6794, 0x6B25, 0x6B80, 0x6B7E, 0x6BDE, 0x6C1D, 0x6C93, 0x6CEC, 0x6CEB, 0x6CEE, 0x6CD9, 0x6CB6, 0x6CD4, 0x6CAD, 0x6CE7, 0x6CB7, 0x6CD0, 0x6CC2, 0x6CBA, 0x6CC3, 0x6CC6, 0x6CED, 0x6CF2, /* Big5-HKSCS 0xCD40 .. 0xCD7E */ 0x6CD2, 0x6CDD, 0x6CB4, 0x6C8A, 0x6C9D, 0x6C80, 0x6CDE, 0x6CC0, 0x6D30, 0x6CCD, 0x6CC7, 0x6CB0, 0x6CF9, 0x6CCF, 0x6CE9, 0x6CD1, 0x7094, 0x7098, 0x7085, 0x7093, 0x7086, 0x7084, 0x7091, 0x7096, 0x7082, 0x709A, 0x7083, 0x726A, 0x72D6, 0x72CB, 0x72D8, 0x72C9, 0x72DC, 0x72D2, 0x72D4, 0x72DA, 0x72CC, 0x72D1, 0x73A4, 0x73A1, 0x73AD, 0x73A6, 0x73A2, 0x73A0, 0x73AC, 0x739D, 0x74DD, 0x74E8, 0x753F, 0x7540, 0x753E, 0x758C, 0x7598, 0x76AF, 0x76F3, 0x76F1, 0x76F0, 0x76F5, 0x77F8, 0x77FC, 0x77F9, 0x77FB, 0x77FA, /* Big5-HKSCS 0xCDA1 .. 0xCDFE */ 0x77F7, 0x7942, 0x793F, 0x79C5, 0x7A78, 0x7A7B, 0x7AFB, 0x7C75, 0x7CFD, 0x8035, 0x808F, 0x80AE, 0x80A3, 0x80B8, 0x80B5, 0x80AD, 0x8220, 0x82A0, 0x82C0, 0x82AB, 0x829A, 0x8298, 0x829B, 0x82B5, 0x82A7, 0x82AE, 0x82BC, 0x829E, 0x82BA, 0x82B4, 0x82A8, 0x82A1, 0x82A9, 0x82C2, 0x82A4, 0x82C3, 0x82B6, 0x82A2, 0x8670, 0x866F, 0x866D, 0x866E, 0x8C56, 0x8FD2, 0x8FCB, 0x8FD3, 0x8FCD, 0x8FD6, 0x8FD5, 0x8FD7, 0x90B2, 0x90B4, 0x90AF, 0x90B3, 0x90B0, 0x9639, 0x963D, 0x963C, 0x963A, 0x9643, 0x4FCD, 0x4FC5, 0x4FD3, 0x4FB2, 0x4FC9, 0x4FCB, 0x4FC1, 0x4FD4, 0x4FDC, 0x4FD9, 0x4FBB, 0x4FB3, 0x4FDB, 0x4FC7, 0x4FD6, 0x4FBA, 0x4FC0, 0x4FB9, 0x4FEC, 0x5244, 0x5249, 0x52C0, 0x52C2, 0x533D, 0x537C, 0x5397, 0x5396, 0x5399, 0x5398, 0x54BA, 0x54A1, 0x54AD, 0x54A5, 0x54CF, /* Big5-HKSCS 0xCE40 .. 0xCE7E */ 0x54C3, 0x830D, 0x54B7, 0x54AE, 0x54D6, 0x54B6, 0x54C5, 0x54C6, 0x54A0, 0x5470, 0x54BC, 0x54A2, 0x54BE, 0x5472, 0x54DE, 0x54B0, 0x57B5, 0x579E, 0x579F, 0x57A4, 0x578C, 0x5797, 0x579D, 0x579B, 0x5794, 0x5798, 0x578F, 0x5799, 0x57A5, 0x579A, 0x5795, 0x58F4, 0x590D, 0x5953, 0x59E1, 0x59DE, 0x59EE, 0x5A00, 0x59F1, 0x59DD, 0x59FA, 0x59FD, 0x59FC, 0x59F6, 0x59E4, 0x59F2, 0x59F7, 0x59DB, 0x59E9, 0x59F3, 0x59F5, 0x59E0, 0x59FE, 0x59F4, 0x59ED, 0x5BA8, 0x5C4C, 0x5CD0, 0x5CD8, 0x5CCC, 0x5CD7, 0x5CCB, 0x5CDB, /* Big5-HKSCS 0xCEA1 .. 0xCEFE */ 0x5CDE, 0x5CDA, 0x5CC9, 0x5CC7, 0x5CCA, 0x5CD6, 0x5CD3, 0x5CD4, 0x5CCF, 0x5CC8, 0x5CC6, 0x5CCE, 0x5CDF, 0x5CF8, 0x5DF9, 0x5E21, 0x5E22, 0x5E23, 0x5E20, 0x5E24, 0x5EB0, 0x5EA4, 0x5EA2, 0x5E9B, 0x5EA3, 0x5EA5, 0x5F07, 0x5F2E, 0x5F56, 0x5F86, 0x6037, 0x6039, 0x6054, 0x6072, 0x605E, 0x6045, 0x6053, 0x6047, 0x6049, 0x605B, 0x604C, 0x6040, 0x6042, 0x605F, 0x6024, 0x6044, 0x6058, 0x6066, 0x606E, 0x6242, 0x6243, 0x62CF, 0x630D, 0x630B, 0x62F5, 0x630E, 0x6303, 0x62EB, 0x62F9, 0x630F, 0x630C, 0x62F8, 0x62F6, 0x6300, 0x6313, 0x6314, 0x62FA, 0x6315, 0x62FB, 0x62F0, 0x6541, 0x6543, 0x65AA, 0x65BF, 0x6636, 0x6621, 0x6632, 0x6635, 0x661C, 0x6626, 0x6622, 0x6633, 0x662B, 0x663A, 0x661D, 0x6634, 0x6639, 0x662E, 0x670F, 0x6710, 0x67C1, 0x67F2, 0x67C8, 0x67BA, /* Big5-HKSCS 0xCF40 .. 0xCF7E */ 0x67DC, 0x67BB, 0x67F8, 0x67D8, 0x67C0, 0x67B7, 0x67C5, 0x67EB, 0x67E4, 0x67DF, 0x67B5, 0x67CD, 0x67B3, 0x67F7, 0x67F6, 0x67EE, 0x67E3, 0x67C2, 0x67B9, 0x67CE, 0x67E7, 0x67F0, 0x67B2, 0x67FC, 0x67C6, 0x67ED, 0x67CC, 0x67AE, 0x67E6, 0x67DB, 0x67FA, 0x67C9, 0x67CA, 0x67C3, 0x67EA, 0x67CB, 0x6B28, 0x6B82, 0x6B84, 0x6BB6, 0x6BD6, 0x6BD8, 0x6BE0, 0x6C20, 0x6C21, 0x6D28, 0x6D34, 0x6D2D, 0x6D1F, 0x6D3C, 0x6D3F, 0x6D12, 0x6D0A, 0x6CDA, 0x6D33, 0x6D04, 0x6D19, 0x6D3A, 0x6D1A, 0x6D11, 0x6D00, 0x6D1D, 0x6D42, /* Big5-HKSCS 0xCFA1 .. 0xCFFE */ 0x6D01, 0x6D18, 0x6D37, 0x6D03, 0x6D0F, 0x6D40, 0x6D07, 0x6D20, 0x6D2C, 0x6D08, 0x6D22, 0x6D09, 0x6D10, 0x70B7, 0x709F, 0x70BE, 0x70B1, 0x70B0, 0x70A1, 0x70B4, 0x70B5, 0x70A9, 0x7241, 0x7249, 0x724A, 0x726C, 0x7270, 0x7273, 0x726E, 0x72CA, 0x72E4, 0x72E8, 0x72EB, 0x72DF, 0x72EA, 0x72E6, 0x72E3, 0x7385, 0x73CC, 0x73C2, 0x73C8, 0x73C5, 0x73B9, 0x73B6, 0x73B5, 0x73B4, 0x73EB, 0x73BF, 0x73C7, 0x73BE, 0x73C3, 0x73C6, 0x73B8, 0x73CB, 0x74EC, 0x74EE, 0x752E, 0x7547, 0x7548, 0x75A7, 0x75AA, 0x7679, 0x76C4, 0x7708, 0x7703, 0x7704, 0x7705, 0x770A, 0x76F7, 0x76FB, 0x76FA, 0x77E7, 0x77E8, 0x7806, 0x7811, 0x7812, 0x7805, 0x7810, 0x780F, 0x780E, 0x7809, 0x7803, 0x7813, 0x794A, 0x794C, 0x794B, 0x7945, 0x7944, 0x79D5, 0x79CD, 0x79CF, 0x79D6, 0x79CE, 0x7A80, /* Big5-HKSCS 0xD040 .. 0xD07E */ 0x7A7E, 0x7AD1, 0x7B00, 0x7B01, 0x7C7A, 0x7C78, 0x7C79, 0x7C7F, 0x7C80, 0x7C81, 0x7D03, 0x7D08, 0x7D01, 0x7F58, 0x7F91, 0x7F8D, 0x7FBE, 0x8007, 0x800E, 0x800F, 0x8014, 0x8037, 0x80D8, 0x80C7, 0x80E0, 0x80D1, 0x80C8, 0x80C2, 0x80D0, 0x80C5, 0x80E3, 0x80D9, 0x80DC, 0x80CA, 0x80D5, 0x80C9, 0x80CF, 0x80D7, 0x80E6, 0x80CD, 0x81FF, 0x8221, 0x8294, 0x82D9, 0x82FE, 0x82F9, 0x8307, 0x82E8, 0x8300, 0x82D5, 0x833A, 0x82EB, 0x82D6, 0x82F4, 0x82EC, 0x82E1, 0x82F2, 0x82F5, 0x830C, 0x82FB, 0x82F6, 0x82F0, 0x82EA, /* Big5-HKSCS 0xD0A1 .. 0xD0FE */ 0x82E4, 0x82E0, 0x82FA, 0x82F3, 0x82ED, 0x8677, 0x8674, 0x867C, 0x8673, 0x8841, 0x884E, 0x8867, 0x886A, 0x8869, 0x89D3, 0x8A04, 0x8A07, 0x8D72, 0x8FE3, 0x8FE1, 0x8FEE, 0x8FE0, 0x90F1, 0x90BD, 0x90BF, 0x90D5, 0x90C5, 0x90BE, 0x90C7, 0x90CB, 0x90C8, 0x91D4, 0x91D3, 0x9654, 0x964F, 0x9651, 0x9653, 0x964A, 0x964E, 0x501E, 0x5005, 0x5007, 0x5013, 0x5022, 0x5030, 0x501B, 0x4FF5, 0x4FF4, 0x5033, 0x5037, 0x502C, 0x4FF6, 0x4FF7, 0x5017, 0x501C, 0x5020, 0x5027, 0x5035, 0x502F, 0x5031, 0x500E, 0x515A, 0x5194, 0x5193, 0x51CA, 0x51C4, 0x51C5, 0x51C8, 0x51CE, 0x5261, 0x525A, 0x5252, 0x525E, 0x525F, 0x5255, 0x5262, 0x52CD, 0x530E, 0x539E, 0x5526, 0x54E2, 0x5517, 0x5512, 0x54E7, 0x54F3, 0x54E4, 0x551A, 0x54FF, 0x5504, 0x5508, 0x54EB, 0x5511, 0x5505, 0x54F1, /* Big5-HKSCS 0xD140 .. 0xD17E */ 0x550A, 0x54FB, 0x54F7, 0x54F8, 0x54E0, 0x550E, 0x5503, 0x550B, 0x5701, 0x5702, 0x57CC, 0x5832, 0x57D5, 0x57D2, 0x57BA, 0x57C6, 0x57BD, 0x57BC, 0x57B8, 0x57B6, 0x57BF, 0x57C7, 0x57D0, 0x57B9, 0x57C1, 0x590E, 0x594A, 0x5A19, 0x5A16, 0x5A2D, 0x5A2E, 0x5A15, 0x5A0F, 0x5A17, 0x5A0A, 0x5A1E, 0x5A33, 0x5B6C, 0x5BA7, 0x5BAD, 0x5BAC, 0x5C03, 0x5C56, 0x5C54, 0x5CEC, 0x5CFF, 0x5CEE, 0x5CF1, 0x5CF7, 0x5D00, 0x5CF9, 0x5E29, 0x5E28, 0x5EA8, 0x5EAE, 0x5EAA, 0x5EAC, 0x5F33, 0x5F30, 0x5F67, 0x605D, 0x605A, 0x6067, /* Big5-HKSCS 0xD1A1 .. 0xD1FE */ 0x6041, 0x60A2, 0x6088, 0x6080, 0x6092, 0x6081, 0x609D, 0x6083, 0x6095, 0x609B, 0x6097, 0x6087, 0x609C, 0x608E, 0x6219, 0x6246, 0x62F2, 0x6310, 0x6356, 0x632C, 0x6344, 0x6345, 0x6336, 0x6343, 0x63E4, 0x6339, 0x634B, 0x634A, 0x633C, 0x6329, 0x6341, 0x6334, 0x6358, 0x6354, 0x6359, 0x632D, 0x6347, 0x6333, 0x635A, 0x6351, 0x6338, 0x6357, 0x6340, 0x6348, 0x654A, 0x6546, 0x65C6, 0x65C3, 0x65C4, 0x65C2, 0x664A, 0x665F, 0x6647, 0x6651, 0x6712, 0x6713, 0x681F, 0x681A, 0x6849, 0x6832, 0x6833, 0x683B, 0x684B, 0x684F, 0x6816, 0x6831, 0x681C, 0x6835, 0x682B, 0x682D, 0x682F, 0x684E, 0x6844, 0x6834, 0x681D, 0x6812, 0x6814, 0x6826, 0x6828, 0x682E, 0x684D, 0x683A, 0x6825, 0x6820, 0x6B2C, 0x6B2F, 0x6B2D, 0x6B31, 0x6B34, 0x6B6D, 0x8082, 0x6B88, 0x6BE6, 0x6BE4, /* Big5-HKSCS 0xD240 .. 0xD27E */ 0x6BE8, 0x6BE3, 0x6BE2, 0x6BE7, 0x6C25, 0x6D7A, 0x6D63, 0x6D64, 0x6D76, 0x6D0D, 0x6D61, 0x6D92, 0x6D58, 0x6D62, 0x6D6D, 0x6D6F, 0x6D91, 0x6D8D, 0x6DEF, 0x6D7F, 0x6D86, 0x6D5E, 0x6D67, 0x6D60, 0x6D97, 0x6D70, 0x6D7C, 0x6D5F, 0x6D82, 0x6D98, 0x6D2F, 0x6D68, 0x6D8B, 0x6D7E, 0x6D80, 0x6D84, 0x6D16, 0x6D83, 0x6D7B, 0x6D7D, 0x6D75, 0x6D90, 0x70DC, 0x70D3, 0x70D1, 0x70DD, 0x70CB, 0x7F39, 0x70E2, 0x70D7, 0x70D2, 0x70DE, 0x70E0, 0x70D4, 0x70CD, 0x70C5, 0x70C6, 0x70C7, 0x70DA, 0x70CE, 0x70E1, 0x7242, 0x7278, /* Big5-HKSCS 0xD2A1 .. 0xD2FE */ 0x7277, 0x7276, 0x7300, 0x72FA, 0x72F4, 0x72FE, 0x72F6, 0x72F3, 0x72FB, 0x7301, 0x73D3, 0x73D9, 0x73E5, 0x73D6, 0x73BC, 0x73E7, 0x73E3, 0x73E9, 0x73DC, 0x73D2, 0x73DB, 0x73D4, 0x73DD, 0x73DA, 0x73D7, 0x73D8, 0x73E8, 0x74DE, 0x74DF, 0x74F4, 0x74F5, 0x7521, 0x755B, 0x755F, 0x75B0, 0x75C1, 0x75BB, 0x75C4, 0x75C0, 0x75BF, 0x75B6, 0x75BA, 0x768A, 0x76C9, 0x771D, 0x771B, 0x7710, 0x7713, 0x7712, 0x7723, 0x7711, 0x7715, 0x7719, 0x771A, 0x7722, 0x7727, 0x7823, 0x782C, 0x7822, 0x7835, 0x782F, 0x7828, 0x782E, 0x782B, 0x7821, 0x7829, 0x7833, 0x782A, 0x7831, 0x7954, 0x795B, 0x794F, 0x795C, 0x7953, 0x7952, 0x7951, 0x79EB, 0x79EC, 0x79E0, 0x79EE, 0x79ED, 0x79EA, 0x79DC, 0x79DE, 0x79DD, 0x7A86, 0x7A89, 0x7A85, 0x7A8B, 0x7A8C, 0x7A8A, 0x7A87, 0x7AD8, 0x7B10, /* Big5-HKSCS 0xD340 .. 0xD37E */ 0x7B04, 0x7B13, 0x7B05, 0x7B0F, 0x7B08, 0x7B0A, 0x7B0E, 0x7B09, 0x7B12, 0x7C84, 0x7C91, 0x7C8A, 0x7C8C, 0x7C88, 0x7C8D, 0x7C85, 0x7D1E, 0x7D1D, 0x7D11, 0x7D0E, 0x7D18, 0x7D16, 0x7D13, 0x7D1F, 0x7D12, 0x7D0F, 0x7D0C, 0x7F5C, 0x7F61, 0x7F5E, 0x7F60, 0x7F5D, 0x7F5B, 0x7F96, 0x7F92, 0x7FC3, 0x7FC2, 0x7FC0, 0x8016, 0x803E, 0x8039, 0x80FA, 0x80F2, 0x80F9, 0x80F5, 0x8101, 0x80FB, 0x8100, 0x8201, 0x822F, 0x8225, 0x8333, 0x832D, 0x8344, 0x8319, 0x8351, 0x8325, 0x8356, 0x833F, 0x8341, 0x8326, 0x831C, 0x8322, /* Big5-HKSCS 0xD3A1 .. 0xD3FE */ 0x8342, 0x834E, 0x831B, 0x832A, 0x8308, 0x833C, 0x834D, 0x8316, 0x8324, 0x8320, 0x8337, 0x832F, 0x8329, 0x8347, 0x8345, 0x834C, 0x8353, 0x831E, 0x832C, 0x834B, 0x8327, 0x8348, 0x8653, 0x8652, 0x86A2, 0x86A8, 0x8696, 0x868D, 0x8691, 0x869E, 0x8687, 0x8697, 0x8686, 0x868B, 0x869A, 0x8685, 0x86A5, 0x8699, 0x86A1, 0x86A7, 0x8695, 0x8698, 0x868E, 0x869D, 0x8690, 0x8694, 0x8843, 0x8844, 0x886D, 0x8875, 0x8876, 0x8872, 0x8880, 0x8871, 0x887F, 0x886F, 0x8883, 0x887E, 0x8874, 0x887C, 0x8A12, 0x8C47, 0x8C57, 0x8C7B, 0x8CA4, 0x8CA3, 0x8D76, 0x8D78, 0x8DB5, 0x8DB7, 0x8DB6, 0x8ED1, 0x8ED3, 0x8FFE, 0x8FF5, 0x9002, 0x8FFF, 0x8FFB, 0x9004, 0x8FFC, 0x8FF6, 0x90D6, 0x90E0, 0x90D9, 0x90DA, 0x90E3, 0x90DF, 0x90E5, 0x90D8, 0x90DB, 0x90D7, 0x90DC, 0x90E4, 0x9150, /* Big5-HKSCS 0xD440 .. 0xD47E */ 0x914E, 0x914F, 0x91D5, 0x91E2, 0x91DA, 0x965C, 0x965F, 0x96BC, 0x98E3, 0x9ADF, 0x9B2F, 0x4E7F, 0x5070, 0x506A, 0x5061, 0x505E, 0x5060, 0x5053, 0x504B, 0x505D, 0x5072, 0x5048, 0x504D, 0x5041, 0x505B, 0x504A, 0x5062, 0x5015, 0x5045, 0x505F, 0x5069, 0x506B, 0x5063, 0x5064, 0x5046, 0x5040, 0x506E, 0x5073, 0x5057, 0x5051, 0x51D0, 0x526B, 0x526D, 0x526C, 0x526E, 0x52D6, 0x52D3, 0x532D, 0x539C, 0x5575, 0x5576, 0x553C, 0x554D, 0x5550, 0x5534, 0x552A, 0x5551, 0x5562, 0x5536, 0x5535, 0x5530, 0x5552, 0x5545, /* Big5-HKSCS 0xD4A1 .. 0xD4FE */ 0x550C, 0x5532, 0x5565, 0x554E, 0x5539, 0x5548, 0x552D, 0x553B, 0x5540, 0x554B, 0x570A, 0x5707, 0x57FB, 0x5814, 0x57E2, 0x57F6, 0x57DC, 0x57F4, 0x5800, 0x57ED, 0x57FD, 0x5808, 0x57F8, 0x580B, 0x57F3, 0x57CF, 0x5807, 0x57EE, 0x57E3, 0x57F2, 0x57E5, 0x57EC, 0x57E1, 0x580E, 0x57FC, 0x5810, 0x57E7, 0x5801, 0x580C, 0x57F1, 0x57E9, 0x57F0, 0x580D, 0x5804, 0x595C, 0x5A60, 0x5A58, 0x5A55, 0x5A67, 0x5A5E, 0x5A38, 0x5A35, 0x5A6D, 0x5A50, 0x5A5F, 0x5A65, 0x5A6C, 0x5A53, 0x5A64, 0x5A57, 0x5A43, 0x5A5D, 0x5A52, 0x5A44, 0x5A5B, 0x5A48, 0x5A8E, 0x5A3E, 0x5A4D, 0x5A39, 0x5A4C, 0x5A70, 0x5A69, 0x5A47, 0x5A51, 0x5A56, 0x5A42, 0x5A5C, 0x5B72, 0x5B6E, 0x5BC1, 0x5BC0, 0x5C59, 0x5D1E, 0x5D0B, 0x5D1D, 0x5D1A, 0x5D20, 0x5D0C, 0x5D28, 0x5D0D, 0x5D26, 0x5D25, 0x5D0F, /* Big5-HKSCS 0xD540 .. 0xD57E */ 0x5D30, 0x5D12, 0x5D23, 0x5D1F, 0x5D2E, 0x5E3E, 0x5E34, 0x5EB1, 0x5EB4, 0x5EB9, 0x5EB2, 0x5EB3, 0x5F36, 0x5F38, 0x5F9B, 0x5F96, 0x5F9F, 0x608A, 0x6090, 0x6086, 0x60BE, 0x60B0, 0x60BA, 0x60D3, 0x60D4, 0x60CF, 0x60E4, 0x60D9, 0x60DD, 0x60C8, 0x60B1, 0x60DB, 0x60B7, 0x60CA, 0x60BF, 0x60C3, 0x60CD, 0x60C0, 0x6332, 0x6365, 0x638A, 0x6382, 0x637D, 0x63BD, 0x639E, 0x63AD, 0x639D, 0x6397, 0x63AB, 0x638E, 0x636F, 0x6387, 0x6390, 0x636E, 0x63AF, 0x6375, 0x639C, 0x636D, 0x63AE, 0x637C, 0x63A4, 0x633B, 0x639F, /* Big5-HKSCS 0xD5A1 .. 0xD5FE */ 0x6378, 0x6385, 0x6381, 0x6391, 0x638D, 0x6370, 0x6553, 0x65CD, 0x6665, 0x6661, 0x665B, 0x6659, 0x665C, 0x6662, 0x6718, 0x6879, 0x6887, 0x6890, 0x689C, 0x686D, 0x686E, 0x68AE, 0x68AB, 0x6956, 0x686F, 0x68A3, 0x68AC, 0x68A9, 0x6875, 0x6874, 0x68B2, 0x688F, 0x6877, 0x6892, 0x687C, 0x686B, 0x6872, 0x68AA, 0x6880, 0x6871, 0x687E, 0x689B, 0x6896, 0x688B, 0x68A0, 0x6889, 0x68A4, 0x6878, 0x687B, 0x6891, 0x688C, 0x688A, 0x687D, 0x6B36, 0x6B33, 0x6B37, 0x6B38, 0x6B91, 0x6B8F, 0x6B8D, 0x6B8E, 0x6B8C, 0x6C2A, 0x6DC0, 0x6DAB, 0x6DB4, 0x6DB3, 0x6E74, 0x6DAC, 0x6DE9, 0x6DE2, 0x6DB7, 0x6DF6, 0x6DD4, 0x6E00, 0x6DC8, 0x6DE0, 0x6DDF, 0x6DD6, 0x6DBE, 0x6DE5, 0x6DDC, 0x6DDD, 0x6DDB, 0x6DF4, 0x6DCA, 0x6DBD, 0x6DED, 0x6DF0, 0x6DBA, 0x6DD5, 0x6DC2, 0x6DCF, 0x6DC9, /* Big5-HKSCS 0xD640 .. 0xD67E */ 0x6DD0, 0x6DF2, 0x6DD3, 0x6DFD, 0x6DD7, 0x6DCD, 0x6DE3, 0x6DBB, 0x70FA, 0x710D, 0x70F7, 0x7117, 0x70F4, 0x710C, 0x70F0, 0x7104, 0x70F3, 0x7110, 0x70FC, 0x70FF, 0x7106, 0x7113, 0x7100, 0x70F8, 0x70F6, 0x710B, 0x7102, 0x710E, 0x727E, 0x727B, 0x727C, 0x727F, 0x731D, 0x7317, 0x7307, 0x7311, 0x7318, 0x730A, 0x7308, 0x72FF, 0x730F, 0x731E, 0x7388, 0x73F6, 0x73F8, 0x73F5, 0x7404, 0x7401, 0x73FD, 0x7407, 0x7400, 0x73FA, 0x73FC, 0x73FF, 0x740C, 0x740B, 0x73F4, 0x7408, 0x7564, 0x7563, 0x75CE, 0x75D2, 0x75CF, /* Big5-HKSCS 0xD6A1 .. 0xD6FE */ 0x75CB, 0x75CC, 0x75D1, 0x75D0, 0x768F, 0x7689, 0x76D3, 0x7739, 0x772F, 0x772D, 0x7731, 0x7732, 0x7734, 0x7733, 0x773D, 0x7725, 0x773B, 0x7735, 0x7848, 0x7852, 0x7849, 0x784D, 0x784A, 0x784C, 0x7826, 0x7845, 0x7850, 0x7964, 0x7967, 0x7969, 0x796A, 0x7963, 0x796B, 0x7961, 0x79BB, 0x79FA, 0x79F8, 0x79F6, 0x79F7, 0x7A8F, 0x7A94, 0x7A90, 0x7B35, 0x7B47, 0x7B34, 0x7B25, 0x7B30, 0x7B22, 0x7B24, 0x7B33, 0x7B18, 0x7B2A, 0x7B1D, 0x7B31, 0x7B2B, 0x7B2D, 0x7B2F, 0x7B32, 0x7B38, 0x7B1A, 0x7B23, 0x7C94, 0x7C98, 0x7C96, 0x7CA3, 0x7D35, 0x7D3D, 0x7D38, 0x7D36, 0x7D3A, 0x7D45, 0x7D2C, 0x7D29, 0x7D41, 0x7D47, 0x7D3E, 0x7D3F, 0x7D4A, 0x7D3B, 0x7D28, 0x7F63, 0x7F95, 0x7F9C, 0x7F9D, 0x7F9B, 0x7FCA, 0x7FCB, 0x7FCD, 0x7FD0, 0x7FD1, 0x7FC7, 0x7FCF, 0x7FC9, 0x801F, /* Big5-HKSCS 0xD740 .. 0xD77E */ 0x801E, 0x801B, 0x8047, 0x8043, 0x8048, 0x8118, 0x8125, 0x8119, 0x811B, 0x812D, 0x811F, 0x812C, 0x811E, 0x8121, 0x8115, 0x8127, 0x811D, 0x8122, 0x8211, 0x8238, 0x8233, 0x823A, 0x8234, 0x8232, 0x8274, 0x8390, 0x83A3, 0x83A8, 0x838D, 0x837A, 0x8373, 0x83A4, 0x8374, 0x838F, 0x8381, 0x8395, 0x8399, 0x8375, 0x8394, 0x83A9, 0x837D, 0x8383, 0x838C, 0x839D, 0x839B, 0x83AA, 0x838B, 0x837E, 0x83A5, 0x83AF, 0x8388, 0x8397, 0x83B0, 0x837F, 0x83A6, 0x8387, 0x83AE, 0x8376, 0x839A, 0x8659, 0x8656, 0x86BF, 0x86B7, /* Big5-HKSCS 0xD7A1 .. 0xD7FE */ 0x86C2, 0x86C1, 0x86C5, 0x86BA, 0x86B0, 0x86C8, 0x86B9, 0x86B3, 0x86B8, 0x86CC, 0x86B4, 0x86BB, 0x86BC, 0x86C3, 0x86BD, 0x86BE, 0x8852, 0x8889, 0x8895, 0x88A8, 0x88A2, 0x88AA, 0x889A, 0x8891, 0x88A1, 0x889F, 0x8898, 0x88A7, 0x8899, 0x889B, 0x8897, 0x88A4, 0x88AC, 0x888C, 0x8893, 0x888E, 0x8982, 0x89D6, 0x89D9, 0x89D5, 0x8A30, 0x8A27, 0x8A2C, 0x8A1E, 0x8C39, 0x8C3B, 0x8C5C, 0x8C5D, 0x8C7D, 0x8CA5, 0x8D7D, 0x8D7B, 0x8D79, 0x8DBC, 0x8DC2, 0x8DB9, 0x8DBF, 0x8DC1, 0x8ED8, 0x8EDE, 0x8EDD, 0x8EDC, 0x8ED7, 0x8EE0, 0x8EE1, 0x9024, 0x900B, 0x9011, 0x901C, 0x900C, 0x9021, 0x90EF, 0x90EA, 0x90F0, 0x90F4, 0x90F2, 0x90F3, 0x90D4, 0x90EB, 0x90EC, 0x90E9, 0x9156, 0x9158, 0x915A, 0x9153, 0x9155, 0x91EC, 0x91F4, 0x91F1, 0x91F3, 0x91F8, 0x91E4, 0x91F9, 0x91EA, /* Big5-HKSCS 0xD840 .. 0xD87E */ 0x91EB, 0x91F7, 0x91E8, 0x91EE, 0x957A, 0x9586, 0x9588, 0x967C, 0x966D, 0x966B, 0x9671, 0x966F, 0x96BF, 0x976A, 0x9804, 0x98E5, 0x9997, 0x509B, 0x5095, 0x5094, 0x509E, 0x508B, 0x50A3, 0x5083, 0x508C, 0x508E, 0x509D, 0x5068, 0x509C, 0x5092, 0x5082, 0x5087, 0x515F, 0x51D4, 0x5312, 0x5311, 0x53A4, 0x53A7, 0x5591, 0x55A8, 0x55A5, 0x55AD, 0x5577, 0x5645, 0x55A2, 0x5593, 0x5588, 0x558F, 0x55B5, 0x5581, 0x55A3, 0x5592, 0x55A4, 0x557D, 0x558C, 0x55A6, 0x557F, 0x5595, 0x55A1, 0x558E, 0x570C, 0x5829, 0x5837, /* Big5-HKSCS 0xD8A1 .. 0xD8FE */ 0x5819, 0x581E, 0x5827, 0x5823, 0x5828, 0x57F5, 0x5848, 0x5825, 0x581C, 0x581B, 0x5833, 0x583F, 0x5836, 0x582E, 0x5839, 0x5838, 0x582D, 0x582C, 0x583B, 0x5961, 0x5AAF, 0x5A94, 0x5A9F, 0x5A7A, 0x5AA2, 0x5A9E, 0x5A78, 0x5AA6, 0x5A7C, 0x5AA5, 0x5AAC, 0x5A95, 0x5AAE, 0x5A37, 0x5A84, 0x5A8A, 0x5A97, 0x5A83, 0x5A8B, 0x5AA9, 0x5A7B, 0x5A7D, 0x5A8C, 0x5A9C, 0x5A8F, 0x5A93, 0x5A9D, 0x5BEA, 0x5BCD, 0x5BCB, 0x5BD4, 0x5BD1, 0x5BCA, 0x5BCE, 0x5C0C, 0x5C30, 0x5D37, 0x5D43, 0x5D6B, 0x5D41, 0x5D4B, 0x5D3F, 0x5D35, 0x5D51, 0x5D4E, 0x5D55, 0x5D33, 0x5D3A, 0x5D52, 0x5D3D, 0x5D31, 0x5D59, 0x5D42, 0x5D39, 0x5D49, 0x5D38, 0x5D3C, 0x5D32, 0x5D36, 0x5D40, 0x5D45, 0x5E44, 0x5E41, 0x5F58, 0x5FA6, 0x5FA5, 0x5FAB, 0x60C9, 0x60B9, 0x60CC, 0x60E2, 0x60CE, 0x60C4, 0x6114, /* Big5-HKSCS 0xD940 .. 0xD97E */ 0x60F2, 0x610A, 0x6116, 0x6105, 0x60F5, 0x6113, 0x60F8, 0x60FC, 0x60FE, 0x60C1, 0x6103, 0x6118, 0x611D, 0x6110, 0x60FF, 0x6104, 0x610B, 0x624A, 0x6394, 0x63B1, 0x63B0, 0x63CE, 0x63E5, 0x63E8, 0x63EF, 0x63C3, 0x649D, 0x63F3, 0x63CA, 0x63E0, 0x63F6, 0x63D5, 0x63F2, 0x63F5, 0x6461, 0x63DF, 0x63BE, 0x63DD, 0x63DC, 0x63C4, 0x63D8, 0x63D3, 0x63C2, 0x63C7, 0x63CC, 0x63CB, 0x63C8, 0x63F0, 0x63D7, 0x63D9, 0x6532, 0x6567, 0x656A, 0x6564, 0x655C, 0x6568, 0x6565, 0x658C, 0x659D, 0x659E, 0x65AE, 0x65D0, 0x65D2, /* Big5-HKSCS 0xD9A1 .. 0xD9FE */ 0x667C, 0x666C, 0x667B, 0x6680, 0x6671, 0x6679, 0x666A, 0x6672, 0x6701, 0x690C, 0x68D3, 0x6904, 0x68DC, 0x692A, 0x68EC, 0x68EA, 0x68F1, 0x690F, 0x68D6, 0x68F7, 0x68EB, 0x68E4, 0x68F6, 0x6913, 0x6910, 0x68F3, 0x68E1, 0x6907, 0x68CC, 0x6908, 0x6970, 0x68B4, 0x6911, 0x68EF, 0x68C6, 0x6914, 0x68F8, 0x68D0, 0x68FD, 0x68FC, 0x68E8, 0x690B, 0x690A, 0x6917, 0x68CE, 0x68C8, 0x68DD, 0x68DE, 0x68E6, 0x68F4, 0x68D1, 0x6906, 0x68D4, 0x68E9, 0x6915, 0x6925, 0x68C7, 0x6B39, 0x6B3B, 0x6B3F, 0x6B3C, 0x6B94, 0x6B97, 0x6B99, 0x6B95, 0x6BBD, 0x6BF0, 0x6BF2, 0x6BF3, 0x6C30, 0x6DFC, 0x6E46, 0x6E47, 0x6E1F, 0x6E49, 0x6E88, 0x6E3C, 0x6E3D, 0x6E45, 0x6E62, 0x6E2B, 0x6E3F, 0x6E41, 0x6E5D, 0x6E73, 0x6E1C, 0x6E33, 0x6E4B, 0x6E40, 0x6E51, 0x6E3B, 0x6E03, 0x6E2E, 0x6E5E, /* Big5-HKSCS 0xDA40 .. 0xDA7E */ 0x6E68, 0x6E5C, 0x6E61, 0x6E31, 0x6E28, 0x6E60, 0x6E71, 0x6E6B, 0x6E39, 0x6E22, 0x6E30, 0x6E53, 0x6E65, 0x6E27, 0x6E78, 0x6E64, 0x6E77, 0x6E55, 0x6E79, 0x6E52, 0x6E66, 0x6E35, 0x6E36, 0x6E5A, 0x7120, 0x711E, 0x712F, 0x70FB, 0x712E, 0x7131, 0x7123, 0x7125, 0x7122, 0x7132, 0x711F, 0x7128, 0x713A, 0x711B, 0x724B, 0x725A, 0x7288, 0x7289, 0x7286, 0x7285, 0x728B, 0x7312, 0x730B, 0x7330, 0x7322, 0x7331, 0x7333, 0x7327, 0x7332, 0x732D, 0x7326, 0x7323, 0x7335, 0x730C, 0x742E, 0x742C, 0x7430, 0x742B, 0x7416, /* Big5-HKSCS 0xDAA1 .. 0xDAFE */ 0x741A, 0x7421, 0x742D, 0x7431, 0x7424, 0x7423, 0x741D, 0x7429, 0x7420, 0x7432, 0x74FB, 0x752F, 0x756F, 0x756C, 0x75E7, 0x75DA, 0x75E1, 0x75E6, 0x75DD, 0x75DF, 0x75E4, 0x75D7, 0x7695, 0x7692, 0x76DA, 0x7746, 0x7747, 0x7744, 0x774D, 0x7745, 0x774A, 0x774E, 0x774B, 0x774C, 0x77DE, 0x77EC, 0x7860, 0x7864, 0x7865, 0x785C, 0x786D, 0x7871, 0x786A, 0x786E, 0x7870, 0x7869, 0x7868, 0x785E, 0x7862, 0x7974, 0x7973, 0x7972, 0x7970, 0x7A02, 0x7A0A, 0x7A03, 0x7A0C, 0x7A04, 0x7A99, 0x7AE6, 0x7AE4, 0x7B4A, 0x7B3B, 0x7B44, 0x7B48, 0x7B4C, 0x7B4E, 0x7B40, 0x7B58, 0x7B45, 0x7CA2, 0x7C9E, 0x7CA8, 0x7CA1, 0x7D58, 0x7D6F, 0x7D63, 0x7D53, 0x7D56, 0x7D67, 0x7D6A, 0x7D4F, 0x7D6D, 0x7D5C, 0x7D6B, 0x7D52, 0x7D54, 0x7D69, 0x7D51, 0x7D5F, 0x7D4E, 0x7F3E, 0x7F3F, 0x7F65, /* Big5-HKSCS 0xDB40 .. 0xDB7E */ 0x7F66, 0x7FA2, 0x7FA0, 0x7FA1, 0x7FD7, 0x8051, 0x804F, 0x8050, 0x80FE, 0x80D4, 0x8143, 0x814A, 0x8152, 0x814F, 0x8147, 0x813D, 0x814D, 0x813A, 0x81E6, 0x81EE, 0x81F7, 0x81F8, 0x81F9, 0x8204, 0x823C, 0x823D, 0x823F, 0x8275, 0x833B, 0x83CF, 0x83F9, 0x8423, 0x83C0, 0x83E8, 0x8412, 0x83E7, 0x83E4, 0x83FC, 0x83F6, 0x8410, 0x83C6, 0x83C8, 0x83EB, 0x83E3, 0x83BF, 0x8401, 0x83DD, 0x83E5, 0x83D8, 0x83FF, 0x83E1, 0x83CB, 0x83CE, 0x83D6, 0x83F5, 0x83C9, 0x8409, 0x840F, 0x83DE, 0x8411, 0x8406, 0x83C2, 0x83F3, /* Big5-HKSCS 0xDBA1 .. 0xDBFE */ 0x83D5, 0x83FA, 0x83C7, 0x83D1, 0x83EA, 0x8413, 0x83C3, 0x83EC, 0x83EE, 0x83C4, 0x83FB, 0x83D7, 0x83E2, 0x841B, 0x83DB, 0x83FE, 0x86D8, 0x86E2, 0x86E6, 0x86D3, 0x86E3, 0x86DA, 0x86EA, 0x86DD, 0x86EB, 0x86DC, 0x86EC, 0x86E9, 0x86D7, 0x86E8, 0x86D1, 0x8848, 0x8856, 0x8855, 0x88BA, 0x88D7, 0x88B9, 0x88B8, 0x88C0, 0x88BE, 0x88B6, 0x88BC, 0x88B7, 0x88BD, 0x88B2, 0x8901, 0x88C9, 0x8995, 0x8998, 0x8997, 0x89DD, 0x89DA, 0x89DB, 0x8A4E, 0x8A4D, 0x8A39, 0x8A59, 0x8A40, 0x8A57, 0x8A58, 0x8A44, 0x8A45, 0x8A52, 0x8A48, 0x8A51, 0x8A4A, 0x8A4C, 0x8A4F, 0x8C5F, 0x8C81, 0x8C80, 0x8CBA, 0x8CBE, 0x8CB0, 0x8CB9, 0x8CB5, 0x8D84, 0x8D80, 0x8D89, 0x8DD8, 0x8DD3, 0x8DCD, 0x8DC7, 0x8DD6, 0x8DDC, 0x8DCF, 0x8DD5, 0x8DD9, 0x8DC8, 0x8DD7, 0x8DC5, 0x8EEF, 0x8EF7, 0x8EFA, /* Big5-HKSCS 0xDC40 .. 0xDC7E */ 0x8EF9, 0x8EE6, 0x8EEE, 0x8EE5, 0x8EF5, 0x8EE7, 0x8EE8, 0x8EF6, 0x8EEB, 0x8EF1, 0x8EEC, 0x8EF4, 0x8EE9, 0x902D, 0x9034, 0x902F, 0x9106, 0x912C, 0x9104, 0x90FF, 0x90FC, 0x9108, 0x90F9, 0x90FB, 0x9101, 0x9100, 0x9107, 0x9105, 0x9103, 0x9161, 0x9164, 0x915F, 0x9162, 0x9160, 0x9201, 0x920A, 0x9225, 0x9203, 0x921A, 0x9226, 0x920F, 0x920C, 0x9200, 0x9212, 0x91FF, 0x91FD, 0x9206, 0x9204, 0x9227, 0x9202, 0x921C, 0x9224, 0x9219, 0x9217, 0x9205, 0x9216, 0x957B, 0x958D, 0x958C, 0x9590, 0x9687, 0x967E, 0x9688, /* Big5-HKSCS 0xDCA1 .. 0xDCFE */ 0x9689, 0x9683, 0x9680, 0x96C2, 0x96C8, 0x96C3, 0x96F1, 0x96F0, 0x976C, 0x9770, 0x976E, 0x9807, 0x98A9, 0x98EB, 0x9CE6, 0x9EF9, 0x4E83, 0x4E84, 0x4EB6, 0x50BD, 0x50BF, 0x50C6, 0x50AE, 0x50C4, 0x50CA, 0x50B4, 0x50C8, 0x50C2, 0x50B0, 0x50C1, 0x50BA, 0x50B1, 0x50CB, 0x50C9, 0x50B6, 0x50B8, 0x51D7, 0x527A, 0x5278, 0x527B, 0x527C, 0x55C3, 0x55DB, 0x55CC, 0x55D0, 0x55CB, 0x55CA, 0x55DD, 0x55C0, 0x55D4, 0x55C4, 0x55E9, 0x55BF, 0x55D2, 0x558D, 0x55CF, 0x55D5, 0x55E2, 0x55D6, 0x55C8, 0x55F2, 0x55CD, 0x55D9, 0x55C2, 0x5714, 0x5853, 0x5868, 0x5864, 0x584F, 0x584D, 0x5849, 0x586F, 0x5855, 0x584E, 0x585D, 0x5859, 0x5865, 0x585B, 0x583D, 0x5863, 0x5871, 0x58FC, 0x5AC7, 0x5AC4, 0x5ACB, 0x5ABA, 0x5AB8, 0x5AB1, 0x5AB5, 0x5AB0, 0x5ABF, 0x5AC8, 0x5ABB, 0x5AC6, /* Big5-HKSCS 0xDD40 .. 0xDD7E */ 0x5AB7, 0x5AC0, 0x5ACA, 0x5AB4, 0x5AB6, 0x5ACD, 0x5AB9, 0x5A90, 0x5BD6, 0x5BD8, 0x5BD9, 0x5C1F, 0x5C33, 0x5D71, 0x5D63, 0x5D4A, 0x5D65, 0x5D72, 0x5D6C, 0x5D5E, 0x5D68, 0x5D67, 0x5D62, 0x5DF0, 0x5E4F, 0x5E4E, 0x5E4A, 0x5E4D, 0x5E4B, 0x5EC5, 0x5ECC, 0x5EC6, 0x5ECB, 0x5EC7, 0x5F40, 0x5FAF, 0x5FAD, 0x60F7, 0x6149, 0x614A, 0x612B, 0x6145, 0x6136, 0x6132, 0x612E, 0x6146, 0x612F, 0x614F, 0x6129, 0x6140, 0x6220, 0x9168, 0x6223, 0x6225, 0x6224, 0x63C5, 0x63F1, 0x63EB, 0x6410, 0x6412, 0x6409, 0x6420, 0x6424, /* Big5-HKSCS 0xDDA1 .. 0xDDFE */ 0x6433, 0x6443, 0x641F, 0x6415, 0x6418, 0x6439, 0x6437, 0x6422, 0x6423, 0x640C, 0x6426, 0x6430, 0x6428, 0x6441, 0x6435, 0x642F, 0x640A, 0x641A, 0x6440, 0x6425, 0x6427, 0x640B, 0x63E7, 0x641B, 0x642E, 0x6421, 0x640E, 0x656F, 0x6592, 0x65D3, 0x6686, 0x668C, 0x6695, 0x6690, 0x668B, 0x668A, 0x6699, 0x6694, 0x6678, 0x6720, 0x6966, 0x695F, 0x6938, 0x694E, 0x6962, 0x6971, 0x693F, 0x6945, 0x696A, 0x6939, 0x6942, 0x6957, 0x6959, 0x697A, 0x6948, 0x6949, 0x6935, 0x696C, 0x6933, 0x693D, 0x6965, 0x68F0, 0x6978, 0x6934, 0x6969, 0x6940, 0x696F, 0x6944, 0x6976, 0x6958, 0x6941, 0x6974, 0x694C, 0x693B, 0x694B, 0x6937, 0x695C, 0x694F, 0x6951, 0x6932, 0x6952, 0x692F, 0x697B, 0x693C, 0x6B46, 0x6B45, 0x6B43, 0x6B42, 0x6B48, 0x6B41, 0x6B9B, 0xFA0D, 0x6BFB, 0x6BFC, /* Big5-HKSCS 0xDE40 .. 0xDE7E */ 0x6BF9, 0x6BF7, 0x6BF8, 0x6E9B, 0x6ED6, 0x6EC8, 0x6E8F, 0x6EC0, 0x6E9F, 0x6E93, 0x6E94, 0x6EA0, 0x6EB1, 0x6EB9, 0x6EC6, 0x6ED2, 0x6EBD, 0x6EC1, 0x6E9E, 0x6EC9, 0x6EB7, 0x6EB0, 0x6ECD, 0x6EA6, 0x6ECF, 0x6EB2, 0x6EBE, 0x6EC3, 0x6EDC, 0x6ED8, 0x6E99, 0x6E92, 0x6E8E, 0x6E8D, 0x6EA4, 0x6EA1, 0x6EBF, 0x6EB3, 0x6ED0, 0x6ECA, 0x6E97, 0x6EAE, 0x6EA3, 0x7147, 0x7154, 0x7152, 0x7163, 0x7160, 0x7141, 0x715D, 0x7162, 0x7172, 0x7178, 0x716A, 0x7161, 0x7142, 0x7158, 0x7143, 0x714B, 0x7170, 0x715F, 0x7150, 0x7153, /* Big5-HKSCS 0xDEA1 .. 0xDEFE */ 0x7144, 0x714D, 0x715A, 0x724F, 0x728D, 0x728C, 0x7291, 0x7290, 0x728E, 0x733C, 0x7342, 0x733B, 0x733A, 0x7340, 0x734A, 0x7349, 0x7444, 0x744A, 0x744B, 0x7452, 0x7451, 0x7457, 0x7440, 0x744F, 0x7450, 0x744E, 0x7442, 0x7446, 0x744D, 0x7454, 0x74E1, 0x74FF, 0x74FE, 0x74FD, 0x751D, 0x7579, 0x7577, 0x6983, 0x75EF, 0x760F, 0x7603, 0x75F7, 0x75FE, 0x75FC, 0x75F9, 0x75F8, 0x7610, 0x75FB, 0x75F6, 0x75ED, 0x75F5, 0x75FD, 0x7699, 0x76B5, 0x76DD, 0x7755, 0x775F, 0x7760, 0x7752, 0x7756, 0x775A, 0x7769, 0x7767, 0x7754, 0x7759, 0x776D, 0x77E0, 0x7887, 0x789A, 0x7894, 0x788F, 0x7884, 0x7895, 0x7885, 0x7886, 0x78A1, 0x7883, 0x7879, 0x7899, 0x7880, 0x7896, 0x787B, 0x797C, 0x7982, 0x797D, 0x7979, 0x7A11, 0x7A18, 0x7A19, 0x7A12, 0x7A17, 0x7A15, 0x7A22, 0x7A13, /* Big5-HKSCS 0xDF40 .. 0xDF7E */ 0x7A1B, 0x7A10, 0x7AA3, 0x7AA2, 0x7A9E, 0x7AEB, 0x7B66, 0x7B64, 0x7B6D, 0x7B74, 0x7B69, 0x7B72, 0x7B65, 0x7B73, 0x7B71, 0x7B70, 0x7B61, 0x7B78, 0x7B76, 0x7B63, 0x7CB2, 0x7CB4, 0x7CAF, 0x7D88, 0x7D86, 0x7D80, 0x7D8D, 0x7D7F, 0x7D85, 0x7D7A, 0x7D8E, 0x7D7B, 0x7D83, 0x7D7C, 0x7D8C, 0x7D94, 0x7D84, 0x7D7D, 0x7D92, 0x7F6D, 0x7F6B, 0x7F67, 0x7F68, 0x7F6C, 0x7FA6, 0x7FA5, 0x7FA7, 0x7FDB, 0x7FDC, 0x8021, 0x8164, 0x8160, 0x8177, 0x815C, 0x8169, 0x815B, 0x8162, 0x8172, 0x6721, 0x815E, 0x8176, 0x8167, 0x816F, /* Big5-HKSCS 0xDFA1 .. 0xDFFE */ 0x8144, 0x8161, 0x821D, 0x8249, 0x8244, 0x8240, 0x8242, 0x8245, 0x84F1, 0x843F, 0x8456, 0x8476, 0x8479, 0x848F, 0x848D, 0x8465, 0x8451, 0x8440, 0x8486, 0x8467, 0x8430, 0x844D, 0x847D, 0x845A, 0x8459, 0x8474, 0x8473, 0x845D, 0x8507, 0x845E, 0x8437, 0x843A, 0x8434, 0x847A, 0x8443, 0x8478, 0x8432, 0x8445, 0x8429, 0x83D9, 0x844B, 0x842F, 0x8442, 0x842D, 0x845F, 0x8470, 0x8439, 0x844E, 0x844C, 0x8452, 0x846F, 0x84C5, 0x848E, 0x843B, 0x8447, 0x8436, 0x8433, 0x8468, 0x847E, 0x8444, 0x842B, 0x8460, 0x8454, 0x846E, 0x8450, 0x870B, 0x8704, 0x86F7, 0x870C, 0x86FA, 0x86D6, 0x86F5, 0x874D, 0x86F8, 0x870E, 0x8709, 0x8701, 0x86F6, 0x870D, 0x8705, 0x88D6, 0x88CB, 0x88CD, 0x88CE, 0x88DE, 0x88DB, 0x88DA, 0x88CC, 0x88D0, 0x8985, 0x899B, 0x89DF, 0x89E5, 0x89E4, /* Big5-HKSCS 0xE040 .. 0xE07E */ 0x89E1, 0x89E0, 0x89E2, 0x89DC, 0x89E6, 0x8A76, 0x8A86, 0x8A7F, 0x8A61, 0x8A3F, 0x8A77, 0x8A82, 0x8A84, 0x8A75, 0x8A83, 0x8A81, 0x8A74, 0x8A7A, 0x8C3C, 0x8C4B, 0x8C4A, 0x8C65, 0x8C64, 0x8C66, 0x8C86, 0x8C84, 0x8C85, 0x8CCC, 0x8D68, 0x8D69, 0x8D91, 0x8D8C, 0x8D8E, 0x8D8F, 0x8D8D, 0x8D93, 0x8D94, 0x8D90, 0x8D92, 0x8DF0, 0x8DE0, 0x8DEC, 0x8DF1, 0x8DEE, 0x8DD0, 0x8DE9, 0x8DE3, 0x8DE2, 0x8DE7, 0x8DF2, 0x8DEB, 0x8DF4, 0x8F06, 0x8EFF, 0x8F01, 0x8F00, 0x8F05, 0x8F07, 0x8F08, 0x8F02, 0x8F0B, 0x9052, 0x903F, /* Big5-HKSCS 0xE0A1 .. 0xE0FE */ 0x9044, 0x9049, 0x903D, 0x9110, 0x910D, 0x910F, 0x9111, 0x9116, 0x9114, 0x910B, 0x910E, 0x916E, 0x916F, 0x9248, 0x9252, 0x9230, 0x923A, 0x9266, 0x9233, 0x9265, 0x925E, 0x9283, 0x922E, 0x924A, 0x9246, 0x926D, 0x926C, 0x924F, 0x9260, 0x9267, 0x926F, 0x9236, 0x9261, 0x9270, 0x9231, 0x9254, 0x9263, 0x9250, 0x9272, 0x924E, 0x9253, 0x924C, 0x9256, 0x9232, 0x959F, 0x959C, 0x959E, 0x959B, 0x9692, 0x9693, 0x9691, 0x9697, 0x96CE, 0x96FA, 0x96FD, 0x96F8, 0x96F5, 0x9773, 0x9777, 0x9778, 0x9772, 0x980F, 0x980D, 0x980E, 0x98AC, 0x98F6, 0x98F9, 0x99AF, 0x99B2, 0x99B0, 0x99B5, 0x9AAD, 0x9AAB, 0x9B5B, 0x9CEA, 0x9CED, 0x9CE7, 0x9E80, 0x9EFD, 0x50E6, 0x50D4, 0x50D7, 0x50E8, 0x50F3, 0x50DB, 0x50EA, 0x50DD, 0x50E4, 0x50D3, 0x50EC, 0x50F0, 0x50EF, 0x50E3, 0x50E0, /* Big5-HKSCS 0xE140 .. 0xE17E */ 0x51D8, 0x5280, 0x5281, 0x52E9, 0x52EB, 0x5330, 0x53AC, 0x5627, 0x5615, 0x560C, 0x5612, 0x55FC, 0x560F, 0x561C, 0x5601, 0x5613, 0x5602, 0x55FA, 0x561D, 0x5604, 0x55FF, 0x55F9, 0x5889, 0x587C, 0x5890, 0x5898, 0x5886, 0x5881, 0x587F, 0x5874, 0x588B, 0x587A, 0x5887, 0x5891, 0x588E, 0x5876, 0x5882, 0x5888, 0x587B, 0x5894, 0x588F, 0x58FE, 0x596B, 0x5ADC, 0x5AEE, 0x5AE5, 0x5AD5, 0x5AEA, 0x5ADA, 0x5AED, 0x5AEB, 0x5AF3, 0x5AE2, 0x5AE0, 0x5ADB, 0x5AEC, 0x5ADE, 0x5ADD, 0x5AD9, 0x5AE8, 0x5ADF, 0x5B77, 0x5BE0, /* Big5-HKSCS 0xE1A1 .. 0xE1FE */ 0x5BE3, 0x5C63, 0x5D82, 0x5D80, 0x5D7D, 0x5D86, 0x5D7A, 0x5D81, 0x5D77, 0x5D8A, 0x5D89, 0x5D88, 0x5D7E, 0x5D7C, 0x5D8D, 0x5D79, 0x5D7F, 0x5E58, 0x5E59, 0x5E53, 0x5ED8, 0x5ED1, 0x5ED7, 0x5ECE, 0x5EDC, 0x5ED5, 0x5ED9, 0x5ED2, 0x5ED4, 0x5F44, 0x5F43, 0x5F6F, 0x5FB6, 0x612C, 0x6128, 0x6141, 0x615E, 0x6171, 0x6173, 0x6152, 0x6153, 0x6172, 0x616C, 0x6180, 0x6174, 0x6154, 0x617A, 0x615B, 0x6165, 0x613B, 0x616A, 0x6161, 0x6156, 0x6229, 0x6227, 0x622B, 0x642B, 0x644D, 0x645B, 0x645D, 0x6474, 0x6476, 0x6472, 0x6473, 0x647D, 0x6475, 0x6466, 0x64A6, 0x644E, 0x6482, 0x645E, 0x645C, 0x644B, 0x6453, 0x6460, 0x6450, 0x647F, 0x643F, 0x646C, 0x646B, 0x6459, 0x6465, 0x6477, 0x6573, 0x65A0, 0x66A1, 0x66A0, 0x669F, 0x6705, 0x6704, 0x6722, 0x69B1, 0x69B6, 0x69C9, /* Big5-HKSCS 0xE240 .. 0xE27E */ 0x69A0, 0x69CE, 0x6996, 0x69B0, 0x69AC, 0x69BC, 0x6991, 0x6999, 0x698E, 0x69A7, 0x698D, 0x69A9, 0x69BE, 0x69AF, 0x69BF, 0x69C4, 0x69BD, 0x69A4, 0x69D4, 0x69B9, 0x69CA, 0x699A, 0x69CF, 0x69B3, 0x6993, 0x69AA, 0x69A1, 0x699E, 0x69D9, 0x6997, 0x6990, 0x69C2, 0x69B5, 0x69A5, 0x69C6, 0x6B4A, 0x6B4D, 0x6B4B, 0x6B9E, 0x6B9F, 0x6BA0, 0x6BC3, 0x6BC4, 0x6BFE, 0x6ECE, 0x6EF5, 0x6EF1, 0x6F03, 0x6F25, 0x6EF8, 0x6F37, 0x6EFB, 0x6F2E, 0x6F09, 0x6F4E, 0x6F19, 0x6F1A, 0x6F27, 0x6F18, 0x6F3B, 0x6F12, 0x6EED, 0x6F0A, /* Big5-HKSCS 0xE2A1 .. 0xE2FE */ 0x6F36, 0x6F73, 0x6EF9, 0x6EEE, 0x6F2D, 0x6F40, 0x6F30, 0x6F3C, 0x6F35, 0x6EEB, 0x6F07, 0x6F0E, 0x6F43, 0x6F05, 0x6EFD, 0x6EF6, 0x6F39, 0x6F1C, 0x6EFC, 0x6F3A, 0x6F1F, 0x6F0D, 0x6F1E, 0x6F08, 0x6F21, 0x7187, 0x7190, 0x7189, 0x7180, 0x7185, 0x7182, 0x718F, 0x717B, 0x7186, 0x7181, 0x7197, 0x7244, 0x7253, 0x7297, 0x7295, 0x7293, 0x7343, 0x734D, 0x7351, 0x734C, 0x7462, 0x7473, 0x7471, 0x7475, 0x7472, 0x7467, 0x746E, 0x7500, 0x7502, 0x7503, 0x757D, 0x7590, 0x7616, 0x7608, 0x760C, 0x7615, 0x7611, 0x760A, 0x7614, 0x76B8, 0x7781, 0x777C, 0x7785, 0x7782, 0x776E, 0x7780, 0x776F, 0x777E, 0x7783, 0x78B2, 0x78AA, 0x78B4, 0x78AD, 0x78A8, 0x787E, 0x78AB, 0x789E, 0x78A5, 0x78A0, 0x78AC, 0x78A2, 0x78A4, 0x7998, 0x798A, 0x798B, 0x7996, 0x7995, 0x7994, 0x7993, /* Big5-HKSCS 0xE340 .. 0xE37E */ 0x7997, 0x7988, 0x7992, 0x7990, 0x7A2B, 0x7A4A, 0x7A30, 0x7A2F, 0x7A28, 0x7A26, 0x7AA8, 0x7AAB, 0x7AAC, 0x7AEE, 0x7B88, 0x7B9C, 0x7B8A, 0x7B91, 0x7B90, 0x7B96, 0x7B8D, 0x7B8C, 0x7B9B, 0x7B8E, 0x7B85, 0x7B98, 0x5284, 0x7B99, 0x7BA4, 0x7B82, 0x7CBB, 0x7CBF, 0x7CBC, 0x7CBA, 0x7DA7, 0x7DB7, 0x7DC2, 0x7DA3, 0x7DAA, 0x7DC1, 0x7DC0, 0x7DC5, 0x7D9D, 0x7DCE, 0x7DC4, 0x7DC6, 0x7DCB, 0x7DCC, 0x7DAF, 0x7DB9, 0x7D96, 0x7DBC, 0x7D9F, 0x7DA6, 0x7DAE, 0x7DA9, 0x7DA1, 0x7DC9, 0x7F73, 0x7FE2, 0x7FE3, 0x7FE5, 0x7FDE, /* Big5-HKSCS 0xE3A1 .. 0xE3FE */ 0x8024, 0x805D, 0x805C, 0x8189, 0x8186, 0x8183, 0x8187, 0x818D, 0x818C, 0x818B, 0x8215, 0x8497, 0x84A4, 0x84A1, 0x849F, 0x84BA, 0x84CE, 0x84C2, 0x84AC, 0x84AE, 0x84AB, 0x84B9, 0x84B4, 0x84C1, 0x84CD, 0x84AA, 0x849A, 0x84B1, 0x84D0, 0x849D, 0x84A7, 0x84BB, 0x84A2, 0x8494, 0x84C7, 0x84CC, 0x849B, 0x84A9, 0x84AF, 0x84A8, 0x84D6, 0x8498, 0x84B6, 0x84CF, 0x84A0, 0x84D7, 0x84D4, 0x84D2, 0x84DB, 0x84B0, 0x8491, 0x8661, 0x8733, 0x8723, 0x8728, 0x876B, 0x8740, 0x872E, 0x871E, 0x8721, 0x8719, 0x871B, 0x8743, 0x872C, 0x8741, 0x873E, 0x8746, 0x8720, 0x8732, 0x872A, 0x872D, 0x873C, 0x8712, 0x873A, 0x8731, 0x8735, 0x8742, 0x8726, 0x8727, 0x8738, 0x8724, 0x871A, 0x8730, 0x8711, 0x88F7, 0x88E7, 0x88F1, 0x88F2, 0x88FA, 0x88FE, 0x88EE, 0x88FC, 0x88F6, 0x88FB, /* Big5-HKSCS 0xE440 .. 0xE47E */ 0x88F0, 0x88EC, 0x88EB, 0x899D, 0x89A1, 0x899F, 0x899E, 0x89E9, 0x89EB, 0x89E8, 0x8AAB, 0x8A99, 0x8A8B, 0x8A92, 0x8A8F, 0x8A96, 0x8C3D, 0x8C68, 0x8C69, 0x8CD5, 0x8CCF, 0x8CD7, 0x8D96, 0x8E09, 0x8E02, 0x8DFF, 0x8E0D, 0x8DFD, 0x8E0A, 0x8E03, 0x8E07, 0x8E06, 0x8E05, 0x8DFE, 0x8E00, 0x8E04, 0x8F10, 0x8F11, 0x8F0E, 0x8F0D, 0x9123, 0x911C, 0x9120, 0x9122, 0x911F, 0x911D, 0x911A, 0x9124, 0x9121, 0x911B, 0x917A, 0x9172, 0x9179, 0x9173, 0x92A5, 0x92A4, 0x9276, 0x929B, 0x927A, 0x92A0, 0x9294, 0x92AA, 0x928D, /* Big5-HKSCS 0xE4A1 .. 0xE4FE */ 0x92A6, 0x929A, 0x92AB, 0x9279, 0x9297, 0x927F, 0x92A3, 0x92EE, 0x928E, 0x9282, 0x9295, 0x92A2, 0x927D, 0x9288, 0x92A1, 0x928A, 0x9286, 0x928C, 0x9299, 0x92A7, 0x927E, 0x9287, 0x92A9, 0x929D, 0x928B, 0x922D, 0x969E, 0x96A1, 0x96FF, 0x9758, 0x977D, 0x977A, 0x977E, 0x9783, 0x9780, 0x9782, 0x977B, 0x9784, 0x9781, 0x977F, 0x97CE, 0x97CD, 0x9816, 0x98AD, 0x98AE, 0x9902, 0x9900, 0x9907, 0x999D, 0x999C, 0x99C3, 0x99B9, 0x99BB, 0x99BA, 0x99C2, 0x99BD, 0x99C7, 0x9AB1, 0x9AE3, 0x9AE7, 0x9B3E, 0x9B3F, 0x9B60, 0x9B61, 0x9B5F, 0x9CF1, 0x9CF2, 0x9CF5, 0x9EA7, 0x50FF, 0x5103, 0x5130, 0x50F8, 0x5106, 0x5107, 0x50F6, 0x50FE, 0x510B, 0x510C, 0x50FD, 0x510A, 0x528B, 0x528C, 0x52F1, 0x52EF, 0x5648, 0x5642, 0x564C, 0x5635, 0x5641, 0x564A, 0x5649, 0x5646, 0x5658, /* Big5-HKSCS 0xE540 .. 0xE57E */ 0x565A, 0x5640, 0x5633, 0x563D, 0x562C, 0x563E, 0x5638, 0x562A, 0x563A, 0x571A, 0x58AB, 0x589D, 0x58B1, 0x58A0, 0x58A3, 0x58AF, 0x58AC, 0x58A5, 0x58A1, 0x58FF, 0x5AFF, 0x5AF4, 0x5AFD, 0x5AF7, 0x5AF6, 0x5B03, 0x5AF8, 0x5B02, 0x5AF9, 0x5B01, 0x5B07, 0x5B05, 0x5B0F, 0x5C67, 0x5D99, 0x5D97, 0x5D9F, 0x5D92, 0x5DA2, 0x5D93, 0x5D95, 0x5DA0, 0x5D9C, 0x5DA1, 0x5D9A, 0x5D9E, 0x5E69, 0x5E5D, 0x5E60, 0x5E5C, 0x7DF3, 0x5EDB, 0x5EDE, 0x5EE1, 0x5F49, 0x5FB2, 0x618B, 0x6183, 0x6179, 0x61B1, 0x61B0, 0x61A2, 0x6189, /* Big5-HKSCS 0xE5A1 .. 0xE5FE */ 0x619B, 0x6193, 0x61AF, 0x61AD, 0x619F, 0x6192, 0x61AA, 0x61A1, 0x618D, 0x6166, 0x61B3, 0x622D, 0x646E, 0x6470, 0x6496, 0x64A0, 0x6485, 0x6497, 0x649C, 0x648F, 0x648B, 0x648A, 0x648C, 0x64A3, 0x649F, 0x6468, 0x64B1, 0x6498, 0x6576, 0x657A, 0x6579, 0x657B, 0x65B2, 0x65B3, 0x66B5, 0x66B0, 0x66A9, 0x66B2, 0x66B7, 0x66AA, 0x66AF, 0x6A00, 0x6A06, 0x6A17, 0x69E5, 0x69F8, 0x6A15, 0x69F1, 0x69E4, 0x6A20, 0x69FF, 0x69EC, 0x69E2, 0x6A1B, 0x6A1D, 0x69FE, 0x6A27, 0x69F2, 0x69EE, 0x6A14, 0x69F7, 0x69E7, 0x6A40, 0x6A08, 0x69E6, 0x69FB, 0x6A0D, 0x69FC, 0x69EB, 0x6A09, 0x6A04, 0x6A18, 0x6A25, 0x6A0F, 0x69F6, 0x6A26, 0x6A07, 0x69F4, 0x6A16, 0x6B51, 0x6BA5, 0x6BA3, 0x6BA2, 0x6BA6, 0x6C01, 0x6C00, 0x6BFF, 0x6C02, 0x6F41, 0x6F26, 0x6F7E, 0x6F87, 0x6FC6, 0x6F92, /* Big5-HKSCS 0xE640 .. 0xE67E */ 0x6F8D, 0x6F89, 0x6F8C, 0x6F62, 0x6F4F, 0x6F85, 0x6F5A, 0x6F96, 0x6F76, 0x6F6C, 0x6F82, 0x6F55, 0x6F72, 0x6F52, 0x6F50, 0x6F57, 0x6F94, 0x6F93, 0x6F5D, 0x6F00, 0x6F61, 0x6F6B, 0x6F7D, 0x6F67, 0x6F90, 0x6F53, 0x6F8B, 0x6F69, 0x6F7F, 0x6F95, 0x6F63, 0x6F77, 0x6F6A, 0x6F7B, 0x71B2, 0x71AF, 0x719B, 0x71B0, 0x71A0, 0x719A, 0x71A9, 0x71B5, 0x719D, 0x71A5, 0x719E, 0x71A4, 0x71A1, 0x71AA, 0x719C, 0x71A7, 0x71B3, 0x7298, 0x729A, 0x7358, 0x7352, 0x735E, 0x735F, 0x7360, 0x735D, 0x735B, 0x7361, 0x735A, 0x7359, /* Big5-HKSCS 0xE6A1 .. 0xE6FE */ 0x7362, 0x7487, 0x7489, 0x748A, 0x7486, 0x7481, 0x747D, 0x7485, 0x7488, 0x747C, 0x7479, 0x7508, 0x7507, 0x757E, 0x7625, 0x761E, 0x7619, 0x761D, 0x761C, 0x7623, 0x761A, 0x7628, 0x761B, 0x769C, 0x769D, 0x769E, 0x769B, 0x778D, 0x778F, 0x7789, 0x7788, 0x78CD, 0x78BB, 0x78CF, 0x78CC, 0x78D1, 0x78CE, 0x78D4, 0x78C8, 0x78C3, 0x78C4, 0x78C9, 0x799A, 0x79A1, 0x79A0, 0x799C, 0x79A2, 0x799B, 0x6B76, 0x7A39, 0x7AB2, 0x7AB4, 0x7AB3, 0x7BB7, 0x7BCB, 0x7BBE, 0x7BAC, 0x7BCE, 0x7BAF, 0x7BB9, 0x7BCA, 0x7BB5, 0x7CC5, 0x7CC8, 0x7CCC, 0x7CCB, 0x7DF7, 0x7DDB, 0x7DEA, 0x7DE7, 0x7DD7, 0x7DE1, 0x7E03, 0x7DFA, 0x7DE6, 0x7DF6, 0x7DF1, 0x7DF0, 0x7DEE, 0x7DDF, 0x7F76, 0x7FAC, 0x7FB0, 0x7FAD, 0x7FED, 0x7FEB, 0x7FEA, 0x7FEC, 0x7FE6, 0x7FE8, 0x8064, 0x8067, 0x81A3, 0x819F, /* Big5-HKSCS 0xE740 .. 0xE77E */ 0x819E, 0x8195, 0x81A2, 0x8199, 0x8197, 0x8216, 0x824F, 0x8253, 0x8252, 0x8250, 0x824E, 0x8251, 0x8524, 0x853B, 0x850F, 0x8500, 0x8529, 0x850E, 0x8509, 0x850D, 0x851F, 0x850A, 0x8527, 0x851C, 0x84FB, 0x852B, 0x84FA, 0x8508, 0x850C, 0x84F4, 0x852A, 0x84F2, 0x8515, 0x84F7, 0x84EB, 0x84F3, 0x84FC, 0x8512, 0x84EA, 0x84E9, 0x8516, 0x84FE, 0x8528, 0x851D, 0x852E, 0x8502, 0x84FD, 0x851E, 0x84F6, 0x8531, 0x8526, 0x84E7, 0x84E8, 0x84F0, 0x84EF, 0x84F9, 0x8518, 0x8520, 0x8530, 0x850B, 0x8519, 0x852F, 0x8662, /* Big5-HKSCS 0xE7A1 .. 0xE7FE */ 0x8756, 0x8763, 0x8764, 0x8777, 0x87E1, 0x8773, 0x8758, 0x8754, 0x875B, 0x8752, 0x8761, 0x875A, 0x8751, 0x875E, 0x876D, 0x876A, 0x8750, 0x874E, 0x875F, 0x875D, 0x876F, 0x876C, 0x877A, 0x876E, 0x875C, 0x8765, 0x874F, 0x877B, 0x8775, 0x8762, 0x8767, 0x8769, 0x885A, 0x8905, 0x890C, 0x8914, 0x890B, 0x8917, 0x8918, 0x8919, 0x8906, 0x8916, 0x8911, 0x890E, 0x8909, 0x89A2, 0x89A4, 0x89A3, 0x89ED, 0x89F0, 0x89EC, 0x8ACF, 0x8AC6, 0x8AB8, 0x8AD3, 0x8AD1, 0x8AD4, 0x8AD5, 0x8ABB, 0x8AD7, 0x8ABE, 0x8AC0, 0x8AC5, 0x8AD8, 0x8AC3, 0x8ABA, 0x8ABD, 0x8AD9, 0x8C3E, 0x8C4D, 0x8C8F, 0x8CE5, 0x8CDF, 0x8CD9, 0x8CE8, 0x8CDA, 0x8CDD, 0x8CE7, 0x8DA0, 0x8D9C, 0x8DA1, 0x8D9B, 0x8E20, 0x8E23, 0x8E25, 0x8E24, 0x8E2E, 0x8E15, 0x8E1B, 0x8E16, 0x8E11, 0x8E19, 0x8E26, 0x8E27, /* Big5-HKSCS 0xE840 .. 0xE87E */ 0x8E14, 0x8E12, 0x8E18, 0x8E13, 0x8E1C, 0x8E17, 0x8E1A, 0x8F2C, 0x8F24, 0x8F18, 0x8F1A, 0x8F20, 0x8F23, 0x8F16, 0x8F17, 0x9073, 0x9070, 0x906F, 0x9067, 0x906B, 0x912F, 0x912B, 0x9129, 0x912A, 0x9132, 0x9126, 0x912E, 0x9185, 0x9186, 0x918A, 0x9181, 0x9182, 0x9184, 0x9180, 0x92D0, 0x92C3, 0x92C4, 0x92C0, 0x92D9, 0x92B6, 0x92CF, 0x92F1, 0x92DF, 0x92D8, 0x92E9, 0x92D7, 0x92DD, 0x92CC, 0x92EF, 0x92C2, 0x92E8, 0x92CA, 0x92C8, 0x92CE, 0x92E6, 0x92CD, 0x92D5, 0x92C9, 0x92E0, 0x92DE, 0x92E7, 0x92D1, 0x92D3, /* Big5-HKSCS 0xE8A1 .. 0xE8FE */ 0x92B5, 0x92E1, 0x92C6, 0x92B4, 0x957C, 0x95AC, 0x95AB, 0x95AE, 0x95B0, 0x96A4, 0x96A2, 0x96D3, 0x9705, 0x9708, 0x9702, 0x975A, 0x978A, 0x978E, 0x9788, 0x97D0, 0x97CF, 0x981E, 0x981D, 0x9826, 0x9829, 0x9828, 0x9820, 0x981B, 0x9827, 0x98B2, 0x9908, 0x98FA, 0x9911, 0x9914, 0x9916, 0x9917, 0x9915, 0x99DC, 0x99CD, 0x99CF, 0x99D3, 0x99D4, 0x99CE, 0x99C9, 0x99D6, 0x99D8, 0x99CB, 0x99D7, 0x99CC, 0x9AB3, 0x9AEC, 0x9AEB, 0x9AF3, 0x9AF2, 0x9AF1, 0x9B46, 0x9B43, 0x9B67, 0x9B74, 0x9B71, 0x9B66, 0x9B76, 0x9B75, 0x9B70, 0x9B68, 0x9B64, 0x9B6C, 0x9CFC, 0x9CFA, 0x9CFD, 0x9CFF, 0x9CF7, 0x9D07, 0x9D00, 0x9CF9, 0x9CFB, 0x9D08, 0x9D05, 0x9D04, 0x9E83, 0x9ED3, 0x9F0F, 0x9F10, 0x511C, 0x5113, 0x5117, 0x511A, 0x5111, 0x51DE, 0x5334, 0x53E1, 0x5670, 0x5660, 0x566E, /* Big5-HKSCS 0xE940 .. 0xE97E */ 0x5673, 0x5666, 0x5663, 0x566D, 0x5672, 0x565E, 0x5677, 0x571C, 0x571B, 0x58C8, 0x58BD, 0x58C9, 0x58BF, 0x58BA, 0x58C2, 0x58BC, 0x58C6, 0x5B17, 0x5B19, 0x5B1B, 0x5B21, 0x5B14, 0x5B13, 0x5B10, 0x5B16, 0x5B28, 0x5B1A, 0x5B20, 0x5B1E, 0x5BEF, 0x5DAC, 0x5DB1, 0x5DA9, 0x5DA7, 0x5DB5, 0x5DB0, 0x5DAE, 0x5DAA, 0x5DA8, 0x5DB2, 0x5DAD, 0x5DAF, 0x5DB4, 0x5E67, 0x5E68, 0x5E66, 0x5E6F, 0x5EE9, 0x5EE7, 0x5EE6, 0x5EE8, 0x5EE5, 0x5F4B, 0x5FBC, 0x619D, 0x61A8, 0x6196, 0x61C5, 0x61B4, 0x61C6, 0x61C1, 0x61CC, 0x61BA, /* Big5-HKSCS 0xE9A1 .. 0xE9FE */ 0x61BF, 0x61B8, 0x618C, 0x64D7, 0x64D6, 0x64D0, 0x64CF, 0x64C9, 0x64BD, 0x6489, 0x64C3, 0x64DB, 0x64F3, 0x64D9, 0x6533, 0x657F, 0x657C, 0x65A2, 0x66C8, 0x66BE, 0x66C0, 0x66CA, 0x66CB, 0x66CF, 0x66BD, 0x66BB, 0x66BA, 0x66CC, 0x6723, 0x6A34, 0x6A66, 0x6A49, 0x6A67, 0x6A32, 0x6A68, 0x6A3E, 0x6A5D, 0x6A6D, 0x6A76, 0x6A5B, 0x6A51, 0x6A28, 0x6A5A, 0x6A3B, 0x6A3F, 0x6A41, 0x6A6A, 0x6A64, 0x6A50, 0x6A4F, 0x6A54, 0x6A6F, 0x6A69, 0x6A60, 0x6A3C, 0x6A5E, 0x6A56, 0x6A55, 0x6A4D, 0x6A4E, 0x6A46, 0x6B55, 0x6B54, 0x6B56, 0x6BA7, 0x6BAA, 0x6BAB, 0x6BC8, 0x6BC7, 0x6C04, 0x6C03, 0x6C06, 0x6FAD, 0x6FCB, 0x6FA3, 0x6FC7, 0x6FBC, 0x6FCE, 0x6FC8, 0x6F5E, 0x6FC4, 0x6FBD, 0x6F9E, 0x6FCA, 0x6FA8, 0x7004, 0x6FA5, 0x6FAE, 0x6FBA, 0x6FAC, 0x6FAA, 0x6FCF, 0x6FBF, 0x6FB8, /* Big5-HKSCS 0xEA40 .. 0xEA7E */ 0x6FA2, 0x6FC9, 0x6FAB, 0x6FCD, 0x6FAF, 0x6FB2, 0x6FB0, 0x71C5, 0x71C2, 0x71BF, 0x71B8, 0x71D6, 0x71C0, 0x71C1, 0x71CB, 0x71D4, 0x71CA, 0x71C7, 0x71CF, 0x71BD, 0x71D8, 0x71BC, 0x71C6, 0x71DA, 0x71DB, 0x729D, 0x729E, 0x7369, 0x7366, 0x7367, 0x736C, 0x7365, 0x736B, 0x736A, 0x747F, 0x749A, 0x74A0, 0x7494, 0x7492, 0x7495, 0x74A1, 0x750B, 0x7580, 0x762F, 0x762D, 0x7631, 0x763D, 0x7633, 0x763C, 0x7635, 0x7632, 0x7630, 0x76BB, 0x76E6, 0x779A, 0x779D, 0x77A1, 0x779C, 0x779B, 0x77A2, 0x77A3, 0x7795, 0x7799, /* Big5-HKSCS 0xEAA1 .. 0xEAFE */ 0x7797, 0x78DD, 0x78E9, 0x78E5, 0x78EA, 0x78DE, 0x78E3, 0x78DB, 0x78E1, 0x78E2, 0x78ED, 0x78DF, 0x78E0, 0x79A4, 0x7A44, 0x7A48, 0x7A47, 0x7AB6, 0x7AB8, 0x7AB5, 0x7AB1, 0x7AB7, 0x7BDE, 0x7BE3, 0x7BE7, 0x7BDD, 0x7BD5, 0x7BE5, 0x7BDA, 0x7BE8, 0x7BF9, 0x7BD4, 0x7BEA, 0x7BE2, 0x7BDC, 0x7BEB, 0x7BD8, 0x7BDF, 0x7CD2, 0x7CD4, 0x7CD7, 0x7CD0, 0x7CD1, 0x7E12, 0x7E21, 0x7E17, 0x7E0C, 0x7E1F, 0x7E20, 0x7E13, 0x7E0E, 0x7E1C, 0x7E15, 0x7E1A, 0x7E22, 0x7E0B, 0x7E0F, 0x7E16, 0x7E0D, 0x7E14, 0x7E25, 0x7E24, 0x7F43, 0x7F7B, 0x7F7C, 0x7F7A, 0x7FB1, 0x7FEF, 0x802A, 0x8029, 0x806C, 0x81B1, 0x81A6, 0x81AE, 0x81B9, 0x81B5, 0x81AB, 0x81B0, 0x81AC, 0x81B4, 0x81B2, 0x81B7, 0x81A7, 0x81F2, 0x8255, 0x8256, 0x8257, 0x8556, 0x8545, 0x856B, 0x854D, 0x8553, 0x8561, 0x8558, /* Big5-HKSCS 0xEB40 .. 0xEB7E */ 0x8540, 0x8546, 0x8564, 0x8541, 0x8562, 0x8544, 0x8551, 0x8547, 0x8563, 0x853E, 0x855B, 0x8571, 0x854E, 0x856E, 0x8575, 0x8555, 0x8567, 0x8560, 0x858C, 0x8566, 0x855D, 0x8554, 0x8565, 0x856C, 0x8663, 0x8665, 0x8664, 0x879B, 0x878F, 0x8797, 0x8793, 0x8792, 0x8788, 0x8781, 0x8796, 0x8798, 0x8779, 0x8787, 0x87A3, 0x8785, 0x8790, 0x8791, 0x879D, 0x8784, 0x8794, 0x879C, 0x879A, 0x8789, 0x891E, 0x8926, 0x8930, 0x892D, 0x892E, 0x8927, 0x8931, 0x8922, 0x8929, 0x8923, 0x892F, 0x892C, 0x891F, 0x89F1, 0x8AE0, /* Big5-HKSCS 0xEBA1 .. 0xEBFE */ 0x8AE2, 0x8AF2, 0x8AF4, 0x8AF5, 0x8ADD, 0x8B14, 0x8AE4, 0x8ADF, 0x8AF0, 0x8AC8, 0x8ADE, 0x8AE1, 0x8AE8, 0x8AFF, 0x8AEF, 0x8AFB, 0x8C91, 0x8C92, 0x8C90, 0x8CF5, 0x8CEE, 0x8CF1, 0x8CF0, 0x8CF3, 0x8D6C, 0x8D6E, 0x8DA5, 0x8DA7, 0x8E33, 0x8E3E, 0x8E38, 0x8E40, 0x8E45, 0x8E36, 0x8E3C, 0x8E3D, 0x8E41, 0x8E30, 0x8E3F, 0x8EBD, 0x8F36, 0x8F2E, 0x8F35, 0x8F32, 0x8F39, 0x8F37, 0x8F34, 0x9076, 0x9079, 0x907B, 0x9086, 0x90FA, 0x9133, 0x9135, 0x9136, 0x9193, 0x9190, 0x9191, 0x918D, 0x918F, 0x9327, 0x931E, 0x9308, 0x931F, 0x9306, 0x930F, 0x937A, 0x9338, 0x933C, 0x931B, 0x9323, 0x9312, 0x9301, 0x9346, 0x932D, 0x930E, 0x930D, 0x92CB, 0x931D, 0x92FA, 0x9325, 0x9313, 0x92F9, 0x92F7, 0x9334, 0x9302, 0x9324, 0x92FF, 0x9329, 0x9339, 0x9335, 0x932A, 0x9314, 0x930C, /* Big5-HKSCS 0xEC40 .. 0xEC7E */ 0x930B, 0x92FE, 0x9309, 0x9300, 0x92FB, 0x9316, 0x95BC, 0x95CD, 0x95BE, 0x95B9, 0x95BA, 0x95B6, 0x95BF, 0x95B5, 0x95BD, 0x96A9, 0x96D4, 0x970B, 0x9712, 0x9710, 0x9799, 0x9797, 0x9794, 0x97F0, 0x97F8, 0x9835, 0x982F, 0x9832, 0x9924, 0x991F, 0x9927, 0x9929, 0x999E, 0x99EE, 0x99EC, 0x99E5, 0x99E4, 0x99F0, 0x99E3, 0x99EA, 0x99E9, 0x99E7, 0x9AB9, 0x9ABF, 0x9AB4, 0x9ABB, 0x9AF6, 0x9AFA, 0x9AF9, 0x9AF7, 0x9B33, 0x9B80, 0x9B85, 0x9B87, 0x9B7C, 0x9B7E, 0x9B7B, 0x9B82, 0x9B93, 0x9B92, 0x9B90, 0x9B7A, 0x9B95, /* Big5-HKSCS 0xECA1 .. 0xECFE */ 0x9B7D, 0x9B88, 0x9D25, 0x9D17, 0x9D20, 0x9D1E, 0x9D14, 0x9D29, 0x9D1D, 0x9D18, 0x9D22, 0x9D10, 0x9D19, 0x9D1F, 0x9E88, 0x9E86, 0x9E87, 0x9EAE, 0x9EAD, 0x9ED5, 0x9ED6, 0x9EFA, 0x9F12, 0x9F3D, 0x5126, 0x5125, 0x5122, 0x5124, 0x5120, 0x5129, 0x52F4, 0x5693, 0x568C, 0x568D, 0x5686, 0x5684, 0x5683, 0x567E, 0x5682, 0x567F, 0x5681, 0x58D6, 0x58D4, 0x58CF, 0x58D2, 0x5B2D, 0x5B25, 0x5B32, 0x5B23, 0x5B2C, 0x5B27, 0x5B26, 0x5B2F, 0x5B2E, 0x5B7B, 0x5BF1, 0x5BF2, 0x5DB7, 0x5E6C, 0x5E6A, 0x5FBE, 0x5FBB, 0x61C3, 0x61B5, 0x61BC, 0x61E7, 0x61E0, 0x61E5, 0x61E4, 0x61E8, 0x61DE, 0x64EF, 0x64E9, 0x64E3, 0x64EB, 0x64E4, 0x64E8, 0x6581, 0x6580, 0x65B6, 0x65DA, 0x66D2, 0x6A8D, 0x6A96, 0x6A81, 0x6AA5, 0x6A89, 0x6A9F, 0x6A9B, 0x6AA1, 0x6A9E, 0x6A87, 0x6A93, 0x6A8E, /* Big5-HKSCS 0xED40 .. 0xED7E */ 0x6A95, 0x6A83, 0x6AA8, 0x6AA4, 0x6A91, 0x6A7F, 0x6AA6, 0x6A9A, 0x6A85, 0x6A8C, 0x6A92, 0x6B5B, 0x6BAD, 0x6C09, 0x6FCC, 0x6FA9, 0x6FF4, 0x6FD4, 0x6FE3, 0x6FDC, 0x6FED, 0x6FE7, 0x6FE6, 0x6FDE, 0x6FF2, 0x6FDD, 0x6FE2, 0x6FE8, 0x71E1, 0x71F1, 0x71E8, 0x71F2, 0x71E4, 0x71F0, 0x71E2, 0x7373, 0x736E, 0x736F, 0x7497, 0x74B2, 0x74AB, 0x7490, 0x74AA, 0x74AD, 0x74B1, 0x74A5, 0x74AF, 0x7510, 0x7511, 0x7512, 0x750F, 0x7584, 0x7643, 0x7648, 0x7649, 0x7647, 0x76A4, 0x76E9, 0x77B5, 0x77AB, 0x77B2, 0x77B7, 0x77B6, /* Big5-HKSCS 0xEDA1 .. 0xEDFE */ 0x77B4, 0x77B1, 0x77A8, 0x77F0, 0x78F3, 0x78FD, 0x7902, 0x78FB, 0x78FC, 0x78F2, 0x7905, 0x78F9, 0x78FE, 0x7904, 0x79AB, 0x79A8, 0x7A5C, 0x7A5B, 0x7A56, 0x7A58, 0x7A54, 0x7A5A, 0x7ABE, 0x7AC0, 0x7AC1, 0x7C05, 0x7C0F, 0x7BF2, 0x7C00, 0x7BFF, 0x7BFB, 0x7C0E, 0x7BF4, 0x7C0B, 0x7BF3, 0x7C02, 0x7C09, 0x7C03, 0x7C01, 0x7BF8, 0x7BFD, 0x7C06, 0x7BF0, 0x7BF1, 0x7C10, 0x7C0A, 0x7CE8, 0x7E2D, 0x7E3C, 0x7E42, 0x7E33, 0x9848, 0x7E38, 0x7E2A, 0x7E49, 0x7E40, 0x7E47, 0x7E29, 0x7E4C, 0x7E30, 0x7E3B, 0x7E36, 0x7E44, 0x7E3A, 0x7F45, 0x7F7F, 0x7F7E, 0x7F7D, 0x7FF4, 0x7FF2, 0x802C, 0x81BB, 0x81C4, 0x81CC, 0x81CA, 0x81C5, 0x81C7, 0x81BC, 0x81E9, 0x825B, 0x825A, 0x825C, 0x8583, 0x8580, 0x858F, 0x85A7, 0x8595, 0x85A0, 0x858B, 0x85A3, 0x857B, 0x85A4, 0x859A, 0x859E, /* Big5-HKSCS 0xEE40 .. 0xEE7E */ 0x8577, 0x857C, 0x8589, 0x85A1, 0x857A, 0x8578, 0x8557, 0x858E, 0x8596, 0x8586, 0x858D, 0x8599, 0x859D, 0x8581, 0x85A2, 0x8582, 0x8588, 0x8585, 0x8579, 0x8576, 0x8598, 0x8590, 0x859F, 0x8668, 0x87BE, 0x87AA, 0x87AD, 0x87C5, 0x87B0, 0x87AC, 0x87B9, 0x87B5, 0x87BC, 0x87AE, 0x87C9, 0x87C3, 0x87C2, 0x87CC, 0x87B7, 0x87AF, 0x87C4, 0x87CA, 0x87B4, 0x87B6, 0x87BF, 0x87B8, 0x87BD, 0x87DE, 0x87B2, 0x8935, 0x8933, 0x893C, 0x893E, 0x8941, 0x8952, 0x8937, 0x8942, 0x89AD, 0x89AF, 0x89AE, 0x89F2, 0x89F3, 0x8B1E, /* Big5-HKSCS 0xEEA1 .. 0xEEFE */ 0x8B18, 0x8B16, 0x8B11, 0x8B05, 0x8B0B, 0x8B22, 0x8B0F, 0x8B12, 0x8B15, 0x8B07, 0x8B0D, 0x8B08, 0x8B06, 0x8B1C, 0x8B13, 0x8B1A, 0x8C4F, 0x8C70, 0x8C72, 0x8C71, 0x8C6F, 0x8C95, 0x8C94, 0x8CF9, 0x8D6F, 0x8E4E, 0x8E4D, 0x8E53, 0x8E50, 0x8E4C, 0x8E47, 0x8F43, 0x8F40, 0x9085, 0x907E, 0x9138, 0x919A, 0x91A2, 0x919B, 0x9199, 0x919F, 0x91A1, 0x919D, 0x91A0, 0x93A1, 0x9383, 0x93AF, 0x9364, 0x9356, 0x9347, 0x937C, 0x9358, 0x935C, 0x9376, 0x9349, 0x9350, 0x9351, 0x9360, 0x936D, 0x938F, 0x934C, 0x936A, 0x9379, 0x9357, 0x9355, 0x9352, 0x934F, 0x9371, 0x9377, 0x937B, 0x9361, 0x935E, 0x9363, 0x9367, 0x9380, 0x934E, 0x9359, 0x95C7, 0x95C0, 0x95C9, 0x95C3, 0x95C5, 0x95B7, 0x96AE, 0x96B0, 0x96AC, 0x9720, 0x971F, 0x9718, 0x971D, 0x9719, 0x979A, 0x97A1, 0x979C, /* Big5-HKSCS 0xEF40 .. 0xEF7E */ 0x979E, 0x979D, 0x97D5, 0x97D4, 0x97F1, 0x9841, 0x9844, 0x984A, 0x9849, 0x9845, 0x9843, 0x9925, 0x992B, 0x992C, 0x992A, 0x9933, 0x9932, 0x992F, 0x992D, 0x9931, 0x9930, 0x9998, 0x99A3, 0x99A1, 0x9A02, 0x99FA, 0x99F4, 0x99F7, 0x99F9, 0x99F8, 0x99F6, 0x99FB, 0x99FD, 0x99FE, 0x99FC, 0x9A03, 0x9ABE, 0x9AFE, 0x9AFD, 0x9B01, 0x9AFC, 0x9B48, 0x9B9A, 0x9BA8, 0x9B9E, 0x9B9B, 0x9BA6, 0x9BA1, 0x9BA5, 0x9BA4, 0x9B86, 0x9BA2, 0x9BA0, 0x9BAF, 0x9D33, 0x9D41, 0x9D67, 0x9D36, 0x9D2E, 0x9D2F, 0x9D31, 0x9D38, 0x9D30, /* Big5-HKSCS 0xEFA1 .. 0xEFFE */ 0x9D45, 0x9D42, 0x9D43, 0x9D3E, 0x9D37, 0x9D40, 0x9D3D, 0x7FF5, 0x9D2D, 0x9E8A, 0x9E89, 0x9E8D, 0x9EB0, 0x9EC8, 0x9EDA, 0x9EFB, 0x9EFF, 0x9F24, 0x9F23, 0x9F22, 0x9F54, 0x9FA0, 0x5131, 0x512D, 0x512E, 0x5698, 0x569C, 0x5697, 0x569A, 0x569D, 0x5699, 0x5970, 0x5B3C, 0x5C69, 0x5C6A, 0x5DC0, 0x5E6D, 0x5E6E, 0x61D8, 0x61DF, 0x61ED, 0x61EE, 0x61F1, 0x61EA, 0x61F0, 0x61EB, 0x61D6, 0x61E9, 0x64FF, 0x6504, 0x64FD, 0x64F8, 0x6501, 0x6503, 0x64FC, 0x6594, 0x65DB, 0x66DA, 0x66DB, 0x66D8, 0x6AC5, 0x6AB9, 0x6ABD, 0x6AE1, 0x6AC6, 0x6ABA, 0x6AB6, 0x6AB7, 0x6AC7, 0x6AB4, 0x6AAD, 0x6B5E, 0x6BC9, 0x6C0B, 0x7007, 0x700C, 0x700D, 0x7001, 0x7005, 0x7014, 0x700E, 0x6FFF, 0x7000, 0x6FFB, 0x7026, 0x6FFC, 0x6FF7, 0x700A, 0x7201, 0x71FF, 0x71F9, 0x7203, 0x71FD, 0x7376, /* Big5-HKSCS 0xF040 .. 0xF07E */ 0x74B8, 0x74C0, 0x74B5, 0x74C1, 0x74BE, 0x74B6, 0x74BB, 0x74C2, 0x7514, 0x7513, 0x765C, 0x7664, 0x7659, 0x7650, 0x7653, 0x7657, 0x765A, 0x76A6, 0x76BD, 0x76EC, 0x77C2, 0x77BA, 0x78FF, 0x790C, 0x7913, 0x7914, 0x7909, 0x7910, 0x7912, 0x7911, 0x79AD, 0x79AC, 0x7A5F, 0x7C1C, 0x7C29, 0x7C19, 0x7C20, 0x7C1F, 0x7C2D, 0x7C1D, 0x7C26, 0x7C28, 0x7C22, 0x7C25, 0x7C30, 0x7E5C, 0x7E50, 0x7E56, 0x7E63, 0x7E58, 0x7E62, 0x7E5F, 0x7E51, 0x7E60, 0x7E57, 0x7E53, 0x7FB5, 0x7FB3, 0x7FF7, 0x7FF8, 0x8075, 0x81D1, 0x81D2, /* Big5-HKSCS 0xF0A1 .. 0xF0FE */ 0x81D0, 0x825F, 0x825E, 0x85B4, 0x85C6, 0x85C0, 0x85C3, 0x85C2, 0x85B3, 0x85B5, 0x85BD, 0x85C7, 0x85C4, 0x85BF, 0x85CB, 0x85CE, 0x85C8, 0x85C5, 0x85B1, 0x85B6, 0x85D2, 0x8624, 0x85B8, 0x85B7, 0x85BE, 0x8669, 0x87E7, 0x87E6, 0x87E2, 0x87DB, 0x87EB, 0x87EA, 0x87E5, 0x87DF, 0x87F3, 0x87E4, 0x87D4, 0x87DC, 0x87D3, 0x87ED, 0x87D8, 0x87E3, 0x87A4, 0x87D7, 0x87D9, 0x8801, 0x87F4, 0x87E8, 0x87DD, 0x8953, 0x894B, 0x894F, 0x894C, 0x8946, 0x8950, 0x8951, 0x8949, 0x8B2A, 0x8B27, 0x8B23, 0x8B33, 0x8B30, 0x8B35, 0x8B47, 0x8B2F, 0x8B3C, 0x8B3E, 0x8B31, 0x8B25, 0x8B37, 0x8B26, 0x8B36, 0x8B2E, 0x8B24, 0x8B3B, 0x8B3D, 0x8B3A, 0x8C42, 0x8C75, 0x8C99, 0x8C98, 0x8C97, 0x8CFE, 0x8D04, 0x8D02, 0x8D00, 0x8E5C, 0x8E62, 0x8E60, 0x8E57, 0x8E56, 0x8E5E, 0x8E65, 0x8E67, /* Big5-HKSCS 0xF140 .. 0xF17E */ 0x8E5B, 0x8E5A, 0x8E61, 0x8E5D, 0x8E69, 0x8E54, 0x8F46, 0x8F47, 0x8F48, 0x8F4B, 0x9128, 0x913A, 0x913B, 0x913E, 0x91A8, 0x91A5, 0x91A7, 0x91AF, 0x91AA, 0x93B5, 0x938C, 0x9392, 0x93B7, 0x939B, 0x939D, 0x9389, 0x93A7, 0x938E, 0x93AA, 0x939E, 0x93A6, 0x9395, 0x9388, 0x9399, 0x939F, 0x938D, 0x93B1, 0x9391, 0x93B2, 0x93A4, 0x93A8, 0x93B4, 0x93A3, 0x93A5, 0x95D2, 0x95D3, 0x95D1, 0x96B3, 0x96D7, 0x96DA, 0x5DC2, 0x96DF, 0x96D8, 0x96DD, 0x9723, 0x9722, 0x9725, 0x97AC, 0x97AE, 0x97A8, 0x97AB, 0x97A4, 0x97AA, /* Big5-HKSCS 0xF1A1 .. 0xF1FE */ 0x97A2, 0x97A5, 0x97D7, 0x97D9, 0x97D6, 0x97D8, 0x97FA, 0x9850, 0x9851, 0x9852, 0x98B8, 0x9941, 0x993C, 0x993A, 0x9A0F, 0x9A0B, 0x9A09, 0x9A0D, 0x9A04, 0x9A11, 0x9A0A, 0x9A05, 0x9A07, 0x9A06, 0x9AC0, 0x9ADC, 0x9B08, 0x9B04, 0x9B05, 0x9B29, 0x9B35, 0x9B4A, 0x9B4C, 0x9B4B, 0x9BC7, 0x9BC6, 0x9BC3, 0x9BBF, 0x9BC1, 0x9BB5, 0x9BB8, 0x9BD3, 0x9BB6, 0x9BC4, 0x9BB9, 0x9BBD, 0x9D5C, 0x9D53, 0x9D4F, 0x9D4A, 0x9D5B, 0x9D4B, 0x9D59, 0x9D56, 0x9D4C, 0x9D57, 0x9D52, 0x9D54, 0x9D5F, 0x9D58, 0x9D5A, 0x9E8E, 0x9E8C, 0x9EDF, 0x9F01, 0x9F00, 0x9F16, 0x9F25, 0x9F2B, 0x9F2A, 0x9F29, 0x9F28, 0x9F4C, 0x9F55, 0x5134, 0x5135, 0x5296, 0x52F7, 0x53B4, 0x56AB, 0x56AD, 0x56A6, 0x56A7, 0x56AA, 0x56AC, 0x58DA, 0x58DD, 0x58DB, 0x5912, 0x5B3D, 0x5B3E, 0x5B3F, 0x5DC3, 0x5E70, /* Big5-HKSCS 0xF240 .. 0xF27E */ 0x5FBF, 0x61FB, 0x6507, 0x6510, 0x650D, 0x6509, 0x650C, 0x650E, 0x6584, 0x65DE, 0x65DD, 0x66DE, 0x6AE7, 0x6AE0, 0x6ACC, 0x6AD1, 0x6AD9, 0x6ACB, 0x6ADF, 0x6ADC, 0x6AD0, 0x6AEB, 0x6ACF, 0x6ACD, 0x6ADE, 0x6B60, 0x6BB0, 0x6C0C, 0x7019, 0x7027, 0x7020, 0x7016, 0x702B, 0x7021, 0x7022, 0x7023, 0x7029, 0x7017, 0x7024, 0x701C, 0x702A, 0x720C, 0x720A, 0x7207, 0x7202, 0x7205, 0x72A5, 0x72A6, 0x72A4, 0x72A3, 0x72A1, 0x74CB, 0x74C5, 0x74B7, 0x74C3, 0x7516, 0x7660, 0x77C9, 0x77CA, 0x77C4, 0x77F1, 0x791D, 0x791B, /* Big5-HKSCS 0xF2A1 .. 0xF2FE */ 0x7921, 0x791C, 0x7917, 0x791E, 0x79B0, 0x7A67, 0x7A68, 0x7C33, 0x7C3C, 0x7C39, 0x7C2C, 0x7C3B, 0x7CEC, 0x7CEA, 0x7E76, 0x7E75, 0x7E78, 0x7E70, 0x7E77, 0x7E6F, 0x7E7A, 0x7E72, 0x7E74, 0x7E68, 0x7F4B, 0x7F4A, 0x7F83, 0x7F86, 0x7FB7, 0x7FFD, 0x7FFE, 0x8078, 0x81D7, 0x81D5, 0x8264, 0x8261, 0x8263, 0x85EB, 0x85F1, 0x85ED, 0x85D9, 0x85E1, 0x85E8, 0x85DA, 0x85D7, 0x85EC, 0x85F2, 0x85F8, 0x85D8, 0x85DF, 0x85E3, 0x85DC, 0x85D1, 0x85F0, 0x85E6, 0x85EF, 0x85DE, 0x85E2, 0x8800, 0x87FA, 0x8803, 0x87F6, 0x87F7, 0x8809, 0x880C, 0x880B, 0x8806, 0x87FC, 0x8808, 0x87FF, 0x880A, 0x8802, 0x8962, 0x895A, 0x895B, 0x8957, 0x8961, 0x895C, 0x8958, 0x895D, 0x8959, 0x8988, 0x89B7, 0x89B6, 0x89F6, 0x8B50, 0x8B48, 0x8B4A, 0x8B40, 0x8B53, 0x8B56, 0x8B54, 0x8B4B, 0x8B55, /* Big5-HKSCS 0xF340 .. 0xF37E */ 0x8B51, 0x8B42, 0x8B52, 0x8B57, 0x8C43, 0x8C77, 0x8C76, 0x8C9A, 0x8D06, 0x8D07, 0x8D09, 0x8DAC, 0x8DAA, 0x8DAD, 0x8DAB, 0x8E6D, 0x8E78, 0x8E73, 0x8E6A, 0x8E6F, 0x8E7B, 0x8EC2, 0x8F52, 0x8F51, 0x8F4F, 0x8F50, 0x8F53, 0x8FB4, 0x9140, 0x913F, 0x91B0, 0x91AD, 0x93DE, 0x93C7, 0x93CF, 0x93C2, 0x93DA, 0x93D0, 0x93F9, 0x93EC, 0x93CC, 0x93D9, 0x93A9, 0x93E6, 0x93CA, 0x93D4, 0x93EE, 0x93E3, 0x93D5, 0x93C4, 0x93CE, 0x93C0, 0x93D2, 0x93E7, 0x957D, 0x95DA, 0x95DB, 0x96E1, 0x9729, 0x972B, 0x972C, 0x9728, 0x9726, /* Big5-HKSCS 0xF3A1 .. 0xF3FE */ 0x97B3, 0x97B7, 0x97B6, 0x97DD, 0x97DE, 0x97DF, 0x985C, 0x9859, 0x985D, 0x9857, 0x98BF, 0x98BD, 0x98BB, 0x98BE, 0x9948, 0x9947, 0x9943, 0x99A6, 0x99A7, 0x9A1A, 0x9A15, 0x9A25, 0x9A1D, 0x9A24, 0x9A1B, 0x9A22, 0x9A20, 0x9A27, 0x9A23, 0x9A1E, 0x9A1C, 0x9A14, 0x9AC2, 0x9B0B, 0x9B0A, 0x9B0E, 0x9B0C, 0x9B37, 0x9BEA, 0x9BEB, 0x9BE0, 0x9BDE, 0x9BE4, 0x9BE6, 0x9BE2, 0x9BF0, 0x9BD4, 0x9BD7, 0x9BEC, 0x9BDC, 0x9BD9, 0x9BE5, 0x9BD5, 0x9BE1, 0x9BDA, 0x9D77, 0x9D81, 0x9D8A, 0x9D84, 0x9D88, 0x9D71, 0x9D80, 0x9D78, 0x9D86, 0x9D8B, 0x9D8C, 0x9D7D, 0x9D6B, 0x9D74, 0x9D75, 0x9D70, 0x9D69, 0x9D85, 0x9D73, 0x9D7B, 0x9D82, 0x9D6F, 0x9D79, 0x9D7F, 0x9D87, 0x9D68, 0x9E94, 0x9E91, 0x9EC0, 0x9EFC, 0x9F2D, 0x9F40, 0x9F41, 0x9F4D, 0x9F56, 0x9F57, 0x9F58, 0x5337, 0x56B2, /* Big5-HKSCS 0xF440 .. 0xF47E */ 0x56B5, 0x56B3, 0x58E3, 0x5B45, 0x5DC6, 0x5DC7, 0x5EEE, 0x5EEF, 0x5FC0, 0x5FC1, 0x61F9, 0x6517, 0x6516, 0x6515, 0x6513, 0x65DF, 0x66E8, 0x66E3, 0x66E4, 0x6AF3, 0x6AF0, 0x6AEA, 0x6AE8, 0x6AF9, 0x6AF1, 0x6AEE, 0x6AEF, 0x703C, 0x7035, 0x702F, 0x7037, 0x7034, 0x7031, 0x7042, 0x7038, 0x703F, 0x703A, 0x7039, 0x7040, 0x703B, 0x7033, 0x7041, 0x7213, 0x7214, 0x72A8, 0x737D, 0x737C, 0x74BA, 0x76AB, 0x76AA, 0x76BE, 0x76ED, 0x77CC, 0x77CE, 0x77CF, 0x77CD, 0x77F2, 0x7925, 0x7923, 0x7927, 0x7928, 0x7924, 0x7929, /* Big5-HKSCS 0xF4A1 .. 0xF4FE */ 0x79B2, 0x7A6E, 0x7A6C, 0x7A6D, 0x7AF7, 0x7C49, 0x7C48, 0x7C4A, 0x7C47, 0x7C45, 0x7CEE, 0x7E7B, 0x7E7E, 0x7E81, 0x7E80, 0x7FBA, 0x7FFF, 0x8079, 0x81DB, 0x81D9, 0x820B, 0x8268, 0x8269, 0x8622, 0x85FF, 0x8601, 0x85FE, 0x861B, 0x8600, 0x85F6, 0x8604, 0x8609, 0x8605, 0x860C, 0x85FD, 0x8819, 0x8810, 0x8811, 0x8817, 0x8813, 0x8816, 0x8963, 0x8966, 0x89B9, 0x89F7, 0x8B60, 0x8B6A, 0x8B5D, 0x8B68, 0x8B63, 0x8B65, 0x8B67, 0x8B6D, 0x8DAE, 0x8E86, 0x8E88, 0x8E84, 0x8F59, 0x8F56, 0x8F57, 0x8F55, 0x8F58, 0x8F5A, 0x908D, 0x9143, 0x9141, 0x91B7, 0x91B5, 0x91B2, 0x91B3, 0x940B, 0x9413, 0x93FB, 0x9420, 0x940F, 0x9414, 0x93FE, 0x9415, 0x9410, 0x9428, 0x9419, 0x940D, 0x93F5, 0x9400, 0x93F7, 0x9407, 0x940E, 0x9416, 0x9412, 0x93FA, 0x9409, 0x93F8, 0x940A, 0x93FF, /* Big5-HKSCS 0xF540 .. 0xF57E */ 0x93FC, 0x940C, 0x93F6, 0x9411, 0x9406, 0x95DE, 0x95E0, 0x95DF, 0x972E, 0x972F, 0x97B9, 0x97BB, 0x97FD, 0x97FE, 0x9860, 0x9862, 0x9863, 0x985F, 0x98C1, 0x98C2, 0x9950, 0x994E, 0x9959, 0x994C, 0x994B, 0x9953, 0x9A32, 0x9A34, 0x9A31, 0x9A2C, 0x9A2A, 0x9A36, 0x9A29, 0x9A2E, 0x9A38, 0x9A2D, 0x9AC7, 0x9ACA, 0x9AC6, 0x9B10, 0x9B12, 0x9B11, 0x9C0B, 0x9C08, 0x9BF7, 0x9C05, 0x9C12, 0x9BF8, 0x9C40, 0x9C07, 0x9C0E, 0x9C06, 0x9C17, 0x9C14, 0x9C09, 0x9D9F, 0x9D99, 0x9DA4, 0x9D9D, 0x9D92, 0x9D98, 0x9D90, 0x9D9B, /* Big5-HKSCS 0xF5A1 .. 0xF5FE */ 0x9DA0, 0x9D94, 0x9D9C, 0x9DAA, 0x9D97, 0x9DA1, 0x9D9A, 0x9DA2, 0x9DA8, 0x9D9E, 0x9DA3, 0x9DBF, 0x9DA9, 0x9D96, 0x9DA6, 0x9DA7, 0x9E99, 0x9E9B, 0x9E9A, 0x9EE5, 0x9EE4, 0x9EE7, 0x9EE6, 0x9F30, 0x9F2E, 0x9F5B, 0x9F60, 0x9F5E, 0x9F5D, 0x9F59, 0x9F91, 0x513A, 0x5139, 0x5298, 0x5297, 0x56C3, 0x56BD, 0x56BE, 0x5B48, 0x5B47, 0x5DCB, 0x5DCF, 0x5EF1, 0x61FD, 0x651B, 0x6B02, 0x6AFC, 0x6B03, 0x6AF8, 0x6B00, 0x7043, 0x7044, 0x704A, 0x7048, 0x7049, 0x7045, 0x7046, 0x721D, 0x721A, 0x7219, 0x737E, 0x7517, 0x766A, 0x77D0, 0x792D, 0x7931, 0x792F, 0x7C54, 0x7C53, 0x7CF2, 0x7E8A, 0x7E87, 0x7E88, 0x7E8B, 0x7E86, 0x7E8D, 0x7F4D, 0x7FBB, 0x8030, 0x81DD, 0x8618, 0x862A, 0x8626, 0x861F, 0x8623, 0x861C, 0x8619, 0x8627, 0x862E, 0x8621, 0x8620, 0x8629, 0x861E, 0x8625, /* Big5-HKSCS 0xF640 .. 0xF67E */ 0x8829, 0x881D, 0x881B, 0x8820, 0x8824, 0x881C, 0x882B, 0x884A, 0x896D, 0x8969, 0x896E, 0x896B, 0x89FA, 0x8B79, 0x8B78, 0x8B45, 0x8B7A, 0x8B7B, 0x8D10, 0x8D14, 0x8DAF, 0x8E8E, 0x8E8C, 0x8F5E, 0x8F5B, 0x8F5D, 0x9146, 0x9144, 0x9145, 0x91B9, 0x943F, 0x943B, 0x9436, 0x9429, 0x943D, 0x943C, 0x9430, 0x9439, 0x942A, 0x9437, 0x942C, 0x9440, 0x9431, 0x95E5, 0x95E4, 0x95E3, 0x9735, 0x973A, 0x97BF, 0x97E1, 0x9864, 0x98C9, 0x98C6, 0x98C0, 0x9958, 0x9956, 0x9A39, 0x9A3D, 0x9A46, 0x9A44, 0x9A42, 0x9A41, 0x9A3A, /* Big5-HKSCS 0xF6A1 .. 0xF6FE */ 0x9A3F, 0x9ACD, 0x9B15, 0x9B17, 0x9B18, 0x9B16, 0x9B3A, 0x9B52, 0x9C2B, 0x9C1D, 0x9C1C, 0x9C2C, 0x9C23, 0x9C28, 0x9C29, 0x9C24, 0x9C21, 0x9DB7, 0x9DB6, 0x9DBC, 0x9DC1, 0x9DC7, 0x9DCA, 0x9DCF, 0x9DBE, 0x9DC5, 0x9DC3, 0x9DBB, 0x9DB5, 0x9DCE, 0x9DB9, 0x9DBA, 0x9DAC, 0x9DC8, 0x9DB1, 0x9DAD, 0x9DCC, 0x9DB3, 0x9DCD, 0x9DB2, 0x9E7A, 0x9E9C, 0x9EEB, 0x9EEE, 0x9EED, 0x9F1B, 0x9F18, 0x9F1A, 0x9F31, 0x9F4E, 0x9F65, 0x9F64, 0x9F92, 0x4EB9, 0x56C6, 0x56C5, 0x56CB, 0x5971, 0x5B4B, 0x5B4C, 0x5DD5, 0x5DD1, 0x5EF2, 0x6521, 0x6520, 0x6526, 0x6522, 0x6B0B, 0x6B08, 0x6B09, 0x6C0D, 0x7055, 0x7056, 0x7057, 0x7052, 0x721E, 0x721F, 0x72A9, 0x737F, 0x74D8, 0x74D5, 0x74D9, 0x74D7, 0x766D, 0x76AD, 0x7935, 0x79B4, 0x7A70, 0x7A71, 0x7C57, 0x7C5C, 0x7C59, 0x7C5B, 0x7C5A, /* Big5-HKSCS 0xF740 .. 0xF77E */ 0x7CF4, 0x7CF1, 0x7E91, 0x7F4F, 0x7F87, 0x81DE, 0x826B, 0x8634, 0x8635, 0x8633, 0x862C, 0x8632, 0x8636, 0x882C, 0x8828, 0x8826, 0x882A, 0x8825, 0x8971, 0x89BF, 0x89BE, 0x89FB, 0x8B7E, 0x8B84, 0x8B82, 0x8B86, 0x8B85, 0x8B7F, 0x8D15, 0x8E95, 0x8E94, 0x8E9A, 0x8E92, 0x8E90, 0x8E96, 0x8E97, 0x8F60, 0x8F62, 0x9147, 0x944C, 0x9450, 0x944A, 0x944B, 0x944F, 0x9447, 0x9445, 0x9448, 0x9449, 0x9446, 0x973F, 0x97E3, 0x986A, 0x9869, 0x98CB, 0x9954, 0x995B, 0x9A4E, 0x9A53, 0x9A54, 0x9A4C, 0x9A4F, 0x9A48, 0x9A4A, /* Big5-HKSCS 0xF7A1 .. 0xF7FE */ 0x9A49, 0x9A52, 0x9A50, 0x9AD0, 0x9B19, 0x9B2B, 0x9B3B, 0x9B56, 0x9B55, 0x9C46, 0x9C48, 0x9C3F, 0x9C44, 0x9C39, 0x9C33, 0x9C41, 0x9C3C, 0x9C37, 0x9C34, 0x9C32, 0x9C3D, 0x9C36, 0x9DDB, 0x9DD2, 0x9DDE, 0x9DDA, 0x9DCB, 0x9DD0, 0x9DDC, 0x9DD1, 0x9DDF, 0x9DE9, 0x9DD9, 0x9DD8, 0x9DD6, 0x9DF5, 0x9DD5, 0x9DDD, 0x9EB6, 0x9EF0, 0x9F35, 0x9F33, 0x9F32, 0x9F42, 0x9F6B, 0x9F95, 0x9FA2, 0x513D, 0x5299, 0x58E8, 0x58E7, 0x5972, 0x5B4D, 0x5DD8, 0x882F, 0x5F4F, 0x6201, 0x6203, 0x6204, 0x6529, 0x6525, 0x6596, 0x66EB, 0x6B11, 0x6B12, 0x6B0F, 0x6BCA, 0x705B, 0x705A, 0x7222, 0x7382, 0x7381, 0x7383, 0x7670, 0x77D4, 0x7C67, 0x7C66, 0x7E95, 0x826C, 0x863A, 0x8640, 0x8639, 0x863C, 0x8631, 0x863B, 0x863E, 0x8830, 0x8832, 0x882E, 0x8833, 0x8976, 0x8974, 0x8973, 0x89FE, /* Big5-HKSCS 0xF840 .. 0xF87E */ 0x8B8C, 0x8B8E, 0x8B8B, 0x8B88, 0x8C45, 0x8D19, 0x8E98, 0x8F64, 0x8F63, 0x91BC, 0x9462, 0x9455, 0x945D, 0x9457, 0x945E, 0x97C4, 0x97C5, 0x9800, 0x9A56, 0x9A59, 0x9B1E, 0x9B1F, 0x9B20, 0x9C52, 0x9C58, 0x9C50, 0x9C4A, 0x9C4D, 0x9C4B, 0x9C55, 0x9C59, 0x9C4C, 0x9C4E, 0x9DFB, 0x9DF7, 0x9DEF, 0x9DE3, 0x9DEB, 0x9DF8, 0x9DE4, 0x9DF6, 0x9DE1, 0x9DEE, 0x9DE6, 0x9DF2, 0x9DF0, 0x9DE2, 0x9DEC, 0x9DF4, 0x9DF3, 0x9DE8, 0x9DED, 0x9EC2, 0x9ED0, 0x9EF2, 0x9EF3, 0x9F06, 0x9F1C, 0x9F38, 0x9F37, 0x9F36, 0x9F43, 0x9F4F, /* Big5-HKSCS 0xF8A1 .. 0xF8FE */ 0x9F71, 0x9F70, 0x9F6E, 0x9F6F, 0x56D3, 0x56CD, 0x5B4E, 0x5C6D, 0x652D, 0x66ED, 0x66EE, 0x6B13, 0x705F, 0x7061, 0x705D, 0x7060, 0x7223, 0x74DB, 0x74E5, 0x77D5, 0x7938, 0x79B7, 0x79B6, 0x7C6A, 0x7E97, 0x7F89, 0x826D, 0x8643, 0x8838, 0x8837, 0x8835, 0x884B, 0x8B94, 0x8B95, 0x8E9E, 0x8E9F, 0x8EA0, 0x8E9D, 0x91BE, 0x91BD, 0x91C2, 0x946B, 0x9468, 0x9469, 0x96E5, 0x9746, 0x9743, 0x9747, 0x97C7, 0x97E5, 0x9A5E, 0x9AD5, 0x9B59, 0x9C63, 0x9C67, 0x9C66, 0x9C62, 0x9C5E, 0x9C60, 0x9E02, 0x9DFE, 0x9E07, 0x9E03, 0x9E06, 0x9E05, 0x9E00, 0x9E01, 0x9E09, 0x9DFF, 0x9DFD, 0x9E04, 0x9EA0, 0x9F1E, 0x9F46, 0x9F74, 0x9F75, 0x9F76, 0x56D4, 0x652E, 0x65B8, 0x6B18, 0x6B19, 0x6B17, 0x6B1A, 0x7062, 0x7226, 0x72AA, 0x77D8, 0x77D9, 0x7939, 0x7C69, 0x7C6B, 0x7CF6, 0x7E9A, /* Big5-HKSCS 0xF940 .. 0xF97E */ 0x7E98, 0x7E9B, 0x7E99, 0x81E0, 0x81E1, 0x8646, 0x8647, 0x8648, 0x8979, 0x897A, 0x897C, 0x897B, 0x89FF, 0x8B98, 0x8B99, 0x8EA5, 0x8EA4, 0x8EA3, 0x946E, 0x946D, 0x946F, 0x9471, 0x9473, 0x9749, 0x9872, 0x995F, 0x9C68, 0x9C6E, 0x9C6D, 0x9E0B, 0x9E0D, 0x9E10, 0x9E0F, 0x9E12, 0x9E11, 0x9EA1, 0x9EF5, 0x9F09, 0x9F47, 0x9F78, 0x9F7B, 0x9F7A, 0x9F79, 0x571E, 0x7066, 0x7C6F, 0x883C, 0x8DB2, 0x8EA6, 0x91C3, 0x9474, 0x9478, 0x9476, 0x9475, 0x9A60, 0x9C74, 0x9C73, 0x9C71, 0x9C75, 0x9E14, 0x9E13, 0x9EF6, 0x9F0A, /* Big5-HKSCS 0xF9A1 .. 0xF9FE */ 0x9FA4, 0x7068, 0x7065, 0x7CF7, 0x866A, 0x883E, 0x883D, 0x883F, 0x8B9E, 0x8C9C, 0x8EA9, 0x8EC9, 0x974B, 0x9873, 0x9874, 0x98CC, 0x9961, 0x99AB, 0x9A64, 0x9A66, 0x9A67, 0x9B24, 0x9E15, 0x9E17, 0x9F48, 0x6207, 0x6B1E, 0x7227, 0x864C, 0x8EA8, 0x9482, 0x9480, 0x9481, 0x9A69, 0x9A68, 0x9B2E, 0x9E19, 0x7229, 0x864B, 0x8B9F, 0x9483, 0x9C79, 0x9EB7, 0x7675, 0x9A6B, 0x9C7A, 0x9E1D, 0x7069, 0x706A, 0x9EA4, 0x9F7E, 0x9F49, 0x9F98, 0x7881, 0x92B9, 0x88CF, 0x58BB, 0x6052, 0x7CA7, 0x5AFA, 0x2554, 0x2566, 0x2557, 0x2560, 0x256C, 0x2563, 0x255A, 0x2569, 0x255D, 0x2552, 0x2564, 0x2555, 0x255E, 0x256A, 0x2561, 0x2558, 0x2567, 0x255B, 0x2553, 0x2565, 0x2556, 0x255F, 0x256B, 0x2562, 0x2559, 0x2568, 0x255C, 0x2551, 0x2550, 0x256D, 0x256E, 0x2570, 0x256F, 0xFFED, /* Big5-HKSCS 0xFA40 .. 0xFA7E */ 0xE000, 0x92DB, 0xE002, 0xE003, 0x854C, 0x42B5, 0x73EF, 0x51B5, 0x3649, 0xE009, 0xE00A, 0x9344, 0xE00C, 0x82EE, 0xE00E, 0x783C, 0x6744, 0x62DF, 0xE012, 0xE013, 0xE014, 0xE015, 0xE016, 0x4FAB, 0xE018, 0x5008, 0xE01A, 0xE01B, 0xE01C, 0xE01D, 0xE01E, 0x5029, 0xE020, 0x5FA4, 0xE022, 0xE023, 0x6EDB, 0xE025, 0x507D, 0x5101, 0x347A, 0x510E, 0x986C, 0x3743, 0x8416, 0xE02D, 0xE02E, 0x5160, 0xE030, 0x516A, 0xE032, 0xE033, 0xE034, 0xE035, 0xE036, 0xE037, 0xE038, 0x5B82, 0x877D, 0xE03B, 0xE03C, 0x51B2, 0x51B8, /* Big5-HKSCS 0xFAA1 .. 0xFAFE */ 0x9D34, 0x51C9, 0x51CF, 0x51D1, 0x3CDC, 0x51D3, 0xE045, 0x51B3, 0x51E2, 0x5342, 0x51ED, 0x83CD, 0x693E, 0xE04C, 0x5F7B, 0x520B, 0x5226, 0x523C, 0x52B5, 0x5257, 0x5294, 0x52B9, 0x52C5, 0x7C15, 0x8542, 0x52E0, 0x860D, 0xE05A, 0x5305, 0xE05C, 0x5549, 0x6ED9, 0xE05F, 0xE060, 0xE061, 0x5333, 0x5344, 0xE064, 0x6CCB, 0xE066, 0x681B, 0x73D5, 0x604A, 0x3EAA, 0x38CC, 0xE06C, 0x71DD, 0x44A2, 0x536D, 0x5374, 0xE071, 0x537E, 0x537F, 0xE074, 0xE075, 0x77E6, 0x5393, 0xE078, 0x53A0, 0x53AB, 0x53AE, 0x73A7, 0xE07D, 0x3F59, 0x739C, 0x53C1, 0x53C5, 0x6C49, 0x4E49, 0x57FE, 0x53D9, 0x3AAB, 0xE087, 0x53E0, 0xE089, 0xE08A, 0x53F6, 0xE08C, 0x5413, 0x7079, 0x552B, 0x6657, 0x6D5B, 0x546D, 0xE093, 0xE094, 0x555D, 0x548F, 0x54A4, 0x47A6, 0xE099, 0xE09A, 0x3DB4, 0xE09C, /* Big5-HKSCS 0xFB40 .. 0xFB7E */ 0xE09D, 0xE09E, 0x5547, 0x4CED, 0x542F, 0x7417, 0x5586, 0x55A9, 0x5605, 0xE0A6, 0xE0A7, 0x4552, 0xE0A9, 0x66B3, 0xE0AB, 0x5637, 0x66CD, 0xE0AE, 0x66A4, 0x66AD, 0x564D, 0x564F, 0x78F1, 0x56F1, 0x9787, 0x53FE, 0x5700, 0x56EF, 0x56ED, 0xE0BA, 0x3623, 0xE0BC, 0x5746, 0xE0BE, 0x6C6E, 0x708B, 0x5742, 0x36B1, 0xE0C3, 0x57E6, 0xE0C5, 0x5803, 0xE0C7, 0xE0C8, 0x5826, 0xE0CA, 0x585C, 0x58AA, 0x3561, 0x58E0, 0x58DC, 0xE0D0, 0x58FB, 0x5BFF, 0x5743, 0xE0D4, 0xE0D5, 0x93D3, 0x35A1, 0x591F, 0x68A6, 0x36C3, 0x6E59, /* Big5-HKSCS 0xFBA1 .. 0xFBFE */ 0xE0DC, 0x5A24, 0x5553, 0xE0DF, 0x8505, 0x59C9, 0xE0E2, 0xE0E3, 0xE0E4, 0xE0E5, 0x59D9, 0xE0E7, 0xE0E8, 0xE0E9, 0x6D71, 0xE0EB, 0xE0EC, 0x59F9, 0xE0EE, 0x5AAB, 0x5A63, 0x36E6, 0xE0F2, 0x5A77, 0x3708, 0x5A96, 0x7465, 0x5AD3, 0xE0F8, 0xE0F9, 0x3D85, 0xE0FB, 0x3732, 0xE0FD, 0x5E83, 0x52D0, 0x5B76, 0x6588, 0x5B7C, 0xE103, 0x4004, 0x485D, 0xE106, 0x5BD5, 0x6160, 0xE109, 0xE10A, 0xE10B, 0x5BF3, 0x5B9D, 0x4D10, 0x5C05, 0xE110, 0x5C13, 0x73CE, 0x5C14, 0xE114, 0xE115, 0x5C49, 0x48DD, 0x5C85, 0x5CE9, 0x5CEF, 0x5D8B, 0xE11C, 0xE11D, 0x5D10, 0x5D18, 0x5D46, 0xE121, 0x5CBA, 0x5DD7, 0x82FC, 0x382D, 0xE126, 0xE127, 0xE128, 0x8287, 0x3836, 0x3BC2, 0x5E2E, 0x6A8A, 0x5E75, 0x5E7A, 0xE130, 0xE131, 0x53A6, 0x4EB7, 0x5ED0, 0x53A8, 0xE136, 0x5E09, 0x5EF4, 0xE139, /* Big5-HKSCS 0xFC40 .. 0xFC7E */ 0x5EF9, 0x5EFB, 0x38A0, 0x5EFC, 0x683E, 0x941B, 0x5F0D, 0xE141, 0xE142, 0x3ADE, 0x48AE, 0xE145, 0x5F3A, 0xE147, 0xE148, 0x5F58, 0xE14A, 0x5F63, 0x97BD, 0xE14D, 0x5F72, 0x9340, 0xE150, 0x5FA7, 0x5DB6, 0x3D5F, 0xE154, 0xE155, 0xE156, 0xE157, 0x91D6, 0xE159, 0xE15A, 0x6031, 0x6685, 0xE15D, 0x3963, 0x3DC7, 0x3639, 0x5790, 0xE162, 0x7971, 0x3E40, 0x609E, 0x60A4, 0x60B3, 0xE168, 0xE169, 0xE16A, 0x74A4, 0x50E1, 0x5AA0, 0x6164, 0x8424, 0x6142, 0xE171, 0xE172, 0x6181, 0x51F4, 0xE175, 0x6187, 0x5BAA, 0xE178, /* Big5-HKSCS 0xFCA1 .. 0xFCFE */ 0xE179, 0x61D3, 0xE17B, 0xE17C, 0x61D0, 0x3932, 0xE17F, 0xE180, 0x6023, 0x615C, 0x651E, 0x638B, 0xE185, 0x62C5, 0xE187, 0x62D5, 0xE189, 0x636C, 0xE18B, 0x3A17, 0x6438, 0x63F8, 0xE18F, 0xE190, 0x6490, 0x6F8A, 0xE193, 0x9814, 0xE195, 0xE196, 0x64E1, 0x64E5, 0x947B, 0x3A66, 0x643A, 0x3A57, 0x654D, 0x6F16, 0xE19F, 0xE1A0, 0x6585, 0x656D, 0x655F, 0xE1A4, 0x65B5, 0xE1A6, 0x4B37, 0x65D1, 0x40D8, 0xE1AA, 0x65E0, 0x65E3, 0x5FDF, 0xE1AE, 0x6618, 0xE1B0, 0xE1B1, 0x6644, 0xE1B3, 0xE1B4, 0x664B, 0xE1B6, 0x6667, 0xE1B8, 0x6673, 0x6674, 0xE1BB, 0xE1BC, 0xE1BD, 0xE1BE, 0xE1BF, 0x77C5, 0xE1C1, 0x99A4, 0x6702, 0xE1C4, 0xE1C5, 0x3B2B, 0x69FA, 0xE1C8, 0x675E, 0x6767, 0x6762, 0xE1CC, 0xE1CD, 0x67D7, 0x44E9, 0x6822, 0x6E50, 0x923C, 0x6801, 0xE1D4, 0xE1D5, 0x685D, /* Big5-HKSCS 0xFD40 .. 0xFD7E */ 0xE1D7, 0x69E1, 0x6A0B, 0xE1DA, 0x6973, 0x68C3, 0xE1DD, 0x6901, 0x6900, 0x3D32, 0x3A01, 0xE1E2, 0x3B80, 0x67AC, 0x6961, 0xE1E6, 0x42FC, 0x6936, 0x6998, 0x3BA1, 0xE1EB, 0x8363, 0x5090, 0x69F9, 0xE1EF, 0xE1F0, 0x6A45, 0xE1F2, 0x6A9D, 0x3BF3, 0x67B1, 0x6AC8, 0xE1F7, 0x3C0D, 0x6B1D, 0xE1FA, 0x60DE, 0x6B35, 0x6B74, 0xE1FE, 0x6EB5, 0xE200, 0xE201, 0xE202, 0x3740, 0x5421, 0xE205, 0x6BE1, 0xE207, 0x6BDC, 0x6C37, 0xE20A, 0xE20B, 0xE20C, 0x6C5A, 0x8226, 0x6C79, 0xE210, 0x44C5, 0xE212, 0xE213, 0xE214, 0xE215, /* Big5-HKSCS 0xFDA1 .. 0xFDFE */ 0xE216, 0x36E5, 0x3CEB, 0xE219, 0x9B83, 0xE21B, 0xE21C, 0x7F8F, 0x6837, 0xE21F, 0xE220, 0xE221, 0x6D96, 0x6D5C, 0x6E7C, 0x6F04, 0xE226, 0xE227, 0xE228, 0x8533, 0xE22A, 0x51C7, 0x6C9C, 0x6E1D, 0x842E, 0xE22F, 0x6E2F, 0xE231, 0x7453, 0xE233, 0x79CC, 0x6E4F, 0x5A91, 0xE237, 0x6FF8, 0x370D, 0x6F9D, 0xE23B, 0x6EFA, 0xE23D, 0xE23E, 0x4555, 0x93F0, 0x6F44, 0x6F5C, 0x3D4E, 0x6F74, 0xE245, 0x3D3B, 0x6F9F, 0xE248, 0x6FD3, 0xE24A, 0xE24B, 0xE24C, 0xE24D, 0xE24E, 0xE24F, 0x51DF, 0xE251, 0xE252, 0xE253, 0xE254, 0x704B, 0x707E, 0x70A7, 0x7081, 0x70CC, 0x70D5, 0x70D6, 0x70DF, 0x4104, 0x3DE8, 0x71B4, 0x7196, 0xE261, 0x712B, 0x7145, 0x5A88, 0x714A, 0x716E, 0x5C9C, 0xE268, 0x714F, 0x9362, 0xE26B, 0x712C, 0xE26D, 0xE26E, 0xE26F, 0x71BA, 0xE271, 0x70BD, 0x720E, /* Big5-HKSCS 0xFE40 .. 0xFE7E */ 0x9442, 0x7215, 0x5911, 0x9443, 0x7224, 0x9341, 0xE27A, 0x722E, 0x7240, 0xE27D, 0x68BD, 0x7255, 0x7257, 0x3E55, 0xE282, 0x680D, 0x6F3D, 0x7282, 0x732A, 0x732B, 0xE288, 0xE289, 0x48ED, 0xE28B, 0x7328, 0x732E, 0x73CF, 0x73AA, 0xE290, 0xE291, 0x73C9, 0x7449, 0xE294, 0xE295, 0xE296, 0x6623, 0x36C5, 0xE299, 0xE29A, 0xE29B, 0x73F7, 0x7415, 0x6903, 0xE29F, 0x7439, 0xE2A1, 0x3ED7, 0x745C, 0xE2A4, 0x7460, 0xE2A6, 0x7447, 0x73E4, 0x7476, 0x83B9, 0x746C, 0x3730, 0x7474, 0x93F1, 0x6A2C, 0x7482, 0x4953, 0xE2B2, /* Big5-HKSCS 0xFEA1 .. 0xFEFE */ 0xE2B3, 0xE2B4, 0xE2B5, 0x5B46, 0xE2B7, 0xE2B8, 0x74C8, 0xE2BA, 0x750E, 0x74E9, 0x751E, 0xE2BE, 0xE2BF, 0x5BD7, 0xE2C1, 0x9385, 0x754D, 0x754A, 0x7567, 0x756E, 0xE2C7, 0x3F04, 0xE2C9, 0x758E, 0x745D, 0x759E, 0x75B4, 0x7602, 0x762C, 0x7651, 0x764F, 0x766F, 0x7676, 0xE2D4, 0x7690, 0x81EF, 0x37F8, 0xE2D8, 0xE2D9, 0x76A1, 0x76A5, 0x76B7, 0x76CC, 0xE2DE, 0x8462, 0xE2E0, 0xE2E1, 0xE2E2, 0x771E, 0x7726, 0x7740, 0x64AF, 0xE2E7, 0x7758, 0xE2E9, 0x77AF, 0xE2EB, 0xE2EC, 0xE2ED, 0x77F4, 0x7809, 0xE2F0, 0xE2F1, 0x68CA, 0x78AF, 0x78C7, 0x78D3, 0x96A5, 0x792E, 0xE2F8, 0x78D7, 0x7934, 0x78B1, 0xE2FC, 0x8FB8, 0x8884, 0xE2FF, 0xE300, 0xE301, 0x7986, 0x8900, 0x6902, 0x7980, 0xE306, 0x799D, 0xE308, 0x793C, 0x79A9, 0x6E2A, 0xE30C, 0x3EA8, 0x79C6, 0xE30F, 0x79D4, }; static const uint16_t REPLACEMENT = 0xfffd; static inline bool IsFirstByte(unsigned c) { return c >= 0x81 && c <= 0xFE; } static inline bool IsSecondByte(unsigned c) { return (c >= 0x40 && c <= 0x7E) || (c >= 0xA1 && c <= 0xFE); } static inline uint16_t ValidChar(unsigned u) { return u != 0 ? static_cast(u) : REPLACEMENT; } /* Returns the number of bytes of Bytes consumed. */ static int qt_Big5hkscsToUnicode(const uint8_t *s, unsigned *pwc) { uint8_t c1 = s[0]; if ((c1 >= 0x81 && c1 <= 0xfe)) { uint8_t c2 = s[1]; if ((c2 >= 0x40 && c2 < 0x7f) || (c2 >= 0xa1 && c2 < 0xff)) { unsigned i = 157 * (c1 - 0x81) + (c2 - (c2 >= 0xa1 ? 0x62 : 0x40)); uint16_t wc = 0xfffd; if (i < 19782) wc = big5hkscs_to_ucs[i]; if (wc != 0xfffd) { *pwc = (unsigned)wc; return 2; } } return 0; } else if (c1 < 0x80) { *pwc = (unsigned)c1; return 1; } return 0; } static int qt_Big5ToUnicode(const uint8_t *buf, unsigned *u) { //for this conversion only first 4 tables are used. for (int i = 0; i < 4; i++) { int start = 0; int end = b5_map_table[i].tableSize - 1; unsigned b5 = (buf[0] << 8) + buf[1]; while (start <= end) { int middle = (end + start + 1) / 2; if (b5_map_table[i].table[middle].x == b5) { *u = b5_map_table[i].table[middle].y; return 2; } else if (b5_map_table[i].table[middle].x > b5) { end = middle - 1; } else { start = middle + 1; } } } return qt_Big5hkscsToUnicode(buf, u); } void Big5TextDecoder::AppendBig5(std::vector& result, const uint8_t* bytes, size_t length) { uint8_t buf[2] = { 0 }; int nbuf = 0; int invalid = 0; result.reserve(length); for (size_t i = 0; i #include #include class Big5TextDecoder { public: static void AppendBig5(std::vector& utf16, const uint8_t* bytes, size_t length); }; zxing-cpp-1.0.8+ds2/core/src/textcodec/Big5TextEncoder.cpp000066400000000000000000015403731361167020700233030ustar00rootroot00000000000000/**************************************************************************** ** ** Copyright (C) 2015 The Qt Company Ltd. ** Contact: http://www.qt.io/licensing/ ** ** This file is part of the QtCore module of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:LGPL21$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and The Qt Company. For licensing terms ** and conditions see http://www.qt.io/terms-conditions. For further ** information use the contact form at http://www.qt.io/contact-us. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 or version 3 as published by the Free ** Software Foundation and appearing in the file LICENSE.LGPLv21 and ** LICENSE.LGPLv3 included in the packaging of this file. Please review the ** following information to ensure the GNU Lesser General Public License ** requirements will be met: https://www.gnu.org/licenses/lgpl.html and ** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** As a special exception, The Qt Company gives you certain additional ** rights. These rights are described in The Qt Company LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** $QT_END_LICENSE$ ** ****************************************************************************/ #include "Big5TextEncoder.h" #include "Big5MapTable.h" /* * ucs4 to big5hkscs convert routing */ struct Summary16 { uint16_t index; /* index into big table */ uint16_t used; /* bitmask of used entries */ }; /* ISO-10646-UCS-4 to big5hkscs convert table */ static const uint8_t big5hkscs_to_charset[24908][2] = { {0x21,0x00}, {0xa2,0x46}, {0xa2,0x47}, {0xa2,0x44}, {0x7c,0x00}, {0xa1,0xb1}, {0xc6,0xd8}, {0x63,0x00}, {0x61,0x00}, {0x2d,0x00}, {0x52,0x00}, {0xa1,0xc2}, {0xa2,0x58}, {0xa1,0xd3}, {0x32,0x00}, {0x33,0x00}, {0xa1,0xa6}, {0xa3,0x67}, {0xa1,0x50}, {0xa1,0x4d}, {0x31,0x00}, {0x6f,0x00}, {0x3f,0x00}, {0x88,0x59}, {0x88,0x57}, {0x41,0x00}, {0x41,0x00}, {0x41,0x00}, {0x41,0x00}, {0x41,0x00}, {0x43,0x00}, {0x88,0x5d}, {0x88,0x5b}, {0x88,0x66}, {0x45,0x00}, {0x49,0x00}, {0x49,0x00}, {0x49,0x00}, {0x49,0x00}, {0x44,0x00}, {0x4e,0x00}, {0x88,0x61}, {0x88,0x5f}, {0x4f,0x00}, {0x4f,0x00}, {0x4f,0x00}, {0xa1,0xd1}, {0x4f,0x00}, {0x55,0x00}, {0x55,0x00}, {0x55,0x00}, {0x55,0x00}, {0x59,0x00}, {0x54,0x00}, {0x73,0x00}, {0x88,0x6a}, {0x88,0x68}, {0x61,0x00}, {0x61,0x00}, {0x61,0x00}, {0x61,0x00}, {0x61,0x00}, {0x63,0x00}, {0x88,0x6f}, {0x88,0x6d}, {0x88,0xa7}, {0x65,0x00}, {0x88,0x73}, {0x88,0x71}, {0x69,0x00}, {0x69,0x00}, {0x65,0x00}, {0x6e,0x00}, {0x88,0x77}, {0x88,0x75}, {0x6f,0x00}, {0x6f,0x00}, {0x6f,0x00}, {0xa1,0xd2}, {0xc8,0xfb}, {0x88,0x7b}, {0x88,0x79}, {0x75,0x00}, {0x88,0xa2}, {0x79,0x00}, {0x74,0x00}, {0x79,0x00}, {0x88,0x56}, {0x88,0x67}, {0x88,0x5a}, {0x88,0x6c}, {0x88,0x5c}, {0x88,0x6e}, {0x88,0x70}, {0xc8,0xfc}, {0x88,0x5e}, {0x88,0x74}, {0xc8,0xfa}, {0x88,0x78}, {0x88,0x58}, {0x88,0x69}, {0x88,0x72}, {0x88,0x60}, {0x88,0x76}, {0x88,0x7a}, {0x88,0x7c}, {0x88,0x7d}, {0x88,0x7e}, {0x88,0xa1}, {0xc8,0xf6}, {0x88,0x6b}, {0xc8,0xf8}, {0xc8,0xf7}, {0x88,0xa8}, {0xc8,0xfe}, {0xc8,0xf9}, {0xc8,0xf5}, {0xc8,0xfd}, {0xc6,0xd9}, {0xa3,0xbe}, {0xa3,0xbc}, {0xa3,0xbd}, {0xa3,0xbf}, {0xa1,0xc5}, {0xa3,0xbb}, {0xa1,0xc2}, {0xa3,0x44}, {0xa3,0x45}, {0xa3,0x46}, {0xa3,0x47}, {0xa3,0x48}, {0xa3,0x49}, {0xa3,0x4a}, {0xa3,0x4b}, {0xa3,0x4c}, {0xa3,0x4d}, {0xa3,0x4e}, {0xa3,0x4f}, {0xa3,0x50}, {0xa3,0x51}, {0xa3,0x52}, {0xa3,0x53}, {0xa3,0x54}, {0xa3,0x55}, {0xa3,0x56}, {0xa3,0x57}, {0xa3,0x58}, {0xa3,0x59}, {0xa3,0x5a}, {0xa3,0x5b}, {0xa3,0x5c}, {0xa3,0x5d}, {0xa3,0x5e}, {0xa3,0x5f}, {0xa3,0x60}, {0xa3,0x61}, {0xa3,0x62}, {0xa3,0x63}, {0xa3,0x64}, {0xa3,0x65}, {0xa3,0x66}, {0xa3,0x67}, {0xa3,0x68}, {0xa3,0x69}, {0xa3,0x6a}, {0xa3,0x6b}, {0xa3,0x6c}, {0xa3,0x6d}, {0xa3,0x6e}, {0xa3,0x6f}, {0xa3,0x70}, {0xa3,0x71}, {0xa3,0x72}, {0xa3,0x73}, {0xc7,0xf9}, {0xc7,0xf3}, {0xc7,0xf4}, {0xc7,0xf5}, {0xc7,0xf6}, {0xc7,0xf7}, {0xc7,0xf8}, {0xc7,0xfa}, {0xc7,0xfb}, {0xc7,0xfc}, {0xc7,0xfd}, {0xc7,0xfe}, {0xc8,0x40}, {0xc8,0x41}, {0xc8,0x42}, {0xc8,0x43}, {0xc8,0x44}, {0xc8,0x45}, {0xc8,0x46}, {0xc8,0x47}, {0xc8,0x48}, {0xc8,0x49}, {0xc8,0x4a}, {0xc8,0x4b}, {0xc8,0x4c}, {0xc8,0x4d}, {0xc8,0x4e}, {0xc8,0x4f}, {0xc8,0x50}, {0xc8,0x51}, {0xc8,0x52}, {0xc8,0x53}, {0xc8,0x54}, {0xc8,0x55}, {0xc8,0x56}, {0xc8,0x57}, {0xc8,0x58}, {0xc8,0x59}, {0xc8,0x5a}, {0xc8,0x5c}, {0xc8,0x5d}, {0xc8,0x5e}, {0xc8,0x5f}, {0xc8,0x60}, {0xc8,0x61}, {0xc8,0x62}, {0xc8,0x63}, {0xc8,0x64}, {0xc8,0x65}, {0xc8,0x66}, {0xc8,0x67}, {0xc8,0x68}, {0xc8,0x69}, {0xc8,0x6a}, {0xc8,0x6b}, {0xc8,0x6c}, {0xc8,0x6d}, {0xc8,0x6e}, {0xc8,0x6f}, {0xc8,0x70}, {0xc8,0x71}, {0xc8,0x72}, {0xc8,0x73}, {0xc8,0x74}, {0xc8,0x75}, {0xc8,0x5b}, {0x88,0x63}, {0x88,0xa4}, {0x88,0x65}, {0x88,0xa6}, {0xa1,0x56}, {0xa1,0x58}, {0xa2,0x77}, {0xa1,0xfc}, {0xa1,0xa5}, {0xa1,0xa6}, {0xa1,0xa7}, {0xa1,0xa8}, {0xa1,0x45}, {0xa3,0xbb}, {0xa1,0x4c}, {0xa1,0x4b}, {0xa1,0x45}, {0xa1,0xac}, {0xa1,0xb2}, {0xa1,0xab}, {0xa1,0xb0}, {0xa1,0xc3}, {0xa3,0xe1}, {0xa2,0x4a}, {0xa1,0xc1}, {0xa2,0x4b}, {0xc8,0xd2}, {0xc8,0xd3}, {0xa2,0xb9}, {0xa2,0xba}, {0xa2,0xbb}, {0xa2,0xbc}, {0xa2,0xbd}, {0xa2,0xbe}, {0xa2,0xbf}, {0xa2,0xc0}, {0xa2,0xc1}, {0xa2,0xc2}, {0xc6,0xb5}, {0xc6,0xb6}, {0xc6,0xb7}, {0xc6,0xb8}, {0xc6,0xb9}, {0xc6,0xba}, {0xc6,0xbb}, {0xc6,0xbc}, {0xc6,0xbd}, {0xc6,0xbe}, {0xa1,0xf6}, {0xa1,0xf4}, {0xa1,0xf7}, {0xa1,0xf5}, {0xa1,0xf8}, {0xa1,0xf9}, {0xa1,0xfb}, {0xa1,0xfa}, {0xc8,0x77}, {0xc8,0x78}, {0xc8,0x76}, {0xa2,0x41}, {0xa2,0x42}, {0xa2,0x58}, {0xa1,0xd4}, {0xa1,0xdb}, {0xa1,0xe8}, {0xa1,0xe7}, {0xa1,0xfd}, {0xa1,0xfc}, {0xa1,0xe4}, {0xa1,0xe5}, {0xa1,0xec}, {0xa1,0xed}, {0xa1,0xef}, {0xa1,0xee}, {0xa1,0xdc}, {0xa1,0xda}, {0xa1,0xdd}, {0xa1,0xdd}, {0xa1,0xd8}, {0xa1,0xd9}, {0xa1,0xf2}, {0xa1,0xf3}, {0xa1,0xe6}, {0xa1,0xe9}, {0xa1,0x5b}, {0xc6,0xa1}, {0xc6,0xa2}, {0xc6,0xa3}, {0xc6,0xa4}, {0xc6,0xa5}, {0xc6,0xa6}, {0xc6,0xa7}, {0xc6,0xa8}, {0xc6,0xa9}, {0xc6,0xaa}, {0xc6,0xab}, {0xc6,0xac}, {0xc6,0xad}, {0xc6,0xae}, {0xc6,0xaf}, {0xc6,0xb0}, {0xc6,0xb1}, {0xc6,0xb2}, {0xc6,0xb3}, {0xc6,0xb4}, {0xa2,0x77}, {0xa2,0x78}, {0xa2,0x7a}, {0xa2,0x7b}, {0xa2,0x7c}, {0xa2,0x7d}, {0xa2,0x75}, {0xa2,0x74}, {0xa2,0x73}, {0xa2,0x72}, {0xa2,0x71}, {0xf9,0xf9}, {0xf9,0xf8}, {0xf9,0xe6}, {0xf9,0xef}, {0xf9,0xdd}, {0xf9,0xe8}, {0xf9,0xf1}, {0xf9,0xdf}, {0xf9,0xec}, {0xf9,0xf5}, {0xf9,0xe3}, {0xf9,0xee}, {0xf9,0xf7}, {0xf9,0xe5}, {0xf9,0xe9}, {0xf9,0xf2}, {0xf9,0xe0}, {0xf9,0xeb}, {0xf9,0xf4}, {0xf9,0xe2}, {0xf9,0xe7}, {0xf9,0xf0}, {0xf9,0xde}, {0xf9,0xed}, {0xf9,0xf6}, {0xf9,0xe4}, {0xf9,0xea}, {0xf9,0xf3}, {0xf9,0xe1}, {0xf9,0xfa}, {0xf9,0xfb}, {0xf9,0xfd}, {0xf9,0xfc}, {0xa2,0xac}, {0xa2,0xad}, {0xa2,0xae}, {0xa1,0x5a}, {0xa2,0x62}, {0xa2,0x63}, {0xa2,0x64}, {0xa2,0x65}, {0xa2,0x66}, {0xa2,0x67}, {0xa2,0x68}, {0xa2,0x69}, {0xa2,0x70}, {0xa2,0x6f}, {0xa2,0x6e}, {0xa2,0x6d}, {0xa2,0x6c}, {0xa2,0x6b}, {0xa2,0x6a}, {0xf9,0xfe}, {0xa2,0x76}, {0xa2,0x79}, {0xa1,0xbd}, {0xa1,0xbc}, {0xa1,0xb6}, {0xa1,0xb5}, {0xa1,0xbf}, {0xa1,0xbe}, {0xa1,0xbb}, {0xa1,0xba}, {0xa1,0xb3}, {0xa1,0xb7}, {0xa1,0xb4}, {0xa2,0xa8}, {0xa2,0xa9}, {0xa2,0xab}, {0xa2,0xaa}, {0xa1,0xb9}, {0xa1,0xb8}, {0xa1,0xf3}, {0xa1,0xf0}, {0xa1,0xf2}, {0xa1,0xf1}, {0xc6,0xe6}, {0xc8,0xd6}, {0xc8,0xd7}, {0xc8,0xd8}, {0xc8,0xd9}, {0xc8,0xda}, {0xc8,0xdb}, {0xc8,0xdc}, {0xc8,0xdd}, {0xc8,0xde}, {0xc8,0xdf}, {0xc8,0xe0}, {0xc8,0xe1}, {0xc8,0xe2}, {0xc8,0xe3}, {0xc8,0xe4}, {0xc8,0xe5}, {0xc8,0xe6}, {0xc8,0xe7}, {0xc8,0xe8}, {0xc8,0xe9}, {0xc8,0xea}, {0xc8,0xeb}, {0xc8,0xec}, {0xc8,0xed}, {0xc8,0xee}, {0xc8,0xef}, {0xc8,0xf0}, {0xc8,0xf1}, {0xc6,0xcd}, {0xa1,0x40}, {0xa1,0x42}, {0xa1,0x43}, {0xa1,0xb2}, {0xc6,0xe0}, {0xc6,0xe1}, {0xc6,0xe2}, {0xa1,0x71}, {0xa1,0x72}, {0xa1,0x6d}, {0xa1,0x6e}, {0xa1,0x75}, {0xa1,0x76}, {0xa1,0x79}, {0xa1,0x7a}, {0xa1,0x69}, {0xa1,0x6a}, {0xa2,0x45}, {0xa1,0x65}, {0xa1,0x66}, {0xa1,0xe3}, {0xa1,0xa9}, {0xa1,0xaa}, {0xa2,0xc3}, {0xa2,0xc4}, {0xa2,0xc5}, {0xa2,0xc6}, {0xa2,0xc7}, {0xa2,0xc8}, {0xa2,0xc9}, {0xa2,0xca}, {0xa2,0xcb}, {0xa1,0xca}, {0xc6,0xe7}, {0xc6,0xe8}, {0xc6,0xe9}, {0xc6,0xea}, {0xc6,0xeb}, {0xc6,0xec}, {0xc6,0xed}, {0xc6,0xee}, {0xc6,0xef}, {0xc6,0xf0}, {0xc6,0xf1}, {0xc6,0xf2}, {0xc6,0xf3}, {0xc6,0xf4}, {0xc6,0xf5}, {0xc6,0xf6}, {0xc6,0xf7}, {0xc6,0xf8}, {0xc6,0xf9}, {0xc6,0xfa}, {0xc6,0xfb}, {0xc6,0xfc}, {0xc6,0xfd}, {0xc6,0xfe}, {0xc7,0x40}, {0xc7,0x41}, {0xc7,0x42}, {0xc7,0x43}, {0xc7,0x44}, {0xc7,0x45}, {0xc7,0x46}, {0xc7,0x47}, {0xc7,0x48}, {0xc7,0x49}, {0xc7,0x4a}, {0xc7,0x4b}, {0xc7,0x4c}, {0xc7,0x4d}, {0xc7,0x4e}, {0xc7,0x4f}, {0xc7,0x50}, {0xc7,0x51}, {0xc7,0x52}, {0xc7,0x53}, {0xc7,0x54}, {0xc7,0x55}, {0xc7,0x56}, {0xc7,0x57}, {0xc7,0x58}, {0xc7,0x59}, {0xc7,0x5a}, {0xc7,0x5b}, {0xc7,0x5c}, {0xc7,0x5d}, {0xc7,0x5e}, {0xc7,0x5f}, {0xc7,0x60}, {0xc7,0x61}, {0xc7,0x62}, {0xc7,0x63}, {0xc7,0x64}, {0xc7,0x65}, {0xc7,0x66}, {0xc7,0x67}, {0xc7,0x68}, {0xc7,0x69}, {0xc7,0x6a}, {0xc7,0x6b}, {0xc7,0x6c}, {0xc7,0x6d}, {0xc7,0x6e}, {0xc7,0x6f}, {0xc7,0x70}, {0xc7,0x71}, {0xc7,0x72}, {0xc7,0x73}, {0xc7,0x74}, {0xc7,0x75}, {0xc7,0x76}, {0xc7,0x77}, {0xc7,0x78}, {0xc7,0x79}, {0xc7,0x7a}, {0xc8,0xd4}, {0xc8,0xd5}, {0xc6,0xdc}, {0xc6,0xdd}, {0xc7,0x7b}, {0xc7,0x7c}, {0xc7,0x7d}, {0xc7,0x7e}, {0xc7,0xa1}, {0xc7,0xa2}, {0xc7,0xa3}, {0xc7,0xa4}, {0xc7,0xa5}, {0xc7,0xa6}, {0xc7,0xa7}, {0xc7,0xa8}, {0xc7,0xa9}, {0xc7,0xaa}, {0xc7,0xab}, {0xc7,0xac}, {0xc7,0xad}, {0xc7,0xae}, {0xc7,0xaf}, {0xc7,0xb0}, {0xc7,0xb1}, {0xc7,0xb2}, {0xc7,0xb3}, {0xc7,0xb4}, {0xc7,0xb5}, {0xc7,0xb6}, {0xc7,0xb7}, {0xc7,0xb8}, {0xc7,0xb9}, {0xc7,0xba}, {0xc7,0xbb}, {0xc7,0xbc}, {0xc7,0xbd}, {0xc7,0xbe}, {0xc7,0xbf}, {0xc7,0xc0}, {0xc7,0xc1}, {0xc7,0xc2}, {0xc7,0xc3}, {0xc7,0xc4}, {0xc7,0xc5}, {0xc7,0xc6}, {0xc7,0xc7}, {0xc7,0xc8}, {0xc7,0xc9}, {0xc7,0xca}, {0xc7,0xcb}, {0xc7,0xcc}, {0xc7,0xcd}, {0xc7,0xce}, {0xc7,0xcf}, {0xc7,0xd0}, {0xc7,0xd1}, {0xc7,0xd2}, {0xc7,0xd3}, {0xc7,0xd4}, {0xc7,0xd5}, {0xc7,0xd6}, {0xc7,0xd7}, {0xc7,0xd8}, {0xc7,0xd9}, {0xc7,0xda}, {0xc7,0xdb}, {0xc7,0xdc}, {0xc7,0xdd}, {0xc7,0xde}, {0xc7,0xdf}, {0xc7,0xe0}, {0xc7,0xe1}, {0xc7,0xe2}, {0xc7,0xe3}, {0xc7,0xe4}, {0xc7,0xe5}, {0xc7,0xe6}, {0xc7,0xe7}, {0xc7,0xe8}, {0xc7,0xe9}, {0xc7,0xea}, {0xc7,0xeb}, {0xc7,0xec}, {0xc7,0xed}, {0xc7,0xee}, {0xc7,0xef}, {0xc7,0xf0}, {0xc7,0xf1}, {0xc7,0xf2}, {0xc6,0xe3}, {0xc6,0xda}, {0xc6,0xdb}, {0xa3,0x74}, {0xa3,0x75}, {0xa3,0x76}, {0xa3,0x77}, {0xa3,0x78}, {0xa3,0x79}, {0xa3,0x7a}, {0xa3,0x7b}, {0xa3,0x7c}, {0xa3,0x7d}, {0xa3,0x7e}, {0xa3,0xa1}, {0xa3,0xa2}, {0xa3,0xa3}, {0xa3,0xa4}, {0xa3,0xa5}, {0xa3,0xa6}, {0xa3,0xa7}, {0xa3,0xa8}, {0xa3,0xa9}, {0xa3,0xaa}, {0xa3,0xab}, {0xa3,0xac}, {0xa3,0xad}, {0xa3,0xae}, {0xa3,0xaf}, {0xa3,0xb0}, {0xa3,0xb1}, {0xa3,0xb2}, {0xa3,0xb3}, {0xa3,0xb4}, {0xa3,0xb5}, {0xa3,0xb6}, {0xa3,0xb7}, {0xa3,0xb8}, {0xa3,0xb9}, {0xa3,0xba}, {0xa4,0x40}, {0xa4,0x47}, {0xa4,0x54}, {0xa5,0x7c}, {0xa4,0x57}, {0xa4,0xa4}, {0xa4,0x55}, {0xa5,0xd2}, {0xa4,0x41}, {0xa4,0xfe}, {0xa4,0x42}, {0xa4,0xd1}, {0xa6,0x61}, {0xa4,0x48}, {0xa4,0x40}, {0xa4,0x47}, {0xa4,0x54}, {0xa5,0x7c}, {0xa4,0xad}, {0xa4,0xbb}, {0xa4,0x43}, {0xa4,0x4b}, {0xa4,0x45}, {0xa4,0x51}, {0xa4,0xeb}, {0xa4,0xf5}, {0xa4,0xf4}, {0xa4,0xec}, {0xaa,0xf7}, {0xa4,0x67}, {0xa4,0xe9}, {0xc8,0xd1}, {0xa6,0xb3}, {0xaa,0xc0}, {0xa6,0x57}, {0xaf,0x53}, {0xb0,0x5d}, {0xaf,0xac}, {0xb3,0xd2}, {0xa5,0x4e}, {0xa9,0x49}, {0xbe,0xc7}, {0xba,0xca}, {0xa5,0xf8}, {0xb8,0xea}, {0xa8,0xf3}, {0xb2,0xbd}, {0xa5,0xf0}, {0xa6,0xdb}, {0xa6,0xdc}, {0xa4,0x40}, {0xa4,0x47}, {0xa4,0x54}, {0xa5,0x7c}, {0xa4,0xad}, {0xa4,0xbb}, {0xa4,0x43}, {0xa4,0x4b}, {0xa4,0x45}, {0xa4,0x51}, {0xa4,0xeb}, {0xa4,0xf5}, {0xa4,0xf4}, {0xa4,0xec}, {0xaa,0xf7}, {0xa4,0x67}, {0xa4,0xe9}, {0xae,0xe8}, {0xa6,0xb3}, {0xaa,0xc0}, {0xa6,0x57}, {0xaf,0x53}, {0xb0,0x5d}, {0xaf,0xac}, {0xb3,0xd2}, {0xaf,0xb5}, {0xa8,0x6b}, {0xa4,0x6b}, {0xbe,0x41}, {0xc0,0x75}, {0xa6,0x4c}, {0xaa,0x60}, {0xb6,0xb5}, {0xa5,0xf0}, {0xbc,0x67}, {0xa1,0xc0}, {0xa4,0x57}, {0xa4,0xa4}, {0xa4,0x55}, {0xa5,0xaa}, {0xa5,0x6b}, {0xc2,0xe5}, {0xa9,0x76}, {0xbe,0xc7}, {0xba,0xca}, {0xa5,0xf8}, {0xb8,0xea}, {0xa8,0xf3}, {0xa9,0x5d}, {0xa2,0x55}, {0xa2,0x56}, {0xa2,0x50}, {0xa2,0x51}, {0xa2,0x52}, {0xa2,0x54}, {0xa2,0x57}, {0xa2,0x53}, {0xa1,0xeb}, {0xa1,0xea}, {0xa2,0x4f}, {0x92,0x77}, {0x96,0xdf}, {0x89,0xd5}, {0x93,0xcd}, {0x9b,0xdf}, {0xfa,0x68}, {0x89,0xda}, {0x8f,0x59}, {0x89,0xdb}, {0x8f,0x5d}, {0x89,0xdc}, {0x96,0xf7}, {0x8a,0xda}, {0x8b,0xdc}, {0x97,0xdb}, {0x9e,0x53}, {0x9d,0xaa}, {0x9b,0xea}, {0x8a,0x6e}, {0x8b,0xc8}, {0x89,0xe8}, {0x89,0xea}, {0x8c,0x4b}, {0xfb,0x70}, {0x89,0xed}, {0x94,0xdd}, {0x89,0xee}, {0x9e,0xb4}, {0x8a,0xd3}, {0x92,0xdb}, {0x94,0xdb}, {0x89,0xf9}, {0xfb,0x7a}, {0x89,0xfb}, {0x9e,0xfc}, {0x89,0xfc}, {0x89,0xbf}, {0x89,0xfe}, {0x89,0xe6}, {0x9d,0x46}, {0x9d,0xee}, {0xa0,0x7e}, {0xa0,0x68}, {0x98,0xe9}, {0x8b,0x68}, {0x8d,0xfd}, {0x8b,0xbe}, {0x9f,0xd9}, {0x8a,0xeb}, {0x9f,0xd7}, {0x8b,0x6a}, {0x9c,0x5c}, {0x8b,0xb1}, {0xfb,0x5e}, {0x9d,0xf3}, {0xa0,0xd0}, {0xfc,0x66}, {0x92,0xe9}, {0x9a,0xec}, {0x8f,0xab}, {0xfa,0x48}, {0x8e,0x45}, {0x9c,0x6f}, {0x9e,0xde}, {0x89,0xef}, {0x96,0xe9}, {0x9e,0xbb}, {0x94,0xde}, {0x9e,0xb8}, {0x97,0xba}, {0xfb,0x65}, {0x95,0xd6}, {0x9c,0xbb}, {0x97,0xda}, {0x8f,0x45}, {0xfb,0x7d}, {0x91,0x58}, {0xfe,0x64}, {0x98,0x56}, {0x9b,0x4d}, {0x93,0x5b}, {0x95,0xc7}, {0x97,0xe7}, {0x93,0x59}, {0x91,0xf5}, {0x97,0xb8}, {0xfd,0xa2}, {0xfb,0xb6}, {0x92,0xfa}, {0x93,0x57}, {0x8b,0xa6}, {0xfb,0xb9}, {0x97,0xb0}, {0xfd,0xc4}, {0x9c,0xa1}, {0x91,0xf2}, {0x91,0xf9}, {0x8f,0xf1}, {0x97,0x45}, {0x98,0x53}, {0xfe,0x78}, {0xfb,0xc1}, {0x92,0x51}, {0x9d,0xad}, {0xfd,0x6c}, {0xfa,0x6b}, {0x9b,0xc2}, {0x9a,0x7b}, {0x8b,0x60}, {0x93,0x4b}, {0x9a,0xbd}, {0x91,0xb7}, {0x95,0xb4}, {0xfe,0xc5}, {0x9e,0xf0}, {0x8d,0x64}, {0x92,0x69}, {0x8d,0x67}, {0xfb,0xea}, {0xfb,0xef}, {0x8d,0x68}, {0x93,0xeb}, {0xfc,0x42}, {0x91,0x66}, {0xfa,0xcd}, {0x93,0xdd}, {0x8b,0xcc}, {0x8d,0x6d}, {0x8d,0x6e}, {0x96,0xa8}, {0xfc,0xa6}, {0x8d,0x6f}, {0x8d,0x70}, {0xfc,0x64}, {0x90,0x60}, {0x8d,0x74}, {0x97,0xc3}, {0x8a,0xd0}, {0x92,0x74}, {0x9b,0xbe}, {0x9c,0xc8}, {0x9c,0xba}, {0x8d,0x78}, {0x9e,0xb9}, {0x95,0x5a}, {0x91,0xb4}, {0x8a,0x48}, {0x8d,0x7d}, {0x8a,0x7d}, {0x8a,0xc2}, {0xfd,0x4a}, {0x8d,0xa1}, {0x8a,0xd1}, {0xfc,0xb4}, {0x8b,0x47}, {0x93,0xa4}, {0x9e,0xda}, {0x8a,0x51}, {0x8d,0xa6}, {0x9e,0xc5}, {0xfc,0xc4}, {0xa0,0x78}, {0x94,0xb5}, {0xfc,0xc2}, {0x8a,0x6b}, {0x8d,0xab}, {0xfa,0xe8}, {0x8d,0xad}, {0xfc,0x49}, {0x93,0xc1}, {0x90,0x6f}, {0x8d,0xb0}, {0x94,0x7e}, {0x90,0xfa}, {0x94,0x79}, {0x8d,0xb2}, {0xfc,0xee}, {0x99,0x7b}, {0x8d,0xb4}, {0x8d,0xb7}, {0x91,0xb3}, {0x8d,0xbb}, {0x8d,0xba}, {0x8d,0xbc}, {0x90,0x44}, {0xfd,0x4c}, {0x93,0xe4}, {0x93,0xe0}, {0xfd,0x53}, {0x8d,0xc3}, {0x9b,0xb8}, {0xfb,0xf0}, {0x93,0xe9}, {0x93,0xf6}, {0x8d,0xc5}, {0x8d,0xca}, {0x8d,0xcc}, {0xfd,0x5d}, {0x93,0xb5}, {0xfd,0x61}, {0x9c,0xf8}, {0x92,0x52}, {0xa0,0xe8}, {0x9c,0xa5}, {0x8c,0x56}, {0x8d,0xd6}, {0x97,0xc0}, {0xa0,0xde}, {0x97,0xd2}, {0xfa,0xa5}, {0xfd,0xa3}, {0x8d,0xdb}, {0x8e,0xaf}, {0x91,0xb5}, {0xfd,0x49}, {0xfd,0xd1}, {0x8d,0xeb}, {0x97,0xc6}, {0xfd,0xce}, {0x90,0xfc}, {0xfc,0x59}, {0x96,0xd6}, {0x97,0xc5}, {0x8d,0xef}, {0x97,0xd7}, {0x8d,0xf0}, {0x96,0xa6}, {0xfb,0xbf}, {0x8d,0xf3}, {0x94,0x49}, {0x8d,0xf5}, {0x98,0x72}, {0x8e,0x6b}, {0xfa,0xfd}, {0x8f,0x50}, {0x9d,0xcc}, {0xfc,0x65}, {0x8c,0x44}, {0x99,0x6e}, {0x94,0xa1}, {0x8f,0x63}, {0xa0,0xda}, {0x92,0x53}, {0xfd,0xe9}, {0x9d,0xb5}, {0x98,0x79}, {0x9d,0x5d}, {0x8d,0x63}, {0x96,0x69}, {0x9f,0x70}, {0xfc,0x6a}, {0x8a,0xc7}, {0x89,0xd7}, {0xfe,0x4d}, {0x9e,0xdd}, {0xfe,0xfb}, {0x98,0xbc}, {0xfa,0xcc}, {0x95,0xb0}, {0x94,0x64}, {0x93,0x6f}, {0x94,0xb9}, {0x95,0xec}, {0x91,0xee}, {0x98,0xc3}, {0x95,0xf6}, {0x8f,0xfd}, {0x98,0xc5}, {0x97,0x66}, {0xfe,0x6e}, {0x97,0xdd}, {0x8c,0xaa}, {0x92,0xd2}, {0x97,0x61}, {0x98,0xcb}, {0x95,0xf0}, {0x97,0x5d}, {0x91,0xe3}, {0x98,0xcc}, {0x94,0x69}, {0x98,0xcd}, {0x98,0xce}, {0x95,0xfc}, {0x94,0xa3}, {0x96,0x62}, {0xfe,0xb6}, {0x94,0x63}, {0x98,0xd0}, {0x98,0xd1}, {0x94,0x75}, {0xfa,0xe0}, {0x94,0x72}, {0x98,0xd6}, {0x8a,0xf0}, {0x98,0xd9}, {0x98,0xdb}, {0x98,0xdd}, {0x98,0xa8}, {0x8a,0x6d}, {0x8a,0xfb}, {0x8a,0xae}, {0xfb,0xc9}, {0x8c,0x5d}, {0x98,0xe4}, {0x98,0xe6}, {0x98,0xe8}, {0x8a,0x4d}, {0x92,0x57}, {0x95,0xdf}, {0xa0,0xac}, {0x98,0xeb}, {0x98,0xec}, {0x8c,0xc3}, {0x98,0xf4}, {0x8a,0xb8}, {0x9e,0xe7}, {0x94,0xbc}, {0xfc,0xd1}, {0x9c,0xc6}, {0x9e,0x7e}, {0x98,0xfe}, {0xfd,0xe8}, {0x99,0x40}, {0x94,0xc9}, {0x94,0xd3}, {0x99,0x46}, {0x90,0xc0}, {0x94,0xd1}, {0x95,0x73}, {0x93,0xc2}, {0x99,0x48}, {0x99,0x4b}, {0x8e,0x55}, {0x99,0x4e}, {0x8e,0xfe}, {0x8e,0x59}, {0x94,0xec}, {0x94,0xef}, {0x8c,0x60}, {0x8f,0x74}, {0x99,0x55}, {0x95,0x44}, {0x8c,0xcb}, {0x99,0x56}, {0x99,0x59}, {0x99,0x5b}, {0x8c,0xc4}, {0xfa,0x45}, {0x90,0xb7}, {0x97,0x43}, {0x95,0xcd}, {0x97,0xc9}, {0xfd,0x50}, {0x8e,0xb9}, {0x95,0xc6}, {0x99,0x67}, {0x8a,0xb9}, {0x8d,0xfc}, {0x8a,0x76}, {0x9d,0x51}, {0x99,0x73}, {0x9d,0x4f}, {0x99,0x7a}, {0x95,0x64}, {0x99,0xa1}, {0x99,0xa5}, {0x99,0xa7}, {0x8e,0xed}, {0x99,0xad}, {0x94,0x6e}, {0x8f,0x70}, {0xfa,0xd0}, {0x99,0xb3}, {0xa0,0x53}, {0x96,0x5c}, {0xfd,0x7a}, {0x97,0xfe}, {0x92,0xbd}, {0x97,0xfd}, {0x8f,0x64}, {0xfc,0xf7}, {0x95,0x62}, {0x97,0xcd}, {0x9e,0x64}, {0x92,0x4c}, {0x8e,0xc9}, {0x99,0xbc}, {0x9d,0xa5}, {0x8f,0x54}, {0x8f,0x7c}, {0x8e,0xa2}, {0x8f,0x7a}, {0x97,0xae}, {0x96,0xc8}, {0x99,0xc3}, {0x90,0xd6}, {0x9c,0xbe}, {0x8f,0x76}, {0x94,0x70}, {0xfb,0x4b}, {0xfd,0xca}, {0x8e,0xc7}, {0xa0,0xf9}, {0x8f,0xa9}, {0x99,0xc7}, {0x90,0xd7}, {0x9e,0xdf}, {0x99,0xce}, {0x8f,0xba}, {0x8f,0xeb}, {0x99,0xcf}, {0x8f,0xc2}, {0x92,0xc9}, {0x97,0xdc}, {0x95,0xb3}, {0x9c,0x79}, {0x95,0xb2}, {0x8f,0xdb}, {0x9b,0xe3}, {0x9e,0x7a}, {0x9b,0xee}, {0x99,0xde}, {0xfa,0xfa}, {0x9e,0xe5}, {0x8a,0x52}, {0x99,0xe1}, {0x8a,0x67}, {0x8b,0xb5}, {0x8a,0xac}, {0x99,0xe9}, {0xfb,0xca}, {0x97,0xde}, {0x95,0xd1}, {0x99,0xf5}, {0xfc,0x4a}, {0x9b,0xa9}, {0xfb,0xdc}, {0xfe,0x56}, {0x9e,0xa4}, {0x9d,0x49}, {0x95,0xdb}, {0x89,0xc5}, {0x99,0xf8}, {0x96,0x64}, {0x90,0x55}, {0x96,0xd4}, {0x97,0x7c}, {0x96,0x4d}, {0x97,0xe1}, {0x9a,0x48}, {0x9a,0x49}, {0xfe,0x7d}, {0x90,0xaa}, {0x9a,0x50}, {0x93,0x47}, {0x8e,0xd8}, {0x90,0xc9}, {0x9a,0x55}, {0x90,0xbc}, {0x9a,0x58}, {0x8b,0xb8}, {0x90,0xd5}, {0x96,0x41}, {0x9a,0x5a}, {0x9a,0x5c}, {0x97,0xc2}, {0x8a,0xbb}, {0x9b,0xaa}, {0x90,0xf5}, {0x9a,0x60}, {0x91,0x45}, {0x8c,0x58}, {0x9a,0x63}, {0x8c,0x49}, {0x8b,0xb6}, {0xfc,0xcf}, {0x96,0x6b}, {0x9a,0x6e}, {0x91,0x4f}, {0x97,0x46}, {0xa0,0xe6}, {0x92,0xd7}, {0x96,0x75}, {0x93,0xd4}, {0x91,0xbb}, {0x96,0x79}, {0x9a,0x70}, {0x96,0x78}, {0x91,0xcd}, {0x9c,0x4a}, {0xa0,0x6f}, {0xa0,0x6a}, {0x91,0x5f}, {0x9f,0xa5}, {0x89,0xba}, {0x9e,0xcd}, {0x9a,0x79}, {0x9d,0xce}, {0x8c,0xd2}, {0x9d,0x73}, {0x96,0xb9}, {0x96,0xbc}, {0x9c,0xd1}, {0x89,0xb7}, {0x9e,0xee}, {0xfb,0x43}, {0x9e,0xc9}, {0xfb,0xd3}, {0x91,0xae}, {0x9d,0x78}, {0x9d,0x7b}, {0xa4,0x40}, {0xa4,0x42}, {0xa4,0x43}, {0x9e,0xb3}, {0xc9,0x45}, {0xa4,0x56}, {0xa4,0x54}, {0xa4,0x57}, {0xa4,0x55}, {0xc9,0x46}, {0xa4,0xa3}, {0xc9,0x4f}, {0xc9,0x4d}, {0xa4,0xa2}, {0xa4,0xa1}, {0xa5,0x42}, {0xa5,0x41}, {0xa5,0x40}, {0xa5,0x43}, {0xa4,0xfe}, {0x9e,0xb2}, {0x9d,0xd6}, {0xa5,0xe0}, {0xa5,0xe1}, {0x99,0x4f}, {0x89,0xce}, {0xa8,0xc3}, {0x8b,0xc0}, {0x9f,0xc4}, {0xa4,0x58}, {0x8b,0xd4}, {0xa4,0xa4}, {0xc9,0x50}, {0x8c,0x72}, {0xa4,0xa5}, {0xc9,0x63}, {0xa6,0xea}, {0xcb,0xb1}, {0xc6,0xbf}, {0x8b,0xf9}, {0xa4,0x59}, {0xa4,0xa6}, {0xa5,0x44}, {0xc9,0x64}, {0x89,0x46}, {0xc6,0xc0}, {0xc9,0x40}, {0xa4,0x44}, {0xa4,0x5b}, {0xc9,0x47}, {0xa4,0x5c}, {0xfa,0xe5}, {0xa4,0xa7}, {0xa5,0x45}, {0xa5,0x47}, {0xa5,0x46}, {0xa5,0xe2}, {0xa5,0xe3}, {0xa8,0xc4}, {0xad,0xbc}, {0xa4,0x41}, {0xc8,0x7b}, {0x8b,0xc6}, {0xc9,0x41}, {0xa4,0x45}, {0xa4,0x5e}, {0xa4,0x5d}, {0xa5,0xe4}, {0x9c,0x57}, {0xa8,0xc5}, {0x9a,0xfb}, {0xb0,0xae}, {0xd4,0x4b}, {0x89,0xd0}, {0x89,0xcf}, {0xb6,0xc3}, {0xdc,0xb1}, {0xdc,0xb2}, {0xc6,0xc1}, {0xa4,0x46}, {0x89,0xd1}, {0xa4,0xa9}, {0x89,0xe2}, {0xa8,0xc6}, {0xa4,0x47}, {0xc9,0x48}, {0xa4,0x5f}, {0xa4,0xaa}, {0xa4,0xac}, {0xc9,0x51}, {0xa4,0xad}, {0xa4,0xab}, {0x92,0x7e}, {0xa5,0xe5}, {0x9d,0xba}, {0xa8,0xc7}, {0xa8,0xc8}, {0xab,0x45}, {0xc6,0xc2}, {0xa4,0x60}, {0xa4,0xae}, {0x8c,0x6f}, {0xa5,0xe6}, {0xa5,0xe8}, {0xa5,0xe7}, {0xa6,0xeb}, {0xa8,0xc9}, {0xa8,0xca}, {0xab,0x46}, {0xab,0x47}, {0xad,0xbd}, {0xdc,0xb3}, {0xfb,0xf8}, {0xf6,0xd6}, {0xa4,0x48}, {0x8b,0xc7}, {0x92,0x6b}, {0x89,0xd2}, {0xa4,0xb0}, {0xa4,0xaf}, {0xc9,0x52}, {0xa4,0xb1}, {0xa4,0xb7}, {0xa4,0xb2}, {0xa4,0xb3}, {0xc9,0x54}, {0xc9,0x53}, {0xa4,0xb5}, {0xa4,0xb6}, {0xa4,0xb4}, {0x9f,0xcf}, {0xa5,0x4a}, {0xa5,0x4b}, {0xa5,0x4c}, {0xa5,0x4d}, {0xa5,0x49}, {0xa5,0x50}, {0xc9,0x6a}, {0xc9,0x66}, {0xc9,0x69}, {0xa5,0x51}, {0xa5,0x61}, {0xc9,0x68}, {0xa5,0x4e}, {0xa5,0x4f}, {0xa5,0x48}, {0xc9,0x65}, {0xc9,0x67}, {0x9d,0xa9}, {0x89,0xd3}, {0x99,0xe2}, {0xa5,0xf5}, {0xc9,0xb0}, {0xa5,0xf2}, {0xa5,0xf6}, {0xc9,0xba}, {0xc9,0xae}, {0xa5,0xf3}, {0xc9,0xb2}, {0x92,0x67}, {0xa5,0xf4}, {0xa5,0xf7}, {0xa5,0xe9}, {0xc9,0xb1}, {0xa5,0xf8}, {0xc9,0xb5}, {0x92,0xa4}, {0xc9,0xb9}, {0xc9,0xb6}, {0xc9,0xb3}, {0xa5,0xea}, {0xa5,0xec}, {0xa5,0xf9}, {0xa5,0xee}, {0xc9,0xab}, {0xa5,0xf1}, {0xa5,0xef}, {0xa5,0xf0}, {0xc9,0xbb}, {0xc9,0xb8}, {0xc9,0xaf}, {0xa5,0xed}, {0x8c,0x73}, {0xc9,0xac}, {0xa5,0xeb}, {0x89,0x4e}, {0xc9,0xb4}, {0xc9,0xb7}, {0x89,0x4f}, {0x92,0x78}, {0xc9,0xad}, {0xca,0x66}, {0xa7,0x42}, {0xa6,0xf4}, {0x91,0xb6}, {0xca,0x67}, {0xa6,0xf1}, {0xa7,0x44}, {0x89,0xd4}, {0xa6,0xf9}, {0x9f,0xd2}, {0xa6,0xf8}, {0xca,0x5b}, {0xa6,0xfc}, {0xa6,0xf7}, {0xca,0x60}, {0xca,0x68}, {0xca,0x64}, {0x92,0xa7}, {0xa6,0xfa}, {0x95,0xa2}, {0xa6,0xfd}, {0xa6,0xee}, {0xa7,0x47}, {0xca,0x5d}, {0x92,0x6e}, {0xcb,0xbd}, {0xa6,0xec}, {0xa7,0x43}, {0xa6,0xed}, {0xa6,0xf5}, {0xa6,0xf6}, {0xca,0x62}, {0xca,0x5e}, {0xa6,0xfb}, {0xa6,0xf3}, {0xca,0x5a}, {0xa6,0xef}, {0xca,0x65}, {0xa7,0x45}, {0xa7,0x48}, {0xa6,0xf2}, {0xa7,0x40}, {0xa7,0x46}, {0xa6,0xf0}, {0xca,0x63}, {0xa7,0x41}, {0xca,0x69}, {0xca,0x5c}, {0xa6,0xfe}, {0xca,0x5f}, {0xca,0x61}, {0xa8,0xd8}, {0xcb,0xbf}, {0xcb,0xcb}, {0xa8,0xd0}, {0xcb,0xcc}, {0xa8,0xcb}, {0xa8,0xd5}, {0x96,0xea}, {0xa8,0xce}, {0xcb,0xb9}, {0xa8,0xd6}, {0xcb,0xb8}, {0xcb,0xbc}, {0xcb,0xc3}, {0xcb,0xc1}, {0xa8,0xde}, {0xa8,0xd9}, {0xcb,0xb3}, {0xcb,0xb5}, {0xa8,0xdb}, {0xa8,0xcf}, {0xcb,0xb6}, {0xcb,0xc2}, {0xcb,0xc9}, {0xa8,0xd4}, {0xcb,0xbb}, {0xcb,0xb4}, {0xa8,0xd3}, {0xcb,0xb7}, {0xa8,0xd7}, {0xcb,0xba}, {0x92,0x6f}, {0xa8,0xd2}, {0xa8,0xcd}, {0xa8,0xdc}, {0xcb,0xc4}, {0xa8,0xdd}, {0xcb,0xc8}, {0xcb,0xc6}, {0xcb,0xca}, {0xa8,0xda}, {0xcb,0xbe}, {0xcb,0xb2}, {0xcb,0xc0}, {0xa8,0xd1}, {0xcb,0xc5}, {0xa8,0xcc}, {0xcb,0xc7}, {0x92,0xa3}, {0x89,0x50}, {0xfa,0x57}, {0xab,0x56}, {0xab,0x4a}, {0x98,0x66}, {0xcd,0xe0}, {0xcd,0xe8}, {0xab,0x49}, {0xab,0x51}, {0xab,0x5d}, {0xcd,0xee}, {0xcd,0xec}, {0xcd,0xe7}, {0x89,0xd6}, {0xab,0x4b}, {0xcd,0xed}, {0xcd,0xe3}, {0xab,0x59}, {0xab,0x50}, {0xab,0x58}, {0xcd,0xde}, {0xcd,0xea}, {0x98,0xb2}, {0xcd,0xe1}, {0xab,0x54}, {0xcd,0xe2}, {0x92,0xab}, {0xcd,0xdd}, {0xab,0x5b}, {0xab,0x4e}, {0xab,0x57}, {0xab,0x4d}, {0xcd,0xdf}, {0xcd,0xe4}, {0xcd,0xeb}, {0xab,0x55}, {0xab,0x52}, {0xcd,0xe6}, {0xab,0x5a}, {0xcd,0xe9}, {0xcd,0xe5}, {0xab,0x4f}, {0xab,0x5c}, {0xab,0x53}, {0xab,0x4c}, {0xab,0x48}, {0x96,0xde}, {0x92,0xac}, {0xcd,0xef}, {0xad,0xd7}, {0xad,0xc1}, {0x8c,0x70}, {0xad,0xd1}, {0x9f,0x6e}, {0xad,0xd6}, {0xd0,0xd0}, {0xd0,0xcf}, {0xd0,0xd4}, {0xd0,0xd5}, {0xad,0xc4}, {0x8e,0xf2}, {0xad,0xcd}, {0x9f,0x6c}, {0xad,0xda}, {0xad,0xce}, {0x89,0xd8}, {0xd0,0xc9}, {0xad,0xc7}, {0xd0,0xca}, {0xfa,0x59}, {0xad,0xdc}, {0xad,0xd3}, {0xad,0xbe}, {0xad,0xbf}, {0xd0,0xdd}, {0xb0,0xbf}, {0xad,0xcc}, {0xad,0xcb}, {0xd0,0xcb}, {0xad,0xcf}, {0xd4,0x5b}, {0xad,0xc6}, {0xd0,0xd6}, {0xad,0xd5}, {0xad,0xd4}, {0xad,0xca}, {0xd0,0xce}, {0xd0,0xd7}, {0xd0,0xc8}, {0xad,0xc9}, {0xd0,0xd8}, {0xad,0xd2}, {0xd0,0xcc}, {0xad,0xc0}, {0xad,0xc3}, {0xad,0xc2}, {0xd0,0xd9}, {0xad,0xd0}, {0xad,0xc5}, {0xad,0xd9}, {0xad,0xdb}, {0xd0,0xd3}, {0xad,0xd8}, {0x92,0xa8}, {0xd0,0xdb}, {0xd0,0xcd}, {0xd0,0xdc}, {0xd0,0xd1}, {0x91,0x63}, {0xd0,0xda}, {0xd0,0xd2}, {0x8c,0x40}, {0xad,0xc8}, {0xd4,0x63}, {0xd4,0x57}, {0xb0,0xb3}, {0xd4,0x5c}, {0xd4,0x62}, {0xb0,0xb2}, {0xd4,0x55}, {0xb0,0xb6}, {0xd4,0x59}, {0xd4,0x52}, {0xb0,0xb4}, {0xd4,0x56}, {0xb0,0xb9}, {0xb0,0xbe}, {0xd4,0x67}, {0xd4,0x51}, {0xb0,0xba}, {0x9f,0x73}, {0xd4,0x66}, {0x92,0xad}, {0xb0,0xb5}, {0xd4,0x58}, {0xb0,0xb1}, {0xd4,0x53}, {0xd4,0x4f}, {0xd4,0x5d}, {0xd4,0x50}, {0xd4,0x4e}, {0xd4,0x5a}, {0xd4,0x60}, {0xd4,0x61}, {0xb0,0xb7}, {0x9b,0xe9}, {0xd8,0x5b}, {0xd4,0x5e}, {0xd4,0x4d}, {0xd4,0x5f}, {0x92,0xa9}, {0xb0,0xc1}, {0xd4,0x64}, {0xb0,0xc0}, {0xd4,0x4c}, {0xd4,0x54}, {0xd4,0x65}, {0xb0,0xbc}, {0xb0,0xbb}, {0xb0,0xb8}, {0xb0,0xbd}, {0xb0,0xaf}, {0xb0,0xb0}, {0xb3,0xc8}, {0x92,0xaa}, {0xd8,0x5e}, {0xd8,0x57}, {0xb3,0xc5}, {0xd8,0x5f}, {0x89,0xd9}, {0xd8,0x55}, {0xd8,0x58}, {0xb3,0xc4}, {0xd8,0x59}, {0xfd,0x56}, {0xb3,0xc7}, {0xd8,0x5d}, {0xd8,0x53}, {0xd8,0x52}, {0xb3,0xc9}, {0xb3,0xca}, {0xb3,0xc6}, {0xb3,0xcb}, {0xd8,0x51}, {0xd8,0x5c}, {0xd8,0x5a}, {0xd8,0x54}, {0xb3,0xc3}, {0xd8,0x56}, {0x9f,0xa8}, {0xb6,0xca}, {0xb6,0xc4}, {0xdc,0xb7}, {0xb6,0xcd}, {0xdc,0xbd}, {0xdc,0xc0}, {0xb6,0xc6}, {0xb6,0xc7}, {0xdc,0xba}, {0xb6,0xc5}, {0xdc,0xc3}, {0xb6,0xcb}, {0xdc,0xc4}, {0xdc,0xbf}, {0xb6,0xcc}, {0x8c,0x71}, {0xdc,0xb4}, {0xb6,0xc9}, {0xdc,0xb5}, {0xdc,0xbe}, {0xdc,0xbc}, {0xdc,0xb8}, {0xb6,0xc8}, {0xdc,0xb6}, {0xb6,0xce}, {0xdc,0xbb}, {0xdc,0xc2}, {0xdc,0xb9}, {0xdc,0xc1}, {0x92,0xa1}, {0xb9,0xb6}, {0xb9,0xb3}, {0x90,0xe3}, {0xb9,0xb4}, {0xe0,0xf9}, {0xe0,0xf1}, {0xb9,0xb2}, {0xb9,0xaf}, {0xe0,0xf2}, {0xa0,0xa6}, {0xb9,0xb1}, {0xe0,0xf5}, {0xe0,0xf7}, {0x94,0xab}, {0xe0,0xfe}, {0xfc,0x72}, {0xe0,0xfd}, {0xe0,0xf8}, {0xb9,0xae}, {0xe0,0xf0}, {0xb9,0xac}, {0xe0,0xf3}, {0xb9,0xb7}, {0xe0,0xf6}, {0xe0,0xfa}, {0xb9,0xb0}, {0xb9,0xad}, {0xe0,0xfc}, {0xe0,0xfb}, {0xb9,0xb5}, {0xe0,0xf4}, {0x97,0xc4}, {0xbb,0xf8}, {0xe4,0xec}, {0xe4,0xe9}, {0xbb,0xf9}, {0xbb,0xf7}, {0x92,0xae}, {0xe4,0xf0}, {0xe4,0xed}, {0xe4,0xe6}, {0xbb,0xf6}, {0xfa,0x67}, {0xbb,0xfa}, {0xe4,0xe7}, {0xbb,0xf5}, {0xbb,0xfd}, {0xe4,0xea}, {0xe4,0xeb}, {0xbb,0xfb}, {0xbb,0xfc}, {0xe4,0xf1}, {0xe4,0xee}, {0xe4,0xef}, {0x92,0xa2}, {0xfa,0x69}, {0xbe,0xaa}, {0xe8,0xf8}, {0xbe,0xa7}, {0xe8,0xf5}, {0xbe,0xa9}, {0xbe,0xab}, {0xe8,0xf6}, {0xbe,0xa8}, {0xe8,0xf7}, {0xe8,0xf4}, {0xc0,0x76}, {0xec,0xbd}, {0xc0,0x77}, {0xec,0xbb}, {0xec,0xbc}, {0xec,0xba}, {0xec,0xb9}, {0xec,0xbe}, {0xc0,0x75}, {0x92,0x68}, {0xef,0xb8}, {0xef,0xb9}, {0xe4,0xe8}, {0xef,0xb7}, {0xc0,0x78}, {0xc3,0x5f}, {0xf1,0xeb}, {0xf1,0xec}, {0xc4,0xd7}, {0xc4,0xd8}, {0xf5,0xc1}, {0xf5,0xc0}, {0xc5,0x6c}, {0xc5,0x6b}, {0xf7,0xd0}, {0xa4,0x49}, {0xa4,0x61}, {0xa4,0xb9}, {0xa4,0xb8}, {0xa5,0x53}, {0xa5,0x52}, {0xa5,0xfc}, {0xa5,0xfb}, {0xa5,0xfd}, {0xa5,0xfa}, {0xa7,0x4a}, {0xa7,0x49}, {0xa7,0x4b}, {0xa8,0xe0}, {0xa8,0xdf}, {0xa8,0xe1}, {0x89,0x51}, {0xab,0x5e}, {0xa2,0x59}, {0xd0,0xde}, {0xa2,0x5a}, {0xb0,0xc2}, {0xa2,0x5c}, {0xa2,0x5b}, {0xd8,0x60}, {0xfa,0x6f}, {0xa2,0x5d}, {0xb9,0xb8}, {0xa2,0x5e}, {0xa4,0x4a}, {0xa4,0xba}, {0xa5,0xfe}, {0xa8,0xe2}, {0xfa,0x71}, {0xa4,0x4b}, {0xa4,0xbd}, {0xa4,0xbb}, {0xa4,0xbc}, {0xa6,0x40}, {0x89,0x52}, {0xa7,0x4c}, {0xa8,0xe4}, {0xa8,0xe3}, {0xa8,0xe5}, {0x94,0x5a}, {0xad,0xdd}, {0xbe,0xac}, {0xc6,0xc3}, {0x89,0xdd}, {0xc9,0x4e}, {0xc8,0xa2}, {0xa5,0x54}, {0xa5,0x55}, {0xa6,0x41}, {0xca,0x6a}, {0xab,0x60}, {0xab,0x5f}, {0xd0,0xe0}, {0xd0,0xdf}, {0xb0,0xc3}, {0xc6,0xc4}, {0xa4,0xbe}, {0xc9,0x55}, {0x9e,0x52}, {0x89,0x53}, {0xcb,0xcd}, {0xab,0x61}, {0xad,0xe0}, {0xad,0xde}, {0xad,0xdf}, {0x9e,0x55}, {0x92,0xba}, {0xbe,0xad}, {0xc6,0xc5}, {0xa5,0x56}, {0x8c,0x5b}, {0xa6,0x42}, {0xc9,0xbc}, {0xfa,0x7d}, {0xfa,0xa8}, {0x9a,0x68}, {0xfa,0x47}, {0xa7,0x4d}, {0xa7,0x4e}, {0xfa,0x7e}, {0xca,0x6b}, {0xcb,0xce}, {0xa8,0xe6}, {0xcb,0xcf}, {0x92,0xbb}, {0xd0,0xe2}, {0xd0,0xe3}, {0xad,0xe3}, {0xfd,0xb6}, {0xd0,0xe4}, {0xfa,0xa2}, {0xd0,0xe1}, {0xad,0xe4}, {0xad,0xe2}, {0xad,0xe1}, {0xd0,0xe5}, {0xfa,0xa3}, {0xd4,0x68}, {0xfa,0xa4}, {0x9b,0xb4}, {0xfa,0xa6}, {0xd8,0x61}, {0xdc,0xc5}, {0xe1,0x40}, {0x89,0xdf}, {0xbb,0xfe}, {0xbe,0xae}, {0xe8,0xf9}, {0xfd,0xdb}, {0xa4,0x4c}, {0xa4,0x5a}, {0xfa,0xa9}, {0x89,0x54}, {0xfa,0xab}, {0xb0,0xc4}, {0xb3,0xcd}, {0xb9,0xb9}, {0xfc,0x7a}, {0xc9,0x42}, {0xa4,0xbf}, {0xa5,0x59}, {0xa5,0x57}, {0xa5,0x58}, {0x89,0xe0}, {0xa8,0xe7}, {0x9f,0x4f}, {0xa4,0x4d}, {0xa4,0x4e}, {0xc8,0x7d}, {0xa4,0x62}, {0x89,0xe1}, {0xa4,0xc0}, {0xa4,0xc1}, {0xa4,0xc2}, {0xc9,0xbe}, {0xa5,0x5a}, {0xfa,0xb0}, {0xc9,0x6b}, {0xa6,0x46}, {0xc9,0xbf}, {0xa6,0x44}, {0xa6,0x45}, {0xc9,0xbd}, {0xa6,0x47}, {0xa6,0x43}, {0xca,0x6c}, {0xaa,0xec}, {0xca,0x6d}, {0x9f,0xcd}, {0xa0,0xe7}, {0xca,0x6e}, {0xa7,0x50}, {0xa7,0x4f}, {0xfa,0xb1}, {0x89,0xa6}, {0xa7,0x53}, {0xa7,0x51}, {0xa7,0x52}, {0xa8,0xed}, {0xa8,0xec}, {0xcb,0xd4}, {0xcb,0xd1}, {0xcb,0xd2}, {0x9e,0xfa}, {0xcb,0xd0}, {0xa8,0xee}, {0xa8,0xea}, {0xa8,0xe9}, {0xa8,0xeb}, {0xa8,0xe8}, {0xfa,0xb2}, {0xa8,0xef}, {0xab,0x63}, {0xcd,0xf0}, {0xcb,0xd3}, {0xab,0x68}, {0xcd,0xf1}, {0xab,0x64}, {0xab,0x67}, {0xab,0x66}, {0xab,0x65}, {0xab,0x62}, {0xd0,0xe8}, {0xad,0xe7}, {0xd0,0xeb}, {0xad,0xe5}, {0xfa,0xb4}, {0x92,0xc4}, {0xd0,0xe7}, {0xad,0xe8}, {0xad,0xe6}, {0xad,0xe9}, {0xd0,0xe9}, {0xd0,0xea}, {0x9f,0x6f}, {0xd0,0xe6}, {0xd0,0xec}, {0x8b,0xb0}, {0xb3,0xd1}, {0xb0,0xc5}, {0xd4,0x69}, {0xd4,0x6b}, {0xd4,0x6a}, {0xd4,0x6c}, {0xb0,0xc6}, {0xb3,0xce}, {0x9f,0xac}, {0xb3,0xcf}, {0xb3,0xd0}, {0xb6,0xd0}, {0xdc,0xc7}, {0x89,0xe3}, {0xdc,0xc6}, {0xdc,0xc8}, {0xdc,0xc9}, {0xb6,0xd1}, {0xb6,0xcf}, {0xe1,0x41}, {0xe1,0x42}, {0xb9,0xbb}, {0xb9,0xba}, {0xe3,0x5a}, {0xbc,0x40}, {0xbc,0x41}, {0xbc,0x42}, {0xbc,0x44}, {0xe4,0xf2}, {0xe4,0xf3}, {0xbc,0x43}, {0x9b,0xd3}, {0x89,0xe4}, {0xbe,0xaf}, {0xbe,0xb0}, {0xfa,0xb5}, {0xf1,0xed}, {0xf5,0xc3}, {0xf5,0xc2}, {0xf7,0xd1}, {0x9f,0xd5}, {0xa4,0x4f}, {0xa5,0x5c}, {0xa5,0x5b}, {0x89,0x55}, {0xa6,0x48}, {0x92,0xc5}, {0xc9,0xc0}, {0x89,0x56}, {0xa7,0x55}, {0xa7,0x56}, {0xa7,0x54}, {0xa7,0x57}, {0xca,0x6f}, {0xca,0x70}, {0xfa,0xb3}, {0xfa,0xb6}, {0xa8,0xf1}, {0xcb,0xd5}, {0xa8,0xf0}, {0xcd,0xf2}, {0xab,0x6c}, {0xcd,0xf3}, {0xab,0x6b}, {0xfa,0xb7}, {0xab,0x69}, {0xab,0x6a}, {0x9e,0xdc}, {0xd0,0xed}, {0xfb,0xc4}, {0x9f,0x71}, {0xb0,0xc7}, {0xd4,0x6e}, {0xb0,0xca}, {0xd4,0x6d}, {0xb1,0xe5}, {0xb0,0xc9}, {0xb0,0xc8}, {0xb3,0xd4}, {0xb3,0xd3}, {0xb3,0xd2}, {0xb6,0xd2}, {0xfa,0xba}, {0x92,0xc7}, {0xb6,0xd5}, {0xb6,0xd6}, {0xb6,0xd4}, {0xb6,0xd3}, {0xe1,0x43}, {0xe1,0x44}, {0xe4,0xf5}, {0xbc,0x45}, {0xe4,0xf4}, {0xbe,0xb1}, {0xec,0xbf}, {0xc0,0x79}, {0xf1,0xee}, {0xc4,0x55}, {0xc6,0xc6}, {0xa4,0x63}, {0xa4,0xc3}, {0xc9,0x56}, {0xa4,0xc4}, {0xa4,0xc5}, {0x9a,0x4c}, {0xa5,0x5d}, {0xa5,0x5e}, {0xa6,0x49}, {0xca,0x71}, {0xcb,0xd6}, {0xcb,0xd7}, {0xab,0x6d}, {0xd0,0xee}, {0xb0,0xcc}, {0xb0,0xcb}, {0xd8,0x63}, {0xd8,0x62}, {0xa4,0x50}, {0xa4,0xc6}, {0xa5,0x5f}, {0xb0,0xcd}, {0xc9,0x43}, {0xc9,0x6c}, {0xa5,0x60}, {0xc9,0xc2}, {0xa6,0x4b}, {0xa6,0x4a}, {0xc9,0xc1}, {0xa7,0x58}, {0x8c,0x68}, {0x89,0xe5}, {0xad,0xea}, {0x9f,0x7d}, {0xd4,0x6f}, {0xb6,0xd7}, {0xe1,0x45}, {0xb9,0xbc}, {0xa0,0xa9}, {0xfa,0xc4}, {0xe8,0xfa}, {0xf3,0xfd}, {0xc6,0xc7}, {0xa4,0xc7}, {0x89,0x57}, {0xcb,0xd8}, {0xcd,0xf4}, {0xb0,0xd0}, {0xb0,0xce}, {0xb0,0xcf}, {0xa4,0x51}, {0xfa,0xaa}, {0xa4,0x64}, {0xa2,0xcd}, {0xa4,0xca}, {0xa4,0xc9}, {0xa4,0xc8}, {0xa5,0x63}, {0xa5,0x62}, {0xc9,0x6d}, {0xc9,0xc3}, {0x89,0x58}, {0xa8,0xf5}, {0xa8,0xf2}, {0xa8,0xf4}, {0xa8,0xf3}, {0xab,0x6e}, {0xb3,0xd5}, {0xa4,0x52}, {0x8b,0xe3}, {0xa4,0xcb}, {0x8b,0x61}, {0xa5,0x65}, {0xa5,0x64}, {0xca,0x72}, {0x9a,0xf1}, {0xa8,0xf6}, {0x9e,0xb7}, {0xc6,0xc8}, {0xc9,0x57}, {0xfa,0xd1}, {0xa5,0x67}, {0xa5,0x66}, {0xa6,0x4c}, {0xa6,0x4d}, {0xca,0x73}, {0xa7,0x59}, {0xfa,0xd2}, {0xa7,0x5a}, {0xa8,0xf7}, {0xa8,0xf8}, {0xa8,0xf9}, {0xab,0x6f}, {0xcd,0xf5}, {0x9e,0xba}, {0xfa,0xd4}, {0xad,0xeb}, {0xc9,0x44}, {0xa4,0xcc}, {0xc9,0xc4}, {0xca,0x74}, {0xca,0x75}, {0xcb,0xd9}, {0xfa,0xd9}, {0xcb,0xda}, {0xcd,0xf7}, {0xcd,0xf6}, {0xcd,0xf9}, {0xcd,0xf8}, {0xab,0x70}, {0xd4,0x70}, {0xad,0xed}, {0xd0,0xef}, {0xad,0xec}, {0xfa,0xdb}, {0x9c,0xe0}, {0xd8,0x64}, {0xb3,0xd6}, {0xfb,0xf7}, {0xd8,0x65}, {0xfb,0xfa}, {0x89,0xe7}, {0xa0,0x7a}, {0xfa,0xdc}, {0xe1,0x46}, {0xb9,0xbd}, {0xfa,0xdd}, {0x89,0xe9}, {0xbc,0x46}, {0xf1,0xef}, {0xc6,0xc9}, {0xc9,0x58}, {0xa5,0x68}, {0xfa,0xe2}, {0x89,0xeb}, {0xb0,0xd1}, {0xfa,0xe3}, {0xa4,0x53}, {0xa4,0x65}, {0xa4,0xce}, {0xa4,0xcd}, {0x90,0xc8}, {0xa4,0xcf}, {0x92,0xda}, {0x89,0x59}, {0x9c,0xf5}, {0xa8,0xfb}, {0xa8,0xfa}, {0xa8,0xfc}, {0x89,0x5a}, {0xfa,0xe7}, {0x9f,0xa2}, {0xab,0x71}, {0xad,0xee}, {0xfa,0xea}, {0xe8,0xfb}, {0xc2,0x4f}, {0xa4,0x66}, {0xa5,0x6a}, {0xa5,0x79}, {0xa5,0x74}, {0xa5,0x6f}, {0xa5,0x6e}, {0xa5,0x75}, {0xa5,0x73}, {0xa5,0x6c}, {0xa5,0x7a}, {0xa5,0x6d}, {0xa5,0x69}, {0xa5,0x78}, {0xa5,0x77}, {0xa5,0x76}, {0xa5,0x6b}, {0xa5,0x72}, {0xfa,0xed}, {0x8f,0xad}, {0xa5,0x71}, {0xa5,0x7b}, {0xa5,0x70}, {0xfb,0x59}, {0xa6,0x53}, {0xa6,0x59}, {0xa6,0x55}, {0xa6,0x5b}, {0xc9,0xc5}, {0xa6,0x58}, {0xa6,0x4e}, {0xa6,0x51}, {0xa6,0x54}, {0xa6,0x50}, {0xa6,0x57}, {0xa6,0x5a}, {0xa6,0x4f}, {0xa6,0x52}, {0xa6,0x56}, {0xa6,0x5c}, {0xfa,0xef}, {0x96,0xef}, {0x9d,0xec}, {0xca,0x7e}, {0xca,0x7b}, {0x9d,0xca}, {0xa7,0x67}, {0xca,0x7c}, {0xa7,0x5b}, {0xa7,0x5d}, {0xa7,0x75}, {0xa7,0x70}, {0xfd,0x6d}, {0x89,0xec}, {0xca,0xa5}, {0xca,0x7d}, {0xa7,0x5f}, {0xa7,0x61}, {0xca,0xa4}, {0xa7,0x68}, {0xca,0x78}, {0xa7,0x74}, {0xa7,0x76}, {0xa7,0x5c}, {0xa7,0x6d}, {0xfb,0x44}, {0xca,0x76}, {0xa7,0x73}, {0x9d,0xe2}, {0xa7,0x64}, {0x8c,0x75}, {0xa7,0x6e}, {0xa7,0x6f}, {0xca,0x77}, {0xa7,0x6c}, {0xa7,0x6a}, {0xa7,0x6b}, {0xa7,0x71}, {0xca,0xa1}, {0xa7,0x5e}, {0xa7,0x72}, {0xca,0xa3}, {0xa7,0x66}, {0xa7,0x63}, {0xca,0x7a}, {0xa7,0x62}, {0xca,0xa6}, {0xa7,0x65}, {0xa7,0x69}, {0x9e,0xc0}, {0x9e,0x56}, {0xa7,0x60}, {0xca,0xa2}, {0xca,0x79}, {0xcb,0xeb}, {0xcb,0xea}, {0xa9,0x4f}, {0xcb,0xed}, {0xcb,0xef}, {0xcb,0xe4}, {0xcb,0xe7}, {0xcb,0xee}, {0xa9,0x50}, {0x9f,0x79}, {0x9a,0xc7}, {0xcb,0xe1}, {0xcb,0xe5}, {0xfa,0xf4}, {0xcb,0xe9}, {0xce,0x49}, {0xa9,0x4b}, {0xce,0x4d}, {0xa8,0xfd}, {0xcb,0xe6}, {0xa8,0xfe}, {0xa9,0x4c}, {0xa9,0x45}, {0xa9,0x41}, {0xcb,0xe2}, {0xa9,0x44}, {0xa9,0x49}, {0xa9,0x52}, {0xcb,0xe3}, {0xcb,0xdc}, {0xa9,0x43}, {0xcb,0xdd}, {0xcb,0xdf}, {0xa9,0x46}, {0x98,0xa1}, {0xa9,0x48}, {0xcb,0xdb}, {0xcb,0xe0}, {0xa9,0x51}, {0xa9,0x4d}, {0xcb,0xe8}, {0xa9,0x53}, {0xfa,0xf8}, {0xa9,0x4a}, {0xcb,0xde}, {0xa9,0x47}, {0x89,0xf0}, {0x9e,0x47}, {0xa9,0x42}, {0xa9,0x40}, {0x9d,0xf7}, {0xcb,0xec}, {0xa9,0x4e}, {0x9f,0xd3}, {0x9a,0xca}, {0xce,0x48}, {0xcd,0xfb}, {0xce,0x4b}, {0x89,0xf1}, {0xfa,0xf9}, {0xcd,0xfd}, {0xab,0x78}, {0xab,0xa8}, {0xab,0x74}, {0xab,0xa7}, {0xab,0x7d}, {0xab,0xa4}, {0xab,0x72}, {0xcd,0xfc}, {0xce,0x43}, {0xab,0xa3}, {0xce,0x4f}, {0xab,0xa5}, {0x8e,0x5a}, {0xab,0x79}, {0x89,0xf2}, {0xce,0x45}, {0xce,0x42}, {0xab,0x77}, {0x89,0xf3}, {0xcd,0xfa}, {0xab,0xa6}, {0xce,0x4a}, {0xab,0x7c}, {0xce,0x4c}, {0xab,0xa9}, {0xab,0x73}, {0xab,0x7e}, {0xab,0x7b}, {0xce,0x40}, {0xab,0xa1}, {0xce,0x46}, {0xce,0x47}, {0xab,0x7a}, {0xab,0xa2}, {0xab,0x76}, {0x92,0x5d}, {0x8b,0x51}, {0x92,0xe0}, {0xab,0x75}, {0xcd,0xfe}, {0x89,0xf4}, {0xce,0x44}, {0x9f,0xd4}, {0xce,0x4e}, {0xd1,0x44}, {0xad,0xfb}, {0xd0,0xf1}, {0x8a,0x79}, {0xd0,0xf6}, {0xad,0xf4}, {0xae,0x40}, {0xd0,0xf4}, {0xad,0xef}, {0xad,0xf9}, {0xad,0xfe}, {0xd0,0xfb}, {0xad,0xfa}, {0xad,0xfd}, {0x89,0xf5}, {0xd0,0xfe}, {0xad,0xf5}, {0xd0,0xf5}, {0xd1,0x42}, {0xd1,0x43}, {0xad,0xf7}, {0xd1,0x41}, {0xad,0xf3}, {0xae,0x43}, {0xd0,0xf8}, {0xad,0xf1}, {0x97,0xa7}, {0xd1,0x46}, {0xd0,0xf9}, {0xd0,0xfd}, {0xad,0xf6}, {0xae,0x42}, {0xd0,0xfa}, {0xad,0xfc}, {0xd1,0x40}, {0xd1,0x47}, {0xd4,0xa1}, {0x93,0xba}, {0xd1,0x45}, {0xae,0x44}, {0xad,0xf0}, {0xd0,0xfc}, {0xd0,0xf3}, {0x9e,0x58}, {0xad,0xf8}, {0xd0,0xf2}, {0x89,0xf6}, {0xd0,0xf7}, {0x9e,0x57}, {0x89,0xf7}, {0x8a,0x41}, {0xd0,0xf0}, {0xae,0x41}, {0x89,0xf8}, {0xd4,0x77}, {0xfa,0xf1}, {0xb0,0xe4}, {0xd4,0xa7}, {0xb0,0xe2}, {0xb0,0xdf}, {0xd4,0x7c}, {0xb0,0xdb}, {0xd4,0xa2}, {0xb0,0xe6}, {0xd4,0x76}, {0xd4,0x7b}, {0xd4,0x7a}, {0xad,0xf2}, {0xb0,0xe1}, {0xd4,0xa5}, {0xd4,0xa8}, {0xd4,0x73}, {0xb3,0xe8}, {0x89,0xfa}, {0xd4,0xa9}, {0xb0,0xe7}, {0xb0,0xd9}, {0xb0,0xd6}, {0xd4,0x7e}, {0xb0,0xd3}, {0xfb,0x42}, {0xd4,0xa6}, {0xfa,0xbf}, {0xb0,0xda}, {0xd4,0xaa}, {0xd4,0x74}, {0xd4,0xa4}, {0xb0,0xdd}, {0xd4,0x75}, {0xd4,0x78}, {0xd4,0x7d}, {0xfb,0xa3}, {0xb0,0xde}, {0xb0,0xdc}, {0xb0,0xe8}, {0xb0,0xe3}, {0xfa,0xf7}, {0xb0,0xd7}, {0xb1,0xd2}, {0xb0,0xd8}, {0xd4,0x79}, {0xb0,0xe5}, {0xb0,0xe0}, {0xd4,0xa3}, {0xb0,0xd5}, {0x9e,0x4e}, {0xb0,0xd4}, {0x94,0xdc}, {0x95,0xda}, {0x9d,0xf8}, {0x9f,0x6a}, {0xd4,0x71}, {0xd4,0x72}, {0xd8,0x6a}, {0x8a,0xb7}, {0xb3,0xd7}, {0xb3,0xda}, {0xd8,0x75}, {0xb3,0xee}, {0xd8,0x78}, {0xb3,0xd8}, {0xd8,0x71}, {0xb3,0xde}, {0xb3,0xe4}, {0xb5,0xbd}, {0xfb,0x46}, {0xb3,0xe2}, {0xd8,0x6e}, {0xb3,0xef}, {0xb3,0xdb}, {0xb3,0xe3}, {0xd8,0x76}, {0xdc,0xd7}, {0xd8,0x7b}, {0xd8,0x6f}, {0x8a,0x46}, {0xd8,0x66}, {0xd8,0x73}, {0xd8,0x6d}, {0xb3,0xe1}, {0xd8,0x79}, {0xb3,0xdd}, {0xb3,0xf1}, {0xb3,0xea}, {0xb3,0xdf}, {0xb3,0xdc}, {0xb3,0xe7}, {0xd8,0x7a}, {0xd8,0x6c}, {0xd8,0x72}, {0xd8,0x74}, {0xd8,0x68}, {0xd8,0x77}, {0xb3,0xd9}, {0xd8,0x67}, {0xfb,0x47}, {0xb3,0xe0}, {0xb3,0xf0}, {0xb3,0xec}, {0xd8,0x69}, {0xb3,0xe6}, {0x91,0x48}, {0xb3,0xed}, {0xb3,0xe9}, {0xb3,0xe5}, {0x92,0xde}, {0xd8,0x70}, {0x8b,0x53}, {0x9d,0xf6}, {0xb3,0xeb}, {0x9b,0xda}, {0xdc,0xd5}, {0xdc,0xd1}, {0x9d,0x7e}, {0xdc,0xe0}, {0xdc,0xca}, {0xdc,0xd3}, {0xb6,0xe5}, {0xb6,0xe6}, {0xb6,0xde}, {0xdc,0xdc}, {0xb6,0xe8}, {0xdc,0xcf}, {0xdc,0xce}, {0xdc,0xcc}, {0xdc,0xde}, {0xb6,0xdc}, {0xdc,0xd8}, {0xdc,0xcd}, {0xb6,0xdf}, {0xdc,0xd6}, {0xb6,0xda}, {0xdc,0xd2}, {0xdc,0xd9}, {0xdc,0xdb}, {0x89,0xfd}, {0x99,0xe4}, {0xdc,0xdf}, {0xb6,0xe3}, {0xdc,0xcb}, {0xb6,0xdd}, {0xdc,0xd0}, {0x9e,0x43}, {0xb6,0xd8}, {0xb6,0xe4}, {0xdc,0xda}, {0xb6,0xe0}, {0xb6,0xe1}, {0xb6,0xe7}, {0xb6,0xdb}, {0xa2,0x5f}, {0xb6,0xd9}, {0xdc,0xd4}, {0x9d,0xe9}, {0x8f,0x52}, {0xb6,0xe2}, {0x9d,0xf5}, {0x9d,0xf0}, {0xdc,0xdd}, {0x99,0xe7}, {0xb9,0xcd}, {0xb9,0xc8}, {0xe1,0x55}, {0xe1,0x51}, {0x8b,0xbd}, {0xe1,0x4b}, {0xb9,0xc2}, {0xb9,0xbe}, {0xe1,0x54}, {0xb9,0xbf}, {0xe1,0x4e}, {0xe1,0x50}, {0xe1,0x53}, {0x9d,0xef}, {0xb9,0xc4}, {0xb9,0xcb}, {0xb9,0xc5}, {0xe1,0x49}, {0xb9,0xc6}, {0xb9,0xc7}, {0xe1,0x4c}, {0xb9,0xcc}, {0x9f,0xb7}, {0xe1,0x4a}, {0xe1,0x4f}, {0xb9,0xc3}, {0xe1,0x48}, {0xb9,0xc9}, {0xb9,0xc1}, {0xb9,0xc0}, {0xe1,0x4d}, {0xe1,0x52}, {0x9d,0xd0}, {0xb9,0xca}, {0x9f,0xeb}, {0x8d,0xa9}, {0x9d,0xcf}, {0x98,0xe1}, {0x9d,0xe5}, {0xe1,0x47}, {0xbc,0x4d}, {0xe5,0x47}, {0xe5,0x44}, {0x9d,0xc8}, {0xbc,0x47}, {0xbc,0x53}, {0xbc,0x54}, {0xbc,0x4a}, {0xe5,0x42}, {0xbc,0x4c}, {0xe4,0xf9}, {0xbc,0x52}, {0xfb,0x4f}, {0xe5,0x46}, {0xbc,0x49}, {0xe5,0x48}, {0xbc,0x48}, {0xe5,0x43}, {0xe5,0x45}, {0xbc,0x4b}, {0xe5,0x41}, {0xe4,0xfa}, {0xe4,0xf7}, {0x9d,0xeb}, {0xd8,0x6b}, {0xe4,0xfd}, {0xe4,0xf6}, {0xe4,0xfc}, {0xe4,0xfb}, {0xe4,0xf8}, {0xfb,0x54}, {0xbc,0x4f}, {0xfb,0x55}, {0x9a,0xa2}, {0x8a,0xd6}, {0xbc,0x4e}, {0x9a,0x5f}, {0xbc,0x50}, {0xe4,0xfe}, {0xbe,0xb2}, {0xe5,0x40}, {0x9e,0xf5}, {0xe9,0x45}, {0xe8,0xfd}, {0x8f,0xb7}, {0xbe,0xbe}, {0xe9,0x42}, {0xbe,0xb6}, {0xbe,0xba}, {0xe9,0x41}, {0xbe,0xb9}, {0xbe,0xb5}, {0xbe,0xb8}, {0xbe,0xb3}, {0xbe,0xbd}, {0xe9,0x43}, {0xe8,0xfe}, {0xbe,0xbc}, {0xe8,0xfc}, {0xbe,0xbb}, {0xe9,0x44}, {0xe9,0x40}, {0xbc,0x51}, {0xbe,0xbf}, {0xe9,0x46}, {0xbe,0xb7}, {0xbe,0xb4}, {0x9a,0xd2}, {0x9e,0x6a}, {0x9e,0xe8}, {0xec,0xc6}, {0xec,0xc8}, {0xc0,0x7b}, {0xec,0xc9}, {0xec,0xc7}, {0xec,0xc5}, {0xec,0xc4}, {0xc0,0x7d}, {0xec,0xc3}, {0xc0,0x7e}, {0x8b,0xbf}, {0x91,0xc2}, {0x9d,0x62}, {0xec,0xc1}, {0xec,0xc2}, {0xc0,0x7a}, {0xc0,0xa1}, {0xc0,0x7c}, {0x92,0x60}, {0xec,0xc0}, {0xc2,0x50}, {0xef,0xbc}, {0xef,0xba}, {0xef,0xbf}, {0xef,0xbd}, {0xef,0xbb}, {0xef,0xbe}, {0x92,0x5e}, {0x91,0xc1}, {0x8a,0xc5}, {0x97,0xa3}, {0xc3,0x60}, {0xf1,0xf2}, {0xf1,0xf3}, {0xc4,0x56}, {0xf1,0xf4}, {0xf1,0xf0}, {0xf1,0xf5}, {0xf1,0xf1}, {0xc2,0x51}, {0x8b,0x6c}, {0x8d,0x7e}, {0xf3,0xfe}, {0xf4,0x41}, {0xc4,0x59}, {0xf4,0x40}, {0xc4,0x58}, {0xc4,0x57}, {0x9c,0x54}, {0xc4,0x5a}, {0xf5,0xc5}, {0xf5,0xc6}, {0x9d,0xbd}, {0xc4,0xda}, {0xc4,0xd9}, {0xc4,0xdb}, {0xf5,0xc4}, {0xf6,0xd8}, {0xf6,0xd7}, {0xc5,0x6d}, {0xc5,0x6f}, {0xc5,0x6e}, {0xf6,0xd9}, {0xc5,0xc8}, {0xf8,0xa6}, {0xc5,0xf1}, {0xf8,0xa5}, {0xf8,0xee}, {0x9c,0xc5}, {0xc9,0x49}, {0xa5,0x7d}, {0xa5,0x7c}, {0xa6,0x5f}, {0xa6,0x5e}, {0xc9,0xc7}, {0xa6,0x5d}, {0xc9,0xc6}, {0x89,0x5b}, {0xa7,0x79}, {0xca,0xa9}, {0xca,0xa8}, {0xa7,0x77}, {0xa7,0x7a}, {0xfb,0x5c}, {0xca,0xa7}, {0xfb,0x5b}, {0xa7,0x78}, {0xfb,0x57}, {0xcb,0xf0}, {0xcb,0xf1}, {0xa9,0x54}, {0x98,0xc7}, {0xab,0xaa}, {0xfb,0x5a}, {0xd1,0x48}, {0xd1,0x49}, {0xae,0x45}, {0xae,0x46}, {0xd4,0xac}, {0xb0,0xe9}, {0xb0,0xeb}, {0xd4,0xab}, {0xb0,0xea}, {0xd8,0x7c}, {0xb3,0xf2}, {0xb6,0xe9}, {0xb6,0xea}, {0xdc,0xe1}, {0x9c,0xee}, {0xb9,0xcf}, {0xb9,0xce}, {0xe5,0x49}, {0xe9,0x48}, {0xe9,0x47}, {0x92,0xe2}, {0xf9,0x6b}, {0xa4,0x67}, {0xc9,0x59}, {0xc9,0x6e}, {0xc9,0x6f}, {0xa6,0x62}, {0xa6,0x66}, {0xc9,0xc9}, {0xa6,0x64}, {0xa6,0x63}, {0xc9,0xc8}, {0xa6,0x65}, {0xa6,0x61}, {0x94,0xa7}, {0xa6,0x60}, {0xc9,0xca}, {0xa7,0xa6}, {0x8c,0xcc}, {0xa7,0xa3}, {0x9b,0xd4}, {0xa7,0x7d}, {0xca,0xaa}, {0xfb,0x64}, {0xfb,0x76}, {0xca,0xab}, {0xfb,0x60}, {0xa7,0xa1}, {0xca,0xad}, {0xa7,0x7b}, {0xca,0xae}, {0xca,0xac}, {0xa7,0x7e}, {0xa7,0xa2}, {0xa7,0xa5}, {0xa7,0xa4}, {0xa7,0x7c}, {0xca,0xaf}, {0x99,0xe5}, {0x9a,0xc2}, {0x91,0xfb}, {0xa0,0x73}, {0xa9,0x59}, {0xcb,0xfe}, {0xa9,0x5b}, {0xa9,0x5a}, {0x9f,0x72}, {0xcc,0x40}, {0xa9,0x58}, {0xa9,0x57}, {0xcb,0xf5}, {0xcb,0xf4}, {0xcb,0xf2}, {0xcb,0xf7}, {0xcb,0xf6}, {0xcb,0xf3}, {0xcb,0xfc}, {0xcb,0xfd}, {0xcb,0xfa}, {0xcb,0xf8}, {0xa9,0x56}, {0x9f,0xcc}, {0xcb,0xfb}, {0xa9,0x5c}, {0xcc,0x41}, {0x98,0xa5}, {0x92,0xe8}, {0xcb,0xf9}, {0xab,0xab}, {0xa9,0x55}, {0x9b,0xbc}, {0x96,0xf3}, {0xab,0xac}, {0xce,0x54}, {0x92,0xe7}, {0xce,0x5a}, {0xfc,0x67}, {0xab,0xb2}, {0xce,0x58}, {0xce,0x5e}, {0xce,0x55}, {0xce,0x59}, {0xce,0x5b}, {0xce,0x5d}, {0xce,0x57}, {0x8b,0x7d}, {0xce,0x56}, {0xce,0x51}, {0xce,0x52}, {0xab,0xad}, {0x9b,0xf4}, {0xab,0xaf}, {0xab,0xae}, {0xce,0x53}, {0xce,0x5c}, {0x9e,0xf7}, {0x9e,0xc1}, {0xab,0xb1}, {0x99,0x6f}, {0xce,0x50}, {0xd1,0x53}, {0xd1,0x52}, {0xd1,0x57}, {0xd1,0x4e}, {0x96,0xf1}, {0xd1,0x51}, {0xd1,0x50}, {0x8e,0x41}, {0xd1,0x54}, {0xd1,0x58}, {0xae,0x47}, {0xae,0x4a}, {0x95,0x4a}, {0xd1,0x4f}, {0xd1,0x55}, {0x97,0xe6}, {0xae,0x49}, {0xd1,0x4a}, {0xab,0xb0}, {0xd4,0xba}, {0xd1,0x56}, {0xd1,0x4d}, {0xae,0x48}, {0xd1,0x4c}, {0x96,0xf5}, {0xd4,0xb1}, {0x92,0xe6}, {0x9f,0x42}, {0xb0,0xec}, {0xb0,0xf0}, {0xd4,0xc1}, {0xd4,0xaf}, {0xd4,0xbd}, {0xb0,0xf1}, {0xd4,0xbf}, {0xfb,0x67}, {0xd4,0xc5}, {0xd4,0xc9}, {0xd4,0xc0}, {0xd4,0xb4}, {0xd4,0xbc}, {0x99,0xa9}, {0xd4,0xca}, {0xd4,0xc8}, {0xd4,0xbe}, {0xd4,0xb9}, {0xd4,0xb2}, {0xd8,0xa6}, {0xd4,0xb0}, {0xb0,0xf5}, {0xd4,0xb7}, {0xb0,0xf6}, {0xb0,0xf2}, {0xd4,0xad}, {0xd4,0xc3}, {0xd4,0xb5}, {0xfa,0xe6}, {0xd4,0xb3}, {0xd4,0xc6}, {0xb0,0xf3}, {0xfb,0x69}, {0xd4,0xcc}, {0xb0,0xed}, {0xb0,0xef}, {0xd4,0xbb}, {0xd4,0xb6}, {0xae,0x4b}, {0xb0,0xee}, {0xd4,0xb8}, {0xd4,0xc7}, {0xd4,0xcb}, {0xd4,0xc2}, {0xd4,0xc4}, {0x97,0xe5}, {0xd4,0xae}, {0xd8,0xa1}, {0xd8,0xaa}, {0xd8,0xa9}, {0xb3,0xfa}, {0xd8,0xa2}, {0xb3,0xfb}, {0xb3,0xf9}, {0x96,0x7d}, {0xd8,0xa4}, {0xb3,0xf6}, {0xd8,0xa8}, {0xfb,0x6c}, {0xd8,0xa3}, {0xd8,0xa5}, {0xd8,0x7d}, {0xb3,0xf4}, {0xd8,0xb2}, {0xd8,0xb1}, {0xd8,0xae}, {0xb3,0xf3}, {0xb3,0xf7}, {0xb3,0xf8}, {0xd1,0x4b}, {0xd8,0xab}, {0xb3,0xf5}, {0xb0,0xf4}, {0xd8,0xad}, {0xd8,0x7e}, {0xd8,0xb0}, {0xd8,0xaf}, {0x99,0xa2}, {0xd8,0xb3}, {0xdc,0xef}, {0xd8,0xac}, {0x9a,0xbb}, {0x9a,0x65}, {0x94,0x4e}, {0xd8,0xa7}, {0xdc,0xe7}, {0xb6,0xf4}, {0xb6,0xf7}, {0xb6,0xf2}, {0xdc,0xe6}, {0xdc,0xea}, {0xdc,0xe5}, {0xb6,0xec}, {0xb6,0xf6}, {0xdc,0xe2}, {0xb6,0xf0}, {0xdc,0xe9}, {0xb6,0xee}, {0xb6,0xed}, {0xdc,0xec}, {0xb6,0xef}, {0xdc,0xee}, {0xfb,0x6e}, {0xdc,0xeb}, {0xb6,0xeb}, {0x99,0xdf}, {0xb6,0xf5}, {0xdc,0xf0}, {0xdc,0xe4}, {0xdc,0xed}, {0xdc,0xe3}, {0x98,0xe3}, {0xb6,0xf1}, {0x92,0x54}, {0xb6,0xf3}, {0xdc,0xe8}, {0xdc,0xf1}, {0x96,0x7b}, {0x8a,0xaf}, {0xe1,0x5d}, {0xb9,0xd0}, {0xe1,0x63}, {0xb9,0xd5}, {0xe1,0x5f}, {0xe1,0x66}, {0xe1,0x57}, {0xb9,0xd7}, {0xb9,0xd1}, {0xe1,0x5c}, {0xbc,0x55}, {0xe1,0x5b}, {0xe1,0x64}, {0xb9,0xd2}, {0xb9,0xd6}, {0xe1,0x5a}, {0xe1,0x60}, {0xe1,0x65}, {0xe1,0x56}, {0xb9,0xd4}, {0xe1,0x5e}, {0xe1,0x62}, {0xe1,0x68}, {0xe1,0x58}, {0xe1,0x61}, {0x8c,0x77}, {0xb9,0xd3}, {0xe1,0x67}, {0xe1,0x59}, {0x8b,0xaf}, {0x9e,0xbd}, {0xbc,0x59}, {0xe5,0x4b}, {0xbc,0x57}, {0xbc,0x56}, {0xe5,0x4d}, {0xe5,0x52}, {0xe5,0x4e}, {0xe5,0x51}, {0xbc,0x5c}, {0x9e,0xe6}, {0xbe,0xa5}, {0xbc,0x5b}, {0xfb,0x6f}, {0xe5,0x4a}, {0xe5,0x50}, {0xbc,0x5a}, {0xe5,0x4f}, {0x8e,0xe1}, {0xe5,0x4c}, {0xbc,0x58}, {0x9b,0x7d}, {0x9c,0x7e}, {0xe9,0x4d}, {0xf9,0xd9}, {0xe9,0x4f}, {0xe9,0x4a}, {0xbe,0xc1}, {0xe9,0x4c}, {0xbe,0xc0}, {0xe9,0x4e}, {0xbe,0xc3}, {0xe9,0x50}, {0xbe,0xc2}, {0xe9,0x49}, {0xe9,0x4b}, {0x92,0xea}, {0xc0,0xa5}, {0xec,0xcc}, {0x8c,0x78}, {0xc0,0xa4}, {0xec,0xcd}, {0xc0,0xa3}, {0xec,0xcb}, {0xc0,0xa2}, {0xec,0xca}, {0xc2,0x53}, {0xc2,0x52}, {0xf1,0xf6}, {0xf1,0xf8}, {0xfb,0x72}, {0xf1,0xf7}, {0xc3,0x61}, {0xc3,0x62}, {0xfb,0x71}, {0xc3,0x63}, {0xf4,0x42}, {0xc4,0x5b}, {0xf7,0xd3}, {0xf7,0xd2}, {0xc5,0xf2}, {0xa4,0x68}, {0xa4,0xd0}, {0xa7,0xa7}, {0x89,0x5c}, {0x98,0xf0}, {0x96,0xf2}, {0xce,0x5f}, {0xb3,0xfc}, {0xb3,0xfd}, {0xfb,0x74}, {0xdc,0xf2}, {0xb9,0xd8}, {0xe1,0x69}, {0xe5,0x53}, {0x8b,0xc1}, {0xc9,0x5a}, {0x89,0x5d}, {0x89,0xde}, {0xca,0xb0}, {0x89,0x5e}, {0xc6,0xca}, {0xcc,0x42}, {0xce,0x60}, {0xd1,0x59}, {0xae,0x4c}, {0xfe,0x42}, {0xf1,0xf9}, {0xc4,0xdc}, {0xa4,0x69}, {0xa5,0x7e}, {0xc9,0x70}, {0xa6,0x67}, {0xa6,0x68}, {0xa9,0x5d}, {0xfb,0x7b}, {0xb0,0xf7}, {0xb9,0xda}, {0xb9,0xdb}, {0xb9,0xd9}, {0xa4,0x6a}, {0xa4,0xd1}, {0xa4,0xd3}, {0xa4,0xd2}, {0xc9,0x5b}, {0xa4,0xd4}, {0xa5,0xa1}, {0xc9,0x71}, {0xa5,0xa2}, {0x89,0x5f}, {0x89,0x60}, {0xa6,0x69}, {0xa6,0x6a}, {0xc9,0xcb}, {0xa7,0xa8}, {0xca,0xb1}, {0xa9,0x61}, {0xcc,0x43}, {0xa9,0x5f}, {0xa9,0x60}, {0xa9,0x5e}, {0xd1,0x5a}, {0xab,0xb6}, {0xab,0xb5}, {0xab,0xb7}, {0xab,0xb4}, {0xce,0x61}, {0xa9,0x62}, {0xab,0xb3}, {0xae,0x4d}, {0xae,0x4e}, {0xae,0x4f}, {0xd4,0xcd}, {0xb3,0xfe}, {0xd8,0xb4}, {0xb0,0xf8}, {0x9b,0xcd}, {0xb6,0xf8}, {0xb9,0xdd}, {0xb9,0xdc}, {0xe1,0x6a}, {0xbc,0x5d}, {0xbe,0xc4}, {0xef,0xc0}, {0xf6,0xda}, {0xf7,0xd4}, {0xa4,0x6b}, {0xa5,0xa3}, {0x9d,0xd3}, {0xa5,0xa4}, {0xc9,0xd1}, {0xa6,0x6c}, {0xa6,0x6f}, {0xc9,0xcf}, {0xc9,0xcd}, {0xa6,0x6e}, {0xc9,0xd0}, {0xc9,0xd2}, {0xc9,0xcc}, {0xa6,0x71}, {0xa6,0x70}, {0xa6,0x6d}, {0xa6,0x6b}, {0xc9,0xce}, {0x98,0x4c}, {0xa7,0xb3}, {0xa7,0xb0}, {0xca,0xb6}, {0xca,0xb9}, {0xca,0xb8}, {0xa7,0xaa}, {0xa7,0xb2}, {0x97,0x52}, {0xa7,0xaf}, {0xca,0xb5}, {0xca,0xb3}, {0xa7,0xae}, {0x95,0xc3}, {0xa7,0xa9}, {0xa7,0xac}, {0x9b,0xb6}, {0xca,0xb4}, {0xca,0xbb}, {0xca,0xb7}, {0xa7,0xad}, {0xa7,0xb1}, {0xa7,0xb4}, {0xca,0xb2}, {0xca,0xba}, {0xa7,0xab}, {0x9a,0xb9}, {0xa9,0x67}, {0xa9,0x6f}, {0x97,0xb3}, {0xcc,0x4f}, {0xcc,0x48}, {0xa9,0x70}, {0xcc,0x53}, {0xcc,0x44}, {0xcc,0x4b}, {0x9f,0x74}, {0x92,0xf1}, {0xa9,0x66}, {0xcc,0x45}, {0xa9,0x64}, {0xcc,0x4c}, {0xcc,0x50}, {0xa9,0x63}, {0xcc,0x51}, {0xcc,0x4a}, {0xcc,0x4d}, {0x97,0xdf}, {0xa9,0x72}, {0xa9,0x69}, {0xcc,0x54}, {0xcc,0x52}, {0xfb,0xa6}, {0xa9,0x6e}, {0xa9,0x6c}, {0xcc,0x49}, {0xa9,0x6b}, {0xcc,0x47}, {0xcc,0x46}, {0xa9,0x6a}, {0xa9,0x68}, {0xa9,0x71}, {0xa9,0x6d}, {0xa9,0x65}, {0xcc,0x4e}, {0xab,0xb9}, {0xfb,0xab}, {0xab,0xc0}, {0xce,0x6f}, {0xab,0xb8}, {0xce,0x67}, {0xce,0x63}, {0xce,0x73}, {0xce,0x62}, {0xab,0xbb}, {0xce,0x6c}, {0xab,0xbe}, {0xab,0xc1}, {0xab,0xbc}, {0xce,0x70}, {0xab,0xbf}, {0x98,0x77}, {0xae,0x56}, {0xce,0x76}, {0xce,0x64}, {0x98,0x54}, {0x95,0xc5}, {0xce,0x66}, {0xce,0x6d}, {0xce,0x71}, {0xce,0x75}, {0xce,0x72}, {0xce,0x6b}, {0xce,0x6e}, {0x9d,0x55}, {0xfb,0xb2}, {0xce,0x68}, {0xab,0xc3}, {0xce,0x6a}, {0xce,0x69}, {0xce,0x74}, {0xab,0xba}, {0xce,0x65}, {0xab,0xc2}, {0x95,0x7e}, {0xab,0xbd}, {0xae,0x5c}, {0xd1,0x62}, {0x97,0x42}, {0xae,0x5b}, {0x94,0xe6}, {0xd1,0x60}, {0xae,0x50}, {0x92,0xf5}, {0xae,0x55}, {0xd1,0x5f}, {0xd1,0x5c}, {0xd1,0x61}, {0xae,0x51}, {0xd1,0x5b}, {0x8c,0xc5}, {0xae,0x54}, {0xae,0x52}, {0xd1,0x63}, {0xae,0x53}, {0xae,0x57}, {0x92,0xfd}, {0xae,0x58}, {0xfb,0xa2}, {0xae,0x5a}, {0x9c,0x51}, {0xae,0x59}, {0x94,0xe9}, {0x98,0x5c}, {0x92,0xf0}, {0xd1,0x5d}, {0xd1,0x5e}, {0xd1,0x64}, {0xd4,0xd4}, {0xb0,0xf9}, {0xd8,0xc2}, {0xd4,0xd3}, {0xd4,0xe6}, {0xb1,0x40}, {0x94,0x4c}, {0xd4,0xe4}, {0xb0,0xfe}, {0xb0,0xfa}, {0xd4,0xed}, {0xd4,0xdd}, {0xd4,0xe0}, {0x91,0x6b}, {0xb1,0x43}, {0xd4,0xea}, {0xd4,0xe2}, {0xb0,0xfb}, {0xb1,0x44}, {0xd4,0xe7}, {0xd4,0xe5}, {0xd4,0xd6}, {0xd4,0xeb}, {0xd4,0xdf}, {0xd4,0xda}, {0x8b,0x78}, {0xd4,0xd0}, {0xd4,0xec}, {0xd4,0xdc}, {0xd4,0xcf}, {0x94,0xe2}, {0xb1,0x42}, {0xd4,0xe1}, {0xd4,0xee}, {0xd4,0xde}, {0xd4,0xd2}, {0xd4,0xd7}, {0xd4,0xce}, {0x98,0x4f}, {0xb1,0x41}, {0xfb,0xb5}, {0xd4,0xdb}, {0xd4,0xd8}, {0xb0,0xfc}, {0xd4,0xd1}, {0x92,0x71}, {0xd4,0xe9}, {0xb0,0xfd}, {0x93,0x65}, {0xd4,0xd9}, {0xd4,0xd5}, {0x98,0x5b}, {0xd4,0xe8}, {0x98,0x50}, {0xb4,0x40}, {0xd8,0xbb}, {0x97,0xbc}, {0xd8,0xb8}, {0xd8,0xc9}, {0xd8,0xbd}, {0xd8,0xca}, {0x92,0xf3}, {0xb4,0x42}, {0x93,0x40}, {0x98,0x4d}, {0xd8,0xc6}, {0xd8,0xc3}, {0x95,0x72}, {0xfd,0xef}, {0xd8,0xc4}, {0xd8,0xc7}, {0xd8,0xcb}, {0xd4,0xe3}, {0xd8,0xcd}, {0xdd,0x47}, {0xfd,0xc1}, {0xb4,0x43}, {0xd8,0xce}, {0xd8,0xb6}, {0xd8,0xc0}, {0xfb,0xba}, {0xd8,0xc5}, {0x92,0xeb}, {0xb4,0x41}, {0xb4,0x44}, {0xd8,0xcc}, {0xd8,0xcf}, {0xd8,0xba}, {0xd8,0xb7}, {0xfc,0x73}, {0x97,0xb7}, {0xd8,0xb9}, {0xd8,0xbe}, {0xd8,0xbc}, {0xb4,0x45}, {0xd8,0xc8}, {0xfb,0xb4}, {0xd8,0xbf}, {0xd8,0xc1}, {0xd8,0xb5}, {0xdc,0xfa}, {0xdc,0xf8}, {0xb7,0x42}, {0xb7,0x40}, {0xdd,0x43}, {0xdc,0xf9}, {0xdd,0x44}, {0xdd,0x40}, {0xdc,0xf7}, {0xdd,0x46}, {0xdc,0xf6}, {0xdc,0xfd}, {0xb6,0xfe}, {0xb6,0xfd}, {0xb6,0xfc}, {0xdc,0xfb}, {0xdd,0x41}, {0xb6,0xf9}, {0xb7,0x41}, {0x90,0xa7}, {0xdc,0xf4}, {0xdc,0xfe}, {0xdc,0xf3}, {0xdc,0xfc}, {0xb6,0xfa}, {0xdd,0x42}, {0xdc,0xf5}, {0xb6,0xfb}, {0xdd,0x45}, {0x97,0x41}, {0x92,0xf4}, {0xfb,0xbc}, {0xe1,0x6e}, {0xb9,0xe2}, {0xb9,0xe1}, {0xb9,0xe3}, {0xe1,0x7a}, {0xe1,0x70}, {0xe1,0x76}, {0xe1,0x6b}, {0xe1,0x79}, {0xe1,0x78}, {0xe1,0x7c}, {0xe1,0x75}, {0xb9,0xde}, {0xe1,0x74}, {0xb9,0xe4}, {0x95,0x77}, {0xe1,0x6d}, {0xb9,0xdf}, {0xe1,0x7b}, {0xb9,0xe0}, {0xe1,0x6f}, {0xe1,0x72}, {0xe1,0x77}, {0xe1,0x71}, {0xe1,0x6c}, {0x9e,0xe2}, {0x8f,0x78}, {0xe1,0x73}, {0xe5,0x55}, {0xbc,0x61}, {0xe5,0x58}, {0xe5,0x57}, {0xe5,0x5a}, {0xe5,0x5c}, {0xf9,0xdc}, {0xbc,0x5f}, {0xe5,0x56}, {0x96,0x72}, {0xe5,0x54}, {0xe5,0x5d}, {0xe5,0x5b}, {0xe5,0x59}, {0xe5,0x5f}, {0xe5,0x5e}, {0xbc,0x63}, {0xbc,0x5e}, {0xbc,0x60}, {0xbc,0x62}, {0x9e,0xb5}, {0xe5,0x60}, {0xe9,0x57}, {0x96,0x4b}, {0xe9,0x56}, {0xe9,0x55}, {0x8c,0xac}, {0xe9,0x58}, {0xe9,0x51}, {0xe9,0x52}, {0xe9,0x5a}, {0xe9,0x53}, {0xbe,0xc5}, {0xe9,0x5c}, {0xa0,0xfa}, {0xe9,0x5b}, {0xe9,0x54}, {0xec,0xd1}, {0xc0,0xa8}, {0xec,0xcf}, {0xec,0xd4}, {0xec,0xd3}, {0xe9,0x59}, {0xc0,0xa7}, {0x95,0x75}, {0xec,0xd2}, {0xec,0xce}, {0xec,0xd6}, {0xec,0xd5}, {0xc0,0xa6}, {0xec,0xd0}, {0xbe,0xc6}, {0xc2,0x54}, {0xef,0xc1}, {0xf1,0xfa}, {0xf1,0xfb}, {0xf1,0xfc}, {0xc4,0x5c}, {0x90,0xda}, {0xc4,0x5d}, {0x93,0x67}, {0xf4,0x43}, {0xfe,0xa4}, {0xf5,0xc8}, {0xf5,0xc7}, {0x90,0xdf}, {0xf6,0xdb}, {0xf6,0xdc}, {0xf7,0xd5}, {0xf8,0xa7}, {0x93,0x54}, {0xa4,0x6c}, {0xa4,0x6d}, {0xa4,0x6e}, {0xa4,0xd5}, {0xa5,0xa5}, {0xc9,0xd3}, {0xa6,0x72}, {0xa6,0x73}, {0xa7,0xb7}, {0xa7,0xb8}, {0xa7,0xb6}, {0xa7,0xb5}, {0xa9,0x73}, {0xcc,0x55}, {0xa9,0x75}, {0xa9,0x74}, {0xcc,0x56}, {0x89,0x61}, {0x8b,0xb4}, {0xab,0xc4}, {0xae,0x5d}, {0xd1,0x65}, {0x9d,0xc0}, {0xd4,0xf0}, {0xb1,0x45}, {0xb4,0x47}, {0xd4,0xef}, {0xb4,0x46}, {0x8e,0x48}, {0xb9,0xe5}, {0xfb,0xc5}, {0xe1,0x7d}, {0xbe,0xc7}, {0xc0,0xa9}, {0xec,0xd7}, {0xfb,0xc7}, {0xc4,0x5e}, {0xc5,0x70}, {0xc6,0xcb}, {0xc9,0x72}, {0xfa,0x79}, {0xa5,0xa6}, {0xc9,0x73}, {0xa6,0x76}, {0xa6,0x74}, {0xa6,0x75}, {0xa6,0x77}, {0xa7,0xba}, {0xa7,0xb9}, {0xca,0xbc}, {0xa7,0xbb}, {0x9e,0x67}, {0xca,0xbd}, {0xcc,0x57}, {0xcc,0x58}, {0x8c,0xd9}, {0xa9,0x76}, {0xa9,0x78}, {0xa9,0x7a}, {0xa9,0x77}, {0xa9,0x7b}, {0xa9,0x79}, {0xfb,0xd2}, {0x89,0x62}, {0x89,0x63}, {0xab,0xc8}, {0xab,0xc5}, {0xab,0xc7}, {0xab,0xc9}, {0xab,0xc6}, {0xd1,0x66}, {0xce,0x77}, {0xfc,0x7d}, {0xd1,0x68}, {0xd1,0x67}, {0xae,0x63}, {0xae,0x5f}, {0xae,0x60}, {0xae,0x62}, {0xae,0x64}, {0xae,0x61}, {0xae,0x66}, {0xae,0x65}, {0xb1,0x4a}, {0xd4,0xf2}, {0xd4,0xf1}, {0xb1,0x49}, {0x9f,0x6b}, {0xb1,0x48}, {0xb1,0x47}, {0xb1,0x4b}, {0xb1,0x46}, {0xd8,0xd5}, {0xd8,0xd2}, {0xb4,0x49}, {0xd8,0xd1}, {0xd8,0xd6}, {0xb4,0x4b}, {0xd8,0xd4}, {0xb4,0x48}, {0xb4,0x4a}, {0xd8,0xd3}, {0xfb,0xcc}, {0xdd,0x48}, {0xfe,0xae}, {0xdd,0x49}, {0xdd,0x4a}, {0xb9,0xe6}, {0xb9,0xee}, {0xe1,0x7e}, {0xb9,0xe8}, {0xb9,0xec}, {0xe1,0xa1}, {0xb9,0xed}, {0xb9,0xe9}, {0xb9,0xea}, {0xb9,0xe7}, {0xb9,0xeb}, {0xbc,0x66}, {0xd8,0xd0}, {0xbc,0x67}, {0xbc,0x65}, {0xbc,0x64}, {0xe9,0x5d}, {0xbe,0xc8}, {0xec,0xd8}, {0xec,0xd9}, {0xfb,0xd1}, {0xc3,0x64}, {0xc4,0x5f}, {0xa4,0x6f}, {0xa6,0x78}, {0xfb,0x75}, {0xab,0xca}, {0xd1,0x69}, {0xae,0x67}, {0xfb,0xd4}, {0xb1,0x4e}, {0xb1,0x4d}, {0xb1,0x4c}, {0xb4,0x4c}, {0xb4,0x4d}, {0xd8,0xd7}, {0xb9,0xef}, {0xbe,0xc9}, {0xa4,0x70}, {0xc9,0x5c}, {0xa4,0xd6}, {0xc9,0x74}, {0xfb,0xd6}, {0xfb,0xd8}, {0xc9,0xd4}, {0xa6,0x79}, {0xa9,0x7c}, {0x8b,0x5d}, {0x93,0x4c}, {0xdd,0x4b}, {0x9a,0xe2}, {0xa4,0x71}, {0x8b,0xc9}, {0xa4,0xd7}, {0xc9,0xd5}, {0xca,0xbe}, {0xca,0xbf}, {0xa7,0xbc}, {0xd8,0xd8}, {0xb4,0x4e}, {0xdd,0x4c}, {0xc0,0xaa}, {0xa4,0x72}, {0xa4,0xa8}, {0xa4,0xd8}, {0xc9,0x75}, {0xa5,0xa7}, {0xa7,0xc0}, {0xa7,0xbf}, {0xa7,0xbd}, {0xa7,0xbe}, {0xcc,0x59}, {0xa9,0x7e}, {0xa9,0xa1}, {0xcc,0x5a}, {0xa9,0x7d}, {0xfb,0xdb}, {0x9f,0xc9}, {0xab,0xce}, {0xce,0x78}, {0xab,0xcd}, {0xab,0xcb}, {0xab,0xcc}, {0xae,0x6a}, {0xae,0x68}, {0x9f,0x44}, {0xd1,0x6b}, {0xae,0x69}, {0xd1,0x6a}, {0xae,0x5e}, {0xd4,0xf3}, {0xb1,0x50}, {0xb1,0x51}, {0x98,0xed}, {0xb1,0x4f}, {0xb9,0xf0}, {0xe1,0xa2}, {0xbc,0x68}, {0xbc,0x69}, {0xe5,0x61}, {0xc0,0xab}, {0xef,0xc2}, {0xef,0xc3}, {0xc4,0xdd}, {0xf8,0xa8}, {0xc9,0x4b}, {0xa4,0xd9}, {0xa4,0x73}, {0xc9,0x77}, {0xc9,0x76}, {0xa6,0x7a}, {0xc9,0xd7}, {0xc9,0xd8}, {0xc9,0xd6}, {0xc9,0xd9}, {0xfb,0xdd}, {0xca,0xc7}, {0xca,0xc2}, {0xca,0xc4}, {0xca,0xc6}, {0xca,0xc3}, {0xa7,0xc4}, {0xca,0xc0}, {0xca,0xc1}, {0xa7,0xc1}, {0xa7,0xc2}, {0xca,0xc5}, {0xca,0xc8}, {0xa7,0xc3}, {0xca,0xc9}, {0x8d,0xf2}, {0x89,0x64}, {0xfd,0xf2}, {0xcc,0x68}, {0x93,0x4d}, {0xcc,0x62}, {0xcc,0x5d}, {0xa9,0xa3}, {0xcc,0x65}, {0xcc,0x63}, {0xcc,0x5c}, {0xcc,0x69}, {0xcc,0x6c}, {0xcc,0x67}, {0xcc,0x60}, {0xa9,0xa5}, {0xcc,0x66}, {0xa9,0xa6}, {0xcc,0x61}, {0xcc,0x64}, {0xcc,0x5b}, {0xcc,0x5f}, {0xcc,0x6b}, {0xa9,0xa7}, {0xa9,0xa8}, {0xcc,0x5e}, {0xcc,0x6a}, {0xa9,0xa2}, {0xa9,0xa4}, {0xfb,0xe7}, {0xa0,0xf2}, {0x98,0x68}, {0xce,0xab}, {0xce,0xa4}, {0xce,0xaa}, {0xce,0xa3}, {0xce,0xa5}, {0xce,0x7d}, {0xce,0x7b}, {0xce,0xac}, {0xce,0xa9}, {0xce,0x79}, {0x9f,0x58}, {0xab,0xd0}, {0xce,0xa7}, {0xce,0xa8}, {0xce,0xa6}, {0xce,0x7c}, {0xce,0x7a}, {0xab,0xcf}, {0xce,0xa2}, {0xce,0x7e}, {0xce,0xa1}, {0xce,0xad}, {0x8d,0x73}, {0xae,0x6f}, {0xfb,0xde}, {0xae,0x6e}, {0xd1,0x6c}, {0xae,0x6b}, {0xd1,0x6e}, {0xfb,0xdf}, {0xae,0x70}, {0xd1,0x6f}, {0xae,0x73}, {0x8c,0x48}, {0xae,0x71}, {0xd1,0x70}, {0xce,0xae}, {0xd1,0x72}, {0xae,0x6d}, {0xae,0x6c}, {0xd1,0x6d}, {0xd1,0x71}, {0xae,0x72}, {0xb1,0x53}, {0xb1,0x52}, {0xd4,0xf5}, {0xd4,0xf9}, {0xd4,0xfb}, {0xb1,0x54}, {0xd4,0xfe}, {0xfb,0xe3}, {0xb1,0x58}, {0xd5,0x41}, {0xb1,0x5a}, {0x8d,0xa8}, {0xb1,0x56}, {0xb1,0x5e}, {0xfb,0xe4}, {0xb1,0x5b}, {0xd4,0xf7}, {0xb1,0x55}, {0xd4,0xf6}, {0xd4,0xf4}, {0xd5,0x43}, {0xd4,0xf8}, {0xb1,0x57}, {0xd5,0x42}, {0xb1,0x5c}, {0xd4,0xfd}, {0xd4,0xfc}, {0xb1,0x5d}, {0xd4,0xfa}, {0xb1,0x59}, {0x9c,0x75}, {0xd5,0x44}, {0x98,0x78}, {0xd5,0x40}, {0xd8,0xe7}, {0xd8,0xee}, {0xd8,0xe3}, {0xb4,0x51}, {0xd8,0xdf}, {0xd8,0xef}, {0xd8,0xd9}, {0xd8,0xec}, {0xd8,0xea}, {0xd8,0xe4}, {0xd8,0xed}, {0xd8,0xe6}, {0x8d,0x60}, {0xd8,0xde}, {0xd8,0xf0}, {0xd8,0xdc}, {0xd8,0xe9}, {0xd8,0xda}, {0xd8,0xf1}, {0xfb,0xe5}, {0xb4,0x52}, {0x8d,0x61}, {0xd8,0xeb}, {0xdd,0x4f}, {0xd8,0xdd}, {0xb4,0x4f}, {0xd8,0xe1}, {0xb4,0x50}, {0xd8,0xe0}, {0xd8,0xe5}, {0xd8,0xe2}, {0x8d,0x62}, {0xa0,0xa1}, {0xd8,0xe8}, {0x9c,0x40}, {0xdd,0x53}, {0xdd,0x56}, {0xdd,0x4e}, {0xdd,0x50}, {0xdd,0x55}, {0xdd,0x54}, {0xb7,0x43}, {0xd8,0xdb}, {0xdd,0x52}, {0xb7,0x44}, {0x98,0xad}, {0xdd,0x4d}, {0xdd,0x51}, {0x9e,0xea}, {0xe1,0xa9}, {0xe1,0xb0}, {0xe1,0xa7}, {0x8c,0xd4}, {0xe1,0xae}, {0xe1,0xa5}, {0xe1,0xad}, {0xe1,0xb1}, {0xe1,0xa4}, {0xe1,0xa8}, {0xe1,0xa3}, {0xb9,0xf1}, {0x9c,0xeb}, {0xe1,0xa6}, {0xb9,0xf2}, {0xe1,0xac}, {0xe1,0xab}, {0xe1,0xaa}, {0xfb,0xe0}, {0xe1,0xaf}, {0x9f,0x51}, {0xe5,0x65}, {0xe5,0x67}, {0xbc,0x6b}, {0xe5,0x68}, {0xe5,0x63}, {0xe5,0x62}, {0xe5,0x6c}, {0xe5,0x6a}, {0xbc,0x6a}, {0xe5,0x6d}, {0xe5,0x64}, {0xe5,0x69}, {0xe5,0x6b}, {0xe5,0x66}, {0x8d,0x65}, {0xe9,0x61}, {0xe9,0x66}, {0xe9,0x60}, {0xe9,0x65}, {0x9c,0xf1}, {0xe9,0x5e}, {0xe9,0x68}, {0xe9,0x64}, {0xe9,0x69}, {0xe9,0x63}, {0xe9,0x5f}, {0xe9,0x67}, {0xe9,0x6a}, {0xe9,0x62}, {0xfc,0x58}, {0xec,0xda}, {0xc0,0xaf}, {0x8d,0x66}, {0xc0,0xad}, {0xc0,0xac}, {0xc0,0xae}, {0xef,0xc4}, {0x96,0x54}, {0xf1,0x72}, {0xf1,0xfd}, {0xf4,0x44}, {0xf4,0x45}, {0xc4,0x60}, {0xf5,0xc9}, {0xc4,0xde}, {0xf5,0xca}, {0xf6,0xde}, {0xc5,0x72}, {0xc5,0x71}, {0xf6,0xdd}, {0xc5,0xc9}, {0xfb,0xe8}, {0xf7,0xd6}, {0xc6,0xcc}, {0xa4,0x74}, {0xa6,0x7b}, {0xc9,0xda}, {0xca,0xca}, {0xa8,0xb5}, {0xb1,0x5f}, {0xa4,0x75}, {0xa5,0xaa}, {0xa5,0xa9}, {0xa5,0xa8}, {0xa7,0xc5}, {0xae,0x74}, {0xdd,0x57}, {0xa4,0x76}, {0xa4,0x77}, {0xa4,0x78}, {0xa4,0xda}, {0x9f,0xce}, {0xab,0xd1}, {0xce,0xaf}, {0xb4,0x53}, {0xa4,0x79}, {0xc9,0x5d}, {0xa5,0xab}, {0xa5,0xac}, {0xc9,0x78}, {0xa6,0x7c}, {0xfb,0xfc}, {0xca,0xcb}, {0x9a,0xe4}, {0xa7,0xc6}, {0xca,0xcc}, {0xa9,0xae}, {0x9f,0x75}, {0xcc,0x6e}, {0xa9,0xac}, {0xa9,0xab}, {0xcc,0x6d}, {0xa9,0xa9}, {0xcc,0x6f}, {0xa9,0xaa}, {0xa9,0xad}, {0xab,0xd2}, {0xab,0xd4}, {0xce,0xb3}, {0xce,0xb0}, {0xce,0xb1}, {0xce,0xb2}, {0xce,0xb4}, {0xab,0xd3}, {0xd1,0x74}, {0xd1,0x73}, {0xae,0x76}, {0xae,0x75}, {0xfb,0xf1}, {0xb1,0x62}, {0xd5,0x46}, {0xb1,0x61}, {0xb1,0x63}, {0xb1,0x60}, {0xb4,0x55}, {0xd5,0x45}, {0xb4,0x56}, {0xd8,0xf3}, {0x8d,0x69}, {0xb4,0x57}, {0xd8,0xf2}, {0xb4,0x54}, {0x93,0x4f}, {0xdd,0x5a}, {0xdd,0x5c}, {0xb7,0x45}, {0xdd,0x5b}, {0xdd,0x59}, {0xdd,0x58}, {0xe1,0xb4}, {0xb9,0xf7}, {0xb9,0xf5}, {0xb9,0xf6}, {0xe1,0xb2}, {0xe1,0xb3}, {0xb9,0xf3}, {0xe5,0x71}, {0xe5,0x6f}, {0x93,0x4e}, {0xbc,0x6d}, {0xe5,0x70}, {0xbc,0x6e}, {0xbc,0x6c}, {0xb9,0xf4}, {0xe9,0x6d}, {0xe9,0x6b}, {0xe9,0x6c}, {0xe5,0x6e}, {0xec,0xdc}, {0xc0,0xb0}, {0xec,0xdb}, {0xef,0xc5}, {0xef,0xc6}, {0xe9,0x6e}, {0xf1,0xfe}, {0xa4,0x7a}, {0xa5,0xad}, {0xa6,0x7e}, {0xc9,0xdb}, {0xa6,0x7d}, {0xa9,0xaf}, {0xb7,0x46}, {0xfb,0xf4}, {0xa4,0xdb}, {0xa5,0xae}, {0xab,0xd5}, {0xb4,0x58}, {0xc6,0xce}, {0xc9,0x79}, {0xc9,0x7a}, {0xfb,0xc3}, {0xc9,0xdc}, {0x89,0x65}, {0xa7,0xc8}, {0xca,0xd0}, {0xca,0xce}, {0xa7,0xc9}, {0xca,0xcd}, {0xca,0xcf}, {0xca,0xd1}, {0xa7,0xc7}, {0x8c,0x7a}, {0xa9,0xb3}, {0xa9,0xb4}, {0xa9,0xb1}, {0x8c,0x7b}, {0xa9,0xb0}, {0xce,0xb8}, {0xa9,0xb2}, {0xab,0xd6}, {0xce,0xb7}, {0xce,0xb9}, {0xce,0xb6}, {0xce,0xba}, {0xab,0xd7}, {0xae,0x79}, {0xd1,0x75}, {0xd1,0x77}, {0xae,0x77}, {0xd1,0x78}, {0xae,0x78}, {0xd1,0x76}, {0xce,0xb5}, {0xd5,0x47}, {0xd5,0x4a}, {0xd5,0x4b}, {0xd5,0x48}, {0xb1,0x67}, {0xb1,0x66}, {0xb1,0x64}, {0xb1,0x65}, {0xd5,0x49}, {0x8d,0x6a}, {0xb1,0x68}, {0xb4,0x5a}, {0xb4,0x5b}, {0xb4,0x5c}, {0xdd,0x5d}, {0xdd,0x5f}, {0xdd,0x61}, {0xb7,0x48}, {0xb7,0x47}, {0xb4,0x59}, {0xdd,0x60}, {0xdd,0x5e}, {0x93,0x53}, {0xe1,0xb8}, {0x9d,0xfb}, {0xe1,0xb6}, {0xe1,0xbc}, {0xb9,0xf8}, {0xe1,0xbd}, {0xe1,0xba}, {0xb9,0xf9}, {0xe1,0xb7}, {0xe1,0xb5}, {0xe1,0xbb}, {0xbc,0x70}, {0xe5,0x73}, {0xe1,0xb9}, {0xbc,0x72}, {0xe5,0x74}, {0xbc,0x71}, {0xbc,0x74}, {0xe5,0x75}, {0xbc,0x6f}, {0xbc,0x73}, {0xe9,0x73}, {0xe9,0x71}, {0xe9,0x70}, {0xe9,0x72}, {0xe9,0x6f}, {0xc3,0x66}, {0xf4,0x46}, {0xf4,0x47}, {0xf5,0xcb}, {0xf6,0xdf}, {0xc6,0x55}, {0xfb,0xfd}, {0xa9,0xb5}, {0xa7,0xca}, {0x90,0x59}, {0xfc,0x40}, {0xab,0xd8}, {0xfc,0x41}, {0xfc,0x43}, {0xa4,0x7b}, {0xa4,0xdc}, {0xa5,0xaf}, {0xc9,0xdd}, {0xa7,0xcb}, {0xca,0xd2}, {0xce,0xbb}, {0xab,0xd9}, {0xb9,0xfa}, {0xa4,0x7c}, {0x93,0x61}, {0xfc,0x46}, {0x93,0x62}, {0xa6,0xa1}, {0xb7,0x49}, {0xa4,0x7d}, {0xa4,0xdd}, {0xa4,0xde}, {0xa5,0xb1}, {0xa5,0xb0}, {0xc9,0xde}, {0xa6,0xa2}, {0xca,0xd3}, {0xa7,0xcc}, {0xcc,0x71}, {0xcc,0x72}, {0xcc,0x73}, {0x8d,0x6b}, {0xa9,0xb6}, {0xa9,0xb7}, {0xcc,0x70}, {0xa9,0xb8}, {0xab,0xda}, {0xce,0xbc}, {0xd1,0x7a}, {0xae,0x7a}, {0xd1,0x79}, {0xb1,0x69}, {0xd5,0x4c}, {0xb1,0x6a}, {0xd5,0x4d}, {0xfc,0x4c}, {0xb4,0x5d}, {0xdd,0x62}, {0xe1,0xbf}, {0xe1,0xbe}, {0xb9,0xfb}, {0xbc,0x75}, {0xe5,0x76}, {0xbe,0xca}, {0xe9,0x74}, {0xc0,0xb1}, {0x95,0xb8}, {0xc5,0x73}, {0xf7,0xd8}, {0xc6,0xd0}, {0x8b,0xca}, {0xcc,0x74}, {0xce,0xbd}, {0xb1,0x6b}, {0xd8,0xf4}, {0xb7,0x4a}, {0x98,0x7a}, {0xc2,0x55}, {0xc6,0xd1}, {0xa7,0xce}, {0xfc,0x51}, {0xa7,0xcd}, {0xab,0xdb}, {0xd1,0x7b}, {0xb1,0x6d}, {0xb3,0x43}, {0xb1,0x6e}, {0xb1,0x6c}, {0xb4,0x5e}, {0xe1,0xc0}, {0xb9,0xfc}, {0xbc,0x76}, {0xfc,0x54}, {0xc9,0x4c}, {0xc9,0xdf}, {0xca,0xd5}, {0xa7,0xcf}, {0xca,0xd4}, {0xa7,0xd0}, {0xfa,0xaf}, {0xa9,0xbc}, {0xcc,0x77}, {0xcc,0x76}, {0xa9,0xbb}, {0xa9,0xb9}, {0xa9,0xba}, {0xcc,0x75}, {0x8d,0x6c}, {0xab,0xdd}, {0xce,0xbe}, {0xab,0xe0}, {0xab,0xdc}, {0xab,0xe2}, {0xab,0xde}, {0xab,0xdf}, {0xab,0xe1}, {0xae,0x7d}, {0xae,0x7c}, {0xae,0x7b}, {0xd5,0x4f}, {0xb1,0x6f}, {0xb1,0x72}, {0xb1,0x70}, {0xd5,0x4e}, {0xb1,0x75}, {0xb1,0x71}, {0xd5,0x50}, {0xb1,0x74}, {0xb1,0x73}, {0xfa,0x61}, {0xd8,0xf6}, {0xd8,0xf5}, {0xfc,0x57}, {0xb4,0x61}, {0xb4,0x5f}, {0xb4,0x60}, {0xd8,0xf7}, {0xb7,0x4b}, {0xdd,0x64}, {0xb7,0x4c}, {0xdd,0x63}, {0x9b,0x70}, {0xe5,0x77}, {0xbc,0x78}, {0xe1,0xc1}, {0xbc,0x77}, {0xb9,0xfd}, {0xa0,0x51}, {0xec,0xde}, {0xe9,0x75}, {0xc0,0xb2}, {0xec,0xdd}, {0xf2,0x40}, {0xf4,0x48}, {0xf4,0x49}, {0x8c,0x7c}, {0xa4,0xdf}, {0x8b,0xcb}, {0xa5,0xb2}, {0xc9,0x7b}, {0xa7,0xd2}, {0xa7,0xd4}, {0xc9,0xe2}, {0xca,0xd8}, {0xca,0xd7}, {0xca,0xd6}, {0xc9,0xe1}, {0xc9,0xe0}, {0xa6,0xa4}, {0xa7,0xd3}, {0xa7,0xd1}, {0xa6,0xa3}, {0x93,0x6e}, {0xa9,0xbd}, {0xcc,0x78}, {0xfc,0xd5}, {0xa9,0xbe}, {0xca,0xdd}, {0xca,0xdf}, {0xca,0xde}, {0xcc,0x79}, {0xca,0xda}, {0xa7,0xd8}, {0xa7,0xd6}, {0xca,0xd9}, {0xca,0xdb}, {0xca,0xe1}, {0xa7,0xd5}, {0xca,0xdc}, {0xca,0xe5}, {0xa9,0xc0}, {0xca,0xe2}, {0xa7,0xd7}, {0xca,0xe0}, {0xca,0xe3}, {0xa9,0xbf}, {0xa9,0xc1}, {0xca,0xe4}, {0xcc,0xaf}, {0xcc,0xa2}, {0xcc,0x7e}, {0xcc,0xae}, {0xcc,0xa9}, {0xab,0xe7}, {0xa9,0xc2}, {0xcc,0xaa}, {0xcc,0xad}, {0xab,0xe3}, {0xcc,0xac}, {0xa9,0xc3}, {0xa9,0xc8}, {0xa9,0xc6}, {0xcc,0xa3}, {0xcc,0x7c}, {0xcc,0xa5}, {0xa9,0xcd}, {0xcc,0xb0}, {0xab,0xe4}, {0xcc,0xa6}, {0xab,0xe5}, {0xa9,0xc9}, {0xcc,0xa8}, {0xfc,0xa9}, {0xce,0xcd}, {0xab,0xe6}, {0xcc,0x7b}, {0xa9,0xca}, {0xab,0xe8}, {0xa9,0xcb}, {0xa9,0xc7}, {0xa9,0xcc}, {0xcc,0xa7}, {0xcc,0x7a}, {0xcc,0xab}, {0xa9,0xc4}, {0xfc,0x61}, {0xcc,0x7d}, {0xcc,0xa4}, {0xcc,0xa1}, {0xa9,0xc5}, {0xce,0xbf}, {0xce,0xc0}, {0x89,0x66}, {0xce,0xca}, {0xd1,0xa1}, {0xce,0xcb}, {0xab,0xee}, {0xce,0xce}, {0xce,0xc4}, {0xab,0xed}, {0xce,0xc6}, {0xce,0xc7}, {0xfa,0xcb}, {0xce,0xc9}, {0xab,0xe9}, {0xae,0xa3}, {0xf9,0xda}, {0xce,0xc5}, {0xce,0xc1}, {0xae,0xa4}, {0xce,0xcf}, {0xae,0x7e}, {0xd1,0x7d}, {0xce,0xc8}, {0xd1,0x7c}, {0xce,0xc3}, {0xce,0xcc}, {0xab,0xec}, {0xae,0xa1}, {0xab,0xf2}, {0xae,0xa2}, {0xce,0xd0}, {0xd1,0x7e}, {0xab,0xeb}, {0xae,0xa6}, {0xab,0xf1}, {0xab,0xf0}, {0xab,0xef}, {0xae,0xa5}, {0xce,0xd1}, {0xae,0xa7}, {0xab,0xea}, {0xce,0xc2}, {0x93,0x7a}, {0xa0,0xe0}, {0x93,0x6b}, {0xb1,0x76}, {0xd1,0xa4}, {0xd1,0xa6}, {0xd1,0xa8}, {0xae,0xa8}, {0xae,0xae}, {0xd5,0x53}, {0xd1,0xac}, {0xd1,0xa3}, {0xb1,0x78}, {0xd5,0x51}, {0xae,0xad}, {0xae,0xab}, {0xd1,0xae}, {0xd5,0x52}, {0xd1,0xa5}, {0xae,0xac}, {0xd1,0xa9}, {0xae,0xaf}, {0xd1,0xab}, {0xae,0xaa}, {0xd1,0xaa}, {0xd1,0xad}, {0xd1,0xa7}, {0xfc,0x6b}, {0xae,0xa9}, {0xb1,0x79}, {0xd1,0xa2}, {0xb1,0x77}, {0xa0,0xdc}, {0x94,0x68}, {0xb1,0x7a}, {0xd5,0x55}, {0xd5,0x5e}, {0xb4,0x64}, {0xfc,0x6d}, {0xb1,0x7c}, {0xb1,0xa3}, {0xb4,0x65}, {0xd5,0x60}, {0xb1,0xaa}, {0xd8,0xf9}, {0xd5,0x56}, {0xb1,0xa2}, {0xb1,0xa5}, {0xb1,0x7e}, {0xd5,0x54}, {0xd5,0x62}, {0xd5,0x65}, {0xd9,0x49}, {0xd5,0x63}, {0xd8,0xfd}, {0xb1,0xa1}, {0xb1,0xa8}, {0xb1,0xac}, {0xd5,0x5d}, {0xd8,0xf8}, {0xd5,0x61}, {0xb1,0x7b}, {0xd8,0xfa}, {0xd5,0x64}, {0xd8,0xfc}, {0xd5,0x59}, {0xb4,0x62}, {0xd5,0x57}, {0xd5,0x58}, {0xb1,0xa7}, {0x8d,0x71}, {0xb1,0xa6}, {0xd5,0x5b}, {0xb1,0xab}, {0xd5,0x5f}, {0xb1,0xa4}, {0xd5,0x5c}, {0xfd,0x64}, {0xb1,0xa9}, {0xb4,0x66}, {0xb4,0x63}, {0xd8,0xfb}, {0x99,0xba}, {0xd5,0x5a}, {0xb1,0x7d}, {0x9a,0xd0}, {0x9a,0x61}, {0xa0,0xe5}, {0xb4,0x6b}, {0xb4,0x6f}, {0xd9,0x40}, {0xb7,0x51}, {0xb4,0x6d}, {0xd9,0x44}, {0xb4,0x71}, {0xdd,0x65}, {0xd9,0x46}, {0xb7,0x53}, {0xb4,0x69}, {0xb4,0x6c}, {0xd9,0x47}, {0xa0,0x5b}, {0xd9,0x48}, {0xd9,0x4e}, {0xb4,0x73}, {0xb7,0x54}, {0xd9,0x4a}, {0xd9,0x4f}, {0xd9,0x43}, {0xb7,0x5e}, {0x96,0xac}, {0xb7,0x55}, {0xb4,0x72}, {0xd9,0x41}, {0xd9,0x50}, {0x97,0x40}, {0xb7,0x5d}, {0xb4,0x70}, {0xb7,0x4e}, {0xd9,0x4d}, {0xb4,0x74}, {0xd9,0x45}, {0xd8,0xfe}, {0xb4,0x6a}, {0xd9,0x42}, {0xd9,0x4b}, {0x9e,0xf1}, {0xb7,0x4d}, {0xb7,0x52}, {0xb4,0x67}, {0xd9,0x4c}, {0xb7,0x50}, {0x8c,0x4d}, {0xb4,0x68}, {0xb7,0x5c}, {0xe1,0xc3}, {0xdd,0x70}, {0xdd,0x68}, {0xe1,0xc2}, {0xdd,0x6c}, {0xdd,0x6e}, {0x9f,0x7e}, {0xdd,0x6b}, {0xb7,0x5b}, {0xdd,0x6a}, {0xb7,0x5f}, {0xe1,0xd2}, {0x8d,0x72}, {0xb7,0x5a}, {0xba,0x40}, {0xdd,0x71}, {0xe1,0xc4}, {0xfc,0x76}, {0xb7,0x58}, {0xdd,0x69}, {0xdd,0x6d}, {0xb9,0xfe}, {0xb7,0x4f}, {0xdd,0x66}, {0xdd,0x67}, {0xba,0x41}, {0xb7,0x57}, {0xb7,0x59}, {0xb7,0x56}, {0xdd,0x6f}, {0x96,0xa9}, {0xe1,0xc8}, {0xe1,0xc9}, {0xe1,0xce}, {0xbc,0x7d}, {0xe1,0xd5}, {0xba,0x47}, {0xa0,0x6e}, {0xba,0x46}, {0xe1,0xd0}, {0xfc,0xaa}, {0xbc,0x7c}, {0xe1,0xc5}, {0xba,0x45}, {0xfb,0xcd}, {0xe1,0xd4}, {0xba,0x43}, {0xba,0x44}, {0xfc,0x74}, {0xe1,0xd1}, {0xe5,0xaa}, {0xbc,0x7a}, {0xb4,0x6e}, {0xe1,0xd3}, {0xbc,0xa3}, {0xe1,0xcb}, {0xbc,0x7b}, {0xa0,0x74}, {0xbc,0xa2}, {0xe1,0xc6}, {0xe1,0xca}, {0xe1,0xc7}, {0xe1,0xcd}, {0xba,0x48}, {0xbc,0x79}, {0xba,0x42}, {0xe5,0x7a}, {0xe1,0xcf}, {0xbc,0xa1}, {0xa0,0x71}, {0xbc,0xa4}, {0xe1,0xcc}, {0xfc,0x79}, {0xbc,0x7e}, {0xe5,0x79}, {0xfc,0x7c}, {0xe5,0x7e}, {0xbe,0xce}, {0xe5,0x78}, {0xe9,0xa3}, {0xe5,0xa9}, {0xbc,0xa8}, {0xbc,0xa6}, {0xbe,0xcc}, {0xe5,0xa6}, {0xe5,0xa2}, {0xbc,0xac}, {0x9c,0x50}, {0xe9,0x78}, {0x93,0x79}, {0x93,0x78}, {0xbc,0xaa}, {0xe5,0xa1}, {0xa0,0xdd}, {0xe9,0x76}, {0xe5,0xa5}, {0xe5,0xa8}, {0xe5,0x7d}, {0xbc,0xab}, {0xbc,0xa5}, {0xe9,0x77}, {0xbe,0xcd}, {0xe5,0xa7}, {0xbc,0xa7}, {0xbc,0xa9}, {0xe5,0xa4}, {0xbc,0xad}, {0xe5,0xa3}, {0xe5,0x7c}, {0xe5,0x7b}, {0xbe,0xcb}, {0xe5,0xab}, {0xe9,0x7a}, {0xec,0xe0}, {0xbe,0xd0}, {0x8d,0x75}, {0xe9,0xa2}, {0x8d,0x76}, {0xe9,0x7e}, {0xec,0xe1}, {0xbe,0xd1}, {0xe9,0xa1}, {0x93,0x74}, {0xe9,0x7c}, {0xc0,0xb4}, {0xec,0xdf}, {0xe9,0x79}, {0xe9,0x7b}, {0xc0,0xb5}, {0xbe,0xd3}, {0xc0,0xb3}, {0xbe,0xd2}, {0xc0,0xb7}, {0xe9,0x7d}, {0xbe,0xcf}, {0x8d,0x77}, {0xfc,0xa5}, {0xfc,0xa2}, {0xef,0xcf}, {0xef,0xc7}, {0x90,0xc3}, {0xec,0xe7}, {0xef,0xc8}, {0xec,0xe3}, {0xa0,0x79}, {0xc2,0x56}, {0xec,0xe5}, {0xec,0xe4}, {0xc0,0xb6}, {0xec,0xe2}, {0xec,0xe6}, {0xef,0xd0}, {0xef,0xcc}, {0xef,0xce}, {0xef,0xc9}, {0xef,0xca}, {0xef,0xcd}, {0xef,0xcb}, {0xc3,0x67}, {0xc3,0x6a}, {0xc3,0x69}, {0xc3,0x68}, {0xc4,0x61}, {0xf4,0x4a}, {0xc4,0x62}, {0xf2,0x41}, {0xc4,0xdf}, {0xf5,0xcc}, {0xc4,0xe0}, {0xc5,0x74}, {0xc5,0xca}, {0xf7,0xd9}, {0xf7,0xda}, {0xf7,0xdb}, {0xf9,0xba}, {0xa4,0xe0}, {0xc9,0x7c}, {0xa5,0xb3}, {0xa6,0xa6}, {0xa6,0xa7}, {0xa6,0xa5}, {0xa6,0xa8}, {0xa7,0xda}, {0xa7,0xd9}, {0xcc,0xb1}, {0xa9,0xcf}, {0xa9,0xce}, {0xd1,0xaf}, {0xb1,0xad}, {0xb1,0xae}, {0xb4,0x75}, {0xdd,0x72}, {0xb7,0x60}, {0xb7,0x61}, {0xdd,0x74}, {0xdd,0x76}, {0xdd,0x75}, {0xe1,0xd7}, {0xe1,0xd6}, {0xba,0x49}, {0xe1,0xd8}, {0x8d,0x79}, {0xe5,0xac}, {0xbc,0xae}, {0xbe,0xd4}, {0xc0,0xb8}, {0xc2,0x57}, {0xc0,0xb9}, {0xa4,0xe1}, {0x8b,0xfc}, {0xa0,0x76}, {0xca,0xe6}, {0xcc,0xb2}, {0xa9,0xd1}, {0xa9,0xd0}, {0xa9,0xd2}, {0xab,0xf3}, {0xce,0xd2}, {0xce,0xd3}, {0xd1,0xb0}, {0xae,0xb0}, {0xb1,0xaf}, {0xb4,0x76}, {0xd9,0x51}, {0xa4,0xe2}, {0x8b,0xcd}, {0xa4,0x7e}, {0xa4,0xe3}, {0xc9,0x7d}, {0xa5,0xb7}, {0xa5,0xb6}, {0xa5,0xb4}, {0xa5,0xb5}, {0xa6,0xab}, {0xc9,0xe9}, {0xc9,0xeb}, {0xa6,0xaa}, {0xc9,0xe3}, {0xc9,0xe4}, {0xc9,0xea}, {0xc9,0xe6}, {0xc9,0xe8}, {0xa6,0xa9}, {0xc9,0xe5}, {0xc9,0xec}, {0xc9,0xe7}, {0x9f,0x5a}, {0xa7,0xe1}, {0xa7,0xea}, {0xa7,0xe8}, {0xca,0xf0}, {0xca,0xed}, {0xca,0xf5}, {0xa7,0xe6}, {0xca,0xf6}, {0xa7,0xdf}, {0xca,0xf3}, {0xa7,0xe5}, {0xca,0xef}, {0xca,0xee}, {0xa7,0xe3}, {0xca,0xf4}, {0xa7,0xe4}, {0xa9,0xd3}, {0xa7,0xde}, {0xca,0xf1}, {0x9f,0xf4}, {0xca,0xe7}, {0xa7,0xdb}, {0x9f,0xba}, {0xa7,0xee}, {0xca,0xec}, {0xca,0xf2}, {0xa7,0xe0}, {0xa7,0xe2}, {0xca,0xe8}, {0xca,0xe9}, {0xca,0xea}, {0x8d,0x7a}, {0xa7,0xed}, {0xa7,0xe7}, {0xa7,0xec}, {0xca,0xeb}, {0xa7,0xeb}, {0xa7,0xdd}, {0xa7,0xdc}, {0xa7,0xe9}, {0x9e,0x45}, {0x93,0xb0}, {0xa0,0x75}, {0xa9,0xe1}, {0xcc,0xbe}, {0xcc,0xb7}, {0xa9,0xdc}, {0xa9,0xef}, {0xcc,0xb3}, {0xcc,0xba}, {0xcc,0xbc}, {0xcc,0xbf}, {0xa9,0xea}, {0xcc,0xbb}, {0xcc,0xb4}, {0xa9,0xe8}, {0xcc,0xb8}, {0xcc,0xc0}, {0xa9,0xd9}, {0xcc,0xbd}, {0xa9,0xe3}, {0xa9,0xe2}, {0xcc,0xb6}, {0xa9,0xd7}, {0xa9,0xd8}, {0x9b,0x46}, {0xa9,0xd6}, {0xfc,0xae}, {0xa9,0xee}, {0xa9,0xe6}, {0xa9,0xe0}, {0xa9,0xd4}, {0xcc,0xb9}, {0xa9,0xdf}, {0xa9,0xd5}, {0xa9,0xe7}, {0xa9,0xf0}, {0xce,0xd4}, {0xa9,0xe4}, {0xcc,0xb5}, {0xa9,0xda}, {0xa9,0xdd}, {0xa9,0xde}, {0xfc,0xb0}, {0xa9,0xec}, {0xa9,0xed}, {0xa9,0xeb}, {0xa9,0xe5}, {0xa9,0xe9}, {0xa9,0xdb}, {0xab,0xf4}, {0xfa,0x51}, {0x8d,0x7b}, {0xce,0xda}, {0xac,0x41}, {0xab,0xf8}, {0xab,0xfa}, {0xac,0x40}, {0xce,0xe6}, {0xab,0xfd}, {0xd1,0xb1}, {0xae,0xb1}, {0xac,0x43}, {0xce,0xd7}, {0xce,0xdf}, {0xab,0xfe}, {0xce,0xde}, {0xce,0xdb}, {0xce,0xe3}, {0xce,0xe5}, {0xab,0xf7}, {0xab,0xfb}, {0xac,0x42}, {0xae,0xb3}, {0xce,0xe0}, {0xab,0xf9}, {0xac,0x45}, {0xce,0xd9}, {0xab,0xfc}, {0xae,0xb2}, {0xab,0xf6}, {0xce,0xd6}, {0xce,0xdd}, {0xce,0xd5}, {0xce,0xd8}, {0xce,0xdc}, {0xd1,0xb2}, {0xac,0x44}, {0xce,0xe1}, {0xce,0xe2}, {0xce,0xe4}, {0xab,0xf5}, {0x8d,0x7c}, {0xae,0xc1}, {0xd1,0xbe}, {0xae,0xbf}, {0xae,0xc0}, {0xd1,0xb4}, {0xd1,0xc4}, {0x9e,0xd6}, {0xae,0xb6}, {0x93,0xac}, {0xd5,0x66}, {0xd1,0xc6}, {0xd1,0xc0}, {0x9f,0x5b}, {0xd1,0xb7}, {0x93,0xa9}, {0xd1,0xc9}, {0xd1,0xba}, {0xae,0xbc}, {0xd5,0x7d}, {0xd1,0xbd}, {0xae,0xbe}, {0xae,0xb5}, {0xd1,0xcb}, {0xd1,0xbf}, {0xae,0xb8}, {0xd1,0xb8}, {0xd1,0xb5}, {0xd1,0xb6}, {0xae,0xb9}, {0xd1,0xc5}, {0xd1,0xcc}, {0xae,0xbb}, {0xd1,0xbc}, {0xd1,0xbb}, {0xae,0xc3}, {0xae,0xc2}, {0xae,0xb4}, {0xae,0xba}, {0xae,0xbd}, {0xd1,0xc8}, {0xd1,0xc2}, {0xae,0xb7}, {0xd1,0xb3}, {0xd1,0xca}, {0xd1,0xc1}, {0xd1,0xc3}, {0xd1,0xc7}, {0xa0,0x7c}, {0xd5,0x67}, {0xb1,0xb7}, {0xb1,0xcb}, {0xb1,0xca}, {0xb1,0xbf}, {0xfc,0xb2}, {0xd5,0x79}, {0xd5,0x75}, {0xd5,0x72}, {0xd5,0xa6}, {0xb1,0xba}, {0xb1,0xb2}, {0xd5,0x77}, {0xb4,0xa8}, {0xb1,0xb6}, {0xd5,0xa1}, {0x8a,0xc1}, {0xb1,0xcc}, {0xb1,0xc9}, {0xd5,0x7b}, {0xd5,0x6a}, {0x9f,0xb4}, {0xb1,0xc8}, {0xd5,0xa3}, {0xd5,0x69}, {0xb1,0xbd}, {0xb1,0xc1}, {0xd5,0xa2}, {0xd5,0x73}, {0xb1,0xc2}, {0xb1,0xbc}, {0xd5,0x68}, {0xfc,0xac}, {0xb4,0x78}, {0xd5,0xa5}, {0xd5,0x71}, {0xb1,0xc7}, {0xd5,0x74}, {0xd5,0xa4}, {0xb1,0xc6}, {0xd9,0x52}, {0xb1,0xb3}, {0xd5,0x6f}, {0xb1,0xb8}, {0xb1,0xc3}, {0xb1,0xbe}, {0xd5,0x78}, {0xd5,0x6e}, {0xd5,0x6c}, {0xd5,0x7e}, {0xb1,0xb0}, {0xb1,0xc4}, {0xb1,0xb4}, {0xb4,0x77}, {0xd5,0x7c}, {0xb1,0xb5}, {0xb1,0xb1}, {0xb1,0xc0}, {0xb1,0xbb}, {0xb1,0xb9}, {0xd5,0x70}, {0xb1,0xc5}, {0xd5,0x6d}, {0xd5,0x7a}, {0xd5,0x76}, {0xd9,0x54}, {0xd9,0x53}, {0x9e,0x4c}, {0xd5,0x6b}, {0xd9,0x64}, {0xb4,0x7a}, {0x8f,0xc5}, {0xd9,0x6a}, {0xd9,0x59}, {0xd9,0x67}, {0xdd,0x77}, {0xb4,0x7d}, {0xd9,0x6b}, {0xd9,0x6e}, {0xb4,0x7c}, {0xd9,0x5c}, {0xd9,0x6d}, {0xd9,0x6c}, {0xb4,0x7e}, {0xd9,0x55}, {0xb4,0x79}, {0xb4,0xa3}, {0x93,0xad}, {0xb4,0xa1}, {0xd9,0x69}, {0xd9,0x5f}, {0xb4,0xa5}, {0xd9,0x70}, {0xd9,0x68}, {0xd9,0x71}, {0xb4,0xad}, {0xb4,0xab}, {0xd9,0x66}, {0xd9,0x65}, {0x9d,0xc3}, {0xd9,0x63}, {0xd9,0x5d}, {0xb4,0xa4}, {0x8d,0xa2}, {0xb4,0xa2}, {0xd1,0xb9}, {0xd9,0x56}, {0x9d,0x4a}, {0xdd,0xb7}, {0xd9,0x57}, {0xb4,0x7b}, {0xb4,0xaa}, {0xdd,0x79}, {0xb4,0xa6}, {0xb4,0xa7}, {0xd9,0x58}, {0xd9,0x6f}, {0xdd,0x78}, {0xd9,0x60}, {0xd9,0x5b}, {0xb4,0xa9}, {0xd9,0x61}, {0xd9,0x5e}, {0xfc,0xb6}, {0xb4,0xae}, {0x8d,0xa3}, {0x9e,0x4b}, {0x9e,0x4d}, {0xb7,0x70}, {0x8d,0xa4}, {0xdd,0x7c}, {0xdd,0xb1}, {0xdd,0xb6}, {0xdd,0xaa}, {0xb7,0x6c}, {0xdd,0xbb}, {0xb7,0x69}, {0xdd,0x7a}, {0xdd,0x7b}, {0xb7,0x62}, {0xb7,0x6b}, {0xdd,0xa4}, {0xb7,0x6e}, {0xb7,0x6f}, {0xdd,0xa5}, {0xdd,0xb2}, {0xdd,0xb8}, {0xb7,0x6a}, {0xb7,0x64}, {0xdd,0xa3}, {0xdd,0x7d}, {0xdd,0xba}, {0xdd,0xa8}, {0xdd,0xa9}, {0xdd,0x7e}, {0xdd,0xb4}, {0xdd,0xab}, {0xdd,0xb5}, {0xdd,0xad}, {0xb7,0x65}, {0xe1,0xd9}, {0xb7,0x68}, {0xb7,0x66}, {0xdd,0xb9}, {0xdd,0xb0}, {0xdd,0xac}, {0x8a,0xfd}, {0xdd,0xa1}, {0xba,0x53}, {0xdd,0xaf}, {0xb7,0x6d}, {0xdd,0xa7}, {0xfc,0xb5}, {0xdd,0xa6}, {0xfc,0xc3}, {0x93,0xb2}, {0xb7,0x67}, {0xb7,0x63}, {0xe1,0xee}, {0xdd,0xb3}, {0xdd,0xae}, {0xdd,0xa2}, {0xe1,0xe9}, {0xe1,0xda}, {0xe1,0xe5}, {0xe1,0xec}, {0xba,0x51}, {0xb4,0xac}, {0xe1,0xea}, {0xba,0x4c}, {0xba,0x4b}, {0xe1,0xf1}, {0x8d,0xa5}, {0xe1,0xdb}, {0xe1,0xe8}, {0xe1,0xdc}, {0xe1,0xe7}, {0xba,0x4f}, {0xe1,0xeb}, {0xd9,0x62}, {0xe1,0xf2}, {0xe1,0xe3}, {0xba,0x52}, {0xe5,0xba}, {0xbc,0xaf}, {0xe1,0xf0}, {0xe1,0xef}, {0xba,0x54}, {0xe5,0xad}, {0xbc,0xb0}, {0xe5,0xae}, {0x93,0xa1}, {0xe1,0xdf}, {0xe1,0xe0}, {0xe1,0xdd}, {0xe1,0xe2}, {0xe1,0xde}, {0xe1,0xf3}, {0xba,0x4e}, {0xbc,0xb1}, {0xba,0x50}, {0xba,0x55}, {0x8a,0xc6}, {0xe1,0xe1}, {0xe1,0xed}, {0xe1,0xe6}, {0xe5,0xb1}, {0xba,0x4a}, {0xbc,0xb4}, {0xe9,0xaa}, {0xe5,0xb6}, {0xe5,0xb5}, {0xe5,0xb7}, {0x8a,0x5b}, {0xe5,0xb4}, {0xbc,0xb5}, {0x89,0x4d}, {0xbc,0xbb}, {0xbc,0xb8}, {0xbc,0xb9}, {0xe5,0xaf}, {0xe5,0xb2}, {0xe5,0xbc}, {0xbc,0xc1}, {0xbc,0xbf}, {0xe5,0xb3}, {0xd9,0x5a}, {0xbc,0xb2}, {0xe5,0xb9}, {0xe5,0xb0}, {0xbc,0xc2}, {0xe5,0xb8}, {0xba,0x4d}, {0xbc,0xb7}, {0xe1,0xe4}, {0xbc,0xba}, {0xbc,0xbe}, {0xbc,0xc0}, {0xbc,0xbd}, {0xbc,0xbc}, {0xfe,0xd4}, {0xbc,0xb6}, {0xe5,0xbb}, {0xbc,0xb3}, {0xbc,0xc3}, {0x8a,0x78}, {0x93,0xab}, {0xbe,0xd8}, {0xbe,0xd9}, {0xe9,0xa9}, {0xbe,0xe2}, {0xbe,0xdf}, {0x8d,0xa7}, {0xbe,0xd6}, {0xbe,0xdd}, {0xe9,0xab}, {0xbe,0xdb}, {0xbe,0xd5}, {0xbe,0xdc}, {0xe9,0xa8}, {0xc0,0xbb}, {0xbe,0xd7}, {0xbe,0xde}, {0xc0,0xba}, {0xe9,0xa7}, {0xe9,0xa6}, {0xbe,0xe0}, {0x9f,0x45}, {0xbe,0xe1}, {0xe9,0xa5}, {0xe9,0xa4}, {0xc0,0xbc}, {0xe9,0xae}, {0xbe,0xda}, {0xe9,0xac}, {0x8a,0x56}, {0xc0,0xbd}, {0xfc,0xbf}, {0xc0,0xc2}, {0xec,0xea}, {0xec,0xec}, {0xfc,0xc0}, {0xc0,0xbf}, {0x8e,0xe6}, {0xec,0xed}, {0xec,0xe9}, {0x8a,0xa4}, {0xec,0xeb}, {0xc0,0xc0}, {0xc0,0xc3}, {0xec,0xe8}, {0xc0,0xbe}, {0xc0,0xc1}, {0xc2,0x59}, {0xe9,0xad}, {0xc2,0x58}, {0xc2,0x5e}, {0xef,0xd4}, {0xc2,0x5c}, {0xc2,0x5d}, {0xef,0xd7}, {0xef,0xd3}, {0xc2,0x5a}, {0xef,0xd1}, {0xc3,0x6b}, {0xef,0xd5}, {0xef,0xd6}, {0xef,0xd2}, {0xc2,0x5b}, {0xf2,0x42}, {0xf2,0x45}, {0x89,0x43}, {0xf2,0x46}, {0xf2,0x44}, {0xf2,0x47}, {0xc3,0x6c}, {0xf2,0x43}, {0x93,0xf3}, {0xf4,0x4e}, {0xc4,0x64}, {0xf4,0x4d}, {0xf4,0x4c}, {0xf4,0x4b}, {0xc4,0x63}, {0xc4,0x65}, {0xf5,0xcd}, {0xc4,0xe2}, {0xc4,0xe1}, {0xfc,0xab}, {0x9e,0xa2}, {0xf6,0xe1}, {0xf6,0xe0}, {0xf6,0xe3}, {0xc5,0xcb}, {0xc5,0x75}, {0xf7,0xdd}, {0xf6,0xe2}, {0xf7,0xdc}, {0xc5,0xcd}, {0xc5,0xcc}, {0xc5,0xf3}, {0xf8,0xa9}, {0xf8,0xef}, {0xa4,0xe4}, {0x9d,0xc7}, {0xd9,0x72}, {0xe9,0xaf}, {0xc6,0xd2}, {0x8b,0xce}, {0xa6,0xac}, {0xca,0xf7}, {0xa7,0xf1}, {0xa7,0xef}, {0xa7,0xf0}, {0xcc,0xc1}, {0xa9,0xf1}, {0xac,0x46}, {0xce,0xe7}, {0xce,0xe8}, {0xac,0x47}, {0xd1,0xce}, {0xae,0xc4}, {0xae,0xc5}, {0xd1,0xcd}, {0xfc,0xc5}, {0xb1,0xd3}, {0xb1,0xcf}, {0xd5,0xa7}, {0xb1,0xd6}, {0xb1,0xd5}, {0xb1,0xce}, {0xb1,0xd1}, {0xb1,0xd4}, {0xb1,0xd0}, {0xd9,0x76}, {0xb1,0xcd}, {0xb4,0xaf}, {0xfc,0xcb}, {0xb4,0xb1}, {0xb4,0xb2}, {0xd9,0x75}, {0xd9,0x78}, {0xb4,0xb0}, {0xd9,0x73}, {0xd9,0x77}, {0xd9,0x74}, {0x93,0xb3}, {0xb7,0x71}, {0xfc,0xca}, {0xdd,0xbc}, {0xba,0x56}, {0xe1,0xf4}, {0xbe,0xe3}, {0xbc,0xc4}, {0xe5,0xbd}, {0xbc,0xc5}, {0xbc,0xc6}, {0xe5,0xbf}, {0xe5,0xbe}, {0xe5,0xc0}, {0xe9,0xb1}, {0xe9,0xb0}, {0xec,0xef}, {0xec,0xee}, {0xc0,0xc4}, {0xc0,0xc5}, {0xf2,0x48}, {0xfc,0xc9}, {0x8d,0xac}, {0xa4,0xe5}, {0xfb,0xc6}, {0x89,0x67}, {0x8c,0x7e}, {0xd9,0x79}, {0xb4,0xb4}, {0xb4,0xb3}, {0xdd,0xbd}, {0xef,0xd8}, {0xc4,0xe3}, {0xf7,0xde}, {0xa4,0xe6}, {0xae,0xc6}, {0xb1,0xd8}, {0xb1,0xd7}, {0xd9,0x7a}, {0xd9,0x7b}, {0xb7,0x72}, {0xe1,0xf5}, {0xba,0x57}, {0xe9,0xb2}, {0xa4,0xe7}, {0xa5,0xb8}, {0xa9,0xf2}, {0xcc,0xc2}, {0xce,0xe9}, {0xac,0x48}, {0xb1,0xd9}, {0xd9,0x7c}, {0xb4,0xb5}, {0xb7,0x73}, {0xe5,0xc1}, {0xe5,0xc2}, {0xfc,0xcd}, {0xec,0xf0}, {0xc2,0x5f}, {0xf8,0xf0}, {0xa4,0xe8}, {0xcc,0xc3}, {0xa9,0xf3}, {0xac,0x49}, {0x9c,0xf3}, {0xce,0xea}, {0xae,0xc7}, {0xd1,0xd2}, {0xd1,0xd0}, {0xd1,0xd1}, {0xae,0xc8}, {0xd1,0xcf}, {0xb1,0xdb}, {0xb1,0xdc}, {0xd5,0xa8}, {0xb1,0xdd}, {0xb1,0xda}, {0xd9,0x7d}, {0xfc,0xd0}, {0xd9,0x7e}, {0xdd,0xbe}, {0x95,0xbb}, {0xba,0x59}, {0xba,0x58}, {0xec,0xf1}, {0xef,0xd9}, {0xf2,0x4a}, {0xf2,0x49}, {0xf4,0x4f}, {0xfc,0xd3}, {0xc9,0x5e}, {0xac,0x4a}, {0xfc,0xd4}, {0xa4,0xe9}, {0xa5,0xb9}, {0xa6,0xae}, {0xa6,0xad}, {0xa6,0xaf}, {0xa6,0xb0}, {0xc9,0xee}, {0xc9,0xed}, {0xca,0xf8}, {0xa7,0xf2}, {0xca,0xfb}, {0xca,0xfa}, {0xca,0xf9}, {0xca,0xfc}, {0xa9,0xf4}, {0xcc,0xc9}, {0xcc,0xc5}, {0xcc,0xce}, {0x8d,0xae}, {0xa9,0xfb}, {0xa9,0xf9}, {0xcc,0xca}, {0xcc,0xc6}, {0xcc,0xcd}, {0xa9,0xf8}, {0xaa,0x40}, {0xcc,0xc8}, {0xcc,0xc4}, {0xa9,0xfe}, {0xcc,0xcb}, {0xa9,0xf7}, {0xcc,0xcc}, {0xa9,0xfa}, {0xa9,0xfc}, {0xcc,0xd0}, {0xcc,0xcf}, {0xcc,0xc7}, {0xa9,0xf6}, {0xa9,0xf5}, {0xa9,0xfd}, {0xfc,0xd7}, {0xce,0xef}, {0xce,0xf5}, {0x93,0xdb}, {0xac,0x50}, {0xac,0x4d}, {0xce,0xec}, {0xce,0xf1}, {0xfe,0x63}, {0xac,0x53}, {0xac,0x4b}, {0xce,0xf0}, {0xac,0x4e}, {0xac,0x51}, {0xce,0xf3}, {0xac,0x4c}, {0xce,0xf8}, {0xac,0x4f}, {0x93,0xd5}, {0xac,0x52}, {0xce,0xed}, {0xce,0xf2}, {0xce,0xf6}, {0xce,0xee}, {0xce,0xeb}, {0xce,0xf7}, {0xce,0xf4}, {0xae,0xd0}, {0xae,0xc9}, {0xae,0xcc}, {0xfc,0xda}, {0xae,0xcf}, {0xd1,0xd5}, {0x9b,0x71}, {0xae,0xca}, {0xd1,0xd3}, {0xfc,0xdd}, {0xae,0xce}, {0xae,0xcb}, {0xd1,0xd6}, {0xae,0xcd}, {0x8d,0xaf}, {0xfa,0xf2}, {0xd5,0xac}, {0xb1,0xdf}, {0xd5,0xab}, {0xd5,0xad}, {0xb1,0xde}, {0xb1,0xe3}, {0xd1,0xd4}, {0xd5,0xaa}, {0xd5,0xae}, {0x93,0xd8}, {0xb1,0xe0}, {0xd5,0xa9}, {0xb1,0xe2}, {0xfc,0xdf}, {0xb1,0xe1}, {0xd9,0xa7}, {0x93,0xd3}, {0xd9,0xa2}, {0xb4,0xb6}, {0xb4,0xba}, {0xb4,0xb7}, {0xd9,0xa5}, {0xd9,0xa8}, {0xfc,0xe1}, {0xb4,0xb8}, {0xb4,0xb9}, {0xb4,0xbe}, {0xdd,0xc7}, {0xd9,0xa6}, {0xb4,0xbc}, {0xd9,0xa3}, {0xd9,0xa1}, {0x8e,0x76}, {0xb4,0xbd}, {0xd9,0xa4}, {0xb7,0x79}, {0xfc,0x62}, {0xdd,0xbf}, {0xb7,0x76}, {0xb7,0x77}, {0xb7,0x75}, {0xdd,0xc4}, {0xdd,0xc3}, {0xdd,0xc0}, {0xb7,0x7b}, {0x93,0xd1}, {0xdd,0xc2}, {0xb4,0xbb}, {0x8d,0xb1}, {0xdd,0xc6}, {0xdd,0xc1}, {0xb7,0x78}, {0xb7,0x74}, {0xb7,0x7a}, {0xdd,0xc5}, {0x98,0x59}, {0xba,0x5c}, {0xe1,0xf8}, {0xe1,0xf7}, {0xe1,0xf6}, {0xba,0x5a}, {0xfb,0x52}, {0xba,0x5b}, {0xe5,0xc5}, {0xe5,0xc8}, {0xbc,0xc8}, {0xfb,0x53}, {0xbc,0xc7}, {0xe5,0xc9}, {0xe5,0xc4}, {0xbc,0xca}, {0xe5,0xc6}, {0xfb,0x4d}, {0xbc,0xc9}, {0xe5,0xc3}, {0x9c,0xbf}, {0xe5,0xc7}, {0xbe,0xe9}, {0xbe,0xe6}, {0xe9,0xbb}, {0xe9,0xba}, {0xe9,0xb9}, {0xe9,0xb4}, {0x9b,0x72}, {0xe9,0xb5}, {0xbe,0xe7}, {0xbe,0xe4}, {0xbe,0xe8}, {0xe9,0xb3}, {0xbe,0xe5}, {0xe9,0xb6}, {0xe9,0xb7}, {0xe9,0xbc}, {0xfb,0x50}, {0x93,0xbe}, {0xe9,0xb8}, {0xec,0xf2}, {0xc0,0xc7}, {0xef,0xdc}, {0xc0,0xc6}, {0xef,0xda}, {0xef,0xdb}, {0xc2,0x60}, {0xc3,0x6e}, {0xf2,0x4b}, {0xc3,0x6d}, {0xf4,0x51}, {0xf4,0x52}, {0xc4,0x66}, {0xf4,0x50}, {0xc4,0xe4}, {0xf7,0xdf}, {0xc5,0xce}, {0xf8,0xaa}, {0xf8,0xab}, {0xa4,0xea}, {0x9d,0xf1}, {0xa6,0xb1}, {0xa6,0xb2}, {0xa7,0xf3}, {0xcc,0xd1}, {0xac,0x54}, {0xae,0xd1}, {0xb1,0xe4}, {0xb0,0xd2}, {0xb4,0xbf}, {0xb4,0xc0}, {0xb3,0xcc}, {0xd9,0xa9}, {0xfc,0xeb}, {0xb7,0x7c}, {0xe1,0xfa}, {0xe1,0xf9}, {0xa4,0xeb}, {0xa6,0xb3}, {0xcc,0xd2}, {0xaa,0x42}, {0xa0,0xbb}, {0xaa,0x41}, {0x9b,0x7e}, {0xce,0xf9}, {0xce,0xfa}, {0xd1,0xd7}, {0xd1,0xd8}, {0xae,0xd2}, {0xae,0xd3}, {0x8d,0xb3}, {0xae,0xd4}, {0xd5,0xaf}, {0x8c,0x52}, {0xb1,0xe6}, {0xb4,0xc2}, {0x9a,0xe8}, {0xb4,0xc1}, {0xdd,0xc8}, {0xdf,0x7a}, {0xe1,0xfb}, {0xe9,0xbd}, {0x8e,0xdc}, {0xc2,0x61}, {0xc4,0x67}, {0xa4,0xec}, {0xa5,0xbc}, {0xa5,0xbd}, {0xa5,0xbb}, {0xa5,0xbe}, {0xa5,0xba}, {0xa6,0xb6}, {0xc9,0xf6}, {0xa6,0xb5}, {0xa6,0xb7}, {0x9c,0xf9}, {0xc9,0xf1}, {0xc9,0xf0}, {0xc9,0xf3}, {0xc9,0xf2}, {0xc9,0xf5}, {0xa6,0xb4}, {0xc9,0xef}, {0xc9,0xf4}, {0xfa,0x50}, {0xca,0xfd}, {0xa7,0xfd}, {0xca,0xfe}, {0xcb,0x43}, {0xa7,0xfc}, {0xcb,0x47}, {0xcb,0x42}, {0xcb,0x45}, {0xa7,0xf5}, {0xa7,0xf6}, {0xa7,0xf7}, {0xa7,0xf8}, {0xa8,0x40}, {0xcb,0x41}, {0xa7,0xfa}, {0xa8,0x41}, {0xcb,0x40}, {0xcb,0x46}, {0xa7,0xf9}, {0xcb,0x44}, {0xa7,0xfb}, {0xa7,0xf4}, {0xa7,0xfe}, {0x98,0xe7}, {0xfc,0xf3}, {0xfc,0xf2}, {0xaa,0x57}, {0x8c,0xca}, {0xcc,0xd4}, {0xaa,0x43}, {0xaa,0x4d}, {0xaa,0x4e}, {0xaa,0x46}, {0xaa,0x58}, {0xaa,0x48}, {0xcc,0xdc}, {0xaa,0x53}, {0xcc,0xd7}, {0xaa,0x49}, {0xcc,0xe6}, {0xcc,0xe7}, {0xcc,0xdf}, {0xcc,0xd8}, {0xaa,0x56}, {0xcc,0xe4}, {0xaa,0x51}, {0xaa,0x4f}, {0xcc,0xe5}, {0xcc,0xe3}, {0xcc,0xdb}, {0xcc,0xd3}, {0xcc,0xda}, {0xaa,0x4a}, {0xaa,0x50}, {0xaa,0x44}, {0xcc,0xde}, {0xcc,0xdd}, {0xcc,0xd5}, {0x93,0xe5}, {0xaa,0x52}, {0xcc,0xe1}, {0xcc,0xd6}, {0xaa,0x55}, {0xcc,0xe8}, {0xaa,0x45}, {0xaa,0x4c}, {0xcc,0xd9}, {0xcc,0xe2}, {0xaa,0x54}, {0xaa,0x47}, {0xaa,0x4b}, {0xcc,0xe0}, {0x9a,0x59}, {0x8d,0xb5}, {0xfd,0x4d}, {0xcf,0x5b}, {0xac,0x5c}, {0xac,0x69}, {0xfd,0x5e}, {0xcf,0x56}, {0xcf,0x4c}, {0xac,0x62}, {0xcf,0x4a}, {0xac,0x5b}, {0xcf,0x45}, {0xac,0x65}, {0xcf,0x52}, {0xce,0xfe}, {0xcf,0x41}, {0x8f,0x7d}, {0xcf,0x44}, {0xce,0xfb}, {0xcf,0x51}, {0xcf,0x61}, {0xac,0x60}, {0xcf,0x46}, {0xcf,0x58}, {0xce,0xfd}, {0xcf,0x5f}, {0xcf,0x60}, {0xcf,0x63}, {0xcf,0x5a}, {0xcf,0x4b}, {0xcf,0x53}, {0xac,0x66}, {0xac,0x59}, {0xac,0x61}, {0xac,0x6d}, {0xac,0x56}, {0xac,0x58}, {0x95,0x47}, {0xfc,0xf6}, {0xcf,0x43}, {0xac,0x6a}, {0xac,0x63}, {0xcf,0x5d}, {0xcf,0x40}, {0xac,0x6c}, {0xac,0x67}, {0xcf,0x49}, {0xac,0x6b}, {0xcf,0x50}, {0xcf,0x48}, {0xac,0x64}, {0xcf,0x5c}, {0xcf,0x54}, {0xac,0x5e}, {0xcf,0x62}, {0xcf,0x47}, {0xac,0x5a}, {0xcf,0x59}, {0xcf,0x4f}, {0xac,0x5f}, {0xcf,0x55}, {0xac,0x57}, {0xce,0xfc}, {0xac,0x68}, {0xae,0xe3}, {0xac,0x5d}, {0xcf,0x4e}, {0xcf,0x4d}, {0xcf,0x42}, {0x92,0x50}, {0xcf,0x5e}, {0xcf,0x57}, {0x89,0x68}, {0xac,0x55}, {0x8d,0xb6}, {0xfc,0xfb}, {0xa0,0x7d}, {0x98,0xfc}, {0x89,0x69}, {0xfe,0x4f}, {0x92,0x56}, {0xd1,0xec}, {0xae,0xea}, {0xd1,0xed}, {0xd1,0xe1}, {0xae,0xdf}, {0xae,0xeb}, {0xd1,0xda}, {0xfa,0xc9}, {0xd1,0xe3}, {0xd1,0xeb}, {0x93,0xe8}, {0xd1,0xd9}, {0xd1,0xf4}, {0xae,0xd5}, {0xfc,0xf8}, {0xd1,0xf3}, {0xd1,0xee}, {0xd1,0xef}, {0xae,0xdd}, {0xae,0xe8}, {0xd1,0xe5}, {0xd1,0xe6}, {0xd1,0xf0}, {0xd1,0xe7}, {0xd1,0xe2}, {0xd1,0xdc}, {0xd1,0xdd}, {0xd1,0xea}, {0xd1,0xe4}, {0x9c,0xe3}, {0xfd,0xa9}, {0xae,0xd6}, {0xae,0xda}, {0xd1,0xf2}, {0xd1,0xde}, {0xae,0xe6}, {0xae,0xe2}, {0xfc,0x44}, {0xae,0xe5}, {0xae,0xec}, {0xae,0xdb}, {0xae,0xe7}, {0xd1,0xe9}, {0xae,0xe9}, {0xae,0xd8}, {0x96,0x40}, {0xae,0xd7}, {0xd1,0xdb}, {0x8d,0xb8}, {0xd1,0xdf}, {0xae,0xe0}, {0xd1,0xf1}, {0xd1,0xe8}, {0xd1,0xe0}, {0xae,0xe4}, {0xae,0xe1}, {0xae,0xd9}, {0xae,0xdc}, {0x9b,0x4a}, {0x8f,0xb9}, {0xfc,0xfe}, {0x89,0x6a}, {0xd5,0xc4}, {0xd5,0xb4}, {0xd5,0xb5}, {0xd5,0xb9}, {0xd5,0xc8}, {0xd5,0xc5}, {0xd5,0xbe}, {0xd5,0xbd}, {0xb1,0xed}, {0xd5,0xc1}, {0xd5,0xd0}, {0xd5,0xb0}, {0xd5,0xd1}, {0xd5,0xc3}, {0xd5,0xd5}, {0xd5,0xc9}, {0xb1,0xec}, {0xd5,0xc7}, {0xb1,0xe7}, {0xb1,0xfc}, {0xb1,0xf2}, {0x8d,0xb9}, {0xb1,0xf6}, {0xb1,0xf5}, {0xd5,0xb1}, {0x91,0x7e}, {0xd5,0xce}, {0xd5,0xd4}, {0xd5,0xcc}, {0xd5,0xd3}, {0xd5,0xc0}, {0xd5,0xb2}, {0xd5,0xd2}, {0xd5,0xc2}, {0xb1,0xea}, {0xb1,0xf7}, {0xd5,0xcb}, {0xb1,0xf0}, {0x93,0xf4}, {0xd5,0xca}, {0xd5,0xb3}, {0xb1,0xf8}, {0xb1,0xfa}, {0xd5,0xcd}, {0xb1,0xfb}, {0xb1,0xe9}, {0xd5,0xba}, {0xd5,0xcf}, {0xfb,0x7c}, {0xb1,0xef}, {0xb1,0xf9}, {0xd5,0xbc}, {0xd5,0xc6}, {0xd5,0xb7}, {0xd5,0xbb}, {0xb1,0xf4}, {0xd5,0xb6}, {0xb1,0xe8}, {0xb1,0xf1}, {0xb1,0xee}, {0xd5,0xbf}, {0xae,0xde}, {0xd9,0xc0}, {0xb1,0xeb}, {0x93,0xe7}, {0x97,0xef}, {0xfe,0x4a}, {0xfd,0x45}, {0xb1,0xf3}, {0x96,0xa5}, {0xd9,0xc3}, {0xd9,0xd9}, {0xd9,0xce}, {0xb4,0xd6}, {0xfe,0xe0}, {0xb4,0xd1}, {0xd9,0xbd}, {0xb4,0xd2}, {0xd9,0xcd}, {0xd9,0xc6}, {0xd9,0xd3}, {0xb4,0xce}, {0xd9,0xab}, {0xd9,0xd5}, {0xb4,0xc4}, {0xd9,0xb3}, {0xb4,0xc7}, {0xb4,0xc6}, {0xb4,0xd7}, {0xd9,0xad}, {0xd9,0xcf}, {0xd9,0xd0}, {0xb4,0xc9}, {0xb4,0xc5}, {0xd9,0xbb}, {0xb4,0xd0}, {0xd9,0xb6}, {0xd9,0xd1}, {0xb4,0xcc}, {0xd9,0xc9}, {0xd9,0xd6}, {0xd9,0xb0}, {0xd9,0xb5}, {0xd9,0xaf}, {0xb4,0xcb}, {0xd9,0xc2}, {0xdd,0xde}, {0xd9,0xb1}, {0xb4,0xcf}, {0xd9,0xba}, {0xd9,0xd2}, {0xb4,0xca}, {0xd9,0xb7}, {0xd9,0xb4}, {0xd9,0xc5}, {0xb4,0xcd}, {0xb4,0xc3}, {0xb4,0xd9}, {0xd9,0xc8}, {0xd9,0xc7}, {0xfd,0x48}, {0xfd,0x47}, {0xfe,0xf2}, {0xfe,0x6a}, {0xd9,0xac}, {0xb4,0xc8}, {0xd9,0xd4}, {0xd9,0xbc}, {0xd9,0xbe}, {0x8d,0xbd}, {0xd9,0xcb}, {0xd9,0xca}, {0xd9,0xaa}, {0xb4,0xd3}, {0xb4,0xd5}, {0xd9,0xb2}, {0xd9,0xb9}, {0xd9,0xc1}, {0xb4,0xd4}, {0xd9,0xb8}, {0xd9,0xc4}, {0xd9,0xd7}, {0xd9,0xcc}, {0x9b,0xa1}, {0x8c,0xa2}, {0x9a,0xb7}, {0x8e,0xfc}, {0xd9,0xd8}, {0xd9,0xae}, {0x9f,0xa1}, {0xdd,0xf2}, {0xb7,0xa6}, {0xdd,0xf0}, {0xdd,0xdb}, {0xdd,0xe0}, {0xdd,0xd9}, {0xfd,0x51}, {0xdd,0xec}, {0xdd,0xcb}, {0xdd,0xd2}, {0xdd,0xea}, {0xdd,0xf4}, {0xdd,0xdc}, {0xfa,0xad}, {0xdd,0xcf}, {0xdd,0xe2}, {0xdd,0xe7}, {0xdd,0xd3}, {0x8d,0xbe}, {0xdd,0xe4}, {0xdd,0xd0}, {0x89,0xa4}, {0xdd,0xd7}, {0xdd,0xd8}, {0xb7,0xa8}, {0xdd,0xeb}, {0xdd,0xe9}, {0xdd,0xcc}, {0xdd,0xee}, {0xdd,0xef}, {0xdd,0xf1}, {0xb7,0xac}, {0xb7,0xa4}, {0x9a,0xd9}, {0xd5,0xb8}, {0xdd,0xd4}, {0xdd,0xe6}, {0xdd,0xd5}, {0xb7,0xa1}, {0xb7,0xb1}, {0xdd,0xed}, {0xb7,0xaf}, {0xb7,0xab}, {0xdd,0xca}, {0xb7,0xa3}, {0xfd,0x4e}, {0xdd,0xcd}, {0xb7,0xb0}, {0x8d,0xc0}, {0xdd,0xdd}, {0xdd,0xc9}, {0x97,0xf0}, {0xb7,0xa9}, {0xdd,0xe1}, {0xdd,0xd1}, {0xb7,0xaa}, {0xdd,0xda}, {0xb7,0x7e}, {0xb4,0xd8}, {0xdd,0xe3}, {0xd9,0xbf}, {0xdd,0xce}, {0x93,0xb4}, {0xfd,0x44}, {0xdd,0xe8}, {0xb7,0xa5}, {0xdd,0xe5}, {0xb7,0xa2}, {0xdd,0xdf}, {0xb7,0xad}, {0xdd,0xd6}, {0xdd,0xf3}, {0x9f,0xa7}, {0xb7,0xa7}, {0xde,0xc6}, {0x8d,0xc2}, {0xb7,0xae}, {0x99,0xb6}, {0xe2,0x4a}, {0xe2,0x48}, {0xe2,0x5e}, {0xe2,0x46}, {0xe2,0x58}, {0xb7,0x7d}, {0xba,0x5f}, {0xe2,0x42}, {0xe2,0x5d}, {0xfd,0x52}, {0xe2,0x47}, {0xe2,0x55}, {0xba,0x64}, {0xba,0x5d}, {0xe2,0x5b}, {0x8d,0xc1}, {0xe2,0x40}, {0xe2,0x5a}, {0x8e,0x46}, {0xba,0x6f}, {0xe2,0x51}, {0xe2,0x61}, {0xba,0x6d}, {0xe2,0x49}, {0xba,0x5e}, {0xe2,0x4b}, {0xe2,0x59}, {0xba,0x67}, {0xe2,0x44}, {0xba,0x6b}, {0xba,0x61}, {0xe2,0x4d}, {0xe2,0x43}, {0xe1,0xfc}, {0xa0,0xd1}, {0xe2,0x57}, {0xba,0x68}, {0xe2,0x60}, {0xe1,0xfd}, {0xba,0x65}, {0xe2,0x53}, {0xba,0x66}, {0xe2,0x45}, {0xe2,0x50}, {0xe2,0x4c}, {0xe2,0x4e}, {0x9f,0xca}, {0xba,0x60}, {0xe2,0x5f}, {0xba,0x6e}, {0xe2,0x4f}, {0xe2,0x62}, {0xe1,0xfe}, {0xe2,0x54}, {0xba,0x63}, {0xba,0x6c}, {0xba,0x6a}, {0xe2,0x41}, {0xe2,0x56}, {0xba,0x69}, {0x92,0xcf}, {0xba,0x62}, {0xe2,0x52}, {0x9c,0xf4}, {0x8d,0xc4}, {0xe2,0x5c}, {0xfd,0x41}, {0xe5,0xd5}, {0xe5,0xd1}, {0xe5,0xcd}, {0xe5,0xe1}, {0xe5,0xde}, {0xbc,0xcd}, {0x9b,0x4c}, {0xe5,0xe5}, {0xe5,0xd4}, {0xbc,0xd8}, {0xe5,0xdb}, {0xe5,0xd0}, {0xe5,0xda}, {0xbc,0xd5}, {0xe5,0xee}, {0xe5,0xeb}, {0xe5,0xdd}, {0xe5,0xce}, {0xfd,0x57}, {0xfc,0xef}, {0xe5,0xe2}, {0xe5,0xe4}, {0xbc,0xd1}, {0xe5,0xd8}, {0xe5,0xd3}, {0xe5,0xca}, {0xbc,0xce}, {0xbc,0xd6}, {0x9c,0xde}, {0xe5,0xe7}, {0xbc,0xd7}, {0xe5,0xcb}, {0xe5,0xed}, {0xe5,0xe0}, {0xe5,0xe6}, {0xbc,0xd4}, {0xfd,0x42}, {0x98,0x6c}, {0xe5,0xe3}, {0xe5,0xea}, {0xbc,0xd9}, {0xbc,0xd3}, {0xe5,0xdc}, {0xe5,0xcf}, {0xe5,0xef}, {0xe5,0xcc}, {0xe5,0xe8}, {0xbc,0xd0}, {0x97,0xf9}, {0xe5,0xd6}, {0x95,0x58}, {0xe5,0xd7}, {0xbc,0xcf}, {0xbc,0xcc}, {0xe5,0xd2}, {0xbc,0xd2}, {0xbc,0xcb}, {0xe5,0xe9}, {0xe5,0xec}, {0xe5,0xd9}, {0xe9,0xca}, {0x98,0x5e}, {0xfe,0x7b}, {0x94,0xcd}, {0xe9,0xc2}, {0x93,0xee}, {0xe9,0xbe}, {0xbe,0xf6}, {0xbe,0xeb}, {0xbe,0xf0}, {0xbe,0xec}, {0xe9,0xcc}, {0xe9,0xd7}, {0xbe,0xea}, {0xe9,0xc4}, {0xe9,0xcd}, {0xe5,0xdf}, {0xe9,0xce}, {0x8c,0xa3}, {0xbe,0xf1}, {0xfd,0x5a}, {0xe9,0xdd}, {0xbe,0xf5}, {0xbe,0xf8}, {0xe9,0xc0}, {0xbe,0xf4}, {0x93,0xf5}, {0xe9,0xdb}, {0xe9,0xdc}, {0xe9,0xd2}, {0xe9,0xd1}, {0xe9,0xc9}, {0x93,0xef}, {0x8e,0xea}, {0xe9,0xd3}, {0xe9,0xda}, {0xe9,0xd9}, {0x8f,0x5b}, {0xbe,0xef}, {0xbe,0xed}, {0xe9,0xcb}, {0xe9,0xc8}, {0xe9,0xc5}, {0xe9,0xd8}, {0xbe,0xf7}, {0xe9,0xd6}, {0xbe,0xf3}, {0xbe,0xf2}, {0x8c,0x5e}, {0xe9,0xd0}, {0x8d,0xc6}, {0xe9,0xbf}, {0xe9,0xc1}, {0xe9,0xc3}, {0xe9,0xd5}, {0xe9,0xcf}, {0xbe,0xee}, {0xe9,0xc6}, {0xe9,0xd4}, {0x8d,0xc8}, {0x8d,0xc7}, {0xe9,0xc7}, {0x93,0xf7}, {0xc0,0xcf}, {0xed,0x45}, {0xc0,0xc8}, {0xec,0xf5}, {0x8d,0xc9}, {0xed,0x41}, {0xc0,0xca}, {0xed,0x48}, {0xec,0xfc}, {0xec,0xf7}, {0xfb,0xf2}, {0xed,0x49}, {0xec,0xf3}, {0xec,0xfe}, {0x96,0x70}, {0xc0,0xd1}, {0xed,0x44}, {0xed,0x4a}, {0xec,0xfd}, {0xc0,0xc9}, {0xed,0x40}, {0xec,0xf4}, {0xc0,0xd0}, {0x8d,0xcb}, {0xed,0x47}, {0xec,0xf9}, {0xc0,0xcc}, {0xfd,0x5c}, {0xec,0xfb}, {0xec,0xf8}, {0xc0,0xd2}, {0xec,0xfa}, {0xc0,0xcb}, {0xc0,0xce}, {0xed,0x43}, {0xec,0xf6}, {0xed,0x46}, {0x8f,0x65}, {0xed,0x42}, {0x8d,0xcd}, {0xc2,0x63}, {0xef,0xe7}, {0xc2,0x68}, {0xc2,0x69}, {0x9d,0xa8}, {0x94,0xf9}, {0xc2,0x62}, {0xef,0xe6}, {0x8d,0xce}, {0xef,0xe3}, {0xef,0xe4}, {0xc2,0x66}, {0xef,0xde}, {0xef,0xe2}, {0xc2,0x65}, {0xef,0xdf}, {0x93,0xea}, {0xc2,0x67}, {0xc2,0x64}, {0xef,0xdd}, {0xef,0xe1}, {0xef,0xe5}, {0xfd,0x5f}, {0x93,0xf0}, {0x9f,0xb6}, {0xf2,0x51}, {0xf2,0x4e}, {0xf2,0x57}, {0xf2,0x56}, {0xf2,0x54}, {0xf2,0x4f}, {0xc3,0x72}, {0x8d,0xcf}, {0x97,0x63}, {0xf2,0x50}, {0xc3,0x71}, {0xc0,0xcd}, {0xf2,0x53}, {0xc3,0x70}, {0xf2,0x58}, {0xf2,0x52}, {0xf2,0x4d}, {0xef,0xe0}, {0xc3,0x6f}, {0xf2,0x4c}, {0xf4,0x56}, {0xf4,0x55}, {0xf2,0x55}, {0xc4,0x68}, {0xf4,0x59}, {0xf4,0x5a}, {0xf4,0x54}, {0xf4,0x58}, {0xf4,0x53}, {0x8d,0xd0}, {0xf5,0xd1}, {0xf4,0x57}, {0xc4,0xe7}, {0xc4,0xe5}, {0xf5,0xcf}, {0xf5,0xd2}, {0xf5,0xce}, {0xf5,0xd0}, {0xc4,0xe6}, {0x93,0xf1}, {0xf6,0xe5}, {0xf6,0xe6}, {0xc5,0x76}, {0xf6,0xe4}, {0xf7,0xe2}, {0xc5,0xcf}, {0xf7,0xe0}, {0xf7,0xe1}, {0xf8,0xac}, {0xc6,0x56}, {0xf8,0xf3}, {0xf8,0xf1}, {0xf8,0xf2}, {0xf8,0xf4}, {0xfd,0x62}, {0xf9,0xbb}, {0xa4,0xed}, {0xa6,0xb8}, {0xaa,0x59}, {0xcc,0xe9}, {0xcf,0x64}, {0xd1,0xf5}, {0xd1,0xf7}, {0xd1,0xf6}, {0xd1,0xf8}, {0xb1,0xfd}, {0xd5,0xd7}, {0xd1,0xf9}, {0xfd,0x65}, {0xd5,0xd6}, {0xd5,0xd8}, {0xd5,0xd9}, {0xd9,0xda}, {0xb4,0xdb}, {0xd9,0xdb}, {0xd9,0xdd}, {0xb4,0xdc}, {0xb4,0xda}, {0xd9,0xdc}, {0xdd,0xfa}, {0xdd,0xf8}, {0xdd,0xf7}, {0xdd,0xf6}, {0xdd,0xf5}, {0xb7,0xb2}, {0xdd,0xf9}, {0xba,0x70}, {0xe2,0x63}, {0xe2,0x65}, {0xba,0x71}, {0xe2,0x64}, {0xbc,0xdb}, {0xbc,0xda}, {0xe5,0xf0}, {0x9f,0xdb}, {0xe9,0xdf}, {0xe9,0xde}, {0xe9,0xe0}, {0x93,0xf8}, {0xbe,0xf9}, {0xed,0x4b}, {0xc0,0xd3}, {0xef,0xe8}, {0xc2,0x6a}, {0xf2,0x59}, {0xc5,0x77}, {0xa4,0xee}, {0xa5,0xbf}, {0xa6,0xb9}, {0xa8,0x42}, {0xaa,0x5a}, {0xaa,0x5b}, {0xac,0x6e}, {0xd1,0xfa}, {0x8b,0xf7}, {0xb7,0xb3}, {0xfd,0x66}, {0xe6,0xd1}, {0xbe,0xfa}, {0xc2,0x6b}, {0xa4,0xef}, {0x8b,0xcf}, {0xa6,0xba}, {0xcc,0xeb}, {0xaa,0x5c}, {0xcc,0xea}, {0x8d,0xd1}, {0xcf,0x65}, {0xac,0x6f}, {0xcf,0x66}, {0xac,0x70}, {0xd1,0xfc}, {0xae,0xee}, {0xae,0xed}, {0xd5,0xde}, {0xd5,0xdc}, {0xd5,0xdd}, {0xd5,0xdb}, {0xd5,0xda}, {0xd9,0xde}, {0xd9,0xe1}, {0xb4,0xde}, {0xd9,0xdf}, {0xb4,0xdd}, {0xd9,0xe0}, {0xdd,0xfb}, {0xe2,0x66}, {0xe2,0x67}, {0xe2,0x68}, {0xe5,0xf3}, {0xe5,0xf2}, {0xbc,0xdc}, {0xe5,0xf1}, {0xe5,0xf4}, {0xe9,0xe1}, {0xe9,0xe2}, {0xe9,0xe3}, {0xed,0x4c}, {0xc0,0xd4}, {0xc2,0x6c}, {0xf2,0x5a}, {0xc4,0xe8}, {0xc9,0x5f}, {0xac,0x71}, {0xcf,0x67}, {0xae,0xef}, {0xb1,0xfe}, {0xb4,0xdf}, {0xd9,0xe2}, {0xb7,0xb5}, {0xb7,0xb4}, {0x8d,0xd2}, {0xe2,0x69}, {0xe2,0x6a}, {0xbc,0xdd}, {0xbc,0xde}, {0xe9,0xe5}, {0xe9,0xe4}, {0xef,0xe9}, {0xf7,0xe3}, {0xa4,0xf0}, {0xc9,0x60}, {0xa5,0xc0}, {0xa8,0x43}, {0xcb,0x48}, {0xac,0x72}, {0xb7,0xb6}, {0xa4,0xf1}, {0xcf,0x68}, {0xac,0x73}, {0xcf,0x69}, {0xc0,0xd5}, {0xa4,0xf2}, {0xfd,0x71}, {0xcc,0xec}, {0xcf,0x6a}, {0xfd,0x6f}, {0xd2,0x42}, {0xd2,0x41}, {0xd1,0xfe}, {0xd1,0xfd}, {0xd2,0x43}, {0xd2,0x40}, {0x8d,0xd3}, {0xb2,0x40}, {0xb2,0x41}, {0xb4,0xe0}, {0xd9,0xe3}, {0xd9,0xe4}, {0xd9,0xe5}, {0xde,0x41}, {0xde,0x42}, {0xde,0x40}, {0x9f,0xe7}, {0xdd,0xfd}, {0xdd,0xfe}, {0xb7,0xb7}, {0xe2,0x6b}, {0xe5,0xf7}, {0xe5,0xf6}, {0xe5,0xf5}, {0xe5,0xf8}, {0xe9,0xe7}, {0xe9,0xe6}, {0xbe,0xfb}, {0xe9,0xe8}, {0xc0,0xd6}, {0xed,0x4d}, {0xef,0xea}, {0xf2,0x5b}, {0xf6,0xe7}, {0xa4,0xf3}, {0xa5,0xc2}, {0xa5,0xc1}, {0xaa,0x5d}, {0xc9,0x61}, {0xc9,0x7e}, {0xa6,0xbb}, {0xc9,0xf7}, {0xcb,0x49}, {0xcb,0x4a}, {0xaa,0x5e}, {0x90,0xbd}, {0xcc,0xed}, {0xac,0x74}, {0xcf,0x6b}, {0xcf,0x6c}, {0xae,0xf0}, {0xae,0xf4}, {0xd2,0x44}, {0xae,0xf3}, {0xae,0xf1}, {0xae,0xf2}, {0xd5,0xdf}, {0xb2,0x42}, {0xb4,0xe3}, {0xb4,0xe1}, {0xb4,0xe2}, {0xd9,0xe6}, {0x9f,0xd0}, {0xba,0x72}, {0xa4,0xf4}, {0x8b,0xd0}, {0xc9,0xa1}, {0xfd,0x72}, {0xa5,0xc3}, {0x9c,0xae}, {0x8b,0xd1}, {0xc9,0xa4}, {0x8a,0xdb}, {0xa5,0xc6}, {0xc9,0xa3}, {0xa5,0xc5}, {0xa5,0xc4}, {0xa8,0x44}, {0xc9,0xa2}, {0xc9,0xf8}, {0xfa,0xe4}, {0xc9,0xfc}, {0xc9,0xfe}, {0xca,0x40}, {0xa6,0xc5}, {0xa6,0xc6}, {0xc9,0xfb}, {0xa6,0xc1}, {0xc9,0xf9}, {0xc9,0xfd}, {0xa6,0xc2}, {0xa6,0xbd}, {0x95,0xce}, {0xa6,0xbe}, {0xfd,0x76}, {0xa6,0xc4}, {0xc9,0xfa}, {0xa6,0xbc}, {0xa8,0x45}, {0xa6,0xbf}, {0xa6,0xc0}, {0xa6,0xc3}, {0xcb,0x5b}, {0xcb,0x59}, {0xcb,0x4c}, {0xa8,0x51}, {0xcb,0x53}, {0xa8,0x4c}, {0xcb,0x4d}, {0xcb,0x55}, {0xfb,0x62}, {0xcb,0x52}, {0xa8,0x4f}, {0xcb,0x51}, {0xa8,0x56}, {0xcb,0x5a}, {0xa8,0x58}, {0x8d,0xd4}, {0xa8,0x5a}, {0xcb,0x4b}, {0xfd,0x78}, {0xa8,0x4d}, {0xcb,0x5c}, {0xa8,0x54}, {0xa8,0x57}, {0x8e,0xe3}, {0xcd,0x45}, {0xa8,0x47}, {0xa8,0x5e}, {0xa8,0x55}, {0xcb,0x4e}, {0xa8,0x4a}, {0xa8,0x59}, {0xcb,0x56}, {0xa8,0x48}, {0xa8,0x49}, {0xcd,0x43}, {0xcb,0x4f}, {0xa8,0x50}, {0xa8,0x5b}, {0xcb,0x5d}, {0xcb,0x50}, {0xa8,0x4e}, {0xa8,0x53}, {0xcc,0xee}, {0xa8,0x5c}, {0xcb,0x57}, {0xa8,0x52}, {0xa8,0x5d}, {0xa8,0x46}, {0xcb,0x54}, {0xa8,0x4b}, {0xcb,0x58}, {0xcd,0x44}, {0x90,0x76}, {0x98,0xc6}, {0x8d,0xd5}, {0xaa,0x6a}, {0xaa,0x7a}, {0xcc,0xf5}, {0xaa,0x71}, {0x97,0xd1}, {0xcd,0x4b}, {0xaa,0x62}, {0x9e,0xb6}, {0xaa,0x65}, {0xcd,0x42}, {0xcc,0xf3}, {0xcc,0xf7}, {0xaa,0x6d}, {0xaa,0x6f}, {0xcc,0xfa}, {0xaa,0x76}, {0xaa,0x68}, {0xaa,0x66}, {0xaa,0x67}, {0xaa,0x75}, {0xcd,0x47}, {0xaa,0x70}, {0xcc,0xf9}, {0xcc,0xfb}, {0xaa,0x6e}, {0xaa,0x73}, {0xcc,0xfc}, {0xcd,0x4a}, {0xac,0x75}, {0xaa,0x79}, {0xfa,0xc7}, {0xaa,0x63}, {0xcd,0x49}, {0xa0,0x42}, {0xcd,0x4d}, {0xcc,0xf8}, {0xcd,0x4f}, {0xcd,0x40}, {0xaa,0x6c}, {0xcc,0xf4}, {0xaa,0x6b}, {0xaa,0x7d}, {0xaa,0x72}, {0xcc,0xf2}, {0xcf,0x75}, {0xaa,0x78}, {0xaa,0x7c}, {0xcd,0x41}, {0xcd,0x46}, {0x98,0x73}, {0xaa,0x7e}, {0xaa,0x77}, {0xaa,0x69}, {0xaa,0x5f}, {0xaa,0x64}, {0xcc,0xf6}, {0xaa,0x60}, {0xcd,0x4e}, {0x9f,0xfc}, {0xcc,0xf0}, {0xcc,0xef}, {0xcc,0xfd}, {0xcc,0xf1}, {0xaa,0x7b}, {0xae,0xf5}, {0xaa,0x74}, {0xcc,0xfe}, {0xaa,0x61}, {0xac,0xa6}, {0xcd,0x4c}, {0x8c,0xa5}, {0xcf,0x7c}, {0xcf,0xa1}, {0x8d,0xd7}, {0xcf,0xa4}, {0xcf,0x77}, {0x92,0xfb}, {0x8d,0xd8}, {0xcf,0xa7}, {0xcf,0xaa}, {0xcf,0xac}, {0xcf,0x74}, {0xac,0x76}, {0xac,0x7b}, {0xd2,0x49}, {0xac,0xad}, {0xcf,0xa5}, {0xcf,0xad}, {0xcf,0x7b}, {0xcf,0x73}, {0xd2,0x64}, {0xac,0x7e}, {0xcf,0xa2}, {0xcf,0x78}, {0xcf,0x7a}, {0xac,0xa5}, {0xcf,0x7d}, {0xac,0x7d}, {0xcf,0x70}, {0xcf,0xa8}, {0xcf,0xab}, {0x94,0x4f}, {0xac,0x7a}, {0x8d,0xd9}, {0xac,0xa8}, {0xcf,0x6d}, {0xac,0xaa}, {0xac,0x78}, {0xac,0xae}, {0xcf,0xa9}, {0xcf,0x6f}, {0xac,0xab}, {0xd2,0x5e}, {0xcd,0x48}, {0xac,0x7c}, {0xac,0x77}, {0xcf,0x76}, {0xcf,0x6e}, {0xac,0xac}, {0xac,0xa4}, {0xcf,0xa3}, {0xac,0xa9}, {0xac,0xa7}, {0xcf,0x79}, {0xac,0xa1}, {0xcf,0x71}, {0xac,0xa2}, {0xac,0xa3}, {0xcf,0x72}, {0xcf,0xa6}, {0xac,0x79}, {0xcf,0x7e}, {0x89,0x6b}, {0x97,0xce}, {0xd2,0x4c}, {0xae,0xfd}, {0xaf,0x43}, {0xfa,0xf3}, {0xfd,0xae}, {0xd2,0x55}, {0xd2,0x5b}, {0xd2,0x57}, {0xd2,0x4a}, {0xd2,0x4d}, {0xd2,0x46}, {0xd2,0x47}, {0xaf,0x4a}, {0xae,0xfa}, {0xd2,0x56}, {0xd2,0x5f}, {0xaf,0x45}, {0xae,0xf6}, {0xaf,0x40}, {0xd2,0x4e}, {0xaf,0x42}, {0xd2,0x4f}, {0xd2,0x59}, {0xfb,0xaf}, {0x92,0xb7}, {0xaf,0x44}, {0xd2,0x68}, {0xd2,0x48}, {0xae,0xfc}, {0xae,0xfb}, {0xaf,0x48}, {0xd2,0x45}, {0xd2,0x66}, {0xd2,0x5a}, {0xd2,0x67}, {0xd2,0x61}, {0xd2,0x53}, {0xd2,0x62}, {0x8d,0xda}, {0xd2,0x5c}, {0xd2,0x65}, {0xd2,0x63}, {0xaf,0x49}, {0xd2,0x54}, {0xae,0xf9}, {0xae,0xf8}, {0xaf,0x41}, {0xaf,0x47}, {0xd2,0x60}, {0xaf,0x46}, {0xd2,0x51}, {0xb2,0x43}, {0x9c,0x5a}, {0xd2,0x69}, {0xd2,0x50}, {0xd2,0x4b}, {0xae,0xfe}, {0xaf,0x4b}, {0xae,0xf7}, {0xfd,0xad}, {0xd2,0x58}, {0xd2,0x5d}, {0x8d,0xdc}, {0x94,0x44}, {0xb2,0x65}, {0xd5,0xe1}, {0xd5,0xe5}, {0xb2,0x52}, {0xb2,0x50}, {0x8d,0xdd}, {0xb2,0x47}, {0xd5,0xe3}, {0xd5,0xe2}, {0xb2,0x5b}, {0xd5,0xe8}, {0xb2,0x55}, {0xa0,0xd6}, {0xd5,0xfa}, {0xd6,0x47}, {0xb2,0x44}, {0xd5,0xf7}, {0xd5,0xf0}, {0xb2,0x67}, {0xd5,0xe0}, {0xd5,0xfc}, {0xb2,0x64}, {0xb2,0x58}, {0xb2,0x63}, {0xb2,0x4e}, {0xd5,0xec}, {0xd5,0xfe}, {0xd5,0xf6}, {0xb2,0x4f}, {0xb2,0x49}, {0xd6,0x45}, {0xd5,0xfd}, {0xd6,0x40}, {0xb2,0x51}, {0xb2,0x59}, {0xd6,0x42}, {0xd5,0xea}, {0xd5,0xfb}, {0xd5,0xef}, {0xd6,0x44}, {0xb2,0x5e}, {0xb2,0x46}, {0xb2,0x5c}, {0xd5,0xf4}, {0xd5,0xf2}, {0xd5,0xf3}, {0xb2,0x53}, {0xd5,0xee}, {0xd5,0xed}, {0xb2,0x48}, {0xd5,0xe7}, {0xd6,0x46}, {0xb2,0x4a}, {0xd5,0xf1}, {0xb2,0x68}, {0xb2,0x62}, {0xd5,0xe6}, {0xb2,0x5f}, {0xb2,0x5d}, {0xb2,0x66}, {0xd5,0xf8}, {0xb2,0x61}, {0xd2,0x52}, {0xd5,0xf9}, {0xb2,0x60}, {0xd6,0x41}, {0xb2,0x45}, {0xd5,0xf5}, {0xb2,0x57}, {0xd5,0xe9}, {0xb2,0x56}, {0xb2,0x54}, {0xb2,0x4c}, {0xb2,0x4b}, {0xd9,0xe7}, {0xd6,0x43}, {0x8c,0x41}, {0xd5,0xeb}, {0x97,0xd5}, {0xd9,0xfc}, {0x94,0x4a}, {0xb2,0x4d}, {0x94,0x4d}, {0x97,0xcb}, {0x8d,0xde}, {0x8d,0xdf}, {0xb5,0x41}, {0xb2,0x5a}, {0xb4,0xee}, {0xd9,0xf6}, {0xb4,0xfc}, {0xd9,0xea}, {0xb4,0xeb}, {0xb4,0xe7}, {0xda,0x49}, {0xb4,0xed}, {0xb4,0xf1}, {0xb4,0xec}, {0xb4,0xf5}, {0xda,0x4d}, {0xda,0x44}, {0x8d,0xe0}, {0xfe,0xf9}, {0xd9,0xf1}, {0xb4,0xfa}, {0xb4,0xf4}, {0xd9,0xfd}, {0xb4,0xe4}, {0xda,0x4a}, {0xda,0x43}, {0xb4,0xe8}, {0xd9,0xf7}, {0xb4,0xf7}, {0xda,0x55}, {0xda,0x56}, {0xb4,0xe5}, {0xda,0x48}, {0xb4,0xf9}, {0xd9,0xfb}, {0xd9,0xed}, {0xd9,0xee}, {0xb4,0xfd}, {0xd9,0xf2}, {0xd9,0xf9}, {0xd9,0xf3}, {0xb4,0xfb}, {0xb5,0x44}, {0xd9,0xef}, {0xd9,0xe8}, {0xd9,0xe9}, {0xd9,0xeb}, {0xb4,0xea}, {0xd9,0xf8}, {0xb4,0xf8}, {0xb5,0x42}, {0xfd,0xc0}, {0xfc,0xf9}, {0xd9,0xfa}, {0xda,0x53}, {0xda,0x4b}, {0xb4,0xe6}, {0xda,0x51}, {0xb4,0xf2}, {0xb4,0xf0}, {0xfb,0x7e}, {0xda,0x57}, {0xb4,0xef}, {0xda,0x41}, {0xd9,0xf4}, {0xd9,0xfe}, {0xb5,0x47}, {0xda,0x45}, {0xda,0x42}, {0xd9,0xf0}, {0xb5,0x43}, {0xda,0x4f}, {0xda,0x4c}, {0xda,0x54}, {0xb4,0xe9}, {0xda,0x40}, {0xb5,0x46}, {0xda,0x47}, {0xb4,0xf3}, {0xb4,0xf6}, {0xda,0x46}, {0xb5,0x45}, {0xd9,0xf5}, {0xd5,0xe4}, {0x92,0xb3}, {0xda,0x50}, {0xda,0x4e}, {0xda,0x52}, {0xfd,0xaf}, {0x8d,0xe1}, {0xd9,0xec}, {0xb5,0x40}, {0x95,0xd3}, {0xde,0x61}, {0xde,0x60}, {0xde,0x46}, {0xb7,0xbd}, {0xde,0x5f}, {0xde,0x49}, {0xde,0x4a}, {0xb7,0xc7}, {0xde,0x68}, {0xb7,0xc2}, {0xde,0x5e}, {0x89,0xc1}, {0xde,0x43}, {0xb7,0xc8}, {0xb7,0xbe}, {0xde,0x52}, {0xde,0x48}, {0xde,0x4b}, {0xde,0x63}, {0xb7,0xb8}, {0xde,0x6a}, {0xde,0x62}, {0xb7,0xc1}, {0xde,0x57}, {0xb7,0xcc}, {0xb7,0xcb}, {0xb7,0xc5}, {0xde,0x69}, {0xb7,0xb9}, {0xde,0x55}, {0xde,0x4c}, {0xde,0x59}, {0xde,0x65}, {0xb7,0xcd}, {0xfd,0x68}, {0xb7,0xbb}, {0xde,0x54}, {0x9c,0xb7}, {0xde,0x4d}, {0xb7,0xc4}, {0x8d,0xe3}, {0xb7,0xc3}, {0xde,0x50}, {0xde,0x5a}, {0xde,0x64}, {0xde,0x47}, {0xde,0x51}, {0xb7,0xbc}, {0xde,0x5b}, {0xb7,0xc9}, {0xb7,0xc0}, {0xde,0x4e}, {0xb7,0xbf}, {0xde,0x45}, {0xde,0x53}, {0xde,0x67}, {0xb4,0xfe}, {0xba,0xb0}, {0xde,0x56}, {0xe2,0x6c}, {0xde,0x58}, {0xde,0x66}, {0xb7,0xc6}, {0xde,0x4f}, {0xb7,0xba}, {0xb7,0xca}, {0xbc,0xf0}, {0xde,0x44}, {0xde,0x5d}, {0xfa,0xc0}, {0x8d,0xe5}, {0xfa,0x64}, {0xde,0x5c}, {0x89,0x47}, {0x8d,0xe4}, {0x8d,0xe7}, {0x8d,0xe8}, {0xe2,0xaa}, {0xba,0xad}, {0xe2,0x7d}, {0xe2,0xa4}, {0xba,0xa2}, {0xe2,0x6e}, {0xba,0xaf}, {0xba,0x77}, {0xe2,0x6d}, {0xe2,0xb0}, {0xba,0xb1}, {0xe2,0x71}, {0xe2,0xa3}, {0xfd,0xc7}, {0xe2,0x73}, {0xe2,0xb3}, {0xe2,0xaf}, {0xba,0x75}, {0xba,0xa1}, {0xe6,0x53}, {0xba,0xae}, {0xba,0x7d}, {0xe2,0x6f}, {0xfd,0xb0}, {0xe2,0xae}, {0xba,0xa3}, {0xe2,0xab}, {0xe2,0xb8}, {0xe2,0x75}, {0xe2,0x7e}, {0x94,0x45}, {0x97,0xd6}, {0xe2,0xb6}, {0xe2,0xac}, {0xba,0x7c}, {0xe2,0x7c}, {0xba,0x76}, {0xba,0x74}, {0xba,0xa8}, {0xfc,0xc6}, {0x98,0x44}, {0xe2,0x7a}, {0xe2,0x77}, {0xe2,0x78}, {0xe2,0xb2}, {0xe2,0xb7}, {0xe2,0xb5}, {0xba,0x7a}, {0xe2,0xb9}, {0xba,0x7e}, {0xba,0xa7}, {0x8d,0xe9}, {0xe2,0x70}, {0xe5,0xfa}, {0xe2,0x79}, {0xba,0x78}, {0xba,0xac}, {0xba,0xa9}, {0xba,0x7b}, {0xe2,0xa5}, {0xe2,0x74}, {0xba,0xaa}, {0xe2,0xa7}, {0xba,0xa4}, {0xba,0xa6}, {0xba,0x73}, {0x8d,0xea}, {0xe2,0xa9}, {0xe2,0xa1}, {0xe2,0x72}, {0xba,0xa5}, {0xe2,0xb1}, {0xe2,0xb4}, {0xe2,0x7b}, {0xe2,0xa8}, {0xfe,0x50}, {0xba,0x79}, {0xbc,0xdf}, {0xe2,0xa6}, {0xe5,0xf9}, {0xe2,0xad}, {0xfd,0xcc}, {0xe2,0x76}, {0xe6,0x44}, {0xe6,0x4e}, {0xbc,0xe2}, {0xe6,0x4d}, {0xe6,0x59}, {0xbc,0xe4}, {0xe6,0x4b}, {0x9d,0xa7}, {0xe6,0x4f}, {0xbc,0xef}, {0xe6,0x46}, {0xbc,0xe7}, {0xfd,0xcd}, {0xe6,0x52}, {0xe9,0xf0}, {0xbc,0xf3}, {0xbc,0xf2}, {0xe6,0x54}, {0xe6,0x43}, {0xe6,0x5e}, {0xbc,0xed}, {0xbc,0xe3}, {0xe6,0x57}, {0xe6,0x5b}, {0xe6,0x60}, {0xe6,0x55}, {0xe6,0x49}, {0xbc,0xe6}, {0xbc,0xe9}, {0xbc,0xf1}, {0xbc,0xec}, {0xe6,0x4c}, {0xe2,0xa2}, {0xfd,0xcf}, {0xe6,0x48}, {0xe6,0x5f}, {0xbc,0xe8}, {0x95,0xd2}, {0xbc,0xeb}, {0xe6,0x61}, {0xbc,0xe0}, {0xe6,0x56}, {0xe5,0xfb}, {0xe6,0x5c}, {0xc0,0xdf}, {0x8d,0xed}, {0xe6,0x4a}, {0xbc,0xe1}, {0xe6,0x45}, {0xbc,0xe5}, {0xe5,0xfc}, {0xba,0xab}, {0xe6,0x41}, {0xfc,0xba}, {0xe6,0x5a}, {0xe6,0x42}, {0xe6,0x40}, {0xbc,0xea}, {0xe6,0x58}, {0xe5,0xfe}, {0xe6,0x51}, {0xe6,0x50}, {0xe6,0x5d}, {0xe6,0x47}, {0xbc,0xee}, {0xfd,0xc5}, {0xe9,0xf3}, {0xfd,0xd2}, {0xbf,0x49}, {0xbe,0xfe}, {0xea,0x40}, {0xe9,0xeb}, {0xbf,0x41}, {0xe9,0xf7}, {0xbf,0x48}, {0xbf,0x43}, {0xe9,0xf5}, {0xed,0x4f}, {0xe9,0xfb}, {0xea,0x42}, {0xe9,0xfa}, {0xe9,0xe9}, {0xe9,0xf8}, {0xea,0x44}, {0xea,0x46}, {0xbe,0xfd}, {0xea,0x45}, {0xbf,0x44}, {0xbf,0x4a}, {0x9c,0xdc}, {0xbf,0x47}, {0xe9,0xfe}, {0xbf,0x46}, {0xe9,0xf9}, {0x95,0xcf}, {0xe9,0xed}, {0xe9,0xf2}, {0x8d,0xee}, {0xe9,0xfd}, {0xbf,0x45}, {0xbf,0x42}, {0xbe,0xfc}, {0xbf,0x40}, {0xe9,0xf1}, {0xe5,0xfd}, {0xe9,0xec}, {0xe9,0xef}, {0xea,0x41}, {0xe9,0xf4}, {0xe9,0xea}, {0xed,0x4e}, {0xea,0x43}, {0xe9,0xee}, {0xe9,0xfc}, {0xfd,0xd4}, {0xed,0x51}, {0xc0,0xe3}, {0xc0,0xd7}, {0x96,0xec}, {0x96,0xeb}, {0xc0,0xdb}, {0xed,0x53}, {0xed,0x59}, {0xed,0x57}, {0xc0,0xd9}, {0xc0,0xda}, {0xc0,0xe1}, {0xed,0x5a}, {0xed,0x52}, {0xc0,0xdc}, {0xed,0x56}, {0xed,0x55}, {0xed,0x5b}, {0xc0,0xe2}, {0xc0,0xdd}, {0xc0,0xe0}, {0xed,0x54}, {0xc0,0xe4}, {0xc0,0xde}, {0xc0,0xe5}, {0xc0,0xd8}, {0xed,0x58}, {0xed,0x50}, {0x90,0xb6}, {0xef,0xf7}, {0xfd,0xc3}, {0xc2,0x71}, {0xef,0xf4}, {0xef,0xf6}, {0xc2,0x6f}, {0xef,0xf2}, {0xef,0xf3}, {0xef,0xee}, {0x98,0xab}, {0xe9,0xf6}, {0xef,0xef}, {0xc2,0x70}, {0xef,0xeb}, {0xc2,0x6d}, {0xef,0xf8}, {0xc2,0x6e}, {0xef,0xec}, {0xef,0xed}, {0xef,0xf1}, {0xc2,0x73}, {0xc2,0x72}, {0xef,0xf0}, {0xc3,0x78}, {0xf2,0x5f}, {0xf2,0x65}, {0xc3,0x79}, {0xf2,0x5c}, {0xc3,0x76}, {0xc3,0x73}, {0xf2,0x67}, {0xc3,0x77}, {0x96,0xee}, {0xc3,0x74}, {0xf2,0x5e}, {0xf2,0x61}, {0xf2,0x62}, {0xf2,0x63}, {0xf2,0x66}, {0xef,0xf5}, {0xf2,0x5d}, {0xc3,0x75}, {0xf2,0x64}, {0xf2,0x68}, {0xf2,0x60}, {0x8d,0xf4}, {0xf4,0x5d}, {0xc4,0x6a}, {0xf4,0x60}, {0xc4,0x6b}, {0xf4,0x68}, {0xf4,0x5f}, {0xf4,0x5c}, {0xf4,0x5e}, {0xf4,0x62}, {0xf4,0x65}, {0xf4,0x64}, {0xf4,0x67}, {0xf4,0x5b}, {0xc4,0x69}, {0xf4,0x63}, {0xf4,0x66}, {0xf4,0x69}, {0xf4,0x61}, {0xf5,0xd3}, {0xf5,0xd4}, {0xf5,0xd8}, {0xf5,0xd9}, {0xf5,0xd6}, {0xf5,0xd7}, {0xf5,0xd5}, {0xfd,0xe0}, {0xc4,0xe9}, {0x8c,0x67}, {0x8d,0xf6}, {0xc5,0x78}, {0xf6,0xeb}, {0x8d,0xf7}, {0xf6,0xe8}, {0xf6,0xe9}, {0xf6,0xea}, {0xc5,0x79}, {0xf7,0xe5}, {0xf7,0xe4}, {0x8f,0xfa}, {0xf8,0xaf}, {0xc5,0xf4}, {0xf8,0xad}, {0xf8,0xb0}, {0xf8,0xae}, {0xf8,0xf5}, {0xc6,0x57}, {0xc6,0x65}, {0xf9,0xa3}, {0xf9,0x6c}, {0x97,0xd0}, {0xf9,0xa2}, {0xf9,0xd0}, {0xf9,0xd1}, {0xa4,0xf5}, {0x8b,0xd2}, {0x8d,0xf8}, {0xa6,0xc7}, {0xca,0x41}, {0xcb,0x5e}, {0x90,0xd9}, {0xa8,0x5f}, {0x8c,0x47}, {0xa8,0x62}, {0xfa,0xf0}, {0xcb,0x5f}, {0xa8,0x60}, {0xa8,0x61}, {0xfd,0xe1}, {0x8d,0xf9}, {0xfd,0xe3}, {0xcd,0x58}, {0xcd,0x5a}, {0xcd,0x55}, {0xcd,0x52}, {0xcd,0x54}, {0x8d,0xfa}, {0xaa,0xa4}, {0xfb,0x63}, {0xaa,0xa2}, {0x90,0xa6}, {0xcd,0x56}, {0xaa,0xa3}, {0xcd,0x53}, {0xcd,0x50}, {0xaa,0xa1}, {0xcd,0x57}, {0xcd,0x51}, {0xaa,0xa5}, {0xcd,0x59}, {0xcf,0xaf}, {0x99,0x70}, {0xcf,0xb3}, {0x91,0xeb}, {0xac,0xb7}, {0x97,0x70}, {0x98,0x6f}, {0xfd,0xe2}, {0xcf,0xb6}, {0xac,0xaf}, {0xac,0xb2}, {0xac,0xb4}, {0xac,0xb6}, {0xac,0xb3}, {0xcf,0xb2}, {0xcf,0xb1}, {0xac,0xb1}, {0xcf,0xb4}, {0xcf,0xb5}, {0xcf,0xae}, {0xac,0xb5}, {0x98,0xf2}, {0xac,0xb0}, {0x9a,0xfc}, {0x89,0x6c}, {0xfd,0xfd}, {0xcf,0xb0}, {0x99,0x5e}, {0x95,0xbd}, {0xd2,0x77}, {0xd2,0x78}, {0xd2,0x79}, {0xaf,0x50}, {0xaf,0x4c}, {0xd2,0x6e}, {0xfd,0xe4}, {0xd2,0x76}, {0xd2,0x7b}, {0xaf,0x51}, {0x91,0xe6}, {0xd2,0x6c}, {0xd2,0x72}, {0xd2,0x6b}, {0xd2,0x75}, {0xfd,0xe5}, {0xfd,0xe6}, {0xd2,0x71}, {0xaf,0x4d}, {0xaf,0x4f}, {0xd2,0x7a}, {0xd2,0x6a}, {0xd2,0x6d}, {0xd2,0x73}, {0xfd,0xe7}, {0xd2,0x74}, {0xd2,0x7c}, {0xd2,0x70}, {0xaf,0x4e}, {0xb2,0x6d}, {0xd6,0x4e}, {0x94,0x54}, {0xd6,0x50}, {0xd6,0x4c}, {0x99,0xb8}, {0xd6,0x58}, {0xd6,0x4a}, {0xd6,0x57}, {0xb2,0x69}, {0xd6,0x48}, {0xda,0x5b}, {0xd6,0x52}, {0xb2,0x6c}, {0x97,0xe9}, {0xd6,0x53}, {0xd6,0x56}, {0xd6,0x5a}, {0xd6,0x4f}, {0x93,0x46}, {0xd6,0x54}, {0xb2,0x6a}, {0xb2,0x6b}, {0xd6,0x59}, {0xd6,0x4d}, {0xd6,0x49}, {0xd6,0x5b}, {0xd6,0x51}, {0xd6,0x55}, {0xd6,0x4b}, {0xb5,0x48}, {0xb5,0x49}, {0xda,0x65}, {0xb5,0x4f}, {0x98,0x63}, {0xda,0x59}, {0xda,0x62}, {0xda,0x58}, {0xb5,0x4c}, {0xda,0x60}, {0xda,0x5e}, {0xda,0x5f}, {0xb5,0x4a}, {0xda,0x63}, {0x95,0xbc}, {0xfd,0xed}, {0xfd,0xf7}, {0xda,0x5c}, {0xda,0x5a}, {0xb5,0x4b}, {0xda,0x5d}, {0xda,0x61}, {0x98,0x70}, {0x96,0xf6}, {0x8e,0xa9}, {0xb5,0x4d}, {0xda,0x64}, {0x94,0x51}, {0x8e,0x43}, {0x8b,0x5a}, {0xde,0x70}, {0xde,0x77}, {0xde,0x79}, {0xde,0xa1}, {0xfd,0xee}, {0xb7,0xda}, {0xde,0x6b}, {0xb7,0xd2}, {0xfd,0xf0}, {0xde,0x7a}, {0xb7,0xd7}, {0xde,0xa2}, {0xb7,0xce}, {0xfd,0xf4}, {0xde,0x7d}, {0x9b,0xf5}, {0xde,0x6d}, {0xde,0x7e}, {0xde,0x6c}, {0xb7,0xdc}, {0xde,0x78}, {0xb7,0xcf}, {0xde,0xa3}, {0xb7,0xd4}, {0xde,0x71}, {0xb7,0xd9}, {0xde,0x7c}, {0xde,0x6f}, {0xde,0x76}, {0xde,0x72}, {0xde,0x6e}, {0xb7,0xd1}, {0xb7,0xd8}, {0xb7,0xd6}, {0xb7,0xd3}, {0xb7,0xdb}, {0xb7,0xd0}, {0xde,0x75}, {0x97,0x7e}, {0xb7,0xd5}, {0xb5,0x4e}, {0xde,0x7b}, {0x9b,0xd5}, {0xde,0x73}, {0x9a,0xc3}, {0x97,0xc8}, {0xa0,0xdb}, {0x91,0xd0}, {0xde,0x74}, {0x9f,0xe4}, {0xe2,0xc1}, {0x8f,0xdd}, {0xba,0xb4}, {0x91,0xe9}, {0xe2,0xbd}, {0xe2,0xc3}, {0xe2,0xbf}, {0xba,0xb6}, {0xe2,0xbe}, {0xe2,0xc2}, {0xe2,0xba}, {0x98,0xe0}, {0xe2,0xbc}, {0xba,0xb5}, {0x92,0xca}, {0x98,0x57}, {0xe2,0xc0}, {0xe2,0xbb}, {0x8c,0x51}, {0xba,0xb7}, {0xba,0xb2}, {0xfd,0xeb}, {0xe2,0xc4}, {0x9b,0x49}, {0xba,0xb3}, {0xe6,0x67}, {0xe6,0x64}, {0xe6,0x70}, {0xe6,0x6a}, {0xe6,0x6c}, {0xbc,0xf4}, {0xe6,0x66}, {0xe6,0x6e}, {0x9d,0x76}, {0x9e,0xaf}, {0xe6,0x6d}, {0xe6,0x6b}, {0xe6,0x71}, {0xbc,0xf7}, {0xe6,0x68}, {0xe6,0x6f}, {0xbc,0xf5}, {0x9c,0xcc}, {0xe6,0x63}, {0xe6,0x65}, {0xbc,0xf6}, {0xe6,0x62}, {0xe6,0x72}, {0xfd,0xea}, {0xe6,0x69}, {0x8d,0xf1}, {0xea,0x4a}, {0xbf,0x51}, {0xfd,0xfb}, {0xea,0x55}, {0xea,0x53}, {0xbf,0x4b}, {0xea,0x49}, {0xea,0x4c}, {0xea,0x4d}, {0xea,0x48}, {0xbf,0x55}, {0xbf,0x56}, {0xea,0x47}, {0xea,0x56}, {0xea,0x51}, {0xbf,0x4f}, {0xbf,0x4c}, {0xea,0x50}, {0xea,0x4e}, {0xbf,0x52}, {0xea,0x52}, {0xbf,0x4d}, {0x8e,0x53}, {0xbf,0x4e}, {0xea,0x4f}, {0xbf,0x50}, {0xea,0x4b}, {0xea,0x54}, {0xbf,0x53}, {0xea,0x57}, {0xea,0x58}, {0xbf,0x54}, {0xfa,0xcf}, {0xc0,0xe7}, {0xc0,0xee}, {0xed,0x5c}, {0xed,0x62}, {0xed,0x60}, {0xc0,0xea}, {0xc0,0xe9}, {0xc0,0xe6}, {0xed,0x5e}, {0x96,0xf9}, {0xc0,0xec}, {0xc0,0xeb}, {0xc0,0xe8}, {0xed,0x61}, {0xed,0x5d}, {0xed,0x5f}, {0xc0,0xed}, {0x98,0xbf}, {0x9e,0x49}, {0xc2,0x77}, {0xef,0xfb}, {0xc2,0x74}, {0xc2,0x75}, {0xef,0xfd}, {0xc2,0x76}, {0xef,0xfa}, {0x8c,0xa7}, {0xef,0xf9}, {0xf2,0x6c}, {0xef,0xfc}, {0xf2,0x6d}, {0xc3,0x7a}, {0xf2,0x6b}, {0x9b,0xca}, {0xf2,0x6a}, {0xf2,0x69}, {0xc3,0x7b}, {0xfd,0xfe}, {0x92,0xdc}, {0xc4,0x6c}, {0xf4,0x6a}, {0xf4,0x6b}, {0xfe,0x41}, {0x91,0xcc}, {0x91,0xe2}, {0xf5,0xdc}, {0xf5,0xdb}, {0xc4,0xea}, {0xf5,0xda}, {0xf6,0xec}, {0xf6,0xed}, {0xf7,0xe6}, {0xf8,0xb1}, {0xfe,0x44}, {0xf8,0xf6}, {0xf9,0xbc}, {0xc6,0x79}, {0xf9,0xc6}, {0xa4,0xf6}, {0x8b,0xd3}, {0xaa,0xa6}, {0xaa,0xa7}, {0xfe,0x47}, {0xac,0xb8}, {0xc0,0xef}, {0xa4,0xf7}, {0xaa,0xa8}, {0xaf,0x52}, {0xb7,0xdd}, {0xa4,0xf8}, {0xb2,0x6e}, {0xba,0xb8}, {0xc9,0x62}, {0xfe,0x48}, {0xcf,0xb7}, {0xd2,0x7d}, {0xe2,0xc5}, {0xc0,0xf0}, {0xa4,0xf9}, {0xaa,0xa9}, {0xcf,0xb8}, {0xcf,0xb9}, {0xda,0x66}, {0xb5,0x50}, {0xde,0xa4}, {0x94,0x55}, {0xb7,0xde}, {0xe2,0xc6}, {0xfe,0x4b}, {0xbc,0xf8}, {0xfe,0x4c}, {0xc3,0x7c}, {0xa4,0xfa}, {0xda,0x67}, {0xa4,0xfb}, {0x8d,0xbf}, {0xa6,0xc9}, {0xca,0x42}, {0xa6,0xc8}, {0xa8,0x65}, {0xa8,0x64}, {0xa8,0x63}, {0xcb,0x60}, {0x9e,0x78}, {0xaa,0xaa}, {0xaa,0xab}, {0xcd,0x5b}, {0xcf,0xba}, {0xcf,0xbd}, {0xac,0xba}, {0xcf,0xbb}, {0xac,0xb9}, {0xcf,0xbc}, {0xac,0xbb}, {0xd2,0xa2}, {0xd2,0xa1}, {0xd2,0x7e}, {0xaf,0x53}, {0xd6,0x5d}, {0xd6,0x5e}, {0xb2,0x6f}, {0xd6,0x5c}, {0xd6,0x5f}, {0xb5,0x52}, {0xb2,0x70}, {0xfe,0x51}, {0xb5,0x51}, {0xda,0x6b}, {0xda,0x6a}, {0x94,0x56}, {0xda,0x68}, {0xda,0x69}, {0xda,0x6c}, {0xde,0xa6}, {0xde,0xa5}, {0xde,0xa9}, {0x9d,0x61}, {0xde,0xa8}, {0xde,0xa7}, {0xba,0xb9}, {0xe2,0xc9}, {0x94,0x57}, {0xe2,0xc8}, {0xba,0xba}, {0xe2,0xc7}, {0xe6,0x73}, {0xe6,0x74}, {0xbc,0xf9}, {0xea,0x59}, {0xea,0x5a}, {0x99,0x66}, {0xf2,0x72}, {0xc3,0x7d}, {0xf2,0x71}, {0xf2,0x70}, {0xf2,0x6e}, {0xf2,0x6f}, {0xc4,0xeb}, {0xf4,0x6c}, {0xf6,0xee}, {0xf8,0xf7}, {0xa4,0xfc}, {0x8b,0xd5}, {0xc9,0xa5}, {0xa5,0xc7}, {0xc9,0xa6}, {0xa0,0x69}, {0xca,0x43}, {0xca,0x44}, {0xcb,0x66}, {0xcb,0x62}, {0xcb,0x61}, {0xaa,0xac}, {0xcb,0x65}, {0xa8,0x67}, {0xcb,0x63}, {0xa8,0x66}, {0xcb,0x67}, {0xcb,0x64}, {0xcd,0x5f}, {0xcf,0xbe}, {0xcd,0x5d}, {0xcd,0x64}, {0x98,0xb4}, {0xaa,0xad}, {0xaa,0xb0}, {0xcd,0x65}, {0xcd,0x61}, {0xcd,0x62}, {0xcd,0x5c}, {0xaa,0xaf}, {0xcd,0x5e}, {0xaa,0xae}, {0xcd,0x63}, {0xcd,0x60}, {0xcf,0xc2}, {0xac,0xbd}, {0xac,0xbe}, {0xa0,0x49}, {0xcf,0xc5}, {0xcf,0xbf}, {0xcf,0xc4}, {0xcf,0xc0}, {0xac,0xbc}, {0xcf,0xc3}, {0xcf,0xc1}, {0xd2,0xa8}, {0xd2,0xa5}, {0xd2,0xa7}, {0xaf,0x58}, {0xaf,0x57}, {0xaf,0x55}, {0xd2,0xa4}, {0xd2,0xa9}, {0xaf,0x54}, {0xaf,0x56}, {0xd2,0xa6}, {0xd6,0x67}, {0xd2,0xa3}, {0xd2,0xaa}, {0xa0,0x4c}, {0x9e,0x65}, {0xd6,0x62}, {0xd6,0x66}, {0xd6,0x65}, {0xda,0x6e}, {0xda,0x79}, {0xd6,0x68}, {0x98,0xb5}, {0xd6,0x63}, {0xda,0x6d}, {0xb2,0x74}, {0xb2,0x73}, {0xd6,0x61}, {0xd6,0x64}, {0xb2,0x75}, {0xb2,0x72}, {0xb2,0x71}, {0xd6,0x60}, {0xd6,0x69}, {0xda,0x70}, {0xda,0x77}, {0xb5,0x54}, {0xda,0x76}, {0xda,0x73}, {0xfe,0x58}, {0xb5,0x56}, {0x99,0x75}, {0xfe,0x53}, {0xa0,0x65}, {0xda,0x75}, {0xfe,0x59}, {0xda,0x6f}, {0xda,0x71}, {0xda,0x74}, {0xda,0x72}, {0xb5,0x55}, {0xda,0x78}, {0xb5,0x53}, {0xb7,0xdf}, {0x98,0xb7}, {0x98,0xb8}, {0xde,0xad}, {0xde,0xac}, {0xde,0xaa}, {0xb7,0xe2}, {0xb7,0xe1}, {0xde,0xae}, {0x98,0xba}, {0xde,0xab}, {0xe2,0xca}, {0xba,0xbb}, {0xb7,0xe0}, {0x98,0xbb}, {0xde,0xb0}, {0xde,0xaf}, {0xe2,0xcd}, {0xe2,0xcb}, {0xbc,0xfa}, {0x9f,0xbc}, {0xba,0xbc}, {0xe2,0xcc}, {0xe6,0x76}, {0xbc,0xfb}, {0xe6,0x75}, {0xe6,0x7e}, {0xe6,0x7d}, {0xe6,0x7b}, {0xe6,0x7a}, {0xe6,0x77}, {0xe6,0x78}, {0xe6,0x79}, {0xe6,0x7c}, {0xe6,0xa1}, {0xea,0x5f}, {0xea,0x5c}, {0xea,0x5d}, {0xbf,0x57}, {0xea,0x5b}, {0xea,0x61}, {0xea,0x60}, {0xea,0x5e}, {0xed,0x64}, {0xed,0x65}, {0xc0,0xf1}, {0xa0,0x4a}, {0xc0,0xf2}, {0xed,0x63}, {0x9e,0xc7}, {0xc2,0x79}, {0xef,0xfe}, {0xc2,0x78}, {0xc3,0x7e}, {0xc3,0xa1}, {0xc4,0x6d}, {0xf4,0x6e}, {0xf4,0x6d}, {0xf5,0xdd}, {0xf6,0xef}, {0xc5,0x7a}, {0xf7,0xe8}, {0xf7,0xe7}, {0xf7,0xe9}, {0xa5,0xc8}, {0xcf,0xc6}, {0xaf,0x59}, {0xb2,0x76}, {0xd6,0x6a}, {0xa5,0xc9}, {0xc9,0xa7}, {0xa4,0xfd}, {0x8c,0xa9}, {0xca,0x45}, {0x98,0xae}, {0xcb,0x6c}, {0xcb,0x6a}, {0xcb,0x6b}, {0xcb,0x68}, {0xa8,0x68}, {0xcb,0x69}, {0x92,0xd6}, {0xfa,0xe1}, {0xcd,0x6d}, {0x91,0xd4}, {0xaa,0xb3}, {0xcd,0x6b}, {0xcd,0x67}, {0xcd,0x6a}, {0xcd,0x66}, {0xaa,0xb5}, {0xcd,0x69}, {0xfa,0xde}, {0xaa,0xb2}, {0xaa,0xb1}, {0xfe,0x5b}, {0xaa,0xb4}, {0xcd,0x6c}, {0xcd,0x68}, {0xac,0xc2}, {0xac,0xc5}, {0xcf,0xce}, {0xcf,0xcd}, {0xcf,0xcc}, {0xac,0xbf}, {0xcf,0xd5}, {0xcf,0xcb}, {0x8c,0x53}, {0xac,0xc1}, {0xd2,0xaf}, {0xcf,0xd2}, {0xcf,0xd0}, {0xac,0xc4}, {0xcf,0xc8}, {0xcf,0xd3}, {0xcf,0xca}, {0xcf,0xd4}, {0xcf,0xd1}, {0xcf,0xc9}, {0xfe,0x5e}, {0xac,0xc0}, {0xcf,0xd6}, {0xcf,0xc7}, {0xac,0xc3}, {0xfb,0xd7}, {0xfe,0x5a}, {0x94,0xc5}, {0xd2,0xb4}, {0xd2,0xab}, {0xd2,0xb6}, {0xfa,0xca}, {0xd2,0xae}, {0xd2,0xb9}, {0xd2,0xba}, {0xd2,0xac}, {0xd2,0xb8}, {0xd2,0xb5}, {0xd2,0xb3}, {0xd2,0xb7}, {0xaf,0x5f}, {0xaf,0x5d}, {0x98,0xc1}, {0x97,0x5c}, {0xd2,0xb1}, {0xfe,0x74}, {0xd2,0xad}, {0x97,0x73}, {0xd2,0xb0}, {0xd2,0xbb}, {0xd2,0xb2}, {0xaf,0x5e}, {0xcf,0xcf}, {0xaf,0x5a}, {0xaf,0x5c}, {0xfa,0x46}, {0x97,0x64}, {0xd6,0x78}, {0xd6,0x6d}, {0xd6,0x6b}, {0xfe,0x68}, {0xd6,0x6c}, {0x96,0x4e}, {0xd6,0x73}, {0x97,0x65}, {0xd6,0x74}, {0xd6,0x70}, {0xb2,0x7b}, {0xd6,0x75}, {0xd6,0x72}, {0xd6,0x6f}, {0x8c,0x5a}, {0xb2,0x79}, {0xd6,0x6e}, {0xb2,0x77}, {0xb2,0x7a}, {0xd6,0x71}, {0xd6,0x79}, {0xaf,0x5b}, {0xb2,0x78}, {0xd6,0x77}, {0xd6,0x76}, {0xb2,0x7c}, {0x89,0xa1}, {0x95,0xfa}, {0x92,0xd4}, {0xfe,0x69}, {0xda,0x7e}, {0xfb,0x45}, {0x98,0xc8}, {0xda,0xa1}, {0xb5,0x60}, {0x90,0xef}, {0xda,0xa7}, {0x98,0xc9}, {0x98,0xca}, {0xda,0xa9}, {0xda,0xa2}, {0xb5,0x5a}, {0xda,0xa6}, {0xda,0xa5}, {0xb5,0x5b}, {0xb5,0x61}, {0xb5,0x62}, {0xda,0xa8}, {0xb5,0x58}, {0xda,0x7d}, {0xda,0x7b}, {0xda,0xa3}, {0xda,0x7a}, {0xb5,0x5f}, {0xda,0x7c}, {0xda,0xa4}, {0xda,0xaa}, {0xb5,0x59}, {0xb5,0x5e}, {0xb5,0x5c}, {0xb5,0x5d}, {0x94,0x6d}, {0x94,0xb7}, {0xfe,0x6c}, {0xb5,0x57}, {0x94,0x6b}, {0xb7,0xe9}, {0xde,0xb7}, {0xb7,0xe8}, {0xde,0xbb}, {0x92,0xfc}, {0xde,0xb1}, {0x95,0xeb}, {0xde,0xbc}, {0xfe,0x73}, {0x97,0x6e}, {0xfe,0x5f}, {0xde,0xb2}, {0xde,0xb3}, {0xde,0xbd}, {0xde,0xba}, {0xde,0xb8}, {0xde,0xb9}, {0xde,0xb5}, {0xde,0xb4}, {0xfd,0xbd}, {0xde,0xbe}, {0xb7,0xe5}, {0x92,0xd5}, {0xde,0xb6}, {0xb7,0xea}, {0xb7,0xe4}, {0xb7,0xeb}, {0xb7,0xec}, {0xfe,0xb9}, {0xb7,0xe7}, {0xb7,0xe6}, {0xfe,0x71}, {0xe2,0xce}, {0xba,0xbe}, {0xba,0xbd}, {0xfb,0xbb}, {0xe2,0xd3}, {0x94,0x7a}, {0xbc,0xfc}, {0xba,0xbf}, {0x95,0xfb}, {0xfe,0x77}, {0xba,0xc1}, {0xe2,0xd4}, {0xb7,0xe3}, {0xba,0xc0}, {0xe2,0xd0}, {0xe2,0xd2}, {0xe2,0xcf}, {0xfe,0x79}, {0xe2,0xd1}, {0xfe,0x75}, {0xe6,0xab}, {0x94,0x5d}, {0xe6,0xaa}, {0xe6,0xa7}, {0xbd,0x40}, {0xea,0x62}, {0xbd,0x41}, {0xe6,0xa6}, {0xfe,0x7c}, {0xbc,0xfe}, {0xe6,0xa8}, {0xe6,0xa5}, {0xe6,0xa2}, {0xe6,0xa9}, {0xe6,0xa3}, {0xe6,0xa4}, {0xbc,0xfd}, {0x93,0x44}, {0x8e,0xa6}, {0xed,0x69}, {0xea,0x66}, {0xea,0x65}, {0xea,0x67}, {0xed,0x66}, {0xbf,0x5a}, {0x92,0xd3}, {0xea,0x63}, {0x94,0xb8}, {0xbf,0x58}, {0xbf,0x5c}, {0xbf,0x5b}, {0xea,0x64}, {0xea,0x68}, {0xbf,0x59}, {0xfc,0x71}, {0xed,0x6d}, {0xc0,0xf5}, {0xc2,0x7a}, {0xc0,0xf6}, {0xc0,0xf3}, {0xed,0x6a}, {0xed,0x68}, {0xed,0x6b}, {0xed,0x6e}, {0xc0,0xf4}, {0xed,0x6c}, {0xed,0x67}, {0x97,0x5e}, {0xf0,0x42}, {0xf0,0x45}, {0xf2,0x75}, {0xf0,0x40}, {0x8c,0xad}, {0xf4,0x6f}, {0xf0,0x46}, {0xc3,0xa2}, {0xf0,0x44}, {0xc2,0x7b}, {0xf0,0x41}, {0xf0,0x43}, {0xf0,0x47}, {0xf2,0x76}, {0xf2,0x74}, {0xfe,0xa7}, {0xc3,0xa3}, {0xf2,0x73}, {0x94,0x6a}, {0xc4,0x6e}, {0x93,0xe3}, {0x98,0xcf}, {0xc4,0xed}, {0xf6,0xf1}, {0xc4,0xec}, {0xf6,0xf3}, {0xf6,0xf0}, {0xf6,0xf2}, {0xc5,0xd0}, {0xf8,0xb2}, {0xa5,0xca}, {0xcd,0x6e}, {0xd2,0xbc}, {0xd2,0xbd}, {0xb2,0x7d}, {0xde,0xbf}, {0xbf,0x5d}, {0xc3,0xa4}, {0xc5,0x7b}, {0xf8,0xb3}, {0xa5,0xcb}, {0xa0,0xd9}, {0xcd,0x6f}, {0xa2,0x60}, {0xcf,0xd7}, {0xcf,0xd8}, {0xa0,0xbf}, {0xa0,0x4d}, {0xa0,0xb8}, {0xd2,0xbe}, {0xd2,0xbf}, {0xb2,0x7e}, {0xb2,0xa1}, {0xa0,0xce}, {0xda,0xab}, {0xde,0xc2}, {0xde,0xc1}, {0xde,0xc0}, {0xe2,0xd5}, {0xe2,0xd6}, {0xe2,0xd7}, {0xba,0xc2}, {0xa0,0xb7}, {0xe6,0xad}, {0xe6,0xac}, {0xea,0x69}, {0xbf,0x5e}, {0xbf,0x5f}, {0xfe,0xa9}, {0xed,0x72}, {0xed,0x6f}, {0xed,0x70}, {0xed,0x71}, {0xf0,0x49}, {0xf0,0x48}, {0xc2,0x7c}, {0xf2,0x77}, {0xf5,0xde}, {0xa5,0xcc}, {0x89,0xc3}, {0xac,0xc6}, {0xb2,0xa2}, {0xde,0xc3}, {0xfe,0xab}, {0xa5,0xcd}, {0xd2,0xc0}, {0xb2,0xa3}, {0xb5,0x63}, {0xb5,0x64}, {0xa5,0xce}, {0xa5,0xcf}, {0xca,0x46}, {0xa8,0x6a}, {0xa8,0x69}, {0xac,0xc7}, {0xcf,0xd9}, {0xda,0xac}, {0xa5,0xd0}, {0xa5,0xd1}, {0xa5,0xd2}, {0xa5,0xd3}, {0x9d,0xf4}, {0x89,0x6d}, {0xa8,0x6b}, {0xa8,0x6c}, {0xcb,0x6e}, {0xcb,0x6d}, {0x9c,0x7b}, {0xaa,0xb6}, {0xcd,0x72}, {0xcd,0x70}, {0xcd,0x71}, {0x98,0xd2}, {0x9f,0xa9}, {0xcf,0xda}, {0xcf,0xdb}, {0xfe,0xb2}, {0xac,0xcb}, {0xac,0xc9}, {0xfe,0xb1}, {0xac,0xca}, {0xac,0xc8}, {0x97,0xd9}, {0xa0,0xc4}, {0xaf,0x60}, {0x94,0x76}, {0xaf,0x64}, {0xaf,0x63}, {0xd2,0xc1}, {0xaf,0x62}, {0xaf,0x61}, {0xd2,0xc2}, {0x99,0x78}, {0xb2,0xa6}, {0xd6,0x7b}, {0xd6,0x7a}, {0xb2,0xa4}, {0xb2,0xa5}, {0xfe,0xb3}, {0xb5,0x66}, {0xb5,0x65}, {0xda,0xae}, {0x98,0xd3}, {0xfe,0xb4}, {0xda,0xad}, {0xb2,0xa7}, {0x98,0xd4}, {0xb7,0xed}, {0xde,0xc5}, {0xb7,0xee}, {0xde,0xc4}, {0x9f,0xb9}, {0xe2,0xd8}, {0xe6,0xae}, {0xbd,0x42}, {0xea,0x6a}, {0x94,0x71}, {0xed,0x73}, {0xc3,0xa6}, {0xc3,0xa5}, {0xc5,0x7c}, {0xa5,0xd4}, {0xcd,0x73}, {0x98,0xd5}, {0xfe,0xb8}, {0xb2,0xa8}, {0xe2,0xd9}, {0xba,0xc3}, {0xc6,0xd4}, {0xcb,0x6f}, {0xcb,0x70}, {0xcd,0x74}, {0xaa,0xb8}, {0xaa,0xb9}, {0xaa,0xb7}, {0xfe,0xba}, {0xac,0xcf}, {0xac,0xd0}, {0xac,0xcd}, {0xac,0xce}, {0xcf,0xdc}, {0xcf,0xdd}, {0xac,0xcc}, {0xd2,0xc3}, {0x9e,0x5c}, {0xaf,0x68}, {0xaf,0x69}, {0xfe,0xbb}, {0xb2,0xab}, {0xd2,0xc9}, {0xaf,0x6e}, {0xaf,0x6c}, {0xd2,0xca}, {0xd2,0xc5}, {0xaf,0x6b}, {0xaf,0x6a}, {0xaf,0x65}, {0xd2,0xc8}, {0xd2,0xc7}, {0xd2,0xc4}, {0xaf,0x6d}, {0xa0,0x44}, {0xd2,0xc6}, {0xaf,0x66}, {0xaf,0x67}, {0x98,0xd7}, {0xb2,0xac}, {0xd6,0xa1}, {0xd6,0xa2}, {0xb2,0xad}, {0xd6,0x7c}, {0xd6,0x7e}, {0xd6,0xa4}, {0xd6,0xa3}, {0xd6,0x7d}, {0xb2,0xa9}, {0xb2,0xaa}, {0xda,0xb6}, {0xb5,0x6b}, {0xb5,0x6a}, {0xda,0xb0}, {0xb5,0x68}, {0x98,0xd8}, {0xda,0xb3}, {0xb5,0x6c}, {0xda,0xb4}, {0xb5,0x6d}, {0xda,0xb1}, {0xb5,0x67}, {0xb5,0x69}, {0xda,0xb5}, {0xda,0xb2}, {0xda,0xaf}, {0xde,0xd2}, {0xde,0xc7}, {0xb7,0xf0}, {0xb7,0xf3}, {0xb7,0xf2}, {0xb7,0xf7}, {0xb7,0xf6}, {0xde,0xd3}, {0xde,0xd1}, {0xde,0xca}, {0xde,0xce}, {0xde,0xcd}, {0xb7,0xf4}, {0xde,0xd0}, {0xde,0xcc}, {0xde,0xd4}, {0xde,0xcb}, {0xb7,0xf5}, {0xb7,0xef}, {0xb7,0xf1}, {0xfe,0xbc}, {0xde,0xc9}, {0x9f,0xfe}, {0xe2,0xdb}, {0xba,0xc7}, {0xe2,0xdf}, {0xba,0xc6}, {0xe2,0xdc}, {0xba,0xc5}, {0xde,0xc8}, {0xde,0xcf}, {0xe2,0xde}, {0xba,0xc8}, {0xe2,0xe0}, {0xe2,0xdd}, {0xe2,0xda}, {0xe6,0xb1}, {0xe6,0xb5}, {0xe6,0xb7}, {0xe6,0xb3}, {0xe6,0xb2}, {0xe6,0xb0}, {0xbd,0x45}, {0xbd,0x43}, {0xbd,0x48}, {0xbd,0x49}, {0xe6,0xb4}, {0xbd,0x46}, {0xe6,0xaf}, {0xbd,0x47}, {0xba,0xc4}, {0xe6,0xb6}, {0xbd,0x44}, {0xfe,0xbd}, {0xea,0x6c}, {0xea,0x6b}, {0xea,0x73}, {0xea,0x6d}, {0xea,0x72}, {0xea,0x6f}, {0xbf,0x60}, {0xea,0x71}, {0xbf,0x61}, {0xbf,0x62}, {0x9d,0xdd}, {0xea,0x70}, {0xea,0x6e}, {0x9e,0xe1}, {0xc0,0xf8}, {0xed,0x74}, {0xc0,0xf7}, {0xed,0x77}, {0xed,0x75}, {0xed,0x76}, {0xc0,0xf9}, {0x98,0xda}, {0x9d,0xdf}, {0xfe,0xbf}, {0xf0,0x4d}, {0xfe,0xbe}, {0xc2,0xa1}, {0xf0,0x4e}, {0x9e,0xeb}, {0xc2,0x7d}, {0xf0,0x4f}, {0xc2,0x7e}, {0xf0,0x4c}, {0xf0,0x50}, {0xf0,0x4a}, {0xc3,0xa7}, {0xf2,0x78}, {0xc3,0xa8}, {0xc4,0x6f}, {0xf0,0x4b}, {0xc4,0x70}, {0x9e,0x59}, {0xa0,0x5c}, {0xc4,0xee}, {0xf5,0xdf}, {0xc5,0x7e}, {0xf6,0xf4}, {0xc5,0x7d}, {0xfe,0xc0}, {0xf7,0xea}, {0xc5,0xf5}, {0xc5,0xf6}, {0x94,0x77}, {0x98,0xdc}, {0xf9,0xcc}, {0xfe,0xc1}, {0xac,0xd1}, {0xcf,0xde}, {0x98,0xde}, {0xb5,0x6e}, {0xb5,0x6f}, {0xa5,0xd5}, {0xa6,0xca}, {0xca,0x47}, {0xcb,0x71}, {0xa8,0x6d}, {0xaa,0xba}, {0xac,0xd2}, {0xac,0xd3}, {0xac,0xd4}, {0xd6,0xa6}, {0xd2,0xcb}, {0xaf,0x6f}, {0xb2,0xae}, {0xd6,0xa5}, {0xfe,0xc3}, {0xda,0xb8}, {0xb5,0x71}, {0xda,0xb7}, {0xb5,0x70}, {0xde,0xd5}, {0xbd,0x4a}, {0xe6,0xbb}, {0xe6,0xb8}, {0xe6,0xb9}, {0xe6,0xba}, {0xfe,0xc8}, {0xed,0x78}, {0xfe,0xc9}, {0xf0,0x51}, {0xf4,0x71}, {0xf4,0x70}, {0xf6,0xf5}, {0xa5,0xd6}, {0xcd,0x75}, {0xaf,0x70}, {0xb5,0x72}, {0xde,0xd6}, {0xfe,0xca}, {0xe2,0xe1}, {0xbd,0x4b}, {0xea,0x74}, {0xf0,0x52}, {0xf4,0x72}, {0xa5,0xd7}, {0xaa,0xbb}, {0xac,0xd7}, {0xcf,0xdf}, {0xac,0xd8}, {0xac,0xd6}, {0xac,0xd5}, {0xd2,0xcc}, {0xaf,0x71}, {0xfe,0xcb}, {0xaf,0x72}, {0xaf,0x73}, {0xb2,0xb0}, {0xd6,0xa7}, {0xb2,0xaf}, {0x9f,0xc2}, {0x8c,0x6b}, {0xda,0xb9}, {0xb2,0xb1}, {0xb5,0x73}, {0xde,0xd7}, {0xb7,0xf8}, {0xb7,0xf9}, {0xba,0xc9}, {0xba,0xca}, {0xbd,0x4c}, {0xbf,0x64}, {0xea,0x75}, {0xbf,0x63}, {0xed,0x79}, {0xc0,0xfa}, {0xf0,0x53}, {0xf4,0x73}, {0xa5,0xd8}, {0xa8,0x6e}, {0xcd,0x78}, {0xcd,0x77}, {0xaa,0xbc}, {0xcd,0x76}, {0xaa,0xbd}, {0xcd,0x79}, {0xcf,0xe5}, {0xac,0xdb}, {0xac,0xda}, {0xcf,0xe7}, {0xcf,0xe6}, {0xac,0xdf}, {0xac,0xde}, {0xac,0xd9}, {0xcf,0xe1}, {0xcf,0xe2}, {0xcf,0xe3}, {0xac,0xe0}, {0xcf,0xe0}, {0xac,0xdc}, {0xcf,0xe4}, {0xac,0xdd}, {0x98,0xc4}, {0x94,0xb0}, {0x94,0xb1}, {0xd2,0xcf}, {0xd2,0xd3}, {0xd2,0xd1}, {0xd2,0xd0}, {0xd2,0xd4}, {0xd2,0xd5}, {0xd2,0xd6}, {0xd2,0xce}, {0xd2,0xcd}, {0xfe,0xd1}, {0xaf,0x75}, {0xaf,0x76}, {0xd2,0xd7}, {0xd2,0xd2}, {0xa0,0xc1}, {0xd6,0xb0}, {0xfe,0xd2}, {0xd2,0xd8}, {0xaf,0x77}, {0xaf,0x74}, {0xa0,0xcd}, {0xd6,0xaa}, {0xd6,0xa9}, {0xd6,0xab}, {0xd6,0xac}, {0xd6,0xae}, {0xd6,0xad}, {0xd6,0xb2}, {0xb2,0xb5}, {0xb2,0xb2}, {0xb2,0xb6}, {0xd6,0xa8}, {0xb2,0xb7}, {0xd6,0xb1}, {0xb2,0xb4}, {0xd6,0xaf}, {0xb2,0xb3}, {0xfe,0xd3}, {0x98,0xe5}, {0xda,0xbc}, {0xda,0xbe}, {0xda,0xba}, {0xda,0xbb}, {0xda,0xbf}, {0xda,0xc1}, {0xda,0xc2}, {0xda,0xbd}, {0xda,0xc0}, {0xb5,0x74}, {0xde,0xdb}, {0xde,0xe0}, {0xde,0xd8}, {0xde,0xdc}, {0xfe,0xd6}, {0xde,0xe1}, {0xde,0xdd}, {0xb7,0xfa}, {0xb8,0x43}, {0xb7,0xfd}, {0xde,0xd9}, {0xde,0xda}, {0xba,0xce}, {0xb8,0x46}, {0xb7,0xfe}, {0xb8,0x44}, {0xb7,0xfc}, {0xde,0xdf}, {0xb8,0x45}, {0xde,0xde}, {0xb8,0x41}, {0xb7,0xfb}, {0xb8,0x42}, {0xde,0xe2}, {0xe2,0xe6}, {0xe2,0xe8}, {0x91,0xe4}, {0x8f,0xc7}, {0x94,0xae}, {0xb8,0x40}, {0x8a,0x4f}, {0x94,0xb2}, {0xe2,0xe3}, {0xba,0xcc}, {0xe2,0xe9}, {0xba,0xcd}, {0xe2,0xe7}, {0xe2,0xe2}, {0xe2,0xe5}, {0xe2,0xea}, {0xba,0xcb}, {0xe2,0xe4}, {0xbd,0x4e}, {0xe6,0xbf}, {0xe6,0xbe}, {0xbd,0x51}, {0xbd,0x4f}, {0xe6,0xbc}, {0xbd,0x4d}, {0xe6,0xbd}, {0xbd,0x50}, {0x8f,0xd4}, {0xea,0x7d}, {0xea,0xa1}, {0x98,0xea}, {0xea,0x7e}, {0xea,0x76}, {0xea,0x7a}, {0xea,0x79}, {0xea,0x77}, {0xbf,0x66}, {0xbf,0x67}, {0xbf,0x65}, {0xea,0x78}, {0xea,0x7b}, {0xea,0x7c}, {0xbf,0x68}, {0xc1,0x40}, {0xed,0xa3}, {0xc0,0xfc}, {0xed,0x7b}, {0xc0,0xfe}, {0xc1,0x41}, {0xfe,0xd8}, {0xc0,0xfd}, {0xed,0xa2}, {0xed,0x7c}, {0xc0,0xfb}, {0xed,0xa1}, {0xed,0x7a}, {0xed,0x7e}, {0xed,0x7d}, {0x9d,0xe0}, {0xf0,0x55}, {0xc2,0xa4}, {0xc2,0xa5}, {0xc2,0xa2}, {0x98,0xee}, {0xc2,0xa3}, {0xf0,0x54}, {0x95,0xc4}, {0xf2,0x7b}, {0xfc,0xe8}, {0xc3,0xa9}, {0xf2,0x79}, {0xf2,0x7a}, {0x98,0xef}, {0xf4,0x74}, {0xf4,0x77}, {0xf4,0x75}, {0xf4,0x76}, {0xf5,0xe0}, {0xc4,0xef}, {0xf7,0xeb}, {0xf8,0xb4}, {0xc5,0xf7}, {0xf8,0xf8}, {0xf8,0xf9}, {0xc6,0x66}, {0xa5,0xd9}, {0xac,0xe1}, {0x8c,0x6e}, {0xda,0xc3}, {0xde,0xe3}, {0xa5,0xda}, {0xa8,0x6f}, {0xaa,0xbe}, {0xfa,0xd8}, {0xcf,0xe8}, {0xcf,0xe9}, {0xaf,0x78}, {0xda,0xc4}, {0xb5,0x75}, {0xb8,0x47}, {0xc1,0x42}, {0xed,0xa4}, {0xf2,0x7c}, {0xf4,0x78}, {0xa5,0xdb}, {0xfe,0xdc}, {0xcd,0xa1}, {0xcd,0x7a}, {0xcd,0x7c}, {0xcd,0x7e}, {0xcd,0x7d}, {0xcd,0x7b}, {0xaa,0xbf}, {0xa0,0xae}, {0xac,0xe2}, {0xcf,0xf2}, {0xcf,0xed}, {0xcf,0xea}, {0x9d,0x4c}, {0xcf,0xf1}, {0xac,0xe4}, {0xac,0xe5}, {0xcf,0xf0}, {0xcf,0xef}, {0xcf,0xee}, {0xcf,0xeb}, {0xcf,0xec}, {0xcf,0xf3}, {0xac,0xe3}, {0x98,0xf1}, {0x98,0xf3}, {0xaf,0x7c}, {0x94,0xc1}, {0xaf,0xa4}, {0xaf,0xa3}, {0xd2,0xe1}, {0xd2,0xdb}, {0xd2,0xd9}, {0xaf,0xa1}, {0xd6,0xb9}, {0xaf,0x7a}, {0xd2,0xde}, {0xd2,0xe2}, {0xd2,0xe4}, {0xd2,0xe0}, {0xd2,0xda}, {0xaf,0xa2}, {0xd2,0xdf}, {0xd2,0xdd}, {0xaf,0x79}, {0xd2,0xe5}, {0xaf,0xa5}, {0xd2,0xe3}, {0xaf,0x7d}, {0xd2,0xdc}, {0xaf,0x7e}, {0xaf,0x7b}, {0x98,0xf5}, {0xfa,0x4f}, {0x96,0xe2}, {0x94,0x50}, {0xb2,0xb9}, {0x96,0xa2}, {0xd6,0xba}, {0x98,0xf6}, {0xd6,0xb3}, {0xd6,0xb5}, {0xd6,0xb7}, {0x96,0xe5}, {0xd6,0xb8}, {0xd6,0xb6}, {0xb2,0xba}, {0xd6,0xbb}, {0x98,0xf7}, {0xd6,0xb4}, {0xa0,0x46}, {0x96,0xe3}, {0xda,0xc8}, {0xb5,0x76}, {0xda,0xd0}, {0xda,0xc5}, {0xda,0xd1}, {0xda,0xc6}, {0xda,0xc7}, {0x98,0xf8}, {0xda,0xcf}, {0xda,0xce}, {0xda,0xcb}, {0xb2,0xb8}, {0xb5,0x77}, {0xda,0xc9}, {0xda,0xcc}, {0xb5,0x78}, {0xda,0xcd}, {0xda,0xca}, {0xde,0xee}, {0x9e,0xe4}, {0xde,0xf2}, {0xb8,0x4e}, {0xe2,0xf0}, {0xb8,0x51}, {0xde,0xf0}, {0xf9,0xd6}, {0xde,0xed}, {0xde,0xe8}, {0xde,0xea}, {0xde,0xeb}, {0xde,0xe4}, {0x94,0xc3}, {0xb8,0x4d}, {0xb8,0x4c}, {0x94,0xc2}, {0xb8,0x48}, {0xde,0xe7}, {0xb8,0x4f}, {0xb8,0x50}, {0xde,0xe6}, {0xde,0xe9}, {0xde,0xf1}, {0xb8,0x4a}, {0xb8,0x4b}, {0xde,0xef}, {0xde,0xe5}, {0xe2,0xf2}, {0xba,0xd0}, {0xe2,0xf4}, {0xde,0xec}, {0xe2,0xf6}, {0xba,0xd4}, {0xe2,0xf7}, {0xe2,0xf3}, {0xba,0xd1}, {0xe2,0xef}, {0xba,0xd3}, {0xe2,0xec}, {0xe2,0xf1}, {0xe2,0xf5}, {0xe2,0xee}, {0xfe,0xe1}, {0xb8,0x49}, {0xfe,0xe9}, {0xe2,0xeb}, {0xba,0xd2}, {0xe2,0xed}, {0x96,0xe4}, {0x89,0xac}, {0x96,0xdb}, {0xbd,0x54}, {0xe6,0xc1}, {0xbd,0x58}, {0xbd,0x56}, {0xba,0xcf}, {0xe6,0xc8}, {0xe6,0xc9}, {0xbd,0x53}, {0xfe,0xe2}, {0xe6,0xc7}, {0xe6,0xca}, {0xbd,0x55}, {0xbd,0x52}, {0xe6,0xc3}, {0xe6,0xc0}, {0xe6,0xc5}, {0xe6,0xc2}, {0xbd,0x59}, {0xe6,0xc4}, {0x94,0xc4}, {0xfe,0xe3}, {0xe6,0xc6}, {0xbd,0x57}, {0xfe,0xe7}, {0x9f,0xfb}, {0xbf,0x6a}, {0xea,0xa8}, {0xea,0xa2}, {0xea,0xa6}, {0xea,0xac}, {0xea,0xad}, {0xea,0xa9}, {0xea,0xaa}, {0xea,0xa7}, {0x8c,0x59}, {0xea,0xa4}, {0xbf,0x6c}, {0xbf,0x69}, {0xea,0xa3}, {0xea,0xa5}, {0xbf,0x6b}, {0xea,0xab}, {0x93,0xc9}, {0xc1,0x46}, {0x94,0xe8}, {0xfb,0x56}, {0xed,0xaa}, {0xed,0xa5}, {0xc1,0x45}, {0x90,0xc5}, {0xc1,0x43}, {0xed,0xac}, {0xc1,0x44}, {0xed,0xa8}, {0xed,0xa9}, {0xed,0xa6}, {0xed,0xad}, {0xf0,0x56}, {0xc1,0x47}, {0xed,0xa7}, {0xed,0xae}, {0xed,0xab}, {0xa0,0xa8}, {0xf0,0x5a}, {0xf0,0x57}, {0xc2,0xa6}, {0xf0,0x5b}, {0xf0,0x5d}, {0xf0,0x5c}, {0xf0,0x58}, {0xf0,0x59}, {0xf2,0xa3}, {0xc3,0xaa}, {0xf2,0x7e}, {0xf2,0xa2}, {0xf2,0x7d}, {0xf2,0xa4}, {0xf2,0xa1}, {0xf4,0x7a}, {0xf4,0x7d}, {0xf4,0x79}, {0xc4,0x71}, {0xf4,0x7b}, {0xf4,0x7c}, {0xf4,0x7e}, {0xc4,0x72}, {0xc4,0x74}, {0xc4,0x73}, {0xf5,0xe1}, {0xfe,0xe5}, {0xf5,0xe3}, {0xf5,0xe2}, {0x98,0xfd}, {0x98,0xfb}, {0xfe,0xe8}, {0xf6,0xf6}, {0x8e,0xbf}, {0xf8,0xb5}, {0xf8,0xfa}, {0xa5,0xdc}, {0x8b,0xd8}, {0xfe,0xf7}, {0xcb,0x72}, {0xaa,0xc0}, {0xcd,0xa3}, {0xaa,0xc1}, {0xaa,0xc2}, {0xcd,0xa2}, {0xcf,0xf8}, {0xcf,0xf7}, {0xac,0xe6}, {0xac,0xe9}, {0xac,0xe8}, {0xac,0xe7}, {0xcf,0xf4}, {0xcf,0xf6}, {0xcf,0xf5}, {0xd2,0xe8}, {0xaf,0xa7}, {0xd2,0xec}, {0xd2,0xeb}, {0xd2,0xea}, {0xd2,0xe6}, {0xaf,0xa6}, {0xaf,0xaa}, {0xaf,0xad}, {0x8f,0x68}, {0x94,0xc6}, {0xaf,0xae}, {0xd2,0xe7}, {0xd2,0xe9}, {0xaf,0xac}, {0xaf,0xab}, {0xaf,0xa9}, {0xaf,0xa8}, {0xd6,0xc2}, {0x9d,0xea}, {0xd6,0xc0}, {0xd6,0xbc}, {0xb2,0xbb}, {0xd6,0xbd}, {0xb2,0xbc}, {0xd6,0xbe}, {0xd6,0xbf}, {0xd6,0xc1}, {0xb2,0xbd}, {0xda,0xd5}, {0xfc,0x69}, {0xda,0xd4}, {0xda,0xd3}, {0xda,0xd2}, {0xde,0xf6}, {0xb8,0x52}, {0xde,0xf3}, {0xde,0xf5}, {0x9c,0xda}, {0xb8,0x53}, {0xfe,0xf3}, {0xb8,0x54}, {0xde,0xf4}, {0x9c,0x72}, {0xfe,0xf0}, {0x89,0xc9}, {0xe3,0x41}, {0xe2,0xf9}, {0xe2,0xfa}, {0xba,0xd7}, {0xba,0xd5}, {0xba,0xd6}, {0xe3,0x43}, {0x99,0x41}, {0xe3,0x42}, {0xe2,0xfe}, {0xe2,0xfd}, {0xe2,0xfc}, {0xe2,0xfb}, {0xe3,0x40}, {0xe2,0xf8}, {0x99,0x42}, {0xe6,0xcb}, {0xe6,0xd0}, {0xe6,0xce}, {0xfe,0xf5}, {0x91,0xd7}, {0xe6,0xcd}, {0xe6,0xcc}, {0xe6,0xcf}, {0xea,0xae}, {0x94,0xcc}, {0xbf,0x6d}, {0xc1,0x48}, {0xed,0xb0}, {0xfe,0xf8}, {0xc1,0x49}, {0xed,0xaf}, {0xf0,0x5f}, {0xf0,0x5e}, {0xc2,0xa7}, {0xf2,0xa5}, {0xc3,0xab}, {0xf4,0xa1}, {0xc5,0xa1}, {0xf6,0xf7}, {0xf8,0xb7}, {0xf8,0xb6}, {0xc9,0xa8}, {0xac,0xea}, {0xac,0xeb}, {0xd6,0xc3}, {0xb8,0x56}, {0xa5,0xdd}, {0xa8,0x72}, {0xa8,0x71}, {0xa8,0x70}, {0x97,0xa8}, {0xcd,0xa4}, {0xfe,0xfc}, {0xaa,0xc4}, {0xaa,0xc3}, {0xac,0xee}, {0xfd,0xbf}, {0xcf,0xfa}, {0xcf,0xfd}, {0xcf,0xfb}, {0xac,0xec}, {0xac,0xed}, {0xfe,0xfe}, {0xcf,0xf9}, {0xcf,0xfc}, {0xaf,0xb5}, {0xd2,0xf3}, {0xd2,0xf5}, {0xd2,0xf4}, {0xaf,0xb2}, {0xd2,0xef}, {0x96,0xd1}, {0xaf,0xb0}, {0xaf,0xaf}, {0xaf,0xb3}, {0xaf,0xb1}, {0xaf,0xb4}, {0xd2,0xf2}, {0xd2,0xed}, {0xd2,0xee}, {0xd2,0xf1}, {0xd2,0xf0}, {0x94,0xd5}, {0x94,0xd0}, {0xd6,0xc6}, {0xd6,0xc7}, {0xd6,0xc5}, {0xd6,0xc4}, {0xb2,0xbe}, {0xb5,0x7d}, {0xda,0xd6}, {0xda,0xd8}, {0xda,0xda}, {0xb5,0x7c}, {0x99,0x44}, {0xb5,0x7a}, {0xda,0xd7}, {0xb5,0x7b}, {0xda,0xd9}, {0xb5,0x79}, {0xdf,0x41}, {0xde,0xf7}, {0xde,0xfa}, {0xde,0xfe}, {0xb8,0x5a}, {0xde,0xfc}, {0xde,0xfb}, {0xde,0xf8}, {0xde,0xf9}, {0xb8,0x58}, {0xdf,0x40}, {0xb8,0x57}, {0xb8,0x5c}, {0xb8,0x5b}, {0xb8,0x59}, {0xde,0xfd}, {0xe3,0x49}, {0xe3,0x48}, {0x8c,0x63}, {0xe3,0x44}, {0xa0,0xb3}, {0xba,0xd8}, {0xe3,0x47}, {0xe3,0x46}, {0xba,0xd9}, {0xbd,0x5e}, {0xe6,0xd2}, {0x94,0xcf}, {0xbd,0x5f}, {0xbd,0x5b}, {0xbd,0x5d}, {0x9f,0xfa}, {0xbd,0x5a}, {0xbd,0x5c}, {0x91,0xe5}, {0xea,0xaf}, {0x9c,0x6a}, {0xbf,0x70}, {0xea,0xb1}, {0xea,0xb0}, {0x8e,0x49}, {0xe3,0x45}, {0xbf,0x72}, {0xbf,0x71}, {0xbf,0x6e}, {0xbf,0x6f}, {0xed,0xb5}, {0xed,0xb3}, {0xc1,0x4a}, {0xed,0xb4}, {0xed,0xb6}, {0xed,0xb2}, {0xed,0xb1}, {0xf0,0x60}, {0xc2,0xaa}, {0xc2,0xa8}, {0xc2,0xa9}, {0x8e,0x4c}, {0xf2,0xa6}, {0xf2,0xa7}, {0xc3,0xad}, {0xc3,0xac}, {0xf4,0xa3}, {0xf4,0xa4}, {0xf4,0xa2}, {0xf6,0xf8}, {0xf6,0xf9}, {0xa5,0xde}, {0xca,0x48}, {0xa8,0x73}, {0xcd,0xa5}, {0xaa,0xc6}, {0xaa,0xc5}, {0xcd,0xa6}, {0x8e,0x4d}, {0xd0,0x40}, {0xac,0xef}, {0xcf,0xfe}, {0xac,0xf0}, {0x9a,0x73}, {0xaf,0xb6}, {0xd2,0xf8}, {0xd2,0xf6}, {0xd2,0xfc}, {0xaf,0xb7}, {0xd2,0xf7}, {0xd2,0xfb}, {0xd2,0xf9}, {0xd2,0xfa}, {0xd6,0xc8}, {0xd6,0xca}, {0x99,0x47}, {0xb2,0xbf}, {0x8c,0xb1}, {0xd6,0xc9}, {0xb2,0xc0}, {0xb5,0xa2}, {0xb5,0xa1}, {0xb5,0x7e}, {0xda,0xdb}, {0xdf,0x44}, {0xb8,0x5d}, {0xb8,0x5e}, {0xdf,0x43}, {0xdf,0x42}, {0xe3,0x4a}, {0xba,0xdb}, {0xba,0xda}, {0xe3,0x4b}, {0xe3,0x4c}, {0xbd,0x61}, {0xbd,0x60}, {0x8e,0x50}, {0xea,0xb5}, {0xe6,0xd3}, {0xe6,0xd5}, {0xe6,0xd4}, {0xea,0xb4}, {0xea,0xb2}, {0xea,0xb6}, {0xea,0xb3}, {0xbf,0x73}, {0x8e,0x4f}, {0x99,0x49}, {0xed,0xb7}, {0xc1,0x4b}, {0xed,0xb8}, {0xed,0xb9}, {0x8e,0x51}, {0x8e,0x52}, {0xc2,0xab}, {0xc2,0xac}, {0xc4,0x75}, {0x9a,0xb2}, {0x89,0xa5}, {0xc5,0xd1}, {0xa5,0xdf}, {0x99,0x4c}, {0xd0,0x41}, {0x9f,0xf8}, {0xd2,0xfd}, {0xaf,0xb8}, {0x8e,0x56}, {0x99,0x4d}, {0x91,0xca}, {0x8e,0x57}, {0xb3,0xba}, {0xb3,0xb9}, {0x94,0xe1}, {0xb5,0xa4}, {0xda,0xdd}, {0xb5,0xa3}, {0xda,0xdc}, {0x90,0x47}, {0x8f,0xd8}, {0x8e,0x58}, {0xdf,0x45}, {0xba,0xdc}, {0xe3,0x4d}, {0xba,0xdd}, {0xc4,0x76}, {0xf4,0xa5}, {0xa6,0xcb}, {0xaa,0xc7}, {0xcd,0xa7}, {0xac,0xf2}, {0x94,0xeb}, {0xac,0xf1}, {0xd0,0x42}, {0xd0,0x43}, {0xd3,0x40}, {0xd3,0x42}, {0xaf,0xb9}, {0xd3,0x44}, {0xd3,0x47}, {0xd3,0x45}, {0x8e,0x5c}, {0x95,0x53}, {0xd3,0x46}, {0xd3,0x43}, {0xd2,0xfe}, {0xaf,0xba}, {0xd3,0x48}, {0xd3,0x41}, {0x9f,0xe5}, {0xd6,0xd3}, {0xb2,0xc6}, {0xd6,0xdc}, {0xb2,0xc3}, {0xd6,0xd5}, {0xb2,0xc7}, {0x9f,0x56}, {0xb2,0xc1}, {0xd6,0xd0}, {0xd6,0xdd}, {0xd6,0xd1}, {0xd6,0xce}, {0xb2,0xc5}, {0x95,0x4f}, {0xb2,0xc2}, {0x8e,0x5e}, {0xd6,0xd4}, {0xd6,0xd7}, {0xb2,0xc4}, {0xd6,0xd8}, {0xb2,0xc8}, {0xd6,0xd9}, {0xd6,0xcf}, {0xd6,0xd6}, {0xd6,0xda}, {0xd6,0xd2}, {0xd6,0xcd}, {0xd6,0xcb}, {0xd6,0xdb}, {0x99,0x6a}, {0xda,0xdf}, {0xda,0xe4}, {0x9c,0x64}, {0x9c,0xd9}, {0xda,0xe0}, {0xda,0xe6}, {0xb5,0xa7}, {0xd6,0xcc}, {0xda,0xe1}, {0xb5,0xa5}, {0xda,0xde}, {0xb5,0xac}, {0xda,0xe2}, {0xb5,0xab}, {0xda,0xe3}, {0xb5,0xad}, {0xb5,0xa8}, {0xb5,0xae}, {0xb5,0xa9}, {0xb5,0xaa}, {0x8e,0x5d}, {0xb5,0xa6}, {0xda,0xe5}, {0xb8,0x61}, {0xdf,0x50}, {0x99,0x50}, {0xdf,0x53}, {0xdf,0x47}, {0xdf,0x4c}, {0xdf,0x46}, {0xb8,0x63}, {0xdf,0x4a}, {0x99,0x51}, {0xdf,0x48}, {0xb8,0x62}, {0x8e,0x62}, {0xdf,0x4f}, {0xdf,0x4e}, {0xdf,0x4b}, {0xdf,0x4d}, {0xdf,0x49}, {0xba,0xe1}, {0xdf,0x52}, {0xb8,0x5f}, {0xdf,0x51}, {0x99,0x52}, {0xe3,0x5d}, {0xba,0xe8}, {0xe3,0x58}, {0xba,0xe7}, {0xe3,0x4e}, {0xe3,0x50}, {0xba,0xe0}, {0xe3,0x55}, {0xe3,0x54}, {0xe3,0x57}, {0xba,0xe5}, {0xe3,0x52}, {0xe3,0x51}, {0x8e,0x68}, {0xba,0xe4}, {0xba,0xdf}, {0xe3,0x53}, {0xba,0xe2}, {0xe3,0x59}, {0xe3,0x5b}, {0xe3,0x56}, {0xe3,0x4f}, {0xba,0xe3}, {0xbd,0x69}, {0xba,0xde}, {0x8e,0x61}, {0x9f,0x59}, {0xe3,0x5c}, {0xe6,0xd9}, {0xbd,0x62}, {0xe6,0xdb}, {0xbd,0x63}, {0x8b,0xb3}, {0xbd,0x65}, {0xe6,0xde}, {0xe6,0xd6}, {0xba,0xe6}, {0xe6,0xdc}, {0xe6,0xd8}, {0xb8,0x60}, {0xbd,0x68}, {0xbd,0x64}, {0xbd,0x66}, {0xbd,0x67}, {0xbf,0x76}, {0xe6,0xdd}, {0xe6,0xd7}, {0xbd,0x6a}, {0xe6,0xda}, {0x9f,0x5d}, {0x8e,0x66}, {0xea,0xc0}, {0xea,0xbb}, {0xea,0xc5}, {0xbf,0x74}, {0xea,0xbd}, {0xbf,0x78}, {0xea,0xc3}, {0xea,0xba}, {0xea,0xb7}, {0xea,0xc6}, {0xc1,0x51}, {0xbf,0x79}, {0xea,0xc2}, {0xea,0xb8}, {0xbf,0x77}, {0xea,0xbc}, {0xbf,0x7b}, {0xea,0xb9}, {0xea,0xbe}, {0xbf,0x7a}, {0xea,0xc1}, {0xea,0xc4}, {0x8c,0xb2}, {0xed,0xcb}, {0xed,0xcc}, {0xed,0xbc}, {0xed,0xc3}, {0xed,0xc1}, {0xc1,0x4f}, {0xed,0xc8}, {0xea,0xbf}, {0x8e,0x6e}, {0xed,0xbf}, {0x9f,0x64}, {0xed,0xc9}, {0xc1,0x4e}, {0xed,0xbe}, {0xed,0xbd}, {0xed,0xc7}, {0xed,0xc4}, {0xed,0xc6}, {0xed,0xba}, {0xed,0xca}, {0xc1,0x4c}, {0xed,0xc5}, {0xed,0xce}, {0xed,0xc2}, {0xc1,0x50}, {0xc1,0x4d}, {0xed,0xc0}, {0xed,0xbb}, {0xed,0xcd}, {0xbf,0x75}, {0x99,0x53}, {0xfa,0xb8}, {0xf0,0x63}, {0x99,0x54}, {0xf0,0x61}, {0xf0,0x67}, {0xc2,0xb0}, {0xf0,0x65}, {0xf0,0x64}, {0xc2,0xb2}, {0xf0,0x6a}, {0xc2,0xb1}, {0xf0,0x6b}, {0xf0,0x68}, {0xc2,0xae}, {0xf0,0x69}, {0xf0,0x62}, {0xc2,0xaf}, {0xc2,0xad}, {0xf2,0xab}, {0xf0,0x66}, {0xf0,0x6c}, {0xf2,0xa8}, {0x8e,0x70}, {0xc3,0xb2}, {0xc3,0xb0}, {0xf2,0xaa}, {0xf2,0xac}, {0xf2,0xa9}, {0xc3,0xb1}, {0xc3,0xae}, {0xc3,0xaf}, {0xc3,0xb3}, {0x9f,0x61}, {0xc4,0x78}, {0x8e,0x72}, {0xf4,0xaa}, {0xf4,0xa9}, {0xf4,0xa7}, {0xf4,0xa6}, {0xf4,0xa8}, {0xc4,0x77}, {0xc4,0x79}, {0xc4,0xf0}, {0xa0,0x6b}, {0xf5,0xe5}, {0xf5,0xe4}, {0x9f,0x40}, {0xf6,0xfa}, {0xf6,0xfc}, {0xf6,0xfe}, {0xf6,0xfd}, {0xf6,0xfb}, {0x94,0xed}, {0xc5,0xa3}, {0xc5,0xa2}, {0xc5,0xd3}, {0xc5,0xd2}, {0xc5,0xd4}, {0xf7,0xed}, {0xf7,0xec}, {0xf8,0xfb}, {0xf8,0xb8}, {0xf8,0xfc}, {0xc6,0x58}, {0x94,0xee}, {0xc6,0x59}, {0xf9,0x6d}, {0x9f,0xbd}, {0xc6,0x7e}, {0xa6,0xcc}, {0x8e,0x7b}, {0xcd,0xa8}, {0xd0,0x45}, {0xd0,0x46}, {0xd0,0x44}, {0x99,0x57}, {0x94,0xf7}, {0xac,0xf3}, {0x9f,0x5f}, {0xd0,0x47}, {0xd0,0x48}, {0xd0,0x49}, {0x8e,0x73}, {0xd3,0x49}, {0xd3,0x4f}, {0x9f,0x62}, {0xd3,0x4d}, {0xaf,0xbb}, {0xd3,0x4b}, {0xd3,0x4c}, {0xd3,0x4e}, {0x94,0xf6}, {0xd3,0x4a}, {0xb2,0xc9}, {0xd6,0xde}, {0xb2,0xcb}, {0xd6,0xe0}, {0xb2,0xca}, {0xd6,0xdf}, {0x99,0x58}, {0xda,0xe8}, {0xb5,0xaf}, {0xda,0xea}, {0xda,0xe7}, {0xd6,0xe1}, {0xb5,0xb0}, {0x8e,0x75}, {0xf9,0xdb}, {0xda,0xe9}, {0x90,0x72}, {0x94,0xf8}, {0xdf,0x56}, {0xb8,0x64}, {0xdf,0x54}, {0xb8,0x65}, {0xdf,0x55}, {0xb8,0x66}, {0x99,0x5a}, {0xba,0xe9}, {0xe3,0x61}, {0xe3,0x5e}, {0xe3,0x60}, {0xba,0xea}, {0xba,0xeb}, {0xe3,0x5f}, {0xa0,0xb0}, {0x8c,0xb3}, {0xe6,0xdf}, {0x8e,0x79}, {0xe6,0xe0}, {0x8e,0x78}, {0xbd,0x6b}, {0xe6,0xe2}, {0xe6,0xe1}, {0x94,0xf3}, {0xa2,0x61}, {0xea,0xca}, {0xea,0xcb}, {0xea,0xc7}, {0x98,0xaf}, {0xea,0xc8}, {0xbf,0x7c}, {0xbf,0x7d}, {0xea,0xc9}, {0xc1,0x57}, {0xa0,0xb2}, {0xc1,0x53}, {0xc1,0x58}, {0xc1,0x54}, {0xc1,0x56}, {0xc1,0x52}, {0xc1,0x55}, {0x8e,0x7a}, {0xc2,0xb3}, {0xed,0xcf}, {0xf2,0xae}, {0xf2,0xad}, {0x99,0x5c}, {0xf4,0xab}, {0xc4,0x7a}, {0xc4,0x7b}, {0xf7,0x41}, {0xf5,0xe6}, {0x8e,0x7c}, {0xf7,0x40}, {0x8e,0x7d}, {0xf8,0xfd}, {0xf9,0xa4}, {0xa6,0xcd}, {0x8b,0xd9}, {0xa8,0x74}, {0x89,0xa2}, {0xcd,0xa9}, {0xaa,0xc8}, {0xac,0xf6}, {0xd0,0x4c}, {0xac,0xf4}, {0xd0,0x4a}, {0xac,0xf9}, {0xac,0xf5}, {0xac,0xfa}, {0xac,0xf8}, {0xd0,0x4b}, {0xac,0xf7}, {0xaf,0xbf}, {0xaf,0xbe}, {0xd3,0x5a}, {0xaf,0xc7}, {0xd3,0x53}, {0xd3,0x59}, {0xaf,0xc3}, {0xd3,0x52}, {0xd3,0x58}, {0xd3,0x56}, {0xaf,0xc2}, {0xaf,0xc4}, {0xd3,0x55}, {0xaf,0xbd}, {0xd3,0x54}, {0xaf,0xc8}, {0xaf,0xc5}, {0xaf,0xc9}, {0xaf,0xc6}, {0xd3,0x51}, {0xd3,0x50}, {0xd3,0x57}, {0xaf,0xc0}, {0xaf,0xbc}, {0xaf,0xc1}, {0x9e,0xd7}, {0xd6,0xf0}, {0xd6,0xe9}, {0xb5,0xb5}, {0xd6,0xe8}, {0xb2,0xcf}, {0xb2,0xd6}, {0xb2,0xd3}, {0xb2,0xd9}, {0xb2,0xd8}, {0xb2,0xd4}, {0xd6,0xe2}, {0xd6,0xe5}, {0xd6,0xe4}, {0xb2,0xd0}, {0xd6,0xe6}, {0xd6,0xef}, {0xb2,0xd1}, {0xd6,0xe3}, {0xd6,0xec}, {0xd6,0xed}, {0xb2,0xd2}, {0xd6,0xea}, {0xb2,0xd7}, {0xb2,0xcd}, {0xb2,0xd5}, {0xd6,0xe7}, {0xb2,0xcc}, {0xd6,0xeb}, {0xd6,0xee}, {0xa0,0xb6}, {0xda,0xfb}, {0xda,0xf2}, {0xb5,0xb2}, {0xda,0xf9}, {0xda,0xf6}, {0xda,0xee}, {0xda,0xf7}, {0xb5,0xb4}, {0xda,0xef}, {0xda,0xeb}, {0x9e,0x42}, {0xb8,0x6c}, {0xda,0xf4}, {0x8e,0xa4}, {0xb5,0xb1}, {0xda,0xfa}, {0xb5,0xb8}, {0xb5,0xba}, {0xda,0xed}, {0xb5,0xb9}, {0xda,0xf0}, {0xb5,0xb3}, {0xda,0xf8}, {0xda,0xf1}, {0xda,0xf5}, {0xda,0xf3}, {0xb5,0xb6}, {0xda,0xec}, {0xb5,0xbb}, {0xb2,0xce}, {0xb5,0xb7}, {0xb5,0xbc}, {0xb8,0x68}, {0xdf,0x5d}, {0xdf,0x5f}, {0xdf,0x61}, {0xdf,0x65}, {0xdf,0x5b}, {0xdf,0x59}, {0xb8,0x6a}, {0xdf,0x60}, {0xdf,0x64}, {0xdf,0x5c}, {0xdf,0x58}, {0xdf,0x57}, {0x8e,0xa7}, {0x8c,0x76}, {0xdf,0x62}, {0xdf,0x5a}, {0xdf,0x5e}, {0xb8,0x6b}, {0xb8,0x69}, {0xdf,0x66}, {0xb8,0x67}, {0xdf,0x63}, {0xe3,0x72}, {0x95,0x42}, {0xba,0xee}, {0xe3,0x6a}, {0xbd,0x78}, {0xe3,0x74}, {0xba,0xf1}, {0xe3,0x78}, {0xba,0xf7}, {0xe3,0x65}, {0x98,0x7d}, {0xe3,0x75}, {0xe3,0x62}, {0x97,0x55}, {0xe3,0x77}, {0xe3,0x66}, {0x8e,0xa8}, {0xba,0xfe}, {0xba,0xfb}, {0xe3,0x76}, {0xe3,0x70}, {0xba,0xed}, {0xba,0xf5}, {0xba,0xf4}, {0x8e,0xaa}, {0xba,0xf3}, {0xba,0xf9}, {0xe3,0x63}, {0xba,0xfa}, {0xe3,0x71}, {0xba,0xf6}, {0xba,0xec}, {0xe3,0x73}, {0xba,0xef}, {0xba,0xf0}, {0xba,0xf8}, {0xe3,0x68}, {0xe3,0x67}, {0xe3,0x64}, {0xe3,0x6c}, {0xe3,0x69}, {0xe3,0x6d}, {0xba,0xfd}, {0xe3,0x79}, {0xba,0xf2}, {0xe3,0x6e}, {0xe3,0x6f}, {0x89,0xa3}, {0xe3,0x6b}, {0x99,0x60}, {0x99,0x62}, {0xba,0xfc}, {0x94,0xfc}, {0x99,0x61}, {0xe6,0xe7}, {0xbd,0x70}, {0xbd,0x79}, {0xbd,0x75}, {0xe6,0xe4}, {0x94,0xfa}, {0xbd,0x72}, {0xbd,0x76}, {0xe6,0xf0}, {0xbd,0x6c}, {0xe6,0xe8}, {0xbd,0x74}, {0x8e,0xae}, {0x8e,0xb2}, {0xe6,0xeb}, {0xe6,0xe6}, {0xbd,0x73}, {0xbd,0x77}, {0xe6,0xe5}, {0xbd,0x71}, {0xe6,0xef}, {0xbd,0x6e}, {0xe6,0xee}, {0xe6,0xed}, {0xbd,0x7a}, {0xe5,0x72}, {0xbd,0x6d}, {0x8e,0xb0}, {0xe6,0xec}, {0xe6,0xe3}, {0xbd,0x7b}, {0xe6,0xea}, {0xbd,0x6f}, {0x99,0x63}, {0x97,0xaa}, {0xe6,0xe9}, {0x94,0xfb}, {0xbf,0xa2}, {0xbf,0xa7}, {0xbf,0x7e}, {0xea,0xd8}, {0xea,0xcf}, {0xea,0xdb}, {0xea,0xd3}, {0xea,0xd9}, {0xbf,0xa8}, {0xbf,0xa1}, {0xea,0xcc}, {0xea,0xd2}, {0xea,0xdc}, {0xea,0xd5}, {0xea,0xda}, {0xea,0xce}, {0xea,0xd6}, {0xbf,0xa3}, {0xea,0xd4}, {0xbf,0xa6}, {0xbf,0xa5}, {0xea,0xd0}, {0xea,0xd1}, {0xea,0xcd}, {0xea,0xd7}, {0xbf,0xa4}, {0xea,0xde}, {0xea,0xdd}, {0x8e,0xbb}, {0xed,0xda}, {0xed,0xd6}, {0xc1,0x5f}, {0xed,0xd0}, {0xc1,0x59}, {0xc1,0x69}, {0xed,0xdc}, {0xc1,0x61}, {0xc1,0x5d}, {0xed,0xd3}, {0xc1,0x64}, {0xc1,0x67}, {0xed,0xde}, {0xc1,0x5c}, {0xed,0xd5}, {0xc1,0x65}, {0xed,0xe0}, {0xed,0xdd}, {0xed,0xd1}, {0xc1,0x60}, {0xc1,0x5a}, {0xc1,0x68}, {0xed,0xd8}, {0xc1,0x63}, {0xed,0xd2}, {0xc1,0x5e}, {0xed,0xdf}, {0xc1,0x62}, {0xc1,0x5b}, {0xed,0xd9}, {0xc1,0x66}, {0xed,0xd7}, {0xed,0xdb}, {0xf0,0x6e}, {0xf0,0x74}, {0xc2,0xb9}, {0xf0,0x77}, {0xc2,0xb4}, {0xc2,0xb5}, {0xf0,0x6f}, {0xf0,0x76}, {0xf0,0x71}, {0xc2,0xba}, {0xc2,0xb7}, {0x8c,0xdc}, {0xf0,0x6d}, {0xc2,0xb6}, {0xf0,0x73}, {0xf0,0x75}, {0xc2,0xb8}, {0xf0,0x72}, {0xf0,0x70}, {0x98,0x76}, {0x8e,0xa1}, {0xf2,0xb8}, {0xc3,0xb7}, {0xc3,0xb8}, {0xc3,0xb4}, {0x8c,0xb4}, {0xc3,0xb5}, {0x8e,0xb7}, {0xf2,0xb4}, {0xf2,0xb2}, {0xf2,0xb6}, {0xc3,0xba}, {0xf2,0xb7}, {0xf2,0xb0}, {0xf2,0xaf}, {0xf2,0xb3}, {0xf2,0xb1}, {0xc3,0xb6}, {0xf2,0xb5}, {0xf4,0xac}, {0xc4,0x7e}, {0xc4,0x7d}, {0xf4,0xad}, {0x9d,0xa6}, {0xf4,0xaf}, {0xf4,0xae}, {0xc4,0xa1}, {0xf5,0xeb}, {0xf5,0xe8}, {0xf5,0xe9}, {0xf5,0xe7}, {0xf5,0xea}, {0xc4,0xf2}, {0xf5,0xec}, {0x9e,0xb0}, {0xc4,0xf1}, {0xf7,0x42}, {0x8e,0xb8}, {0xc5,0xd5}, {0xc5,0xd7}, {0xf7,0xee}, {0xc5,0xd6}, {0xf8,0xb9}, {0xf9,0x40}, {0xf9,0x42}, {0xf8,0xfe}, {0xf9,0x41}, {0xc6,0x6c}, {0x9d,0x70}, {0x89,0x6e}, {0x89,0x6f}, {0x89,0x70}, {0x89,0x71}, {0x89,0x72}, {0x89,0x73}, {0x89,0x74}, {0xa6,0xce}, {0x89,0x75}, {0xac,0xfb}, {0xd2,0x6f}, {0xaf,0xca}, {0xb2,0xda}, {0xda,0xfc}, {0xda,0xfd}, {0x8e,0xbc}, {0x8e,0xbd}, {0xea,0xdf}, {0xc1,0x6a}, {0xed,0xe1}, {0x8e,0xbe}, {0xc2,0xbb}, {0x9d,0xd1}, {0xf2,0xba}, {0xf2,0xb9}, {0xc4,0xa2}, {0xf5,0xed}, {0x94,0xfd}, {0xf7,0x43}, {0xc5,0xf8}, {0xca,0x49}, {0x8b,0xd7}, {0x8b,0xda}, {0xaa,0xc9}, {0xa8,0x75}, {0xd0,0x4d}, {0xd3,0x60}, {0xd3,0x5b}, {0xd3,0x5f}, {0xd3,0x5d}, {0xaf,0xcb}, {0xd3,0x5e}, {0xd3,0x5c}, {0xd6,0xf1}, {0xda,0xfe}, {0xdb,0x40}, {0xdf,0x69}, {0xdf,0x6a}, {0xb8,0x6e}, {0xb8,0x6f}, {0xdf,0x68}, {0xdf,0x6b}, {0xdf,0x67}, {0xb8,0x6d}, {0xbb,0x40}, {0xa0,0xe2}, {0xb8,0x70}, {0xe3,0x7a}, {0xbd,0x7c}, {0xe6,0xf1}, {0xbd,0x7d}, {0x9f,0xe9}, {0xbf,0xa9}, {0xea,0xe2}, {0xea,0xe0}, {0xea,0xe1}, {0xed,0xe4}, {0xed,0xe3}, {0xed,0xe2}, {0xf2,0xbb}, {0xc3,0xb9}, {0xf2,0xbc}, {0xf7,0x44}, {0xc5,0xf9}, {0xf8,0xba}, {0xa6,0xcf}, {0xaa,0xcb}, {0xaa,0xca}, {0xd0,0x4f}, {0xac,0xfc}, {0xfd,0xa8}, {0xd0,0x4e}, {0xd3,0x62}, {0x8a,0xe7}, {0xaf,0xcc}, {0xd6,0xf2}, {0xd3,0x61}, {0x8e,0xc2}, {0xb2,0xdc}, {0xd6,0xf5}, {0xd6,0xf3}, {0xd6,0xf4}, {0xb2,0xdb}, {0xdb,0x42}, {0xdb,0x43}, {0xdb,0x41}, {0x8e,0xc4}, {0xb8,0x73}, {0xdf,0x6d}, {0xdf,0x6c}, {0xdf,0x6e}, {0xb8,0x72}, {0xb8,0x71}, {0xe6,0xf2}, {0xe6,0xf4}, {0x99,0x64}, {0xbd,0x7e}, {0xe6,0xf3}, {0xea,0xe3}, {0xbf,0xaa}, {0xf0,0x79}, {0x99,0x65}, {0xf0,0x78}, {0xc3,0xbb}, {0xf2,0xbd}, {0xc3,0xbd}, {0xc3,0xbc}, {0xf4,0xb0}, {0xf5,0xee}, {0xc4,0xf3}, {0xa6,0xd0}, {0xd0,0x50}, {0xac,0xfd}, {0xd3,0x65}, {0xaf,0xce}, {0xd3,0x64}, {0xd3,0x63}, {0xaf,0xcd}, {0xd6,0xfb}, {0xd6,0xfd}, {0xd6,0xf6}, {0xd6,0xf7}, {0xb2,0xdd}, {0xd6,0xf8}, {0xb2,0xde}, {0xd6,0xfc}, {0xd6,0xf9}, {0xd6,0xfa}, {0xb2,0xdf}, {0xb5,0xbe}, {0xb5,0xbf}, {0xdb,0x44}, {0xdf,0x6f}, {0xdf,0x70}, {0x95,0x4e}, {0xe3,0x7e}, {0xbb,0x43}, {0xbb,0x41}, {0xbb,0x42}, {0xe3,0x7b}, {0xe3,0x7c}, {0xe3,0x7d}, {0xe6,0xf9}, {0x98,0xb3}, {0xe6,0xfa}, {0xbd,0xa1}, {0xe6,0xf7}, {0xe6,0xf6}, {0xe6,0xf8}, {0xe6,0xf5}, {0xbf,0xad}, {0xea,0xe4}, {0xbf,0xab}, {0xbf,0xac}, {0xed,0xe6}, {0xc1,0x6b}, {0xed,0xe5}, {0xef,0xa8}, {0xf0,0x7a}, {0xf0,0x7b}, {0xc2,0xbc}, {0x8e,0xcb}, {0xc2,0xbd}, {0xc1,0x6c}, {0xf2,0xbe}, {0xf2,0xbf}, {0xf4,0xb1}, {0xc4,0xa3}, {0xa6,0xd1}, {0x8b,0xdf}, {0xa6,0xd2}, {0xac,0xfe}, {0xaa,0xcc}, {0xaf,0xcf}, {0xd0,0x51}, {0x8e,0xce}, {0xb5,0xc0}, {0xa6,0xd3}, {0xad,0x41}, {0xd0,0x52}, {0xd0,0x53}, {0xad,0x40}, {0xad,0x42}, {0xa6,0xd4}, {0xd0,0x54}, {0xaf,0xd1}, {0xd3,0x66}, {0xaf,0xd3}, {0xaf,0xd0}, {0xaf,0xd2}, {0xd7,0x41}, {0xb2,0xe0}, {0x8e,0xcf}, {0xd7,0x40}, {0xd6,0xfe}, {0x99,0x68}, {0xdf,0x71}, {0xe3,0xa1}, {0x99,0x69}, {0xbd,0xa2}, {0xbf,0xae}, {0xea,0xe6}, {0xea,0xe5}, {0xed,0xe7}, {0x99,0x6b}, {0x8e,0xd1}, {0xf5,0xef}, {0x99,0x6c}, {0xa6,0xd5}, {0xcb,0x73}, {0xcd,0xaa}, {0xad,0x43}, {0xd0,0x55}, {0xd3,0x68}, {0x8e,0xd4}, {0x8e,0xd5}, {0xaf,0xd4}, {0xd3,0x67}, {0xaf,0xd5}, {0xd7,0x43}, {0xb2,0xe2}, {0xd7,0x42}, {0xd7,0x44}, {0xb2,0xe1}, {0xdb,0x46}, {0xdb,0x47}, {0xdb,0x45}, {0xb5,0xc1}, {0x99,0x6d}, {0xb8,0x74}, {0xb8,0x75}, {0xbb,0x45}, {0xa0,0xbe}, {0xe3,0xa3}, {0xe3,0xa2}, {0xbb,0x44}, {0x8e,0xd6}, {0xa0,0xbc}, {0xa0,0xb5}, {0xe6,0xfb}, {0xa0,0xb4}, {0xe6,0xfc}, {0xea,0xe7}, {0xc1,0x70}, {0xc1,0x6f}, {0xc1,0x6d}, {0xc1,0x6e}, {0xc1,0x71}, {0xf0,0x7c}, {0xc2,0xbf}, {0xc2,0xbe}, {0xf2,0xc0}, {0xf4,0xb2}, {0xc5,0xa5}, {0xc5,0xa4}, {0xa6,0xd6}, {0x8b,0xe0}, {0xd1,0xfb}, {0xb8,0x77}, {0xb5,0xc2}, {0xb8,0x76}, {0xbb,0x46}, {0xa6,0xd7}, {0xc9,0xa9}, {0xa6,0xd8}, {0xa6,0xd9}, {0xcd,0xab}, {0xcb,0x76}, {0xcb,0x77}, {0xa8,0x77}, {0xcb,0x74}, {0xa8,0x76}, {0xa8,0x79}, {0xcb,0x75}, {0xa8,0x7b}, {0xa8,0x7a}, {0xcb,0x78}, {0xa8,0x78}, {0x89,0xb5}, {0xaa,0xd1}, {0xaa,0xcf}, {0xcd,0xad}, {0xaa,0xce}, {0x8e,0xdd}, {0xaa,0xd3}, {0xaa,0xd5}, {0xaa,0xd2}, {0xcd,0xb0}, {0xcd,0xac}, {0xaa,0xd6}, {0xaa,0xd0}, {0xa8,0x7c}, {0xaa,0xd4}, {0xcd,0xaf}, {0x9e,0x5d}, {0x99,0x71}, {0xcd,0xae}, {0xaa,0xcd}, {0x89,0xae}, {0x9d,0xe8}, {0xd0,0x5b}, {0xad,0x47}, {0xad,0x48}, {0xd0,0x5d}, {0x95,0x65}, {0xd0,0x57}, {0xd0,0x5a}, {0xd0,0x63}, {0xd0,0x61}, {0xad,0x49}, {0xd0,0x67}, {0xad,0x4c}, {0xd0,0x64}, {0xd0,0x5c}, {0xd0,0x59}, {0xdb,0x49}, {0xd0,0x62}, {0xad,0x44}, {0xd0,0x65}, {0xd0,0x56}, {0xd0,0x5f}, {0xad,0x46}, {0xad,0x4b}, {0xd0,0x60}, {0xad,0x4f}, {0xad,0x4d}, {0xd0,0x58}, {0xad,0x4a}, {0xd0,0x5e}, {0xad,0x4e}, {0xad,0x45}, {0xd0,0x66}, {0x99,0x72}, {0x8b,0x5c}, {0xaf,0xda}, {0xaf,0xe3}, {0xaf,0xd8}, {0xaf,0xd6}, {0xd3,0x6a}, {0xaf,0xde}, {0xaf,0xdb}, {0xd3,0x6c}, {0x89,0xb1}, {0xaf,0xdd}, {0xd3,0x6b}, {0xd3,0x69}, {0xd3,0x6e}, {0xaf,0xe2}, {0xaf,0xe0}, {0xdb,0x48}, {0xd3,0x6f}, {0xd3,0x6d}, {0xaf,0xd7}, {0xa0,0xc0}, {0xaf,0xd9}, {0xaf,0xdc}, {0x8e,0xdf}, {0xaf,0xdf}, {0x95,0x66}, {0xaf,0xe1}, {0x99,0x74}, {0x99,0x76}, {0x99,0x77}, {0x99,0x79}, {0xd7,0x4e}, {0xb2,0xe4}, {0x9d,0xda}, {0xd7,0x45}, {0xd7,0x47}, {0x8e,0xe0}, {0xd7,0x48}, {0xd7,0x50}, {0xd7,0x4c}, {0xd7,0x4a}, {0xd7,0x4d}, {0xd7,0x51}, {0xb2,0xe5}, {0xb2,0xe9}, {0xd7,0x46}, {0xd7,0x4f}, {0xb2,0xe7}, {0x93,0x5c}, {0xb2,0xe6}, {0xd7,0x4b}, {0xd7,0x49}, {0xb2,0xe3}, {0xb2,0xe8}, {0x9d,0xe6}, {0x8b,0x5f}, {0x95,0x63}, {0xb5,0xc8}, {0xdb,0x51}, {0xdb,0x4f}, {0xb5,0xca}, {0x95,0x67}, {0xdb,0x4a}, {0xdf,0xa1}, {0xb5,0xc9}, {0xdb,0x4e}, {0x9d,0xe3}, {0xdb,0x4b}, {0xb5,0xc5}, {0xb5,0xcb}, {0xdb,0x50}, {0xb5,0xc7}, {0xdb,0x4d}, {0xbb,0x47}, {0xb5,0xc6}, {0xdb,0x4c}, {0xb5,0xcc}, {0xb5,0xc4}, {0xb5,0xc3}, {0x99,0x7c}, {0x99,0x7d}, {0x99,0x7e}, {0xdf,0x77}, {0xdf,0x75}, {0xdf,0x7b}, {0xdf,0x73}, {0xdf,0xa2}, {0xdf,0x78}, {0xdf,0x72}, {0xb8,0x7b}, {0xb8,0xa3}, {0xdf,0x7d}, {0xdf,0x76}, {0xb8,0x7e}, {0x8b,0x5b}, {0xb8,0x7c}, {0xdf,0x7e}, {0xb8,0x79}, {0xb8,0x78}, {0xdf,0x79}, {0xb8,0x7d}, {0xb5,0xcd}, {0xdf,0x7c}, {0xdf,0x74}, {0xb8,0x7a}, {0xb8,0xa1}, {0xb8,0xa2}, {0x99,0xa3}, {0xbb,0x4c}, {0xbb,0x48}, {0xbb,0x4d}, {0xe3,0xa6}, {0x99,0xa4}, {0xe3,0xa5}, {0xe3,0xa7}, {0xbb,0x4a}, {0xe3,0xa4}, {0xbb,0x4b}, {0xe3,0xaa}, {0xe3,0xa9}, {0xe3,0xa8}, {0xbb,0x49}, {0x99,0xa6}, {0xe7,0x41}, {0xe7,0x44}, {0xbd,0xa8}, {0xe7,0x43}, {0xbd,0xa7}, {0xbd,0xa3}, {0xbd,0xa4}, {0xbd,0xa5}, {0xe7,0x40}, {0xe6,0xfe}, {0xbd,0xa6}, {0xe7,0x42}, {0xe6,0xfd}, {0x99,0xa8}, {0xea,0xe9}, {0xea,0xf3}, {0xbf,0xb1}, {0xbf,0xb0}, {0x8a,0xbe}, {0xea,0xed}, {0xea,0xef}, {0xea,0xea}, {0xea,0xee}, {0xea,0xe8}, {0xea,0xf1}, {0xbf,0xaf}, {0xea,0xf0}, {0xea,0xec}, {0x9e,0x61}, {0xea,0xf2}, {0xea,0xeb}, {0xc1,0x74}, {0xed,0xe8}, {0xed,0xee}, {0xc1,0x78}, {0xc1,0x7a}, {0xc1,0x77}, {0xc1,0x76}, {0x99,0xaa}, {0xc1,0x75}, {0xc1,0x73}, {0xed,0xe9}, {0xed,0xec}, {0xc1,0x72}, {0xed,0xed}, {0xa0,0xc8}, {0xc1,0x79}, {0xed,0xeb}, {0xed,0xea}, {0xc2,0xc0}, {0xc2,0xc1}, {0xf0,0xa1}, {0xf0,0x7d}, {0xf0,0x7e}, {0xf2,0xc2}, {0xf2,0xc1}, {0xc3,0xbe}, {0xf4,0xb4}, {0xc4,0xa4}, {0xf4,0xb3}, {0xf5,0xf0}, {0xf7,0x45}, {0xc5,0xa6}, {0xf9,0x43}, {0xf9,0x44}, {0xc5,0xd8}, {0xa6,0xda}, {0x99,0xab}, {0xaa,0xd7}, {0xdb,0x52}, {0xbb,0x4e}, {0xc1,0x7b}, {0xed,0xef}, {0xa6,0xdb}, {0xaf,0xe5}, {0xaf,0xe4}, {0xdb,0x53}, {0xfe,0xc4}, {0xea,0xf4}, {0xa6,0xdc}, {0xad,0x50}, {0x98,0xc2}, {0xdb,0x54}, {0xdb,0x55}, {0xdb,0x56}, {0xbb,0x4f}, {0xbf,0xb2}, {0xa6,0xdd}, {0xaa,0xd8}, {0xd0,0x68}, {0xaf,0xe6}, {0xd3,0x70}, {0xb2,0xea}, {0xdb,0x57}, {0xb8,0xa4}, {0xbb,0x50}, {0xbf,0xb3}, {0xc1,0x7c}, {0xc2,0xc2}, {0xf4,0xb5}, {0xa6,0xde}, {0xaa,0xd9}, {0xaf,0xe7}, {0xd7,0x52}, {0xb5,0xce}, {0xbb,0x51}, {0xe3,0xab}, {0xe7,0x45}, {0x8e,0xe8}, {0xa0,0xba}, {0xa6,0xdf}, {0xb5,0xcf}, {0xdf,0xa3}, {0xbb,0x52}, {0xa6,0xe0}, {0xcd,0xb1}, {0xd0,0x69}, {0xad,0x51}, {0xd3,0x72}, {0xfd,0x77}, {0xaf,0xea}, {0x8e,0xee}, {0xaf,0xe8}, {0xaf,0xe9}, {0xaf,0xeb}, {0x9e,0xbf}, {0xd3,0x71}, {0xd7,0x57}, {0xd7,0x54}, {0xd7,0x56}, {0xb2,0xeb}, {0xb2,0xed}, {0xb2,0xec}, {0xd7,0x53}, {0xb2,0xee}, {0xd7,0x55}, {0xdb,0x58}, {0xdb,0x59}, {0x89,0xc2}, {0xdb,0x5a}, {0xdf,0xa6}, {0xdf,0xa7}, {0xdf,0xa5}, {0xdf,0xa8}, {0xb8,0xa5}, {0xdf,0xa4}, {0xbb,0x53}, {0xe7,0x4a}, {0xe7,0x46}, {0xe7,0x49}, {0xe7,0x4b}, {0xe7,0x48}, {0xe7,0x47}, {0x99,0xac}, {0xea,0xf5}, {0xea,0xf6}, {0xea,0xf7}, {0xbf,0xb4}, {0xbf,0xb5}, {0xed,0xf1}, {0xed,0xf0}, {0xed,0xf2}, {0xf0,0xa3}, {0xf0,0xa2}, {0xf2,0xc4}, {0x95,0x6b}, {0xf2,0xc5}, {0xf2,0xc3}, {0x95,0x6c}, {0xc4,0xa5}, {0xf4,0xb6}, {0xf4,0xb7}, {0xf7,0x46}, {0xf7,0xef}, {0xf8,0xbb}, {0xa6,0xe1}, {0xa8,0x7d}, {0xc1,0x7d}, {0xa6,0xe2}, {0xd7,0x58}, {0xdb,0x5b}, {0x99,0xaf}, {0xc6,0x41}, {0xca,0x4a}, {0x99,0x4a}, {0x89,0x76}, {0x8f,0x48}, {0xca,0x4b}, {0xca,0x4d}, {0xa6,0xe3}, {0xca,0x4e}, {0xca,0x4c}, {0xcb,0xa2}, {0xcb,0xa3}, {0xcb,0x7b}, {0xfb,0xee}, {0xcb,0xa1}, {0xa8,0xa1}, {0xa8,0xa2}, {0xcb,0x7c}, {0xcb,0x7a}, {0xcb,0x79}, {0xcb,0x7d}, {0xa8,0x7e}, {0xcb,0x7e}, {0xd0,0x6a}, {0xcd,0xb6}, {0xaa,0xdc}, {0xcd,0xb5}, {0xcd,0xb7}, {0xaa,0xdb}, {0xcd,0xbc}, {0xaa,0xdf}, {0xcd,0xb2}, {0xcd,0xc0}, {0xcd,0xc6}, {0xaa,0xe6}, {0xcd,0xc3}, {0xaa,0xe3}, {0x99,0xae}, {0xcd,0xb9}, {0xcd,0xbf}, {0xcd,0xc1}, {0x8e,0xfb}, {0xcd,0xb4}, {0xaa,0xe2}, {0xaa,0xdd}, {0xcd,0xba}, {0xaa,0xe4}, {0xaa,0xe7}, {0xaa,0xe1}, {0xaa,0xda}, {0xcd,0xbe}, {0xcd,0xb8}, {0xcd,0xc5}, {0xaa,0xe9}, {0xaa,0xe5}, {0xaa,0xe0}, {0xcd,0xbd}, {0xaf,0xec}, {0xcd,0xbb}, {0xaa,0xde}, {0xaa,0xe8}, {0x8c,0xd0}, {0xcd,0xb3}, {0xcd,0xc2}, {0xcd,0xc4}, {0x8b,0x52}, {0x99,0xb0}, {0x89,0x77}, {0x8f,0x41}, {0xad,0x62}, {0xad,0x5c}, {0xad,0x64}, {0xad,0x61}, {0xd0,0x71}, {0xd0,0x74}, {0xad,0x5d}, {0x99,0xb1}, {0xd0,0x6b}, {0xad,0x56}, {0xad,0x60}, {0xad,0x63}, {0xad,0x65}, {0xd0,0xa2}, {0xd0,0x77}, {0x8f,0x49}, {0xad,0x55}, {0xd0,0xa1}, {0xad,0x59}, {0xad,0x57}, {0xad,0x52}, {0xd0,0x6f}, {0xd0,0x7e}, {0xd0,0x73}, {0xd0,0x76}, {0xd0,0xa5}, {0xfa,0x4d}, {0xad,0x66}, {0xd0,0x7d}, {0xad,0x5e}, {0xd0,0x78}, {0xd0,0xa4}, {0xd0,0x75}, {0xd0,0x79}, {0xd0,0x7c}, {0x9d,0xe4}, {0x8c,0xb5}, {0xd0,0x6d}, {0xd0,0xa3}, {0xd0,0x7b}, {0xfb,0xe9}, {0x9b,0x54}, {0xd0,0x6c}, {0x99,0xb2}, {0xd0,0x70}, {0xad,0x5f}, {0xad,0x5a}, {0xad,0x53}, {0xad,0x58}, {0xad,0x54}, {0xad,0x67}, {0xd0,0x6e}, {0xd3,0xa5}, {0xad,0x5b}, {0x9e,0x68}, {0xd0,0x7a}, {0xce,0x41}, {0xd3,0xa8}, {0xaf,0xfa}, {0x8f,0x4a}, {0xd3,0x76}, {0x8f,0x42}, {0xd3,0xa3}, {0xd3,0x7d}, {0x8f,0x51}, {0xd3,0xb2}, {0xd3,0xaa}, {0xd3,0x7e}, {0xd3,0xa9}, {0xd3,0x78}, {0xd3,0x7c}, {0xd3,0xb5}, {0xaf,0xfd}, {0xd3,0xad}, {0xd3,0xa4}, {0xaf,0xed}, {0xd3,0xb3}, {0xd3,0x74}, {0xd3,0xac}, {0xaf,0xfc}, {0xaf,0xf7}, {0xd3,0x73}, {0xaf,0xf5}, {0xaf,0xf4}, {0xaf,0xf9}, {0xd3,0xab}, {0xaf,0xf1}, {0xaf,0xf8}, {0xd0,0x72}, {0xdb,0x5c}, {0xd3,0xa6}, {0x98,0x46}, {0xd3,0x7a}, {0xaf,0xfb}, {0xd3,0x7b}, {0xd3,0xa1}, {0xaf,0xfe}, {0xd3,0x75}, {0xd3,0xaf}, {0xd3,0xae}, {0xd3,0xb6}, {0xaf,0xf3}, {0xaf,0xf0}, {0xd3,0xb4}, {0xd3,0xb0}, {0xd3,0xa7}, {0xd3,0xa2}, {0xaf,0xf6}, {0xaf,0xf2}, {0xd3,0x77}, {0xaf,0xee}, {0xd3,0xb1}, {0xaf,0xef}, {0xd3,0x79}, {0x99,0xb4}, {0x8e,0xf5}, {0xfd,0x55}, {0x9c,0xcd}, {0x89,0x78}, {0xd7,0x5e}, {0xd7,0x60}, {0xd7,0x65}, {0xd7,0x79}, {0xb2,0xfc}, {0xb2,0xf2}, {0xd7,0x5d}, {0xb2,0xfd}, {0xb2,0xfe}, {0xd7,0x68}, {0xd7,0x6f}, {0xd7,0x75}, {0xd7,0x62}, {0xd7,0x69}, {0x8f,0x53}, {0xb3,0x40}, {0xd7,0x77}, {0xd7,0x72}, {0xb2,0xfa}, {0xb2,0xf8}, {0xd7,0x6e}, {0xd7,0x6a}, {0xd7,0x5c}, {0xb2,0xef}, {0xd7,0x61}, {0xd7,0x59}, {0x8f,0x6f}, {0xb2,0xf7}, {0xb2,0xf9}, {0xd7,0x66}, {0xd7,0x63}, {0xb2,0xf4}, {0xd7,0x73}, {0xb2,0xf1}, {0xd7,0x64}, {0xd7,0x7a}, {0xd7,0x6c}, {0x8e,0x63}, {0xd7,0x6b}, {0xb2,0xf0}, {0xb2,0xfb}, {0xb2,0xf3}, {0xd7,0x5a}, {0xd7,0x5f}, {0xd7,0x70}, {0xd7,0x76}, {0xb3,0x41}, {0xd7,0x5b}, {0xd7,0x67}, {0xd7,0x6d}, {0xb2,0xf6}, {0x8f,0x56}, {0xd7,0x78}, {0xd7,0x71}, {0xd7,0x74}, {0xfe,0x76}, {0xb2,0xf5}, {0x9f,0xc6}, {0xdb,0x6c}, {0xdb,0x60}, {0xb5,0xd7}, {0xdb,0x7d}, {0xdb,0xa7}, {0xdb,0xaa}, {0xb5,0xd5}, {0xdb,0x68}, {0xdb,0xa3}, {0xdb,0x69}, {0xdb,0x77}, {0xb5,0xe2}, {0xdb,0x73}, {0xb5,0xdf}, {0xfa,0xac}, {0xdb,0x74}, {0xdb,0x5d}, {0xdb,0xa4}, {0x8f,0x58}, {0xb5,0xe8}, {0xdb,0xa1}, {0xdb,0x75}, {0xdb,0xac}, {0xdb,0x70}, {0xdf,0xc8}, {0xdb,0xaf}, {0xb5,0xe6}, {0xdb,0x6e}, {0xdb,0x7a}, {0xb5,0xe9}, {0xb5,0xd4}, {0xdb,0x72}, {0xdb,0xad}, {0xdb,0x6b}, {0xdb,0x64}, {0xdb,0x6f}, {0xdb,0x63}, {0xdb,0x61}, {0xb5,0xd0}, {0xdb,0xa5}, {0xdb,0x6a}, {0xdb,0xa8}, {0x98,0x48}, {0xdb,0xa9}, {0xb5,0xd8}, {0xb5,0xdd}, {0xb5,0xd9}, {0xb5,0xe1}, {0xdb,0x7e}, {0xb5,0xda}, {0xdb,0x76}, {0xdb,0x66}, {0xb5,0xd2}, {0xdb,0x5e}, {0xdb,0xa2}, {0xdb,0xab}, {0xdb,0x65}, {0xb5,0xe0}, {0xdb,0xb0}, {0xdb,0x71}, {0xdb,0x6d}, {0xb5,0xd1}, {0xb5,0xe5}, {0x99,0xb7}, {0xdb,0x7c}, {0xb5,0xe7}, {0xdb,0x78}, {0xb5,0xdc}, {0xb5,0xd6}, {0xb5,0xde}, {0xb5,0xd3}, {0xb5,0xe4}, {0xdb,0x79}, {0xdb,0x67}, {0xdb,0x7b}, {0xdb,0x62}, {0xdb,0xa6}, {0x96,0x65}, {0xfa,0x6c}, {0x9d,0xe7}, {0xdb,0xae}, {0x9e,0x62}, {0x96,0xcc}, {0x8e,0x67}, {0xdb,0x5f}, {0xfc,0x75}, {0x98,0x7e}, {0xdf,0xc7}, {0xdf,0xdd}, {0xb8,0x55}, {0xdf,0xcc}, {0xfd,0xb9}, {0xdf,0xca}, {0xdf,0xb5}, {0xb8,0xa9}, {0xdf,0xc5}, {0xdf,0xd9}, {0xdf,0xc1}, {0xb8,0xb1}, {0xdf,0xd8}, {0xdf,0xbf}, {0xb5,0xe3}, {0xdf,0xcf}, {0xdf,0xc0}, {0xdf,0xd6}, {0xb8,0xb0}, {0xb8,0xa8}, {0x97,0xfc}, {0xdf,0xaa}, {0xdf,0xb2}, {0xdf,0xcb}, {0xdf,0xc3}, {0xdf,0xdc}, {0xdf,0xc6}, {0xb8,0xb6}, {0xdf,0xd7}, {0x98,0xf9}, {0xb8,0xad}, {0x8f,0x66}, {0xdf,0xc9}, {0xdf,0xd1}, {0xdf,0xb6}, {0xdf,0xd0}, {0xdf,0xe1}, {0xdf,0xb1}, {0xdf,0xd2}, {0x95,0x6e}, {0xdf,0xdf}, {0x92,0x45}, {0xdf,0xab}, {0xb5,0xdb}, {0x8f,0x60}, {0xdf,0xb9}, {0xdf,0xb8}, {0xb8,0xaf}, {0x9e,0xd1}, {0xdf,0xbc}, {0xdf,0xbe}, {0xdf,0xcd}, {0xdf,0xde}, {0xb8,0xb2}, {0xfe,0xcd}, {0xb8,0xb3}, {0x99,0xb9}, {0xdf,0xb0}, {0xb8,0xab}, {0xdf,0xb4}, {0xdf,0xda}, {0xb8,0xb4}, {0xb8,0xac}, {0xb8,0xae}, {0xb8,0xb5}, {0xdf,0xe0}, {0xdf,0xd3}, {0xdf,0xce}, {0x8f,0x62}, {0x97,0x4c}, {0xdf,0xbb}, {0xdf,0xba}, {0xb8,0xaa}, {0xdf,0xac}, {0xb8,0xa7}, {0xdf,0xc4}, {0xdf,0xad}, {0xdf,0xc2}, {0xdf,0xb7}, {0xdf,0xdb}, {0x91,0xc7}, {0x95,0x5f}, {0xb8,0xa6}, {0xdf,0xb3}, {0x99,0xbb}, {0xdf,0xaf}, {0xdf,0xd5}, {0xdf,0xae}, {0xbb,0x60}, {0xe3,0xd3}, {0x8e,0x6d}, {0x8f,0x71}, {0xe3,0xc2}, {0x94,0xcb}, {0xe3,0xac}, {0xe3,0xca}, {0xbb,0x58}, {0xe3,0xbb}, {0xe3,0xc5}, {0xbb,0x5b}, {0xe3,0xbe}, {0xbb,0x59}, {0xe3,0xaf}, {0xe3,0xcd}, {0xe3,0xae}, {0xe3,0xc1}, {0x95,0xb1}, {0xe3,0xad}, {0xe3,0xbf}, {0xe3,0xc8}, {0xe3,0xc6}, {0xe3,0xba}, {0xe3,0xb5}, {0xe3,0xb3}, {0x9a,0xf2}, {0xe3,0xb4}, {0xe3,0xc7}, {0xe3,0xd2}, {0xe3,0xbc}, {0xbb,0x5a}, {0xe3,0xb7}, {0xe3,0xcb}, {0xbb,0x5d}, {0xe3,0xb6}, {0xe3,0xb0}, {0xe3,0xc0}, {0xbb,0x61}, {0x96,0xc3}, {0x99,0xbd}, {0xbb,0x55}, {0xbb,0x5e}, {0xe3,0xb8}, {0xe3,0xb2}, {0xbb,0x57}, {0xdf,0xd4}, {0xbb,0x56}, {0xe3,0xc3}, {0xbb,0x54}, {0xbb,0x63}, {0xbb,0x5c}, {0xe3,0xc4}, {0xe3,0xb9}, {0xe3,0xb1}, {0xe3,0xcc}, {0xe3,0xbd}, {0xbb,0x62}, {0xe3,0xd0}, {0xbb,0x5f}, {0xe3,0xcf}, {0xe3,0xc9}, {0xe3,0xce}, {0xa0,0xcf}, {0xe3,0xd1}, {0x8f,0x6d}, {0x99,0xbe}, {0x8e,0xf4}, {0x8f,0x72}, {0x95,0xe4}, {0xe7,0x73}, {0xe7,0x74}, {0xe7,0x67}, {0xe7,0x66}, {0xe7,0x62}, {0xbd,0xb4}, {0xbd,0xac}, {0xe7,0x76}, {0xe7,0x75}, {0xdf,0xa9}, {0xe7,0x5f}, {0xe7,0x63}, {0xe7,0x5d}, {0xe7,0x70}, {0xe7,0x61}, {0x99,0xbf}, {0xe7,0x77}, {0xe7,0x5a}, {0xe7,0x58}, {0xe7,0x64}, {0xe7,0x6e}, {0xe7,0x69}, {0xbd,0xb6}, {0xe7,0x4f}, {0xe7,0x6d}, {0x92,0x42}, {0xfb,0xa5}, {0xbd,0xb7}, {0xdf,0xbd}, {0xe7,0x5b}, {0xe7,0x52}, {0xe7,0x55}, {0xe7,0x7b}, {0xe7,0x5c}, {0xe7,0x53}, {0xe7,0x51}, {0xe7,0x4e}, {0x99,0xc0}, {0xbd,0xb0}, {0xe7,0x65}, {0xbd,0xaf}, {0xbd,0xb3}, {0xe7,0x60}, {0xe7,0x68}, {0xbd,0xa9}, {0xe7,0x78}, {0xe7,0x7c}, {0xbd,0xab}, {0xe7,0x57}, {0xe7,0x6b}, {0xe7,0x6f}, {0xe7,0x54}, {0xe7,0x79}, {0xbd,0xb2}, {0xbd,0xb1}, {0xe7,0x4c}, {0xbd,0xb5}, {0xe7,0x72}, {0xe7,0x56}, {0xe7,0x6a}, {0xe7,0x50}, {0xe7,0x5e}, {0xe7,0x59}, {0xbd,0xad}, {0xbd,0xae}, {0xe7,0x6c}, {0xe7,0x7d}, {0xe7,0x7a}, {0xe7,0x71}, {0xfd,0xb4}, {0x8f,0x77}, {0x99,0xc1}, {0xe7,0x4d}, {0xbd,0xaa}, {0xeb,0x49}, {0xeb,0x40}, {0xeb,0x43}, {0xfa,0xb9}, {0xbf,0xbb}, {0xeb,0x45}, {0xea,0xf9}, {0xeb,0x41}, {0xeb,0x47}, {0xbf,0xb8}, {0xbf,0xbc}, {0xbf,0xb6}, {0x8f,0x40}, {0xfa,0x44}, {0xea,0xfb}, {0xeb,0x4c}, {0xeb,0x46}, {0x99,0xc2}, {0xea,0xfc}, {0xeb,0x55}, {0xeb,0x4f}, {0xea,0xf8}, {0xee,0x46}, {0xea,0xfe}, {0xbf,0xb7}, {0x8f,0x5c}, {0xeb,0x4a}, {0xeb,0x54}, {0xbf,0xbf}, {0x8c,0xbd}, {0xeb,0x51}, {0xea,0xfd}, {0xeb,0x44}, {0xeb,0x48}, {0xeb,0x42}, {0xeb,0x56}, {0xeb,0x53}, {0xeb,0x50}, {0xbf,0xb9}, {0xbf,0xba}, {0xbf,0xbe}, {0xea,0xfa}, {0xeb,0x57}, {0xbf,0xbd}, {0xeb,0x4d}, {0x99,0xc4}, {0x99,0xc5}, {0xeb,0x4b}, {0x8f,0x7b}, {0xeb,0x4e}, {0xee,0x53}, {0xee,0x40}, {0xee,0x45}, {0xee,0x52}, {0xee,0x44}, {0xed,0xfb}, {0xee,0x41}, {0xc1,0xa2}, {0xed,0xf4}, {0xee,0x4d}, {0xee,0x4f}, {0xed,0xf3}, {0xc1,0xa1}, {0xee,0x51}, {0xee,0x49}, {0xc1,0xa8}, {0xee,0x50}, {0xee,0x42}, {0xc1,0xaa}, {0xed,0xf9}, {0xeb,0x52}, {0xee,0x4a}, {0xee,0x47}, {0xed,0xf5}, {0xee,0x55}, {0xc1,0xa4}, {0xc1,0xa5}, {0xed,0xf7}, {0xee,0x48}, {0x8c,0xb6}, {0xee,0x54}, {0xee,0x4b}, {0xed,0xfd}, {0xc1,0xa7}, {0xc1,0xa3}, {0xee,0x4c}, {0xed,0xfe}, {0xee,0x56}, {0xed,0xf8}, {0xee,0x43}, {0xee,0x4e}, {0xed,0xfa}, {0xed,0xfc}, {0xc2,0xcb}, {0xed,0xf6}, {0xc1,0xa9}, {0xc2,0xc4}, {0xc1,0x7e}, {0xc1,0xa6}, {0xc2,0xc8}, {0xf0,0xb3}, {0xf0,0xa9}, {0xf0,0xa4}, {0xf0,0xaa}, {0xf0,0xb4}, {0xf0,0xb8}, {0xf0,0xb7}, {0xc2,0xca}, {0xc2,0xc9}, {0xf0,0xab}, {0xf0,0xb9}, {0xf0,0xae}, {0xf0,0xa6}, {0x8f,0xa3}, {0xf0,0xa8}, {0xf0,0xa7}, {0xf0,0xad}, {0xf0,0xb2}, {0xf0,0xa5}, {0xf0,0xac}, {0xf0,0xb1}, {0xc2,0xc7}, {0xf0,0xaf}, {0xc2,0xc5}, {0xf0,0xb0}, {0xc2,0xc3}, {0xc2,0xc6}, {0xf2,0xd5}, {0xf0,0xb5}, {0xc3,0xc2}, {0x8c,0xce}, {0xf2,0xcd}, {0xf2,0xd1}, {0xf2,0xc9}, {0xf2,0xcc}, {0xf2,0xd4}, {0xc3,0xc0}, {0xf2,0xd9}, {0xf2,0xd2}, {0x99,0xc6}, {0xf2,0xca}, {0xf2,0xda}, {0xf2,0xd3}, {0xc3,0xc3}, {0xc3,0xc4}, {0xf2,0xd7}, {0xf2,0xcb}, {0xc3,0xbf}, {0xc3,0xc1}, {0xf2,0xc6}, {0xf2,0xce}, {0xf2,0xc8}, {0x96,0xcd}, {0xf2,0xd8}, {0xf2,0xd6}, {0xf2,0xc7}, {0xf2,0xcf}, {0xf4,0xbe}, {0xc3,0xc5}, {0xf2,0xd0}, {0xc4,0xa7}, {0xc4,0xa9}, {0xc4,0xa6}, {0x96,0xc7}, {0xf4,0xc3}, {0xf4,0xbb}, {0xf4,0xb9}, {0xf4,0xbd}, {0xf4,0xba}, {0x8f,0xa5}, {0xf4,0xbf}, {0xf4,0xc1}, {0xc4,0xaa}, {0xc4,0xac}, {0xf4,0xc0}, {0xc4,0xad}, {0xc4,0xab}, {0xf4,0xc2}, {0xfa,0xbb}, {0x8c,0x61}, {0x95,0x70}, {0xc4,0xa8}, {0x93,0x68}, {0x8f,0x7e}, {0xc4,0xf4}, {0xf5,0xf1}, {0xf5,0xf7}, {0xc4,0xf6}, {0xf4,0xbc}, {0xf5,0xf6}, {0xf5,0xfd}, {0xf5,0xf4}, {0xf5,0xfb}, {0xf5,0xfa}, {0xf4,0xb8}, {0xf5,0xf5}, {0xf0,0xb6}, {0xf5,0xfe}, {0xf5,0xf3}, {0xf5,0xf8}, {0x8f,0xaa}, {0xf5,0xfc}, {0xf5,0xf2}, {0xf7,0x4a}, {0xc4,0xf5}, {0xf5,0xf9}, {0xa0,0x50}, {0xf7,0xf4}, {0xf7,0x4b}, {0xf7,0x49}, {0xf7,0x47}, {0xf7,0x48}, {0xf7,0x4c}, {0xc5,0xd9}, {0xf7,0xf2}, {0xf7,0xf0}, {0xf7,0xf5}, {0xf7,0xf3}, {0xf7,0xf6}, {0xc5,0xda}, {0xf7,0xf1}, {0x90,0xd3}, {0xf8,0xbc}, {0x95,0x56}, {0xf9,0x45}, {0xf9,0x46}, {0xf9,0x47}, {0xf9,0xc7}, {0xf9,0xbd}, {0xca,0x4f}, {0xaa,0xea}, {0xad,0x68}, {0xd3,0xb8}, {0xd3,0xb7}, {0xb0,0x40}, {0xb3,0x42}, {0xd7,0x7c}, {0xd7,0x7b}, {0xb5,0xea}, {0xb8,0xb8}, {0xb8,0xb7}, {0xb8,0xb9}, {0xe3,0xd4}, {0xe7,0x7e}, {0xeb,0x58}, {0xeb,0x5a}, {0xeb,0x59}, {0xc1,0xab}, {0xee,0x57}, {0xf0,0xba}, {0xf9,0xa5}, {0xa6,0xe4}, {0x8f,0xb8}, {0xcd,0xc9}, {0xcd,0xca}, {0xcd,0xc8}, {0xcd,0xc7}, {0xaa,0xeb}, {0x99,0xc8}, {0xd0,0xa9}, {0xd0,0xa7}, {0xd0,0xa6}, {0xad,0x69}, {0xad,0x6b}, {0xad,0x6a}, {0xd0,0xa8}, {0x8f,0xaf}, {0xd3,0xc4}, {0xd3,0xc1}, {0xd3,0xbf}, {0xb0,0x41}, {0xd3,0xc2}, {0xb0,0x46}, {0xd3,0xbc}, {0xd3,0xcb}, {0xd3,0xcd}, {0xd3,0xbd}, {0x99,0xc9}, {0xb0,0x43}, {0xd3,0xce}, {0xd3,0xc9}, {0xd3,0xbb}, {0xd3,0xc0}, {0xd3,0xca}, {0xd3,0xc6}, {0xd3,0xc3}, {0xb0,0x48}, {0xd3,0xcc}, {0xd3,0xbe}, {0x95,0x79}, {0xd3,0xc7}, {0xd3,0xb9}, {0xb0,0x47}, {0xb0,0x44}, {0xd3,0xc5}, {0xd3,0xc8}, {0xd3,0xba}, {0xb0,0x45}, {0xb0,0x42}, {0x9f,0x49}, {0xb3,0x4c}, {0xd7,0xa5}, {0xb3,0x4b}, {0x99,0xca}, {0xd7,0xa8}, {0xd7,0xab}, {0xb3,0x48}, {0xb3,0x46}, {0xd7,0x7e}, {0xd7,0xa9}, {0xd7,0xa7}, {0xd7,0xa4}, {0xd7,0xac}, {0xd7,0xad}, {0xd7,0xaf}, {0xd7,0xb0}, {0xd7,0x7d}, {0xb3,0x45}, {0xd7,0xa2}, {0xd7,0xa1}, {0xd7,0xae}, {0xb3,0x47}, {0xd7,0xa3}, {0xb3,0x49}, {0xb3,0x44}, {0xd7,0xa6}, {0xb3,0x4d}, {0xb3,0x4a}, {0xd7,0xaa}, {0xb5,0xf1}, {0xdb,0xbf}, {0xdb,0xb4}, {0xb5,0xee}, {0xdf,0xe7}, {0xdb,0xbd}, {0xdb,0xb1}, {0xb5,0xec}, {0xdb,0xb6}, {0xb5,0xef}, {0xdb,0xba}, {0xdb,0xb8}, {0xb5,0xf2}, {0xb5,0xeb}, {0xdb,0xb2}, {0xdb,0xb5}, {0xb5,0xf0}, {0xdb,0xb3}, {0xdb,0xbe}, {0xdb,0xbc}, {0xdb,0xb7}, {0xdb,0xb9}, {0xdb,0xbb}, {0xb5,0xed}, {0x99,0xcb}, {0xdf,0xe8}, {0xdf,0xee}, {0xdf,0xe4}, {0xdf,0xea}, {0xb8,0xba}, {0xdf,0xe6}, {0xb8,0xc0}, {0xb8,0xbf}, {0xb8,0xbe}, {0xdf,0xed}, {0xb8,0xc1}, {0xb8,0xc2}, {0xdf,0xe3}, {0xdf,0xf0}, {0xb8,0xc3}, {0xb8,0xbd}, {0xb8,0xbc}, {0xdf,0xec}, {0xb8,0xc4}, {0xdf,0xe2}, {0xdf,0xe5}, {0xdf,0xef}, {0xdf,0xeb}, {0xe3,0xf4}, {0xe3,0xe9}, {0xb8,0xbb}, {0xbb,0x6a}, {0xe3,0xdd}, {0xe3,0xf2}, {0xe3,0xde}, {0xbb,0x65}, {0xe3,0xdb}, {0xe3,0xe4}, {0xe3,0xdc}, {0xbb,0x67}, {0xe3,0xd6}, {0xe3,0xf1}, {0xbb,0x68}, {0xe3,0xee}, {0xe3,0xef}, {0xe3,0xd7}, {0xbb,0x6d}, {0xe3,0xe6}, {0xe3,0xe0}, {0xe3,0xe7}, {0xe3,0xda}, {0xe3,0xf3}, {0xe3,0xeb}, {0xe3,0xe5}, {0xe3,0xd5}, {0xbb,0x69}, {0xe3,0xec}, {0xbb,0x6c}, {0xe3,0xf0}, {0xe3,0xea}, {0xbb,0x66}, {0xe3,0xe8}, {0xe3,0xe2}, {0xbb,0x64}, {0xe3,0xd9}, {0xe3,0xe1}, {0xe3,0xed}, {0xe3,0xdf}, {0xe3,0xe3}, {0xbd,0xc1}, {0xdf,0xe9}, {0xe7,0xb2}, {0xe7,0xbb}, {0xe7,0xb1}, {0xe7,0xad}, {0xe7,0xaa}, {0xbd,0xc2}, {0xe7,0xa8}, {0xbb,0x6b}, {0xe7,0xa1}, {0xbd,0xc0}, {0xe7,0xa7}, {0xbd,0xbf}, {0xe7,0xac}, {0xe7,0xa9}, {0xe7,0xb9}, {0xe7,0xb4}, {0xe7,0xae}, {0xe7,0xb3}, {0xbd,0xbb}, {0xe7,0xab}, {0xe7,0xbe}, {0xe7,0xa2}, {0xe7,0xa3}, {0xe7,0xba}, {0xbd,0xbc}, {0xe7,0xbf}, {0xbd,0xbe}, {0xe7,0xc0}, {0xe7,0xb0}, {0xe3,0xd8}, {0xe7,0xb6}, {0xe7,0xaf}, {0xe7,0xb8}, {0xe7,0xb5}, {0x9d,0xd5}, {0x8f,0xb0}, {0xe7,0xa6}, {0xbd,0xb9}, {0xe7,0xbd}, {0xbd,0xba}, {0xe7,0xa4}, {0xbd,0xbd}, {0xeb,0x64}, {0xe7,0xb7}, {0xe7,0xbc}, {0xfa,0x7a}, {0xeb,0x61}, {0xbd,0xb8}, {0xbf,0xc0}, {0xeb,0x6b}, {0xeb,0x67}, {0x9e,0x5f}, {0xeb,0x65}, {0xeb,0x60}, {0xeb,0x6f}, {0x99,0xcd}, {0xa0,0xc9}, {0xbf,0xc4}, {0xeb,0x5c}, {0xeb,0x68}, {0xeb,0x69}, {0xeb,0x5f}, {0xeb,0x5e}, {0xeb,0x6c}, {0xeb,0x62}, {0xeb,0x5d}, {0xeb,0x63}, {0xeb,0x6e}, {0xeb,0x5b}, {0xeb,0x6d}, {0xeb,0x6a}, {0xbf,0xc2}, {0xbf,0xc1}, {0xbf,0xc3}, {0xeb,0x66}, {0xf0,0xcb}, {0x9a,0xdb}, {0xa0,0xc6}, {0xee,0x59}, {0xc1,0xb1}, {0xee,0x5d}, {0xee,0x5a}, {0xee,0x61}, {0xee,0x67}, {0xee,0x5c}, {0x8f,0xb4}, {0xee,0x70}, {0xc1,0xae}, {0xee,0x6a}, {0xee,0x5f}, {0xee,0x6b}, {0xee,0x66}, {0xee,0x6d}, {0xee,0x5e}, {0xc1,0xb3}, {0xc1,0xb2}, {0xee,0x60}, {0xee,0x6e}, {0xee,0x58}, {0xee,0x6c}, {0xc1,0xac}, {0xa0,0xd7}, {0xee,0x64}, {0xee,0x63}, {0xee,0x68}, {0xee,0x5b}, {0xc1,0xb0}, {0xc1,0xb4}, {0xee,0x62}, {0xee,0x69}, {0xc1,0xb5}, {0xee,0x65}, {0xa0,0xc7}, {0xc1,0xad}, {0xc1,0xaf}, {0xf0,0xc7}, {0xf0,0xc5}, {0xa0,0x43}, {0xf0,0xcc}, {0xf0,0xc9}, {0xf0,0xcd}, {0x8f,0xb5}, {0xf0,0xbe}, {0xf0,0xc6}, {0xf0,0xd1}, {0xee,0x6f}, {0xf0,0xc2}, {0xc2,0xcf}, {0xe7,0xa5}, {0xf0,0xbd}, {0xf0,0xca}, {0xf0,0xc4}, {0xf0,0xc1}, {0xf0,0xbc}, {0xf0,0xbb}, {0xf0,0xd0}, {0xf0,0xc0}, {0xf0,0xbf}, {0xc2,0xcd}, {0xf0,0xc8}, {0x8f,0xb2}, {0xc2,0xcc}, {0xc2,0xce}, {0xf0,0xc3}, {0xf0,0xcf}, {0xa0,0x61}, {0xf2,0xde}, {0xf2,0xdf}, {0xc3,0xc9}, {0xf2,0xdc}, {0xc3,0xc6}, {0xf2,0xe4}, {0xc3,0xca}, {0xf2,0xe6}, {0xf2,0xdb}, {0xf0,0xce}, {0xf2,0xe8}, {0xf2,0xdd}, {0x9e,0x5e}, {0xc3,0xc7}, {0xf2,0xe3}, {0xf2,0xe5}, {0xf2,0xe0}, {0xf2,0xe7}, {0xf2,0xe2}, {0xf2,0xe1}, {0xc3,0xc8}, {0x8f,0xb6}, {0xf4,0xc5}, {0xf4,0xc6}, {0xf4,0xc8}, {0xc4,0xae}, {0xc4,0xaf}, {0xf4,0xc9}, {0xf4,0xc7}, {0x9f,0xe8}, {0xf4,0xc4}, {0xf6,0x42}, {0xf6,0x45}, {0xf6,0x41}, {0xc4,0xfa}, {0xf6,0x43}, {0xc4,0xf9}, {0xc4,0xf8}, {0xc4,0xf7}, {0xf6,0x44}, {0xf7,0x51}, {0xf7,0x4f}, {0x9c,0xb2}, {0xf7,0x4e}, {0xf6,0x40}, {0xf7,0x50}, {0xf6,0x46}, {0xf7,0x4d}, {0x95,0x7c}, {0xf7,0xf9}, {0xf7,0xd7}, {0xf7,0xf7}, {0xc5,0xdb}, {0xf7,0xf8}, {0xf7,0xfa}, {0xf8,0xbf}, {0xc5,0xfa}, {0xf8,0xbe}, {0xf8,0xbd}, {0xc5,0xfb}, {0xc6,0x5a}, {0xf9,0x6e}, {0xf9,0xa7}, {0xf9,0xa6}, {0xf9,0xa8}, {0xa6,0xe5}, {0xd0,0xaa}, {0x9f,0xc7}, {0xd3,0xcf}, {0xd3,0xd0}, {0x8f,0xbb}, {0x8f,0xbc}, {0xdb,0xc0}, {0xf6,0x47}, {0xf8,0xc0}, {0xa6,0xe6}, {0xad,0x6c}, {0xd0,0xab}, {0x8f,0xec}, {0xd7,0xb1}, {0xb3,0x4e}, {0xdb,0xc2}, {0xdb,0xc1}, {0xb5,0xf3}, {0xb8,0xc5}, {0xe7,0xc1}, {0xbd,0xc3}, {0xbd,0xc4}, {0x8f,0xc0}, {0x93,0x6a}, {0xbf,0xc5}, {0xc5,0xfc}, {0xa6,0xe7}, {0x8b,0xe4}, {0x9c,0x7c}, {0xd0,0xac}, {0xaa,0xed}, {0xd0,0xae}, {0xd0,0xad}, {0xad,0x6d}, {0xd3,0xd1}, {0x95,0xa1}, {0xd3,0xd8}, {0xb0,0x49}, {0xd3,0xd6}, {0xd3,0xd4}, {0xd3,0xdb}, {0xd3,0xd2}, {0xd3,0xd3}, {0xb0,0x4a}, {0xb0,0x4e}, {0xd3,0xdc}, {0xb0,0x4d}, {0xd3,0xda}, {0xd3,0xd7}, {0xd3,0xd5}, {0xb0,0x4b}, {0xb0,0x4c}, {0xd3,0xd9}, {0xfe,0xec}, {0x95,0xa3}, {0xb3,0x50}, {0xd7,0xb2}, {0xb3,0x55}, {0xd7,0xc2}, {0xb3,0x54}, {0xd7,0xc4}, {0x8c,0x45}, {0x8c,0xb8}, {0xd7,0xb8}, {0xb3,0x52}, {0xd7,0xc3}, {0xd7,0xb3}, {0xb3,0x53}, {0xd7,0xbf}, {0xd7,0xbb}, {0xd7,0xbd}, {0xd7,0xb7}, {0xd7,0xbe}, {0x8f,0xc1}, {0xb3,0x4f}, {0xd7,0xba}, {0xa0,0x52}, {0xd7,0xb9}, {0xd7,0xb5}, {0xd7,0xc0}, {0xd7,0xbc}, {0xd7,0xb4}, {0xd7,0xb6}, {0xb3,0x51}, {0xd7,0xc1}, {0x99,0xd0}, {0xb5,0xf6}, {0xdb,0xcd}, {0x8f,0xc3}, {0x8f,0xc4}, {0xdb,0xc9}, {0xdb,0xcb}, {0xdb,0xc6}, {0xdb,0xc5}, {0xdb,0xc3}, {0xdb,0xca}, {0xdb,0xcc}, {0xdb,0xc8}, {0x95,0xa4}, {0xdb,0xc7}, {0xb5,0xf4}, {0xb5,0xf5}, {0x8f,0xc6}, {0x9e,0x60}, {0xdb,0xcf}, {0xb8,0xcd}, {0xdf,0xf2}, {0xdf,0xf8}, {0xdf,0xf3}, {0xdf,0xf4}, {0xf9,0xd8}, {0xdf,0xf9}, {0xb8,0xcf}, {0xb8,0xc7}, {0xb8,0xce}, {0xdf,0xf1}, {0xdb,0xc4}, {0xb8,0xca}, {0xb8,0xc8}, {0xdf,0xf7}, {0xdf,0xf6}, {0xb8,0xc9}, {0xb8,0xcb}, {0xdf,0xf5}, {0xb8,0xc6}, {0xb8,0xcc}, {0x95,0xa5}, {0xe3,0xf6}, {0xbb,0x74}, {0xe4,0x42}, {0xe4,0x41}, {0xe3,0xfb}, {0xbb,0x76}, {0xe4,0x40}, {0xe3,0xf7}, {0xe3,0xf8}, {0xbb,0x6e}, {0xbb,0x70}, {0x9c,0xb3}, {0xe3,0xfd}, {0xe3,0xf5}, {0xbb,0x72}, {0xbb,0x71}, {0xe3,0xf9}, {0xe3,0xfe}, {0xe3,0xfc}, {0xbb,0x73}, {0xe3,0xfa}, {0x99,0xd1}, {0xfe,0xf1}, {0xdb,0xce}, {0xbb,0x6f}, {0xe7,0xc2}, {0xe7,0xc9}, {0xbd,0xc6}, {0xe7,0xcd}, {0xbd,0xca}, {0xe7,0xc5}, {0xe7,0xc3}, {0xe7,0xcc}, {0xbd,0xc5}, {0xe7,0xcb}, {0xbd,0xc7}, {0xbd,0xc8}, {0xe7,0xc4}, {0xbd,0xc9}, {0xe7,0xca}, {0xe7,0xc6}, {0xe7,0xc7}, {0xe7,0xc8}, {0xbb,0x75}, {0xeb,0x70}, {0xeb,0x7c}, {0xbf,0xca}, {0xeb,0x77}, {0xeb,0x79}, {0x99,0xd2}, {0xbf,0xc8}, {0xeb,0x71}, {0xeb,0x75}, {0xeb,0x78}, {0xbf,0xc6}, {0xbf,0xc9}, {0xeb,0x7b}, {0xeb,0x73}, {0xeb,0x74}, {0xeb,0x7a}, {0xeb,0x72}, {0xeb,0x76}, {0xbf,0xc7}, {0xee,0x72}, {0xee,0x71}, {0xc1,0xb7}, {0xee,0x77}, {0xc1,0xb9}, {0xc1,0xb6}, {0xee,0x73}, {0xc1,0xba}, {0xee,0x74}, {0xee,0x75}, {0xee,0x78}, {0x9c,0xc2}, {0xc1,0xb8}, {0xf0,0xd6}, {0x99,0xd3}, {0xf0,0xd9}, {0xf0,0xd3}, {0xf0,0xd5}, {0x95,0xa7}, {0xf0,0xd4}, {0xf0,0xd7}, {0xf0,0xd8}, {0xee,0x76}, {0xf0,0xd2}, {0x95,0xa9}, {0xc3,0xcd}, {0xf2,0xec}, {0xf2,0xef}, {0xf2,0xf1}, {0xf2,0xea}, {0xf2,0xeb}, {0xf2,0xee}, {0xf2,0xf0}, {0xc3,0xce}, {0xc3,0xcc}, {0xc3,0xcb}, {0xf2,0xed}, {0xf2,0xe9}, {0xf4,0xca}, {0xc4,0xb0}, {0x95,0xa6}, {0xf4,0xcb}, {0xf6,0x49}, {0xc4,0xfb}, {0xf6,0x4b}, {0xc4,0xfc}, {0xf6,0x48}, {0xf6,0x4a}, {0xc5,0xa8}, {0xf7,0x52}, {0xc5,0xa7}, {0xf7,0xfd}, {0xf7,0xfc}, {0xf7,0xfb}, {0x9c,0x5d}, {0xf9,0x48}, {0xf9,0x49}, {0xf9,0x4b}, {0xf9,0x4a}, {0xca,0x50}, {0xa6,0xe8}, {0x98,0xe2}, {0xad,0x6e}, {0xd7,0xc5}, {0xb5,0xf7}, {0xdf,0xfa}, {0xc2,0xd0}, {0x8f,0xc9}, {0xf2,0xf2}, {0xa0,0xc2}, {0x8f,0xca}, {0xa8,0xa3}, {0xb3,0x57}, {0x99,0xd4}, {0xb3,0x56}, {0xa0,0xb9}, {0xdb,0xd0}, {0xb5,0xf8}, {0xdb,0xd2}, {0xdb,0xd1}, {0xdf,0xfb}, {0xb8,0xd0}, {0xe4,0x43}, {0xe4,0x46}, {0xe4,0x45}, {0xe4,0x44}, {0xe7,0xce}, {0xe7,0xd0}, {0xe7,0xcf}, {0x9b,0x58}, {0xbf,0xcc}, {0x8f,0xcd}, {0xa0,0xd4}, {0xbf,0xcb}, {0xc1,0xbb}, {0xee,0x79}, {0xee,0x7b}, {0xee,0x7a}, {0xc2,0xd1}, {0xf2,0xf4}, {0xf2,0xf3}, {0xf4,0xcc}, {0xc4,0xb1}, {0x8f,0xce}, {0xc4,0xfd}, {0xf7,0x54}, {0xf7,0x53}, {0xc6,0x5b}, {0x8b,0xe5}, {0x89,0x79}, {0xa8,0xa4}, {0xd0,0xaf}, {0xad,0x6f}, {0xd7,0xc8}, {0xd7,0xc6}, {0xd7,0xc7}, {0xdb,0xd4}, {0xdb,0xd5}, {0xe0,0x43}, {0xdb,0xd3}, {0xdf,0xfc}, {0xe0,0x41}, {0xe0,0x40}, {0xe0,0x42}, {0xb8,0xd1}, {0xdf,0xfe}, {0xdf,0xfd}, {0xe0,0x44}, {0x8f,0xd0}, {0xe4,0x49}, {0xe4,0x47}, {0xe4,0x48}, {0xe7,0xd3}, {0xe7,0xd1}, {0xe7,0xd2}, {0xeb,0x7d}, {0xee,0x7c}, {0xee,0x7d}, {0xc2,0xd2}, {0xf2,0xf5}, {0xf4,0xcd}, {0xc4,0xb2}, {0xf6,0x4c}, {0xf7,0x55}, {0xc5,0xa9}, {0xf7,0xfe}, {0xf9,0x4c}, {0xa8,0xa5}, {0xad,0x71}, {0xad,0x72}, {0xd0,0xb0}, {0xd0,0xb1}, {0xad,0x70}, {0xb0,0x54}, {0xb0,0x52}, {0xb0,0x51}, {0xb0,0x58}, {0xb0,0x50}, {0xb0,0x59}, {0xd3,0xdd}, {0xb0,0x56}, {0xb0,0x53}, {0xb0,0x57}, {0xb0,0x55}, {0xb0,0x4f}, {0xb3,0x5f}, {0x95,0xb6}, {0xb3,0x59}, {0xd7,0xcc}, {0xb3,0x5e}, {0xb3,0x60}, {0xb3,0x5a}, {0xb3,0x5b}, {0xd7,0xca}, {0x99,0xd6}, {0xb3,0x58}, {0x95,0xe5}, {0xd7,0xcb}, {0xb3,0x5d}, {0xd7,0xc9}, {0xb3,0x5c}, {0xb6,0x44}, {0xb6,0x46}, {0x99,0xd7}, {0xdb,0xd8}, {0xb6,0x45}, {0xb5,0xf9}, {0xb5,0xfd}, {0x95,0xb5}, {0xb8,0xe4}, {0xe0,0x49}, {0xdb,0xda}, {0xb5,0xfe}, {0xdb,0xdd}, {0xdb,0xde}, {0xb6,0x43}, {0xdb,0xe0}, {0xa0,0xca}, {0xdb,0xe2}, {0xdb,0xe3}, {0xdb,0xd7}, {0xdb,0xd6}, {0xdb,0xe4}, {0xb6,0x42}, {0xdb,0xe1}, {0xdb,0xdf}, {0xb6,0x40}, {0xb5,0xfb}, {0xb6,0x47}, {0xdb,0xdb}, {0xdb,0xdc}, {0xdb,0xd9}, {0xb6,0x41}, {0xb5,0xfc}, {0xb5,0xfa}, {0xe0,0x48}, {0xb8,0xdf}, {0xb8,0xda}, {0xb8,0xd5}, {0x9f,0xfd}, {0xb8,0xe5}, {0xb8,0xd6}, {0xb8,0xd2}, {0xb8,0xe1}, {0xb8,0xde}, {0xb8,0xe0}, {0xb8,0xd7}, {0xb8,0xdc}, {0xb8,0xd3}, {0xb8,0xd4}, {0xe0,0x50}, {0xe0,0x4d}, {0xe0,0x45}, {0xe0,0x4a}, {0xb8,0xe2}, {0xe0,0x51}, {0xb8,0xe3}, {0xb8,0xd9}, {0xa0,0x58}, {0xe0,0x47}, {0xe0,0x4f}, {0xe0,0x4b}, {0xe0,0x4e}, {0xe0,0x4c}, {0xb8,0xdd}, {0xe0,0x46}, {0xb8,0xd8}, {0xe4,0x4c}, {0xbb,0x78}, {0xbb,0x7b}, {0xe4,0x4e}, {0x8f,0xd6}, {0xbb,0xa5}, {0xe4,0x4d}, {0xbb,0x7d}, {0x99,0xd8}, {0xbd,0xcf}, {0xe4,0x4f}, {0xbb,0xa4}, {0xe4,0x4b}, {0xbb,0xa6}, {0x8f,0xd3}, {0xbb,0x79}, {0xb8,0xdb}, {0xbb,0x7c}, {0xbb,0x7a}, {0xbb,0x7e}, {0xbb,0xa2}, {0xbb,0x77}, {0xbb,0xa7}, {0xbb,0xa3}, {0x8f,0xe5}, {0xbb,0xa1}, {0xe4,0x4a}, {0x8f,0xe9}, {0xbd,0xd6}, {0xbd,0xd2}, {0x99,0xd9}, {0xbd,0xd9}, {0xe7,0xd6}, {0xbd,0xda}, {0xe7,0xe2}, {0xe7,0xdb}, {0xbd,0xcb}, {0xe7,0xe3}, {0xe7,0xdd}, {0xbd,0xd5}, {0xe7,0xde}, {0xbd,0xd4}, {0xe7,0xe1}, {0xbd,0xce}, {0xe7,0xdf}, {0xe7,0xd5}, {0xbd,0xcd}, {0xeb,0xaa}, {0xbd,0xd3}, {0xbd,0xd0}, {0xbd,0xd8}, {0xe7,0xd4}, {0xe7,0xd8}, {0xbd,0xcc}, {0xe7,0xd7}, {0xe7,0xd9}, {0xe7,0xda}, {0xbd,0xd7}, {0xe7,0xdc}, {0xe7,0xe0}, {0xe7,0xe4}, {0x92,0x7c}, {0xbd,0xdb}, {0xbf,0xd2}, {0xeb,0xa5}, {0xeb,0xab}, {0xeb,0xa8}, {0xeb,0x7e}, {0xeb,0xac}, {0xeb,0xa1}, {0xeb,0xa7}, {0xbf,0xcd}, {0xbf,0xd3}, {0xeb,0xad}, {0x9c,0x45}, {0xbf,0xcf}, {0xbf,0xd9}, {0xbf,0xd4}, {0xeb,0xaf}, {0xeb,0xa9}, {0xbf,0xd0}, {0xeb,0xa2}, {0xbf,0xda}, {0xeb,0xa3}, {0xeb,0xa4}, {0xbf,0xdb}, {0xbf,0xd8}, {0xbd,0xd1}, {0xbf,0xce}, {0xeb,0xb0}, {0xbf,0xdc}, {0xbf,0xd5}, {0xeb,0xae}, {0xbf,0xd1}, {0xbf,0xd6}, {0xbf,0xd7}, {0xc1,0xc3}, {0xee,0xa4}, {0xee,0xad}, {0xee,0xaa}, {0xee,0xac}, {0xc1,0xc0}, {0xee,0xa5}, {0x8f,0xde}, {0xee,0xab}, {0xc1,0xbc}, {0xee,0xa7}, {0xc1,0xc4}, {0xee,0xa3}, {0xee,0xa8}, {0xee,0xaf}, {0xeb,0xa6}, {0xee,0xa9}, {0xee,0xa2}, {0xc1,0xbd}, {0xee,0xa1}, {0xc1,0xbe}, {0xee,0xb0}, {0xc1,0xbf}, {0xee,0xae}, {0xc1,0xc2}, {0xee,0x7e}, {0x8f,0xdf}, {0xc1,0xc1}, {0xee,0xa6}, {0xf0,0xdc}, {0xf0,0xea}, {0xf0,0xe5}, {0xf0,0xe7}, {0xf0,0xdb}, {0xc2,0xd3}, {0xf0,0xda}, {0xc2,0xd6}, {0xc2,0xd5}, {0xa0,0x4b}, {0xf0,0xe9}, {0xf0,0xe1}, {0xf0,0xde}, {0xf0,0xe4}, {0xf0,0xdd}, {0xf0,0xdf}, {0xf0,0xe8}, {0xf0,0xe6}, {0xc2,0xd4}, {0xf0,0xed}, {0xf0,0xeb}, {0xf0,0xe2}, {0xf0,0xec}, {0xf0,0xe3}, {0x8f,0xe2}, {0xf2,0xf9}, {0xc3,0xcf}, {0xf3,0x41}, {0xa0,0xcc}, {0xf6,0x4f}, {0xc3,0xd6}, {0xf0,0xe0}, {0xf2,0xf7}, {0xc3,0xd2}, {0xf2,0xf8}, {0xf2,0xfd}, {0x8f,0xe3}, {0x8f,0xe4}, {0xc3,0xd4}, {0xc3,0xd5}, {0xf2,0xf6}, {0xf3,0x40}, {0xf3,0x42}, {0xf2,0xfa}, {0xf2,0xfc}, {0xf2,0xfe}, {0xf2,0xfb}, {0xf3,0x43}, {0xc3,0xd1}, {0xc3,0xd7}, {0xc3,0xd3}, {0xc3,0xd0}, {0xf4,0xd0}, {0x9b,0xc4}, {0xc4,0xb7}, {0xf4,0xce}, {0x9b,0xfc}, {0xf4,0xd2}, {0xf4,0xd3}, {0xc4,0xb5}, {0xf4,0xd4}, {0xf4,0xd1}, {0x96,0x4c}, {0xf4,0xcf}, {0xc4,0xb8}, {0xc4,0xb4}, {0xf4,0xd5}, {0xc4,0xb6}, {0xc4,0xb3}, {0xc4,0xfe}, {0xc5,0x40}, {0xf6,0x4e}, {0xf6,0x4d}, {0xf6,0x50}, {0xf6,0x51}, {0xc5,0x41}, {0xf7,0x56}, {0xf7,0x5b}, {0xc5,0xaa}, {0x9a,0xf6}, {0xf7,0x58}, {0x8c,0xae}, {0xf7,0x57}, {0xf7,0x5a}, {0xf7,0x59}, {0xf8,0x43}, {0xc5,0xdc}, {0xf8,0x42}, {0xf8,0x40}, {0xf8,0x41}, {0x8f,0xe7}, {0xc5,0xfe}, {0xc5,0xfd}, {0xf8,0xc1}, {0xf8,0xc2}, {0xc6,0x40}, {0xf9,0x4d}, {0xf9,0x4e}, {0xc6,0x67}, {0x8f,0xe8}, {0xc6,0x6d}, {0xf9,0xa9}, {0xf9,0xc8}, {0x8b,0xe7}, {0x89,0x7a}, {0x89,0x7b}, {0xa8,0xa6}, {0xd7,0xcd}, {0xd7,0xce}, {0xe0,0x52}, {0xe4,0x50}, {0xe7,0xe5}, {0xc1,0xc6}, {0xc1,0xc5}, {0xf0,0xee}, {0xf3,0x44}, {0xf8,0x44}, {0xa8,0xa7}, {0xd3,0xde}, {0xb0,0x5a}, {0xb3,0x61}, {0xe0,0x54}, {0xe0,0x53}, {0xbd,0xdc}, {0xe7,0xe6}, {0xbd,0xdd}, {0xee,0xb1}, {0xc2,0xd7}, {0x99,0xda}, {0xc6,0x76}, {0xa8,0xa8}, {0xcd,0xcb}, {0xd3,0xdf}, {0xb3,0x62}, {0xd7,0xcf}, {0xd7,0xd0}, {0xdb,0xe5}, {0xb6,0x48}, {0xb8,0xe6}, {0xe0,0x56}, {0xe0,0x55}, {0xe0,0x57}, {0xe4,0x51}, {0xe4,0x52}, {0xbb,0xa8}, {0xbf,0xdd}, {0xbd,0xde}, {0xbf,0xde}, {0xee,0xb5}, {0xee,0xb2}, {0xee,0xb4}, {0xee,0xb3}, {0xc1,0xc7}, {0xf0,0xef}, {0xf3,0x46}, {0xf3,0x45}, {0xcb,0xa4}, {0xb0,0x5c}, {0xb0,0x5b}, {0xd3,0xe0}, {0xd7,0xd1}, {0xdb,0xe7}, {0xdb,0xe6}, {0xb6,0x49}, {0xe0,0x59}, {0xe0,0x5a}, {0xe0,0x58}, {0xb8,0xe8}, {0xb8,0xe7}, {0xbb,0xaa}, {0xbb,0xa9}, {0xe7,0xe7}, {0xeb,0xb3}, {0xeb,0xb1}, {0xeb,0xb2}, {0xbf,0xdf}, {0xee,0xb7}, {0xee,0xb6}, {0xf0,0xf2}, {0xf0,0xf1}, {0xf0,0xf0}, {0xf3,0x47}, {0x8f,0xed}, {0xf9,0xaa}, {0xa8,0xa9}, {0xad,0x73}, {0x95,0xc0}, {0xad,0x74}, {0xb0,0x5d}, {0xb0,0x5e}, {0xd3,0xe2}, {0xd3,0xe1}, {0xd7,0xd2}, {0xb3,0x68}, {0xb3,0x66}, {0xb3,0x63}, {0xb3,0x67}, {0xb3,0x65}, {0xb3,0x64}, {0xa0,0xcb}, {0xb6,0x4a}, {0xdb,0xea}, {0xb8,0xed}, {0xb6,0x4c}, {0xb6,0x51}, {0xdb,0xec}, {0xb6,0x53}, {0xb6,0x52}, {0xb6,0x55}, {0xdb,0xeb}, {0xdb,0xe8}, {0xb6,0x4f}, {0xb6,0x4b}, {0xb6,0x4d}, {0xdb,0xe9}, {0xb6,0x54}, {0xb6,0x50}, {0xb6,0x4e}, {0xb8,0xef}, {0xb8,0xee}, {0xb8,0xec}, {0xb8,0xf0}, {0xb8,0xea}, {0xb8,0xeb}, {0xb8,0xe9}, {0xe0,0x5b}, {0x9e,0x48}, {0xe4,0x54}, {0xbb,0xac}, {0xbb,0xad}, {0xbb,0xab}, {0x99,0xdb}, {0xe4,0x53}, {0x8f,0xf3}, {0xe4,0x55}, {0xe7,0xea}, {0xe7,0xec}, {0x8f,0xf9}, {0xbd,0xe7}, {0xe7,0xed}, {0xbd,0xe0}, {0xe7,0xe9}, {0xbd,0xdf}, {0xbd,0xe9}, {0xbd,0xe5}, {0xbd,0xe6}, {0xbd,0xe2}, {0xe7,0xe8}, {0xbd,0xe1}, {0xe7,0xee}, {0xe7,0xeb}, {0x95,0xc1}, {0xbd,0xe8}, {0xa0,0x4e}, {0xbd,0xe3}, {0xbd,0xe4}, {0xeb,0xb5}, {0xeb,0xb7}, {0xeb,0xb6}, {0x99,0xdc}, {0xeb,0xb8}, {0xbf,0xe0}, {0xeb,0xb4}, {0xa0,0x64}, {0xc1,0xcb}, {0xee,0xb8}, {0xc1,0xc8}, {0xc1,0xcc}, {0xc1,0xca}, {0xc1,0xc9}, {0xf0,0xf3}, {0xf0,0xf6}, {0xf0,0xf5}, {0x8f,0xf7}, {0xf0,0xf4}, {0xc2,0xd8}, {0xf3,0x48}, {0xf3,0x49}, {0xc3,0xd8}, {0xf3,0x4a}, {0xc3,0xd9}, {0x89,0xb0}, {0xa0,0x48}, {0xc4,0xba}, {0xc4,0xb9}, {0xf6,0x52}, {0x8f,0xfb}, {0x8f,0xf6}, {0xc5,0x42}, {0xf6,0x53}, {0xf7,0x5c}, {0xc5,0xab}, {0xc5,0xac}, {0x9d,0xdc}, {0xf8,0x45}, {0xc6,0x42}, {0x99,0xdd}, {0x8b,0xe8}, {0xa8,0xaa}, {0xb3,0x6a}, {0xb3,0x69}, {0xe0,0x5c}, {0xe0,0x5d}, {0xbb,0xae}, {0xeb,0xb9}, {0xbd,0xea}, {0xeb,0xba}, {0xee,0xb9}, {0xa8,0xab}, {0xd0,0xb2}, {0xad,0x76}, {0xad,0x75}, {0xd3,0xe3}, {0xb0,0x5f}, {0xd3,0xe4}, {0xd7,0xd5}, {0x92,0xc1}, {0xd7,0xd4}, {0xd7,0xd3}, {0xdb,0xee}, {0xb6,0x58}, {0x9f,0xd6}, {0xdb,0xed}, {0xb6,0x57}, {0xdb,0xef}, {0xb6,0x56}, {0xe0,0x5f}, {0xe0,0x62}, {0xe0,0x60}, {0xe0,0x61}, {0xe0,0x65}, {0xe0,0x5e}, {0xe0,0x66}, {0xe0,0x63}, {0xe0,0x64}, {0xbb,0xb0}, {0xe4,0x56}, {0xbb,0xaf}, {0xe7,0xf2}, {0xe7,0xf0}, {0xbd,0xeb}, {0xe7,0xef}, {0xe7,0xf1}, {0xbd,0xec}, {0xeb,0xbb}, {0xa0,0xd2}, {0xeb,0xbc}, {0xc1,0xcd}, {0x90,0x40}, {0xf3,0x4c}, {0xf3,0x4e}, {0xf3,0x4b}, {0xf3,0x4d}, {0xf4,0xd6}, {0xf6,0x54}, {0xf9,0x6f}, {0xa8,0xac}, {0xad,0x77}, {0xd3,0xe5}, {0xd3,0xe7}, {0xd3,0xe6}, {0xd7,0xd8}, {0xb3,0x6c}, {0xd7,0xd6}, {0xb3,0x6b}, {0xd7,0xd9}, {0x8a,0xc4}, {0xd7,0xda}, {0xd7,0xd7}, {0x99,0xe0}, {0xdb,0xfb}, {0xb6,0x60}, {0xdb,0xf3}, {0xdb,0xf9}, {0xb6,0x5b}, {0xb6,0x5e}, {0xdb,0xf2}, {0xb6,0x59}, {0xdb,0xf6}, {0xe0,0x6c}, {0xb6,0x5d}, {0xdb,0xf1}, {0x9f,0xf0}, {0xdb,0xf7}, {0xdb,0xf4}, {0xdb,0xfa}, {0xdb,0xf0}, {0xdb,0xf8}, {0xb6,0x5c}, {0xb6,0x5f}, {0xdb,0xf5}, {0xb6,0x5a}, {0xb8,0xf2}, {0xe0,0x68}, {0xb8,0xf1}, {0xe0,0x6f}, {0xe0,0x6e}, {0xb8,0xf8}, {0xb8,0xf9}, {0xe0,0x70}, {0xb8,0xf3}, {0xe0,0x6d}, {0xb8,0xf7}, {0xe0,0x72}, {0xe0,0x69}, {0xe0,0x6b}, {0xb8,0xf4}, {0xe0,0x67}, {0xe0,0x6a}, {0xe0,0x71}, {0xb8,0xf5}, {0xe0,0x73}, {0xb8,0xf6}, {0xbb,0xb1}, {0xe4,0x5b}, {0xe4,0x61}, {0xe4,0x59}, {0xe4,0x62}, {0x9f,0xf3}, {0xe4,0x58}, {0xe4,0x5d}, {0xe4,0x63}, {0xe4,0x60}, {0xe4,0x5f}, {0xe4,0x5e}, {0xe4,0x57}, {0xe4,0x5c}, {0xe4,0x5a}, {0x9d,0xbf}, {0xbd,0xf1}, {0xbd,0xee}, {0xe7,0xfb}, {0xe8,0x41}, {0xe8,0x43}, {0xe8,0x40}, {0xe7,0xf8}, {0xe7,0xfa}, {0xe8,0x45}, {0xe8,0x42}, {0xe7,0xfc}, {0xe8,0x46}, {0xe7,0xf9}, {0xe8,0x44}, {0xbd,0xef}, {0xbd,0xf5}, {0xbd,0xf3}, {0xe7,0xf3}, {0xbd,0xf4}, {0xbd,0xf0}, {0xe7,0xf4}, {0xe7,0xf6}, {0xe7,0xf5}, {0xe7,0xfd}, {0xe7,0xfe}, {0x9f,0xf6}, {0xbd,0xf2}, {0x95,0xc8}, {0xbd,0xed}, {0x9e,0x5a}, {0xe7,0xf7}, {0xeb,0xc6}, {0xbf,0xe2}, {0xeb,0xbd}, {0xbf,0xe3}, {0xbf,0xe6}, {0xeb,0xc2}, {0xeb,0xbf}, {0xbf,0xe5}, {0x99,0xe3}, {0xeb,0xc3}, {0xeb,0xc4}, {0xeb,0xbe}, {0xeb,0xc7}, {0xeb,0xc0}, {0xeb,0xc5}, {0xbf,0xe4}, {0xbf,0xe1}, {0xeb,0xc1}, {0x8a,0x4a}, {0xee,0xbf}, {0xc1,0xd0}, {0xc1,0xce}, {0xc1,0xd1}, {0xc1,0xcf}, {0xee,0xbe}, {0xee,0xbb}, {0xee,0xba}, {0x9f,0xf1}, {0xee,0xbd}, {0xee,0xbc}, {0xf1,0x45}, {0xc2,0xde}, {0xf0,0xfb}, {0xf0,0xfa}, {0xc2,0xd9}, {0xf1,0x41}, {0xf1,0x40}, {0xf0,0xf7}, {0xf1,0x43}, {0xf0,0xfc}, {0xc2,0xdd}, {0xf0,0xf9}, {0xf1,0x42}, {0xf0,0xf8}, {0xc2,0xda}, {0xc2,0xdc}, {0xf0,0xfd}, {0xc2,0xdb}, {0xf0,0xfe}, {0x8a,0xa7}, {0xf1,0x44}, {0xf3,0x52}, {0xc3,0xde}, {0xf3,0x4f}, {0xf3,0x53}, {0x99,0xe6}, {0xc3,0xdb}, {0xf3,0x51}, {0xc3,0xe0}, {0x9f,0xf7}, {0xc3,0xdd}, {0x9f,0xed}, {0xf3,0x50}, {0xc3,0xdf}, {0xf3,0x54}, {0xc3,0xda}, {0x8a,0x5c}, {0x9d,0xae}, {0xc4,0xbc}, {0xc4,0xbe}, {0xf4,0xd9}, {0xc4,0xbd}, {0xf4,0xd7}, {0xc3,0xdc}, {0xf4,0xd8}, {0xc4,0xbb}, {0xc5,0x43}, {0xc5,0x45}, {0xf6,0x56}, {0xc5,0x44}, {0xf6,0x55}, {0xf7,0x61}, {0xc5,0xad}, {0xf7,0x60}, {0xc5,0xae}, {0xf7,0x5e}, {0xf7,0x5d}, {0xf7,0x62}, {0xf7,0x63}, {0xf8,0x46}, {0xf7,0x5f}, {0xf8,0xc6}, {0xf8,0xc3}, {0xf8,0xc4}, {0xf8,0xc5}, {0xc6,0x5c}, {0xf9,0x51}, {0xf9,0x50}, {0xf9,0x4f}, {0xf9,0x70}, {0x95,0xc9}, {0xf9,0xbe}, {0xf9,0xab}, {0xc6,0x6e}, {0xa8,0xad}, {0xb0,0x60}, {0x90,0x48}, {0x99,0xe8}, {0xb8,0xfa}, {0x90,0x49}, {0x8c,0xba}, {0xbd,0xf6}, {0x90,0xb1}, {0xeb,0xc8}, {0xc2,0xdf}, {0xf3,0x55}, {0x90,0x4a}, {0xf9,0xac}, {0xa8,0xae}, {0xaa,0xee}, {0xad,0x79}, {0xad,0x78}, {0x99,0xea}, {0xb0,0x63}, {0xd3,0xe8}, {0xb0,0x61}, {0xd3,0xe9}, {0xb0,0x62}, {0xd7,0xdf}, {0xd7,0xdb}, {0x9b,0xd1}, {0xb3,0x6d}, {0xd7,0xde}, {0xd7,0xdd}, {0xd7,0xdc}, {0xb3,0x6e}, {0xd7,0xe0}, {0xd7,0xe1}, {0x99,0xeb}, {0x99,0xec}, {0xdc,0x43}, {0xdc,0x41}, {0xdc,0x45}, {0xdc,0x46}, {0xdc,0x4c}, {0xdc,0x48}, {0xdc,0x4a}, {0x99,0xed}, {0xdc,0x42}, {0xdb,0xfc}, {0xdc,0x49}, {0x99,0xee}, {0xdc,0x4b}, {0xdc,0x44}, {0xdc,0x47}, {0xdb,0xfd}, {0xb6,0x62}, {0xdc,0x40}, {0xdb,0xfe}, {0xb6,0x61}, {0xb6,0x63}, {0xb8,0xfd}, {0xe0,0x75}, {0xe0,0x77}, {0xe0,0x76}, {0xe0,0x7b}, {0xb8,0xfb}, {0xe0,0x78}, {0xe0,0x74}, {0xe0,0x79}, {0xe0,0x7a}, {0xb8,0xfc}, {0xb8,0xfe}, {0xe0,0x7c}, {0xe4,0x67}, {0xe4,0x66}, {0xe4,0x64}, {0xe4,0x65}, {0xbb,0xb3}, {0xbb,0xb5}, {0xbb,0xb2}, {0xbb,0xb4}, {0xe8,0x4d}, {0xe8,0x4e}, {0xe8,0x49}, {0x90,0x4c}, {0xe8,0x4a}, {0xbd,0xf8}, {0xbd,0xfd}, {0xbd,0xf7}, {0xbd,0xfe}, {0xbd,0xf9}, {0xe8,0x4b}, {0xe8,0x4c}, {0xe8,0x48}, {0xbe,0x40}, {0xbd,0xfb}, {0xbd,0xfa}, {0xbd,0xfc}, {0xe8,0x47}, {0x90,0x4d}, {0xeb,0xca}, {0xbf,0xe8}, {0x95,0xcb}, {0xeb,0xcc}, {0xbf,0xea}, {0xeb,0xcf}, {0xeb,0xcb}, {0xeb,0xc9}, {0xeb,0xce}, {0xbf,0xe9}, {0xeb,0xcd}, {0xbf,0xe7}, {0xc1,0xd3}, {0xc1,0xd6}, {0xee,0xc1}, {0x97,0xe2}, {0xc1,0xd4}, {0xee,0xc0}, {0xc1,0xd2}, {0xc1,0xd5}, {0xf1,0x46}, {0xf1,0x47}, {0xf1,0x48}, {0xc2,0xe0}, {0x95,0xcc}, {0xf1,0x49}, {0xc2,0xe1}, {0xc3,0xe2}, {0xf3,0x58}, {0xf3,0x59}, {0xf3,0x57}, {0xf3,0x56}, {0xf3,0x5a}, {0xc3,0xe1}, {0xf4,0xdd}, {0xf4,0xdb}, {0xf4,0xdc}, {0xf4,0xde}, {0xf4,0xda}, {0xf4,0xdf}, {0xf6,0x58}, {0x9f,0x78}, {0xf6,0x59}, {0xf6,0x57}, {0xc5,0x46}, {0xf7,0x64}, {0xc5,0xaf}, {0xf7,0x65}, {0xf8,0x48}, {0xf8,0x47}, {0x89,0x7c}, {0x89,0x7d}, {0x89,0x7e}, {0x99,0x5d}, {0xa8,0xaf}, {0xb6,0x64}, {0xb9,0x40}, {0x9b,0x5a}, {0xbb,0xb6}, {0x90,0x50}, {0xbf,0xec}, {0x8c,0x4f}, {0xbf,0xeb}, {0xc3,0xe3}, {0xc4,0x7c}, {0xc5,0x47}, {0xa8,0xb0}, {0xb0,0x64}, {0xb9,0x41}, {0x90,0x54}, {0xf3,0x5b}, {0xc6,0xd6}, {0x9a,0xa8}, {0x99,0xef}, {0xfe,0xeb}, {0x9d,0xa3}, {0x9d,0xa1}, {0x99,0x43}, {0x99,0x45}, {0x9d,0x7d}, {0xcb,0xa6}, {0x99,0xf0}, {0xa8,0xb1}, {0xa8,0xb4}, {0xa8,0xb3}, {0xa8,0xb2}, {0xcb,0xa5}, {0x99,0xf1}, {0xcd,0xcd}, {0x99,0xf2}, {0xcd,0xcf}, {0xaa,0xef}, {0x8c,0xbc}, {0x9d,0x60}, {0xaa,0xf1}, {0xcd,0xcc}, {0xcd,0xce}, {0xaa,0xf0}, {0xcd,0xd1}, {0xcd,0xd0}, {0xcd,0xd2}, {0xa0,0xa3}, {0xd0,0xb6}, {0xd0,0xb4}, {0xad,0x7c}, {0xd0,0xb3}, {0xad,0xa3}, {0xad,0x7e}, {0xad,0x7b}, {0xad,0xa4}, {0xad,0x7d}, {0xad,0xa2}, {0xad,0xa1}, {0xd0,0xb5}, {0xad,0x7a}, {0xb0,0x6a}, {0xd3,0xeb}, {0xd3,0xf1}, {0xb0,0x67}, {0xb0,0x6e}, {0x90,0x5b}, {0xb0,0x69}, {0xd3,0xee}, {0xd3,0xf0}, {0xb0,0x6c}, {0xd3,0xea}, {0xd3,0xed}, {0xb0,0x68}, {0xb0,0x65}, {0xd3,0xec}, {0xb0,0x6b}, {0xd3,0xef}, {0xb0,0x6d}, {0xb0,0x66}, {0x9e,0xdb}, {0xd7,0xe3}, {0xd7,0xe6}, {0xb3,0x70}, {0xb3,0x7a}, {0xb3,0x76}, {0xd7,0xe4}, {0x9d,0x79}, {0xb3,0x7e}, {0xb3,0x77}, {0xb3,0x7c}, {0xb3,0x72}, {0xb3,0x6f}, {0xb3,0x71}, {0xb3,0x7d}, {0xd7,0xe5}, {0xb3,0x75}, {0xb3,0x78}, {0xb3,0x74}, {0xb3,0x79}, {0xd7,0xe7}, {0xb3,0x7b}, {0xb3,0x73}, {0xd7,0xe2}, {0xdc,0x4d}, {0xb6,0x65}, {0xdc,0x4f}, {0xb6,0x67}, {0xb6,0x69}, {0x99,0xf3}, {0xdc,0x4e}, {0xb6,0x66}, {0xb6,0x6a}, {0x90,0x62}, {0xb6,0x68}, {0xb9,0x47}, {0xe0,0xa3}, {0xb9,0x4f}, {0xe0,0x7e}, {0xb9,0x50}, {0xb9,0x45}, {0xe0,0xa1}, {0xb9,0x4a}, {0xe0,0xa2}, {0xb9,0x43}, {0xb9,0x42}, {0x9f,0x55}, {0xb9,0x4d}, {0xb9,0x4c}, {0xb9,0x4b}, {0xb9,0x49}, {0xb9,0x4e}, {0xe0,0x7d}, {0xb9,0x44}, {0xb9,0x46}, {0xb9,0x48}, {0x9b,0xf9}, {0xbb,0xb8}, {0xbb,0xbb}, {0xbb,0xbf}, {0xbb,0xb9}, {0xbb,0xbe}, {0xbb,0xbc}, {0xbb,0xb7}, {0x90,0x65}, {0xbb,0xbd}, {0xbb,0xba}, {0x96,0xe0}, {0xe8,0x52}, {0xbe,0x43}, {0xbe,0x41}, {0xe8,0x53}, {0x98,0xbe}, {0xbe,0x44}, {0xbe,0x42}, {0xe8,0x51}, {0xe8,0x50}, {0xbf,0xf0}, {0xe8,0x4f}, {0xbf,0xee}, {0xbf,0xed}, {0xeb,0xd0}, {0xbe,0x45}, {0xbf,0xef}, {0xeb,0xd1}, {0xbf,0xf2}, {0xeb,0xd2}, {0xbf,0xf1}, {0xc1,0xd8}, {0xee,0xc3}, {0xc1,0xd7}, {0xc1,0xdc}, {0xc1,0xda}, {0xc1,0xdb}, {0xc2,0xe3}, {0xc1,0xd9}, {0xee,0xc2}, {0xeb,0xd3}, {0xc2,0xe2}, {0xc2,0xe4}, {0xc3,0xe4}, {0xc3,0xe5}, {0xf4,0xe0}, {0xc5,0xde}, {0xc5,0xdd}, {0xa8,0xb6}, {0xca,0x55}, {0xb0,0x6f}, {0xca,0x52}, {0xca,0x53}, {0xca,0x51}, {0xca,0x54}, {0xcb,0xaa}, {0xcb,0xa7}, {0xcb,0xac}, {0xcb,0xa8}, {0xa8,0xb7}, {0xa8,0xba}, {0xcb,0xa9}, {0xa8,0xb9}, {0xcb,0xab}, {0x90,0x68}, {0xa8,0xb8}, {0x90,0x6c}, {0xcd,0xd5}, {0xcd,0xd7}, {0xaa,0xf4}, {0xcd,0xd3}, {0xcd,0xd6}, {0xcd,0xd4}, {0xaa,0xf2}, {0xaa,0xf5}, {0xaa,0xf3}, {0x95,0xd8}, {0xd0,0xb8}, {0xd0,0xbc}, {0xd0,0xb9}, {0xad,0xa7}, {0xad,0xa8}, {0x90,0x6a}, {0xd0,0xbb}, {0xd0,0xbd}, {0xd0,0xbf}, {0xad,0xa5}, {0xd0,0xbe}, {0xad,0xa6}, {0xd7,0xee}, {0xd0,0xba}, {0xd3,0xf2}, {0xd3,0xfb}, {0xd3,0xf9}, {0xd3,0xf4}, {0xd3,0xf5}, {0xd3,0xfa}, {0xd3,0xfc}, {0xb0,0x71}, {0xd3,0xf7}, {0xd3,0xf3}, {0xb0,0x70}, {0xb0,0x72}, {0xd3,0xf6}, {0xd3,0xfd}, {0xd3,0xf8}, {0xb3,0xa1}, {0xd7,0xf1}, {0xd7,0xe9}, {0xd7,0xef}, {0xd7,0xf0}, {0xb3,0xa2}, {0xd7,0xe8}, {0xd7,0xea}, {0xd0,0xb7}, {0xd7,0xec}, {0xd7,0xed}, {0xd7,0xeb}, {0xb6,0x6c}, {0xdc,0x56}, {0xeb,0xd4}, {0xdc,0x57}, {0xdc,0x54}, {0xb3,0xa3}, {0xb6,0x6e}, {0xdc,0x53}, {0xdc,0x59}, {0xdc,0x58}, {0xb6,0x6b}, {0xdc,0x5c}, {0xdc,0x52}, {0xdc,0x5b}, {0xdc,0x50}, {0xdc,0x5a}, {0xdc,0x55}, {0xb6,0x6d}, {0xe0,0xaa}, {0xe0,0xa5}, {0xe0,0xab}, {0xe0,0xa6}, {0xe0,0xa4}, {0xe0,0xa7}, {0xb9,0x51}, {0xe0,0xa9}, {0xe0,0xa8}, {0xb9,0x52}, {0xbb,0xc1}, {0xbb,0xc0}, {0xe4,0x6e}, {0xe4,0x71}, {0xe4,0x69}, {0xe4,0x6d}, {0xbb,0xc2}, {0xe4,0x6c}, {0xe4,0x6a}, {0xe4,0x70}, {0xe4,0x6b}, {0xe4,0x68}, {0xe4,0x6f}, {0xe8,0x59}, {0xbe,0x48}, {0xf1,0x4a}, {0xe8,0x56}, {0xe8,0x57}, {0xe8,0x55}, {0xdc,0x51}, {0xbe,0x47}, {0xe8,0x5a}, {0xe8,0x54}, {0xbe,0x46}, {0xbe,0x49}, {0xe8,0x58}, {0xeb,0xd5}, {0xbf,0xf3}, {0xeb,0xd6}, {0xeb,0xd7}, {0xee,0xc4}, {0xc1,0xdd}, {0xf1,0x4b}, {0xf1,0x4c}, {0xf1,0x4d}, {0xf3,0x5d}, {0xf3,0x5c}, {0xf4,0xe2}, {0xf4,0xe1}, {0xf6,0x5b}, {0xf6,0x5c}, {0xf6,0x5a}, {0xf7,0x66}, {0xc5,0xb0}, {0xa8,0xbb}, {0xad,0xaa}, {0xad,0xa9}, {0xb0,0x75}, {0xb0,0x74}, {0xd4,0x40}, {0xd4,0x41}, {0xd3,0xfe}, {0x9f,0xb2}, {0xb0,0x73}, {0xd7,0xf5}, {0xd7,0xf6}, {0xd7,0xf2}, {0xb3,0xa4}, {0xd7,0xf3}, {0x9f,0xae}, {0xd7,0xf4}, {0x9f,0xb0}, {0x89,0xad}, {0xdc,0x5f}, {0xdc,0x61}, {0xdc,0x5d}, {0xdc,0x60}, {0xb6,0x6f}, {0xdc,0x5e}, {0xb6,0x70}, {0x90,0x6e}, {0xdd,0x73}, {0xb9,0x55}, {0xb9,0x54}, {0xb9,0x53}, {0xe0,0xac}, {0xe0,0xad}, {0x9e,0x71}, {0xe4,0x73}, {0xe4,0x75}, {0xbb,0xc6}, {0xbb,0xc3}, {0x9e,0x4a}, {0xbb,0xc5}, {0xbb,0xc4}, {0xe4,0x74}, {0xe4,0x72}, {0x9f,0xdc}, {0xe8,0x61}, {0xe8,0x5e}, {0xe8,0x5f}, {0xbe,0x4d}, {0xe8,0x60}, {0xe8,0x5b}, {0xe8,0x5c}, {0xbe,0x4a}, {0xbe,0x4b}, {0xe8,0x5d}, {0xbe,0x4c}, {0x89,0xab}, {0xeb,0xdb}, {0x9f,0xb8}, {0xeb,0xdc}, {0xeb,0xd9}, {0xeb,0xda}, {0xbf,0xf4}, {0xeb,0xd8}, {0xee,0xc8}, {0xee,0xc5}, {0xee,0xc7}, {0xc1,0xe0}, {0xee,0xcb}, {0xc1,0xdf}, {0xee,0xc9}, {0xee,0xcc}, {0xee,0xca}, {0xee,0xc6}, {0xc1,0xde}, {0xf1,0x4f}, {0xf1,0x50}, {0xf1,0x4e}, {0x90,0x70}, {0xf1,0x52}, {0xc2,0xe5}, {0xc2,0xe6}, {0xf3,0x5f}, {0xc3,0xe7}, {0xf1,0x51}, {0xf3,0x5e}, {0xc3,0xe6}, {0xf4,0xe5}, {0xf4,0xe6}, {0xc4,0xbf}, {0xf4,0xe4}, {0x8b,0x63}, {0xf4,0xe3}, {0xf6,0x5d}, {0xc5,0x48}, {0x95,0xdc}, {0xf8,0x49}, {0xf8,0xc8}, {0xf8,0xc7}, {0xc6,0x43}, {0xc6,0x5d}, {0xf8,0xc9}, {0xf9,0x71}, {0x90,0x71}, {0xc6,0x6f}, {0xa8,0xbc}, {0xaa,0xf6}, {0xb9,0x56}, {0xc4,0xc0}, {0xa8,0xbd}, {0xad,0xab}, {0xb3,0xa5}, {0xb6,0x71}, {0xc2,0xe7}, {0xaa,0xf7}, {0xd0,0xc1}, {0xd0,0xc0}, {0xd4,0x42}, {0xfc,0x5e}, {0xb0,0x78}, {0xb0,0x76}, {0xb0,0x7a}, {0xd4,0x44}, {0xb0,0x79}, {0xb0,0x77}, {0x89,0x49}, {0xd4,0x43}, {0xb3,0xa8}, {0xd7,0xfc}, {0x96,0x5b}, {0xb3,0xa7}, {0xb3,0xa9}, {0xd8,0x42}, {0xb3,0xab}, {0xd7,0xfe}, {0xd8,0x40}, {0xd7,0xf7}, {0xb3,0xaa}, {0xd8,0x43}, {0xd7,0xf9}, {0xd7,0xfa}, {0xd7,0xf8}, {0xb3,0xa6}, {0x8c,0x50}, {0xd8,0x41}, {0xd7,0xfb}, {0xd7,0xfd}, {0x94,0xa6}, {0xdc,0x6d}, {0x8f,0xd5}, {0xdc,0x6c}, {0xdc,0x6a}, {0xdc,0x62}, {0xdc,0x71}, {0xdc,0x65}, {0xdc,0x6f}, {0xdc,0x76}, {0xdc,0x6e}, {0xb6,0x79}, {0x9e,0x73}, {0xb6,0x75}, {0xdc,0x63}, {0xdc,0x69}, {0xb6,0x77}, {0x90,0x75}, {0xdc,0x68}, {0xb6,0x78}, {0xb6,0x7a}, {0xdc,0x6b}, {0x99,0xf7}, {0xb6,0x72}, {0xb6,0x73}, {0xdc,0x77}, {0xdc,0x75}, {0xdc,0x74}, {0xdc,0x66}, {0xdc,0x72}, {0xb6,0x76}, {0x8c,0xbf}, {0xb6,0x74}, {0xdc,0x73}, {0xdc,0x64}, {0xdc,0x67}, {0xdc,0x70}, {0x99,0xf9}, {0x96,0x63}, {0x95,0xb9}, {0xe4,0xba}, {0xe0,0xb7}, {0xe0,0xb0}, {0xe0,0xc3}, {0xe0,0xcc}, {0xe0,0xb3}, {0xb9,0x61}, {0x94,0xd4}, {0xe0,0xc0}, {0xb9,0x57}, {0xb9,0x59}, {0xb9,0x65}, {0xe0,0xb1}, {0xfc,0xfa}, {0xb9,0x5a}, {0xb9,0x5c}, {0xb9,0x66}, {0xb9,0x5b}, {0x90,0x77}, {0x90,0xab}, {0xb9,0x64}, {0xe0,0xb9}, {0xe0,0xae}, {0xb9,0x62}, {0xe0,0xb8}, {0xb9,0x5e}, {0xe0,0xca}, {0xb9,0x63}, {0xe0,0xc8}, {0xe0,0xbc}, {0xe0,0xc6}, {0xb9,0x60}, {0xe0,0xaf}, {0xe0,0xc9}, {0xe0,0xc4}, {0x9d,0x4d}, {0xe0,0xcb}, {0xb9,0x58}, {0x99,0xfa}, {0xb9,0x67}, {0xb9,0x5d}, {0x92,0xe3}, {0xe0,0xb5}, {0x97,0xbb}, {0xe0,0xbd}, {0xe0,0xc1}, {0x90,0x78}, {0xe0,0xc5}, {0xb9,0x5f}, {0xe0,0xb4}, {0xe0,0xb2}, {0xe0,0xbe}, {0x99,0xfb}, {0xe0,0xbb}, {0xe0,0xba}, {0x97,0xe0}, {0xe0,0xbf}, {0xe0,0xc2}, {0xe0,0xc7}, {0xe4,0x78}, {0x96,0xdc}, {0xbb,0xc7}, {0xe4,0xa4}, {0xe4,0x7a}, {0xbb,0xcc}, {0xbb,0xd0}, {0xe4,0xad}, {0xe4,0xb5}, {0xe4,0xa6}, {0xbb,0xc8}, {0x9c,0xa8}, {0xe4,0xaa}, {0xe0,0xb6}, {0x97,0x72}, {0xbb,0xc9}, {0xe4,0xb1}, {0xe4,0xb6}, {0xe4,0xae}, {0x94,0x40}, {0xe4,0xb0}, {0xe4,0xb9}, {0xe4,0xb2}, {0xe4,0x7e}, {0xe4,0xa9}, {0x92,0xf2}, {0xbb,0xd1}, {0xbb,0xcd}, {0xe4,0x7c}, {0xe4,0xab}, {0xbb,0xcb}, {0xe4,0xa5}, {0xbb,0xca}, {0xe4,0xb3}, {0xe4,0xa2}, {0xe4,0x79}, {0xbb,0xce}, {0xe4,0xb8}, {0xe4,0x7b}, {0xe4,0xaf}, {0xe4,0xac}, {0xe4,0xa7}, {0xe4,0x77}, {0xe4,0x76}, {0xe4,0xa1}, {0xe4,0xb4}, {0xbb,0xcf}, {0xe4,0xb7}, {0xe4,0x7d}, {0xe4,0xa3}, {0xbe,0x52}, {0x99,0xfd}, {0x99,0xfc}, {0xbe,0x5a}, {0xbe,0x55}, {0xe8,0xa4}, {0xe8,0xa1}, {0xe8,0x67}, {0xbe,0x50}, {0xf9,0xd7}, {0x96,0x4a}, {0xbe,0x4f}, {0xbe,0x56}, {0x96,0xd8}, {0x99,0xfe}, {0xe8,0x65}, {0xbe,0x54}, {0xe8,0x71}, {0xe8,0x63}, {0xe8,0x64}, {0xbe,0x4e}, {0xe8,0xa3}, {0xbe,0x58}, {0xe8,0x74}, {0xe8,0x79}, {0xe8,0x73}, {0xeb,0xee}, {0xe8,0x6f}, {0xe8,0x77}, {0xe8,0x75}, {0xe8,0x68}, {0xe8,0x62}, {0xe8,0x7d}, {0xbe,0x57}, {0xe8,0x7e}, {0x90,0x4b}, {0xe8,0x78}, {0xe8,0x6d}, {0xe8,0x6b}, {0xe8,0x66}, {0xfa,0x41}, {0xe8,0x6e}, {0xe8,0x7b}, {0xe8,0x6a}, {0xe8,0x7a}, {0xe8,0xa2}, {0x9a,0x40}, {0xbe,0x53}, {0x97,0x5b}, {0xe8,0x76}, {0xe8,0x7c}, {0xe8,0x72}, {0xe8,0x6c}, {0xbe,0x51}, {0x9a,0x41}, {0x91,0xdd}, {0xe4,0xa8}, {0xe8,0x70}, {0xbe,0x59}, {0xe8,0x69}, {0x93,0xfc}, {0x9a,0x42}, {0x9a,0x43}, {0x96,0x59}, {0xeb,0xf4}, {0xbf,0xf7}, {0xeb,0xf3}, {0xeb,0xf0}, {0xec,0x44}, {0xbf,0xfb}, {0x9a,0x44}, {0xec,0x41}, {0xeb,0xf8}, {0xec,0x43}, {0xeb,0xe9}, {0xeb,0xf6}, {0x90,0x51}, {0xbf,0xfd}, {0xeb,0xe1}, {0x94,0xbf}, {0xeb,0xdf}, {0xec,0x42}, {0xec,0x40}, {0xeb,0xfe}, {0xeb,0xed}, {0xeb,0xec}, {0xeb,0xe2}, {0xc0,0x40}, {0xeb,0xe8}, {0xeb,0xf2}, {0xeb,0xfd}, {0xc0,0x43}, {0xec,0x45}, {0xc1,0xe8}, {0xc0,0x45}, {0xbf,0xfe}, {0xeb,0xe6}, {0xeb,0xef}, {0xeb,0xde}, {0xeb,0xe0}, {0xbf,0xf5}, {0xc0,0x42}, {0xbf,0xfa}, {0xeb,0xe7}, {0xeb,0xf7}, {0xeb,0xf1}, {0xc0,0x41}, {0xeb,0xdd}, {0xc1,0xe3}, {0xeb,0xf9}, {0xeb,0xfc}, {0xbf,0xfc}, {0x90,0xa2}, {0xeb,0xeb}, {0xc0,0x44}, {0xbf,0xf9}, {0x9c,0xab}, {0x97,0x76}, {0xbf,0xf8}, {0xeb,0xf5}, {0xeb,0xfb}, {0xbf,0xf6}, {0xeb,0xe4}, {0xeb,0xfa}, {0xeb,0xe5}, {0xfc,0x55}, {0xfe,0x45}, {0x94,0xa8}, {0x9a,0x45}, {0xfa,0x4b}, {0x9d,0xe1}, {0xeb,0xea}, {0xee,0xd2}, {0x96,0xd9}, {0xee,0xd7}, {0xc1,0xe5}, {0xc1,0xe7}, {0xee,0xdd}, {0xc1,0xe1}, {0xee,0xec}, {0xee,0xe3}, {0xee,0xd8}, {0xee,0xd9}, {0xee,0xe2}, {0xc1,0xee}, {0xee,0xe1}, {0xee,0xd1}, {0xee,0xe0}, {0xee,0xd4}, {0xee,0xed}, {0xc1,0xed}, {0xc1,0xeb}, {0xee,0xd5}, {0xee,0xe8}, {0x97,0x74}, {0xee,0xda}, {0xee,0xe7}, {0xfd,0xf5}, {0xee,0xe9}, {0xee,0xd0}, {0xc1,0xe6}, {0x92,0xe5}, {0xee,0xea}, {0x96,0x45}, {0x91,0xda}, {0xee,0xde}, {0x90,0xa3}, {0xc1,0xea}, {0xee,0xdb}, {0xa0,0x5f}, {0xc1,0xec}, {0xee,0xe4}, {0x90,0xaf}, {0x97,0xbf}, {0xc1,0xe4}, {0xee,0xd6}, {0xee,0xe5}, {0x91,0x4c}, {0xee,0xdf}, {0xeb,0xe3}, {0xee,0xe6}, {0xee,0xd3}, {0x96,0x7a}, {0xc1,0xe9}, {0xee,0xeb}, {0x91,0xde}, {0xc1,0xe2}, {0xee,0xce}, {0x9a,0x46}, {0xfe,0xb0}, {0x97,0x79}, {0x94,0x6c}, {0xf1,0x60}, {0xf1,0x59}, {0xc2,0xe9}, {0xf1,0x54}, {0xf1,0x63}, {0xf1,0x5b}, {0xee,0xdc}, {0x98,0x58}, {0xf1,0x65}, {0xf1,0x55}, {0xc2,0xe8}, {0xf1,0x5f}, {0xc2,0xea}, {0xc2,0xf2}, {0xc2,0xf0}, {0xf1,0x61}, {0xc2,0xf1}, {0xf1,0x57}, {0x92,0x66}, {0xf1,0x58}, {0xf1,0x5d}, {0xf1,0x62}, {0x93,0xfb}, {0xee,0xcd}, {0xc2,0xeb}, {0xf1,0x6a}, {0xf1,0x67}, {0xf1,0x6b}, {0xf1,0x5e}, {0xf1,0x5a}, {0xf1,0x68}, {0xf3,0x6a}, {0xf1,0x5c}, {0xc2,0xee}, {0x9a,0x47}, {0xc2,0xed}, {0xee,0xcf}, {0xc2,0xef}, {0xf1,0x64}, {0xf1,0x66}, {0xc2,0xec}, {0xf1,0x69}, {0xf1,0x53}, {0xf1,0x56}, {0x97,0x49}, {0x97,0x48}, {0x93,0x4a}, {0x9c,0xe2}, {0xf3,0x73}, {0xf3,0x63}, {0xc3,0xeb}, {0xf3,0x71}, {0x92,0x64}, {0xf3,0x61}, {0xc3,0xec}, {0xf3,0x6c}, {0x91,0xdf}, {0xf3,0x68}, {0xc3,0xf1}, {0xf3,0x72}, {0xf3,0x62}, {0xf3,0x65}, {0xc3,0xe9}, {0xf3,0x74}, {0xfb,0x79}, {0xf3,0x6d}, {0xf3,0x70}, {0xc3,0xef}, {0xc3,0xf4}, {0xc3,0xf2}, {0xf3,0x69}, {0xf3,0x64}, {0x96,0xd7}, {0xc3,0xed}, {0xc3,0xee}, {0xf3,0x60}, {0xc3,0xea}, {0x93,0x43}, {0xc3,0xe8}, {0xc3,0xf0}, {0xf3,0x6f}, {0xc3,0xf3}, {0xf3,0x6b}, {0xf3,0x75}, {0xc3,0xf5}, {0xf3,0x67}, {0xf3,0x6e}, {0xfd,0xcb}, {0xfe,0x7a}, {0x91,0xdb}, {0x8c,0x6a}, {0xf4,0xf3}, {0xf5,0x42}, {0xf4,0xf5}, {0xf4,0xfc}, {0xf3,0x66}, {0xf4,0xfa}, {0xf4,0xe9}, {0xf5,0x40}, {0xc4,0xc3}, {0xf4,0xed}, {0xf4,0xfe}, {0xf4,0xf4}, {0x97,0xaf}, {0xc4,0xc2}, {0x95,0xdd}, {0xf5,0x44}, {0xf4,0xf6}, {0x93,0x48}, {0xf4,0xfb}, {0xf4,0xfd}, {0xf4,0xe7}, {0xf5,0x41}, {0xf4,0xf2}, {0xf4,0xf7}, {0xf4,0xeb}, {0xf4,0xef}, {0xf5,0x43}, {0xf4,0xf9}, {0xf4,0xe8}, {0xf4,0xec}, {0xf4,0xee}, {0xf4,0xf8}, {0x9a,0x4b}, {0xc4,0xc1}, {0xf4,0xf1}, {0xfc,0x45}, {0x9a,0x4d}, {0xf4,0xea}, {0x91,0xbc}, {0x90,0xe2}, {0x90,0xb4}, {0x95,0xe1}, {0xf4,0xf0}, {0xf6,0x61}, {0xf6,0x66}, {0xc5,0x4f}, {0xf6,0x68}, {0x9a,0x4e}, {0xc5,0x49}, {0xf6,0x64}, {0xf6,0x6a}, {0xc5,0x4e}, {0xc5,0x4a}, {0xc5,0x4b}, {0xf6,0x60}, {0xf6,0x67}, {0xc5,0x4d}, {0xf6,0x65}, {0xc5,0x4c}, {0xf6,0x5f}, {0xf6,0x63}, {0xf6,0x62}, {0x9a,0x4f}, {0xf6,0x5e}, {0xf6,0x69}, {0xfe,0x40}, {0xfe,0x43}, {0xc5,0xb1}, {0xf7,0x6d}, {0xf7,0x70}, {0xf7,0x6c}, {0xf7,0x6e}, {0xf7,0x6f}, {0xf7,0x69}, {0xf7,0x6a}, {0xf7,0x67}, {0x96,0xdd}, {0xf7,0x6b}, {0xf7,0x68}, {0xc5,0xb2}, {0xc5,0xb3}, {0x9a,0x51}, {0xf8,0x4b}, {0xf8,0x4d}, {0x96,0xa7}, {0x90,0xb0}, {0xf8,0x4c}, {0xf8,0x4e}, {0xc5,0xe0}, {0xf8,0x4a}, {0xc5,0xdf}, {0xc5,0xe1}, {0x9c,0x4e}, {0x94,0x43}, {0xf8,0xcb}, {0xf8,0xcc}, {0xc6,0x44}, {0xf8,0xca}, {0x8e,0xba}, {0xf9,0x53}, {0xf9,0x52}, {0xf9,0x54}, {0xc6,0x5f}, {0xf9,0x55}, {0xc6,0x5e}, {0xf9,0x56}, {0xf9,0x72}, {0xf9,0x75}, {0xf9,0x74}, {0xc6,0x68}, {0xf9,0x73}, {0x9a,0x52}, {0xfc,0xc1}, {0xc6,0x72}, {0xc6,0x70}, {0xc6,0x71}, {0xc6,0x77}, {0xf9,0xc0}, {0xf9,0xc1}, {0xf9,0xbf}, {0xf9,0xc9}, {0x8b,0xe9}, {0x9c,0xaf}, {0x8b,0xfd}, {0x9a,0xbc}, {0x9a,0xb8}, {0x9a,0xae}, {0x9a,0xa7}, {0x9a,0x53}, {0x9d,0x74}, {0xaa,0xf8}, {0x8b,0xea}, {0xd8,0x44}, {0xdc,0x78}, {0xe8,0xa5}, {0xf3,0x76}, {0x8b,0xeb}, {0xaa,0xf9}, {0xad,0xac}, {0xb0,0x7b}, {0x90,0xb2}, {0xd8,0x45}, {0xd8,0x46}, {0xb3,0xac}, {0xb6,0x7d}, {0xdc,0x7a}, {0xdc,0x79}, {0xb6,0xa3}, {0xb6,0x7c}, {0xdc,0x7b}, {0xb6,0x7e}, {0xb6,0xa2}, {0xb6,0xa1}, {0xb6,0x7b}, {0x95,0xe9}, {0x95,0xe8}, {0xb9,0x68}, {0x95,0xe6}, {0xe0,0xd0}, {0xe0,0xce}, {0xe0,0xcf}, {0xe0,0xcd}, {0x90,0xb5}, {0xbb,0xd2}, {0x9a,0x54}, {0xbb,0xd5}, {0xbb,0xd7}, {0xbb,0xd6}, {0x90,0xb3}, {0x95,0xe7}, {0xbb,0xd3}, {0xbb,0xd4}, {0x8b,0x50}, {0xe8,0xa7}, {0xe8,0xa6}, {0xbe,0x5b}, {0xe8,0xa8}, {0xe8,0xa9}, {0xbe,0x5c}, {0xec,0x4d}, {0xec,0x4b}, {0xee,0xf3}, {0xec,0x49}, {0xec,0x4a}, {0xc0,0x46}, {0xec,0x46}, {0xec,0x4e}, {0xec,0x48}, {0xec,0x4c}, {0xee,0xef}, {0xee,0xf1}, {0xee,0xf2}, {0xc1,0xf3}, {0xee,0xee}, {0xc1,0xf2}, {0xee,0xf0}, {0xc1,0xef}, {0xc1,0xf0}, {0xc1,0xf1}, {0xec,0x47}, {0xc2,0xf5}, {0xf1,0x6e}, {0xf1,0x6c}, {0xf1,0x6d}, {0xc2,0xf3}, {0xc2,0xf6}, {0xc2,0xf4}, {0xf3,0x77}, {0xf3,0x78}, {0xc3,0xf6}, {0xf5,0x45}, {0xf5,0x47}, {0xf5,0x46}, {0xc4,0xc4}, {0xc5,0x50}, {0xf6,0x6d}, {0xf6,0x6c}, {0xf6,0x6b}, {0x8b,0xec}, {0x9a,0x56}, {0xaa,0xfa}, {0x8b,0xfb}, {0xc9,0xaa}, {0xca,0x58}, {0xa6,0xe9}, {0xca,0x56}, {0xca,0x59}, {0xca,0x57}, {0xcb,0xae}, {0xa8,0xc1}, {0xa8,0xc2}, {0xcb,0xb0}, {0xa8,0xbf}, {0xcb,0xaf}, {0xcb,0xad}, {0xa8,0xc0}, {0xa8,0xbe}, {0x9a,0x57}, {0xa0,0xaa}, {0xcd,0xd8}, {0xcd,0xdb}, {0xaa,0xfd}, {0xcd,0xda}, {0xcd,0xd9}, {0xaa,0xfc}, {0xaa,0xfb}, {0x9f,0xa6}, {0xab,0x40}, {0xcd,0xdc}, {0xaa,0xfe}, {0x99,0xcc}, {0xd0,0xc6}, {0xad,0xae}, {0xad,0xaf}, {0xad,0xb0}, {0xd0,0xc7}, {0xd0,0xc3}, {0xad,0xad}, {0xd0,0xc4}, {0xd0,0xc5}, {0xd0,0xc2}, {0x9c,0x59}, {0xb0,0xa4}, {0xb0,0xa1}, {0xd4,0x45}, {0xb0,0xa2}, {0xb0,0xa5}, {0xd4,0x46}, {0xb0,0x7e}, {0xb0,0x7c}, {0xb0,0x7d}, {0xb0,0xa3}, {0x99,0xb5}, {0xb3,0xad}, {0xd8,0x49}, {0xb3,0xb5}, {0xd8,0x48}, {0xd8,0x4b}, {0xb3,0xb1}, {0xd8,0x4a}, {0xb6,0xab}, {0xb3,0xaf}, {0xb3,0xb2}, {0xb3,0xae}, {0xb3,0xb3}, {0xb3,0xb4}, {0xb3,0xb0}, {0x90,0xbe}, {0xd8,0x47}, {0xb6,0xa7}, {0xdc,0x7d}, {0xdc,0xa3}, {0x9f,0xaf}, {0xdc,0xa2}, {0xb6,0xac}, {0xb6,0xa8}, {0xb6,0xa9}, {0xdc,0x7c}, {0xdc,0x7e}, {0xdc,0xa1}, {0xb6,0xa4}, {0xb6,0xa6}, {0xb6,0xaa}, {0xb6,0xa5}, {0x95,0xf2}, {0xe0,0xd3}, {0xe0,0xd1}, {0xe0,0xd2}, {0xb9,0x6a}, {0xb9,0x6b}, {0x90,0xbf}, {0xe0,0xd4}, {0xb9,0x69}, {0xbb,0xd8}, {0xbb,0xda}, {0xbb,0xd9}, {0xe4,0xbb}, {0xe4,0xbc}, {0xe8,0xab}, {0x90,0xc1}, {0xe8,0xaa}, {0xfe,0xe4}, {0xc0,0x47}, {0xc0,0x48}, {0xec,0x4f}, {0xc0,0x49}, {0xee,0xf6}, {0xee,0xf4}, {0xee,0xf5}, {0xc1,0xf4}, {0xf1,0x6f}, {0xc3,0xf7}, {0x90,0xc4}, {0xc1,0xf5}, {0xab,0x41}, {0xb0,0xa6}, {0xd4,0x47}, {0x90,0xc7}, {0xd8,0x4c}, {0xb3,0xb6}, {0xb6,0xad}, {0xdc,0xa4}, {0xdc,0xa6}, {0xb6,0xaf}, {0xb6,0xae}, {0xb6,0xb0}, {0xb6,0xb1}, {0xdc,0xa5}, {0xb9,0x6e}, {0xb9,0x6f}, {0xb9,0x6d}, {0xbb,0xdb}, {0xb9,0x6c}, {0xe0,0xd5}, {0xbb,0xdc}, {0xe8,0xac}, {0xec,0x50}, {0xc0,0x4a}, {0xc1,0xf6}, {0xf1,0x70}, {0xf1,0x74}, {0xc2,0xf9}, {0xf1,0x71}, {0xc2,0xfa}, {0xc2,0xf8}, {0xf1,0x75}, {0xc2,0xfb}, {0xf1,0x73}, {0xf3,0x79}, {0xc2,0xf7}, {0xc3,0xf8}, {0xf8,0xcd}, {0xab,0x42}, {0xb3,0xb8}, {0xb3,0xb7}, {0xb6,0xb2}, {0xdc,0xa8}, {0xdc,0xa7}, {0xb6,0xb3}, {0x92,0xe4}, {0xe0,0xd9}, {0xb9,0x73}, {0xb9,0x70}, {0xe0,0xd8}, {0xb9,0x72}, {0xe0,0xd6}, {0xb9,0x71}, {0xe0,0xd7}, {0xe4,0xbd}, {0xbb,0xdd}, {0xe8,0xaf}, {0x9f,0x52}, {0xbe,0x5d}, {0xe8,0xad}, {0xbe,0x5e}, {0xbe,0x5f}, {0xe8,0xae}, {0xbe,0x60}, {0xec,0x51}, {0xc0,0x4e}, {0xc0,0x4b}, {0xc0,0x50}, {0xec,0x53}, {0xc0,0x4c}, {0xec,0x52}, {0xc0,0x4f}, {0xc0,0x4d}, {0xee,0xf9}, {0xee,0xfb}, {0x90,0xdb}, {0xc1,0xf7}, {0xee,0xfa}, {0xc1,0xf8}, {0xee,0xf8}, {0xee,0xf7}, {0xa0,0x66}, {0xf1,0x77}, {0xf1,0x76}, {0xc2,0xfc}, {0xf1,0x78}, {0xf3,0x7e}, {0xc3,0xfa}, {0xf3,0x7d}, {0xf3,0x7a}, {0xc3,0xf9}, {0xf3,0x7b}, {0xf3,0x7c}, {0xf5,0x48}, {0xf5,0x49}, {0xc4,0xc5}, {0x90,0xd2}, {0xc5,0x53}, {0xf6,0x6e}, {0x90,0xd4}, {0xc5,0x51}, {0xc5,0x52}, {0xf6,0x6f}, {0xc5,0xb4}, {0xc5,0xb5}, {0xf7,0x71}, {0x9a,0x5b}, {0x95,0xfd}, {0xc6,0x45}, {0xf8,0xcf}, {0xc6,0x47}, {0xf8,0xce}, {0xf8,0xd0}, {0xc6,0x46}, {0xf9,0x57}, {0xf9,0xad}, {0x8b,0xc4}, {0xab,0x43}, {0x8c,0x66}, {0xb9,0x74}, {0x90,0xde}, {0xe4,0xbe}, {0xe8,0xb0}, {0xc0,0x51}, {0xc0,0x52}, {0x9c,0xe4}, {0xab,0x44}, {0x90,0xe1}, {0xbe,0x61}, {0xc3,0xfb}, {0xad,0xb1}, {0xc0,0x53}, {0xc5,0xe2}, {0xad,0xb2}, {0xd8,0x4d}, {0xdc,0xa9}, {0x9e,0x46}, {0xdc,0xab}, {0xdc,0xaa}, {0x96,0x51}, {0xe0,0xdd}, {0xe0,0xda}, {0xb9,0x75}, {0xb9,0x76}, {0xe0,0xdb}, {0xe0,0xdc}, {0xe4,0xc0}, {0xe4,0xc5}, {0xbb,0xde}, {0xe4,0xbf}, {0xe4,0xc1}, {0xe4,0xc8}, {0xe4,0xc3}, {0xe4,0xc7}, {0xe4,0xc4}, {0xe4,0xc2}, {0xe4,0xc6}, {0xbb,0xdf}, {0xfb,0x58}, {0xe8,0xb3}, {0x90,0xe6}, {0xe8,0xb1}, {0xbe,0x63}, {0xbe,0x62}, {0xe8,0xb2}, {0xbe,0x64}, {0xec,0x56}, {0xec,0x55}, {0xc0,0x54}, {0xec,0x54}, {0xee,0xfc}, {0x96,0x50}, {0xee,0xfe}, {0xef,0x41}, {0xef,0x40}, {0x90,0xe7}, {0xc1,0xf9}, {0xee,0xfd}, {0xf1,0xa1}, {0xc2,0xfd}, {0xf1,0x7d}, {0xf1,0xa2}, {0xc2,0xfe}, {0xf1,0x7b}, {0xf1,0x7e}, {0xf1,0x7c}, {0xf1,0x79}, {0xc3,0x40}, {0xf1,0x7a}, {0x90,0xe8}, {0x9a,0x5d}, {0xf3,0xa1}, {0x9f,0x7a}, {0xf3,0xa3}, {0xf3,0xa2}, {0x9b,0x5c}, {0xf5,0x4a}, {0x9f,0x7c}, {0xf5,0x4b}, {0xfc,0x52}, {0x90,0xe9}, {0xf6,0x70}, {0x90,0xea}, {0xc5,0xb7}, {0x9a,0x5e}, {0xc5,0xb6}, {0xf8,0x4f}, {0xf8,0x50}, {0xc6,0x48}, {0xf8,0xd1}, {0x9f,0x76}, {0xc6,0x69}, {0xad,0xb3}, {0xb6,0xb4}, {0xe4,0xca}, {0xe4,0xc9}, {0xe8,0xb5}, {0xe8,0xb4}, {0x90,0xeb}, {0xc1,0xfa}, {0xef,0x43}, {0xef,0x42}, {0xf1,0xa5}, {0xf1,0xa3}, {0xf1,0xa6}, {0xf1,0xa4}, {0xc3,0xfc}, {0xf3,0xa4}, {0xf3,0xa5}, {0xf3,0xa6}, {0x90,0xec}, {0xf6,0x71}, {0xf7,0x72}, {0xf8,0xd2}, {0x8b,0xee}, {0xad,0xb4}, {0x90,0xee}, {0xec,0x57}, {0xef,0x44}, {0x91,0xc6}, {0xad,0xb5}, {0x90,0xf2}, {0xbb,0xe0}, {0xec,0x58}, {0xc3,0x41}, {0xf1,0xa7}, {0xc3,0xfd}, {0xf5,0x4c}, {0xf5,0x4d}, {0xc5,0x54}, {0xf8,0x51}, {0xad,0xb6}, {0xb3,0xbb}, {0xb3,0xbc}, {0xd8,0x4e}, {0xb6,0xb5}, {0xb6,0xb6}, {0xdc,0xac}, {0xb6,0xb7}, {0xb9,0x7a}, {0xb9,0x7c}, {0xe0,0xdf}, {0xe0,0xe0}, {0xe0,0xde}, {0xb9,0x77}, {0xb9,0x78}, {0xb9,0x7b}, {0xb9,0x79}, {0xfc,0xbc}, {0x8a,0x74}, {0xe4,0xcb}, {0xbb,0xe1}, {0xbb,0xe2}, {0xe8,0xbc}, {0xbe,0x67}, {0xe8,0xb7}, {0xe8,0xb6}, {0x96,0x57}, {0xe8,0xbb}, {0xbe,0x65}, {0x9c,0xef}, {0xc0,0x5b}, {0xe8,0xb8}, {0xe8,0xbd}, {0xe8,0xba}, {0xe8,0xb9}, {0xbe,0x66}, {0xc0,0x59}, {0x9f,0xdf}, {0xec,0x5a}, {0xc0,0x55}, {0xec,0x5b}, {0x90,0xf7}, {0x90,0xf6}, {0xec,0x59}, {0xc0,0x58}, {0xc0,0x56}, {0xc0,0x5a}, {0xc0,0x57}, {0xef,0x45}, {0xef,0x4a}, {0xef,0x46}, {0xef,0x49}, {0xc1,0xfb}, {0x9b,0x5e}, {0xed,0xd4}, {0xef,0x48}, {0xef,0x47}, {0x90,0xf8}, {0xc3,0x44}, {0xc3,0x42}, {0xc3,0x45}, {0xc3,0x43}, {0xf1,0xa8}, {0xf1,0xa9}, {0xf1,0xaa}, {0xc3,0x46}, {0xf3,0xaa}, {0xc4,0x40}, {0xf3,0xa8}, {0xc4,0x41}, {0xf3,0xa7}, {0xf3,0xa9}, {0xc3,0xfe}, {0xf5,0x51}, {0xf5,0x4e}, {0xf5,0x4f}, {0xf5,0x50}, {0xf6,0x72}, {0xc5,0x56}, {0x90,0xf9}, {0xc5,0x55}, {0x8c,0xc9}, {0xf7,0x74}, {0xf7,0x73}, {0xc5,0xb8}, {0xfa,0x6a}, {0xc5,0xe3}, {0xc6,0x49}, {0xc6,0x60}, {0xf9,0x58}, {0xf9,0xae}, {0xf9,0xaf}, {0x8b,0xef}, {0xad,0xb7}, {0xdc,0xad}, {0xe0,0xe1}, {0xe4,0xcc}, {0xe4,0xcd}, {0xbb,0xe3}, {0xbb,0xe4}, {0xe8,0xbe}, {0xbe,0x68}, {0x9f,0xe0}, {0xc1,0xfc}, {0x91,0x42}, {0xf1,0xab}, {0x9a,0x62}, {0xc3,0x47}, {0xf3,0xad}, {0xc4,0x42}, {0xf3,0xac}, {0xf3,0xae}, {0xf3,0xab}, {0xf6,0x75}, {0xf5,0x52}, {0xf5,0x53}, {0x95,0x69}, {0xc4,0xc6}, {0xf6,0x74}, {0x91,0x44}, {0x91,0x43}, {0xf6,0x73}, {0x91,0x41}, {0xf7,0x75}, {0xf9,0xb0}, {0x8b,0xf0}, {0xad,0xb8}, {0x96,0x60}, {0x8b,0xf1}, {0xad,0xb9}, {0x99,0xf6}, {0x91,0x49}, {0xb0,0xa7}, {0xd4,0x48}, {0xd8,0x4f}, {0x91,0x4a}, {0xb6,0xb8}, {0xb6,0xbb}, {0xb6,0xb9}, {0xdc,0xae}, {0x91,0x4b}, {0xb6,0xbd}, {0xb6,0xba}, {0x9a,0x64}, {0xb6,0xbc}, {0xb9,0x7e}, {0x8a,0xbf}, {0xe0,0xe2}, {0xe0,0xe3}, {0xe8,0xc0}, {0xb9,0x7d}, {0xb9,0xa1}, {0xb9,0xa2}, {0xe4,0xcf}, {0xe4,0xce}, {0xbb,0xe5}, {0xbb,0xe6}, {0xe4,0xd0}, {0xe8,0xbf}, {0xbb,0xe8}, {0xbe,0x69}, {0xbb,0xe7}, {0x9a,0x66}, {0xc0,0x5c}, {0xe8,0xc1}, {0xbe,0x6b}, {0xbe,0x6a}, {0xe8,0xc2}, {0xe8,0xc5}, {0xe8,0xc3}, {0xe8,0xc4}, {0xbe,0x6c}, {0x9a,0x67}, {0xc0,0x61}, {0xc0,0x5f}, {0x9a,0x69}, {0xc0,0x5e}, {0xec,0x5d}, {0xc0,0x60}, {0xec,0x5c}, {0xef,0x4b}, {0xec,0x5e}, {0xc0,0x5d}, {0xec,0x5f}, {0xef,0x4e}, {0xef,0x4c}, {0xef,0x4d}, {0xef,0x52}, {0xc3,0x4b}, {0xef,0x51}, {0xef,0x54}, {0xef,0x53}, {0xef,0x50}, {0xef,0x4f}, {0xc1,0xfd}, {0x9a,0x6a}, {0x96,0x52}, {0x91,0x4d}, {0xf1,0xae}, {0x96,0x66}, {0xf1,0xad}, {0xc3,0x4a}, {0xc3,0x48}, {0xc3,0x49}, {0x9f,0x7b}, {0xf1,0xac}, {0x9a,0x6b}, {0xf3,0xb1}, {0xc4,0x43}, {0xf3,0xb0}, {0xf3,0xaf}, {0xc4,0x44}, {0xa0,0x6c}, {0xf5,0x58}, {0xf5,0x57}, {0x96,0x67}, {0xf5,0x55}, {0xf5,0x54}, {0xc4,0xc8}, {0xc4,0xc7}, {0xf5,0x59}, {0xf7,0x76}, {0xc5,0xb9}, {0xf6,0x77}, {0xc5,0x57}, {0xf6,0x76}, {0xf5,0x56}, {0xf7,0x77}, {0xc5,0xe4}, {0x9a,0x6c}, {0xc6,0x61}, {0xf9,0x59}, {0xf9,0xb1}, {0x9a,0x6d}, {0x8b,0xf2}, {0xad,0xba}, {0xd8,0x50}, {0xef,0x55}, {0xad,0xbb}, {0x96,0x6a}, {0xe4,0xd2}, {0xe4,0xd1}, {0xec,0x60}, {0xef,0x57}, {0xef,0x56}, {0xfc,0xea}, {0xc3,0x4c}, {0xf3,0xb2}, {0xf3,0xb3}, {0xc4,0xc9}, {0x96,0x6c}, {0xf9,0xb2}, {0xb0,0xa8}, {0xb6,0xbf}, {0xb6,0xbe}, {0xe0,0xe4}, {0xe0,0xe6}, {0xb9,0xa4}, {0xe0,0xe5}, {0xb9,0xa3}, {0xb9,0xa5}, {0xe0,0xe7}, {0x91,0xc4}, {0xe4,0xd4}, {0xe4,0xd6}, {0xe4,0xd5}, {0x96,0x77}, {0xe4,0xd8}, {0xbb,0xe9}, {0xe4,0xd7}, {0xe4,0xd3}, {0x99,0xf4}, {0x9a,0x6f}, {0xe4,0xd9}, {0xe8,0xcc}, {0xe8,0xcf}, {0xe8,0xd1}, {0xe8,0xc7}, {0xe8,0xcb}, {0xe8,0xc8}, {0xbe,0x6e}, {0xbe,0x71}, {0xbe,0x73}, {0xe8,0xc9}, {0xe8,0xca}, {0xbe,0x72}, {0xe8,0xcd}, {0xe8,0xd0}, {0xe8,0xce}, {0xbe,0x74}, {0x9f,0xab}, {0xbe,0x70}, {0xe8,0xc6}, {0xbe,0x6d}, {0xbe,0x6f}, {0x8c,0xbe}, {0x8e,0xc1}, {0xc0,0x63}, {0xec,0x66}, {0xec,0x64}, {0xec,0x63}, {0x95,0x55}, {0xec,0x69}, {0xec,0x68}, {0xec,0x67}, {0xec,0x62}, {0xc0,0x62}, {0xec,0x61}, {0xec,0x65}, {0xc0,0x64}, {0xef,0x5a}, {0x91,0x52}, {0xef,0x5e}, {0xef,0x5b}, {0xef,0x5d}, {0xef,0x5c}, {0xef,0x59}, {0xef,0x5f}, {0xef,0x62}, {0xef,0x60}, {0xef,0x61}, {0xc2,0x40}, {0xc1,0xfe}, {0xef,0x58}, {0xef,0x63}, {0xf1,0xb3}, {0xf1,0xb6}, {0xf1,0xb8}, {0xf1,0xb7}, {0xf1,0xb1}, {0xf1,0xb5}, {0xf1,0xb0}, {0x91,0x53}, {0xf1,0xb2}, {0xc3,0x4d}, {0xf1,0xaf}, {0x91,0x55}, {0xf1,0xb4}, {0xf3,0xc0}, {0xf3,0xb5}, {0xc4,0x45}, {0xc4,0x46}, {0xf3,0xb4}, {0xf3,0xb9}, {0xf3,0xbf}, {0xf3,0xb7}, {0xf3,0xbe}, {0x95,0x5d}, {0xf3,0xbb}, {0x96,0x71}, {0xf3,0xba}, {0xf3,0xbd}, {0xf3,0xb8}, {0xf3,0xb6}, {0x9c,0x6d}, {0xf3,0xbc}, {0xf5,0x60}, {0xf5,0x5e}, {0xc4,0xca}, {0xf5,0x5d}, {0xf5,0x63}, {0xf5,0x61}, {0x96,0x73}, {0xc4,0xcb}, {0xf5,0x5c}, {0xf5,0x5a}, {0xf5,0x5b}, {0xc4,0xcd}, {0xf5,0x5f}, {0xc4,0xcc}, {0xf5,0x62}, {0xf6,0x78}, {0xf6,0x7e}, {0x91,0x54}, {0x9a,0x71}, {0xf6,0x79}, {0xc5,0x5b}, {0xf6,0xa1}, {0xc5,0x5a}, {0xf6,0x7d}, {0xf6,0x7c}, {0xc5,0x59}, {0xf6,0x7b}, {0xc5,0x58}, {0xf6,0x7a}, {0xf7,0x7d}, {0xf7,0xa1}, {0xf7,0x7e}, {0xf7,0x7b}, {0xc5,0xbb}, {0xf7,0x78}, {0xf7,0x7c}, {0xf7,0xa3}, {0xf7,0xa2}, {0xf7,0x79}, {0xf7,0x7a}, {0xc5,0xba}, {0xf8,0x52}, {0xc5,0xe7}, {0x91,0x56}, {0xf8,0x53}, {0xc5,0xe5}, {0xc5,0xe6}, {0x96,0x6d}, {0xf8,0xd3}, {0xc6,0x4a}, {0xf9,0x76}, {0xc6,0x6a}, {0x95,0x57}, {0xf9,0xb3}, {0xc6,0x6b}, {0xf9,0xb4}, {0xf9,0xb5}, {0xf9,0xc3}, {0xf9,0xc2}, {0xc6,0x7a}, {0xf9,0xcd}, {0x89,0xc6}, {0x89,0xc7}, {0xb0,0xa9}, {0xe0,0xe9}, {0xe0,0xe8}, {0xbb,0xea}, {0xbb,0xeb}, {0xe4,0xda}, {0x8a,0x6a}, {0xe8,0xd2}, {0xec,0x6c}, {0x8b,0x57}, {0xbe,0x75}, {0xc0,0x65}, {0xec,0x6a}, {0x9f,0xe1}, {0xec,0x6d}, {0xc0,0x66}, {0x9b,0x5f}, {0xef,0x64}, {0xec,0x6b}, {0xf1,0xb9}, {0xc3,0x4e}, {0xf3,0xc1}, {0xf5,0x66}, {0xf5,0x64}, {0xf5,0x65}, {0xf6,0xa2}, {0xc5,0x5c}, {0xf7,0xa4}, {0xc5,0xea}, {0xc5,0xbc}, {0xc5,0xe8}, {0xc5,0xe9}, {0xf8,0xd4}, {0xc6,0x62}, {0xa0,0x5d}, {0xb0,0xaa}, {0xf1,0xba}, {0xd4,0x49}, {0x91,0x5b}, {0xb9,0xa6}, {0x91,0x5c}, {0xe4,0xdb}, {0xbb,0xec}, {0xe4,0xdc}, {0xe8,0xd4}, {0xe8,0xd3}, {0xc0,0x68}, {0xbe,0x76}, {0xbe,0x77}, {0xe8,0xd7}, {0xe8,0xd6}, {0xe8,0xd5}, {0x91,0x5e}, {0xec,0x6e}, {0xec,0x71}, {0xec,0x70}, {0xec,0x6f}, {0xc0,0x67}, {0xef,0x68}, {0xef,0x66}, {0xef,0x65}, {0x9f,0x5c}, {0xef,0x67}, {0x9f,0x57}, {0xc3,0x4f}, {0xf1,0xbc}, {0xf1,0xbd}, {0xc3,0x50}, {0xf1,0xbb}, {0x9f,0x65}, {0xf3,0xc3}, {0xf3,0xc2}, {0xf3,0xc5}, {0xc4,0x47}, {0xf3,0xc4}, {0x9a,0x72}, {0xf5,0x67}, {0xf5,0x69}, {0xf5,0x68}, {0x91,0x60}, {0xf6,0xa3}, {0xf6,0xa6}, {0xf6,0xa4}, {0xf6,0xa5}, {0xf7,0xa5}, {0xc5,0xbd}, {0xf8,0x54}, {0xf8,0x55}, {0xf8,0x56}, {0xc6,0x4b}, {0xc6,0x63}, {0xf9,0xb6}, {0xb0,0xab}, {0xbe,0x78}, {0xc0,0x69}, {0xf1,0xbe}, {0x9f,0x5e}, {0xf7,0xa6}, {0x91,0x61}, {0xf9,0xc4}, {0xd4,0x4a}, {0xc6,0x7b}, {0xb0,0xac}, {0xec,0x72}, {0x91,0x64}, {0xf1,0xbf}, {0xf3,0xc6}, {0x9f,0x41}, {0xf6,0xa7}, {0xf7,0xa7}, {0xb0,0xad}, {0xe4,0xdd}, {0xe4,0xde}, {0x91,0x69}, {0xbb,0xed}, {0xbb,0xee}, {0xe8,0xd9}, {0xbe,0x7a}, {0xbe,0x79}, {0xe8,0xd8}, {0xef,0x69}, {0xf1,0xc0}, {0xf1,0xc2}, {0xf1,0xc1}, {0xc3,0x53}, {0xc3,0x52}, {0xc3,0x51}, {0x91,0x68}, {0xc5,0x5e}, {0xf6,0xa8}, {0xc5,0x5d}, {0xf7,0xa9}, {0xf7,0xa8}, {0xc6,0x4c}, {0xf8,0xd5}, {0xb3,0xbd}, {0xe0,0xea}, {0xe4,0xe1}, {0xe4,0xdf}, {0xe4,0xe0}, {0xe8,0xe2}, {0xe8,0xdd}, {0xe8,0xda}, {0xe8,0xe1}, {0x9a,0x74}, {0xe8,0xe3}, {0xbe,0x7c}, {0xe8,0xe0}, {0xe8,0xdc}, {0xe8,0xdb}, {0xe8,0xdf}, {0xe8,0xde}, {0xbe,0x7b}, {0xec,0x7d}, {0xec,0x78}, {0xec,0x76}, {0xec,0xa1}, {0xec,0x77}, {0x96,0xb2}, {0xec,0x73}, {0x9a,0x75}, {0xec,0x79}, {0xfd,0xa5}, {0xec,0x74}, {0xef,0x72}, {0xec,0x75}, {0xec,0xa2}, {0x9e,0xe9}, {0x8b,0xba}, {0x91,0x6d}, {0xa0,0x60}, {0xec,0x7c}, {0xc0,0x6a}, {0xec,0x7b}, {0xec,0x7a}, {0xec,0x7e}, {0x9f,0xde}, {0xef,0x6a}, {0xef,0x6d}, {0x9f,0xc3}, {0xef,0x6c}, {0x96,0xb5}, {0xef,0x74}, {0xef,0x6f}, {0xef,0x73}, {0xef,0x71}, {0xef,0x70}, {0xef,0x6e}, {0xef,0x6b}, {0xc2,0x43}, {0xc2,0x42}, {0xc2,0x44}, {0xc2,0x41}, {0xef,0x75}, {0xa0,0x67}, {0xf1,0xc8}, {0xf1,0xcb}, {0xf1,0xc9}, {0xf1,0xcd}, {0xf1,0xce}, {0xf1,0xc6}, {0xc3,0x58}, {0xf1,0xc7}, {0xf1,0xc5}, {0xf1,0xcc}, {0xf1,0xc4}, {0xf1,0xc3}, {0xc3,0x57}, {0xc3,0x55}, {0xc3,0x54}, {0x96,0xb3}, {0xf1,0xca}, {0xf3,0xcf}, {0xf3,0xd5}, {0xc4,0x4a}, {0xf3,0xd0}, {0xf3,0xd3}, {0xf3,0xd7}, {0xc4,0x4b}, {0xf3,0xd2}, {0x9a,0x76}, {0xf3,0xca}, {0xf3,0xc9}, {0xf3,0xd6}, {0xf3,0xcd}, {0xf3,0xcb}, {0xf3,0xd4}, {0xf3,0xcc}, {0xc4,0x49}, {0xc4,0x48}, {0x95,0xd5}, {0xf3,0xc7}, {0xf3,0xc8}, {0xf3,0xd1}, {0x9e,0xca}, {0xf3,0xce}, {0x9a,0x77}, {0x9a,0x78}, {0xf5,0x6c}, {0xf5,0x6f}, {0xc3,0x56}, {0x91,0x70}, {0x91,0x6f}, {0xf5,0x6d}, {0xf5,0x73}, {0xf5,0x71}, {0xf5,0x6b}, {0xf5,0x76}, {0x9f,0xa3}, {0xf5,0x6a}, {0x91,0x71}, {0xc4,0xcf}, {0xf5,0x72}, {0x96,0xb1}, {0xf5,0x6e}, {0xc4,0xce}, {0xf5,0x75}, {0x9f,0x63}, {0xf5,0x74}, {0x9f,0x67}, {0xf6,0xab}, {0xf6,0xaa}, {0x8b,0xb9}, {0x9a,0x7a}, {0xf6,0xb1}, {0xf6,0xad}, {0xf6,0xb0}, {0xc5,0x60}, {0x8b,0x56}, {0xf6,0xae}, {0xf6,0xaf}, {0xf6,0xa9}, {0xf6,0xac}, {0xc5,0x5f}, {0x9a,0xda}, {0xc5,0xbf}, {0xf7,0xb4}, {0xf7,0xaf}, {0xf7,0xb3}, {0x96,0xb0}, {0xf7,0xb6}, {0xf7,0xb2}, {0xf7,0xae}, {0x9a,0x7e}, {0xc5,0xc1}, {0xf7,0xb1}, {0xf7,0xb5}, {0xc5,0xc0}, {0xf7,0xac}, {0xf5,0x70}, {0xf7,0xb0}, {0xf7,0xad}, {0x9d,0xde}, {0xf7,0xaa}, {0xf7,0xab}, {0xc5,0xbe}, {0xf8,0x5a}, {0xf8,0x5c}, {0xf8,0x5f}, {0xf8,0x5b}, {0xf8,0x60}, {0x96,0xad}, {0xf8,0x59}, {0xf8,0x57}, {0x96,0xae}, {0xc5,0xeb}, {0xf8,0x5d}, {0xc5,0xed}, {0xc5,0xec}, {0xf8,0x58}, {0xf8,0x5e}, {0x9e,0xa1}, {0xf8,0xda}, {0xc6,0x4d}, {0xf8,0xdb}, {0xf8,0xd9}, {0xf8,0xd6}, {0xf8,0xd8}, {0xf8,0xd7}, {0xf9,0x5a}, {0xf9,0x5c}, {0xf9,0x5b}, {0xf9,0x79}, {0x9e,0x50}, {0xf9,0x78}, {0xf9,0x77}, {0xf9,0x7a}, {0xc6,0x73}, {0xc6,0x74}, {0xf9,0xca}, {0xf9,0xce}, {0x96,0xaf}, {0x8b,0xf4}, {0xb3,0xbe}, {0xdc,0xaf}, {0xe0,0xed}, {0xb9,0xa7}, {0xe0,0xeb}, {0xe0,0xec}, {0xe4,0xe2}, {0xe4,0xe3}, {0xbb,0xf1}, {0xbb,0xef}, {0xe4,0xe4}, {0xbb,0xf0}, {0xe8,0xe8}, {0xe8,0xeb}, {0xe8,0xe5}, {0xe8,0xec}, {0xe8,0xe4}, {0xe8,0xe6}, {0xe8,0xe7}, {0xe8,0xea}, {0x9f,0xa4}, {0xbe,0xa1}, {0xe8,0xef}, {0xe8,0xee}, {0xbe,0x7d}, {0xe8,0xe9}, {0xe8,0xed}, {0xbe,0x7e}, {0x96,0xbd}, {0xec,0xac}, {0xc0,0x6f}, {0xec,0xa7}, {0xc0,0x6b}, {0x96,0xf4}, {0xec,0xa4}, {0xec,0xaa}, {0xec,0xad}, {0xc0,0x70}, {0xec,0xa9}, {0xec,0xa6}, {0xec,0xae}, {0xec,0xa5}, {0x96,0xb8}, {0xec,0xab}, {0xc0,0x6c}, {0xec,0xa3}, {0xc0,0x6d}, {0xc0,0x6e}, {0xec,0xa8}, {0xef,0xa9}, {0xef,0x7a}, {0xef,0x7b}, {0xef,0x7e}, {0xef,0x7c}, {0xef,0x76}, {0xfa,0xa1}, {0xef,0x79}, {0xef,0xa5}, {0xef,0x7d}, {0x91,0xa7}, {0xc2,0x45}, {0xef,0xa7}, {0xef,0xa4}, {0xc2,0x46}, {0xef,0xa6}, {0xef,0x77}, {0xef,0xa2}, {0xef,0xa3}, {0xa0,0x5e}, {0xef,0xa1}, {0x9a,0x7d}, {0xf1,0xd2}, {0xf1,0xd4}, {0xf1,0xd7}, {0x89,0x48}, {0xf1,0xd1}, {0x9e,0xb1}, {0xc3,0x59}, {0xf1,0xd9}, {0xf1,0xd0}, {0xf1,0xda}, {0xf1,0xd6}, {0xf1,0xd8}, {0xf1,0xdc}, {0xf1,0xd5}, {0xf1,0xdd}, {0xf1,0xd3}, {0xf1,0xcf}, {0xc3,0x5a}, {0x9d,0xdb}, {0xf1,0xdb}, {0xc3,0x5b}, {0xc4,0x4d}, {0xef,0x78}, {0xf3,0xf1}, {0xf3,0xe8}, {0xc4,0x4f}, {0xf3,0xe4}, {0xc4,0x50}, {0x95,0xbf}, {0x8a,0x73}, {0xf3,0xed}, {0xf3,0xe7}, {0xf3,0xdd}, {0xc4,0x4e}, {0xf3,0xea}, {0xf3,0xe5}, {0xf3,0xe6}, {0xf3,0xd8}, {0xf3,0xdf}, {0xf3,0xee}, {0xf3,0xeb}, {0x9e,0xfe}, {0xf3,0xe3}, {0x91,0x7a}, {0xf3,0xef}, {0xf3,0xde}, {0xf3,0xd9}, {0xf3,0xec}, {0x91,0x7b}, {0xf3,0xdb}, {0xf3,0xe9}, {0xf3,0xe0}, {0xf3,0xf0}, {0xf3,0xdc}, {0xc4,0x4c}, {0xf3,0xda}, {0xf3,0xe1}, {0xf3,0xe2}, {0xf5,0x7d}, {0xf5,0x7b}, {0x9a,0xa3}, {0xf5,0xa2}, {0xf5,0xae}, {0xf5,0xa5}, {0xf5,0x7c}, {0xf5,0x78}, {0xf5,0xa7}, {0xf5,0x7e}, {0xf5,0xa3}, {0xf5,0x7a}, {0xf5,0xaa}, {0xf5,0x77}, {0xf5,0xa1}, {0xf5,0xa6}, {0xf5,0xa8}, {0xf5,0xab}, {0xf5,0x79}, {0x96,0xc2}, {0xf5,0xaf}, {0xf5,0xb0}, {0xf5,0xa9}, {0xf5,0xad}, {0xf5,0xa4}, {0x9f,0x77}, {0xf6,0xc1}, {0xf6,0xc4}, {0xc5,0x61}, {0xf6,0xc3}, {0xf6,0xc8}, {0xf6,0xc6}, {0xc5,0x62}, {0xf6,0xbd}, {0xf6,0xb3}, {0xf6,0xb2}, {0xc5,0x64}, {0xf6,0xbf}, {0xf6,0xc0}, {0xf6,0xbc}, {0xf6,0xb4}, {0x9a,0xa4}, {0xf6,0xb9}, {0xf5,0xac}, {0x9a,0xa5}, {0xf6,0xb5}, {0xc5,0x63}, {0xf6,0xbb}, {0x91,0xa1}, {0xf6,0xba}, {0xf6,0xb6}, {0xf6,0xc2}, {0x89,0xb8}, {0xf6,0xb7}, {0xf7,0xbb}, {0xf6,0xc5}, {0xf6,0xc7}, {0xf6,0xbe}, {0xf6,0xb8}, {0xf7,0xbc}, {0xf7,0xbe}, {0xf7,0xb8}, {0xc5,0xc2}, {0x91,0x73}, {0xf7,0xc5}, {0xf7,0xc3}, {0xc5,0xc3}, {0xf7,0xc2}, {0xf7,0xc1}, {0xf7,0xba}, {0xf7,0xb7}, {0xf7,0xbd}, {0xf7,0xc6}, {0xf7,0xb9}, {0xf7,0xbf}, {0xf8,0x69}, {0xf8,0x6e}, {0xf8,0x64}, {0xf8,0x67}, {0xc5,0xee}, {0xf8,0x6b}, {0xf8,0x72}, {0xf7,0xc0}, {0xf8,0x65}, {0xf8,0x6f}, {0xf8,0x73}, {0xf8,0x6a}, {0xf8,0x63}, {0xf8,0x6d}, {0xf8,0x6c}, {0xf8,0x71}, {0xf8,0x70}, {0xf7,0xc4}, {0xf8,0x68}, {0xf8,0x62}, {0xf8,0x66}, {0xc6,0x4e}, {0xc6,0x4f}, {0xf8,0x61}, {0x9a,0xa6}, {0xf8,0xe6}, {0xf8,0xdd}, {0xf8,0xe5}, {0xf8,0xe2}, {0xf8,0xe3}, {0xf8,0xdc}, {0xf8,0xdf}, {0xf8,0xe7}, {0xf8,0xe1}, {0xf8,0xe0}, {0xf8,0xde}, {0xf8,0xe4}, {0x89,0xbd}, {0xf9,0x5d}, {0x89,0xb9}, {0xf9,0x5e}, {0x91,0x7d}, {0xf9,0x60}, {0xf9,0x5f}, {0xf9,0x62}, {0xf9,0x61}, {0xf9,0x7c}, {0xf9,0x7b}, {0xf9,0xb7}, {0xf9,0xb8}, {0x96,0xbb}, {0xf9,0xc5}, {0xc6,0x78}, {0xc6,0x7c}, {0x9f,0xf2}, {0xf9,0xcf}, {0xc6,0x7d}, {0x8b,0xf5}, {0xb3,0xbf}, {0xc4,0xd0}, {0xf6,0xc9}, {0x9a,0xa9}, {0xc6,0x50}, {0xc6,0x51}, {0xb3,0xc0}, {0xe0,0xee}, {0x9f,0x54}, {0xb9,0xa8}, {0xe8,0xf0}, {0x9f,0xe3}, {0x9e,0xed}, {0xec,0xb0}, {0xec,0xb1}, {0xec,0xaf}, {0xef,0xab}, {0xef,0xaa}, {0xc2,0x47}, {0xf1,0xdf}, {0xef,0xac}, {0xf1,0xde}, {0x91,0xaa}, {0xf3,0xf3}, {0xc4,0x51}, {0xc4,0x53}, {0xf3,0xf2}, {0x91,0xab}, {0xa0,0x70}, {0xc4,0x52}, {0x9f,0x6d}, {0xf5,0xb1}, {0xf5,0xb3}, {0xf5,0xb2}, {0xf6,0xca}, {0xc5,0x65}, {0x91,0xac}, {0xc5,0xef}, {0xf8,0xe8}, {0xf9,0x63}, {0x91,0xad}, {0xf9,0xd2}, {0xb3,0xc1}, {0xa0,0xfd}, {0xe4,0xe5}, {0x9f,0xe2}, {0xbe,0xa2}, {0x91,0xaf}, {0x9e,0x41}, {0x9a,0xaa}, {0xec,0xb3}, {0xec,0xb2}, {0x91,0xb0}, {0xef,0xad}, {0x9a,0xab}, {0xc4,0x54}, {0xc4,0xd1}, {0xf7,0xc7}, {0xf9,0xcb}, {0xb3,0xc2}, {0xbb,0xf2}, {0x9a,0xac}, {0xbe,0xa3}, {0x9a,0x4a}, {0xf3,0xf4}, {0x91,0xb2}, {0xf8,0x74}, {0xb6,0xc0}, {0x8b,0xf6}, {0x9a,0xad}, {0x89,0xb6}, {0xef,0xae}, {0xc6,0x64}, {0xb6,0xc1}, {0xbe,0xa4}, {0xc2,0x48}, {0xf8,0x75}, {0xb6,0xc2}, {0xe8,0xf1}, {0xc0,0x72}, {0xec,0xb4}, {0xec,0xb5}, {0xc0,0x71}, {0xef,0xaf}, {0xc2,0x4c}, {0xc2,0x4a}, {0xc2,0x4b}, {0xc2,0x49}, {0xf1,0xe0}, {0xc3,0x5c}, {0x9a,0xaf}, {0xf5,0xb5}, {0xf5,0xb4}, {0xf5,0xb7}, {0xf5,0xb6}, {0xc4,0xd2}, {0xf6,0xcb}, {0xf6,0xcd}, {0xf6,0xcc}, {0xc5,0x66}, {0xf7,0xc8}, {0x9a,0xb0}, {0xf8,0x76}, {0xf8,0x77}, {0xc5,0xf0}, {0xf9,0x64}, {0xf9,0x7d}, {0xc6,0x75}, {0x9a,0xb1}, {0xdc,0xb0}, {0xec,0xb6}, {0xef,0xb0}, {0xf3,0xf5}, {0xe0,0xef}, {0x9a,0xa1}, {0xef,0xb1}, {0xf1,0xe2}, {0xf1,0xe1}, {0x91,0xb9}, {0xf8,0x78}, {0xc6,0x52}, {0x91,0xba}, {0xf9,0x65}, {0xf9,0x7e}, {0xb9,0xa9}, {0xe8,0xf2}, {0xe8,0xf3}, {0xec,0xb7}, {0xb9,0xaa}, {0xc3,0x5d}, {0xf1,0xe3}, {0x91,0xbe}, {0xf6,0xcf}, {0xc5,0x67}, {0xf6,0xd0}, {0xf6,0xce}, {0xf8,0x79}, {0xf8,0xe9}, {0xb9,0xab}, {0xef,0xb4}, {0xef,0xb3}, {0xef,0xb2}, {0xf1,0xe4}, {0xa0,0x41}, {0x8b,0xb7}, {0xf1,0xe8}, {0xf1,0xe7}, {0xf1,0xe6}, {0xf1,0xe5}, {0xc3,0x5e}, {0xf3,0xf6}, {0xf5,0xb9}, {0xc4,0xd3}, {0xf5,0xb8}, {0xf6,0xd1}, {0xf7,0xcb}, {0xf7,0xca}, {0xc5,0xc4}, {0xf7,0xc9}, {0xf8,0x7c}, {0xf8,0x7b}, {0xf8,0x7a}, {0x91,0xc0}, {0xbb,0xf3}, {0xec,0xb8}, {0xc2,0x4d}, {0xf3,0xf7}, {0xf3,0xf8}, {0xf7,0xcc}, {0xf8,0x7d}, {0x9a,0xb3}, {0x91,0xc3}, {0xf8,0xea}, {0xf9,0x66}, {0xf9,0xb9}, {0xf9,0xd4}, {0xbb,0xf4}, {0xc2,0x4e}, {0xf1,0xe9}, {0xf3,0xf9}, {0xf6,0xd2}, {0xf8,0x7e}, {0xa0,0xfc}, {0xbe,0xa6}, {0x9f,0xee}, {0xef,0xb5}, {0xf1,0xea}, {0xf3,0xfa}, {0xf3,0xfb}, {0xf3,0xfc}, {0xf5,0xbe}, {0x9f,0x69}, {0xf5,0xba}, {0xc5,0x68}, {0xf5,0xbd}, {0xf5,0xbc}, {0xc4,0xd4}, {0xf5,0xbb}, {0xc4,0xd6}, {0x91,0xc8}, {0xc4,0xd5}, {0xf6,0xd4}, {0xf6,0xd3}, {0xc5,0x69}, {0xc5,0x6a}, {0x91,0xc9}, {0xc5,0xc6}, {0xf7,0xcd}, {0xc5,0xc5}, {0xf8,0xa3}, {0xf8,0xa4}, {0xf8,0xa2}, {0xf8,0xa1}, {0xc6,0x54}, {0xf8,0xeb}, {0xf8,0xec}, {0xf8,0xed}, {0xc6,0x53}, {0xf9,0x67}, {0xf9,0x6a}, {0xf9,0x69}, {0xf9,0x68}, {0xf9,0xd3}, {0x8d,0xe6}, {0xc0,0x73}, {0x91,0xcb}, {0xc3,0x65}, {0xf5,0xbf}, {0xf6,0xd5}, {0xc5,0xc7}, {0xf7,0xce}, {0xf9,0xd5}, {0x89,0xc8}, {0xc0,0x74}, {0x8d,0xaa}, {0xef,0xb6}, {0xf7,0xcf}, {0xf9,0xa1}, {0x9f,0xdd}, {0xfa,0x40}, {0xfa,0x41}, {0xfa,0x42}, {0xfa,0x43}, {0xfa,0x44}, {0xfa,0x45}, {0xfa,0x46}, {0xfa,0x47}, {0xfa,0x48}, {0xfa,0x49}, {0xfa,0x4a}, {0xfa,0x4b}, {0xfa,0x4c}, {0xfa,0x4d}, {0xfa,0x4e}, {0xfa,0x4f}, {0xfa,0x50}, {0xfa,0x51}, {0xfa,0x52}, {0xfa,0x53}, {0xfa,0x54}, {0xfa,0x55}, {0xfa,0x56}, {0xfa,0x57}, {0xfa,0x58}, {0xfa,0x59}, {0xfa,0x5a}, {0xfa,0x5b}, {0xfa,0x5c}, {0xfa,0x5d}, {0xfa,0x5e}, {0xad,0xc5}, {0xfa,0x60}, {0xfa,0x61}, {0xfa,0x62}, {0xfa,0x63}, {0xfa,0x64}, {0xfa,0x65}, {0xb0,0xb0}, {0xfa,0x67}, {0xfa,0x68}, {0xfa,0x69}, {0xfa,0x6a}, {0xfa,0x6b}, {0xfa,0x6c}, {0xfa,0x6d}, {0xfa,0x6e}, {0xfa,0x6f}, {0xfa,0x70}, {0xfa,0x71}, {0xfa,0x72}, {0xfa,0x73}, {0xfa,0x74}, {0xfa,0x75}, {0xfa,0x76}, {0xfa,0x77}, {0xfa,0x78}, {0xfa,0x79}, {0xfa,0x7a}, {0xfa,0x7b}, {0xfa,0x7c}, {0xfa,0x7d}, {0xfa,0x7e}, {0xfa,0xa1}, {0xfa,0xa2}, {0xfa,0xa3}, {0xfa,0xa4}, {0xfa,0xa5}, {0xfa,0xa6}, {0xfa,0xa7}, {0xfa,0xa8}, {0xfa,0xa9}, {0xfa,0xaa}, {0xfa,0xab}, {0xfa,0xac}, {0xfa,0xad}, {0xfa,0xae}, {0xfa,0xaf}, {0xfa,0xb0}, {0xfa,0xb1}, {0xfa,0xb2}, {0xfa,0xb3}, {0xfa,0xb4}, {0xfa,0xb5}, {0xfa,0xb6}, {0xfa,0xb7}, {0xfa,0xb8}, {0xfa,0xb9}, {0xfa,0xba}, {0xfa,0xbb}, {0xfa,0xbc}, {0xa5,0x5d}, {0xfa,0xbe}, {0xfa,0xbf}, {0xfa,0xc0}, {0xfa,0xc1}, {0xfa,0xc2}, {0xfa,0xc3}, {0xfa,0xc4}, {0xa2,0xcd}, {0xfa,0xc6}, {0xfa,0xc7}, {0xfa,0xc8}, {0xfa,0xc9}, {0xfa,0xca}, {0xfa,0xcb}, {0xfa,0xcc}, {0xfa,0xcd}, {0xfa,0xce}, {0xfa,0xcf}, {0xfa,0xd0}, {0xfa,0xd1}, {0xfa,0xd2}, {0xfa,0xd3}, {0xfa,0xd4}, {0xad,0xeb}, {0xfa,0xd6}, {0xfa,0xd7}, {0xfa,0xd8}, {0xfa,0xd9}, {0xfa,0xda}, {0xfa,0xdb}, {0xfa,0xdc}, {0xfa,0xdd}, {0xfa,0xde}, {0xfa,0xdf}, {0xfa,0xe0}, {0xfa,0xe1}, {0xfa,0xe2}, {0xfa,0xe3}, {0xfa,0xe4}, {0xfa,0xe5}, {0xfa,0xe6}, {0xfa,0xe7}, {0xfa,0xe8}, {0xfa,0xe9}, {0xfa,0xea}, {0xfa,0xeb}, {0xfa,0xec}, {0xfa,0xed}, {0xfa,0xee}, {0xfa,0xef}, {0xfa,0xf0}, {0xfa,0xf1}, {0xfa,0xf2}, {0xfa,0xf3}, {0xfa,0xf4}, {0xfa,0xf5}, {0xfa,0xf6}, {0xfa,0xf7}, {0xfa,0xf8}, {0xfa,0xf9}, {0xfa,0xfa}, {0xfa,0xfb}, {0xfa,0xfc}, {0xfa,0xfd}, {0xfa,0xfe}, {0xfb,0x40}, {0xfb,0x41}, {0xfb,0x42}, {0xfb,0x43}, {0xfb,0x44}, {0xfb,0x45}, {0xfb,0x46}, {0xfb,0x47}, {0x9d,0xef}, {0xfb,0x49}, {0xfb,0x4a}, {0xfb,0x4b}, {0xfb,0x4c}, {0xfb,0x4d}, {0xfb,0x4e}, {0xfb,0x4f}, {0xfb,0x50}, {0xfb,0x51}, {0xfb,0x52}, {0xfb,0x53}, {0xfb,0x54}, {0xfb,0x55}, {0xfb,0x56}, {0xfb,0x57}, {0xfb,0x58}, {0xfb,0x59}, {0xfb,0x5a}, {0xfb,0x5b}, {0xfb,0x5c}, {0xfb,0x5d}, {0xfb,0x5e}, {0xfb,0x5f}, {0xfb,0x60}, {0xfb,0x61}, {0xfb,0x62}, {0xfb,0x63}, {0xfb,0x64}, {0xfb,0x65}, {0xfb,0x66}, {0xfb,0x67}, {0xfb,0x68}, {0xfb,0x69}, {0xfb,0x6a}, {0xfb,0x6b}, {0xfb,0x6c}, {0xfb,0x6d}, {0xfb,0x6e}, {0xfb,0x6f}, {0xfb,0x70}, {0xfb,0x71}, {0xfb,0x72}, {0xfb,0x73}, {0xfb,0x74}, {0xfb,0x75}, {0xfb,0x76}, {0xfb,0x77}, {0xfb,0x78}, {0xfb,0x79}, {0xfb,0x7a}, {0xfb,0x7b}, {0xfb,0x7c}, {0xfb,0x7d}, {0xfb,0x7e}, {0xfb,0xa1}, {0xfb,0xa2}, {0xfb,0xa3}, {0xfb,0xa4}, {0xfb,0xa5}, {0xfb,0xa6}, {0xfb,0xa7}, {0xfb,0xa8}, {0xfb,0xa9}, {0xfb,0xaa}, {0xfb,0xab}, {0xfb,0xac}, {0xfb,0xad}, {0xfb,0xae}, {0xfb,0xaf}, {0xfb,0xb0}, {0xfb,0xb1}, {0xfb,0xb2}, {0xfb,0xb3}, {0xfb,0xb4}, {0xfb,0xb5}, {0xfb,0xb6}, {0xfb,0xb7}, {0xb4,0x40}, {0xfb,0xb9}, {0xfb,0xba}, {0xfb,0xbb}, {0xfb,0xbc}, {0xfb,0xbd}, {0xfb,0xbe}, {0xfb,0xbf}, {0xfb,0xc0}, {0xfb,0xc1}, {0xfb,0xc2}, {0xfb,0xc3}, {0xfb,0xc4}, {0xfb,0xc5}, {0xfb,0xc6}, {0xfb,0xc7}, {0xfb,0xc8}, {0xfb,0xc9}, {0xfb,0xca}, {0xfb,0xcb}, {0xfb,0xcc}, {0xfb,0xcd}, {0xfb,0xce}, {0xfb,0xcf}, {0xfb,0xd0}, {0xfb,0xd1}, {0xfb,0xd2}, {0xfb,0xd3}, {0xfb,0xd4}, {0xfb,0xd5}, {0xfb,0xd6}, {0xfb,0xd7}, {0xfb,0xd8}, {0xfb,0xd9}, {0xfb,0xda}, {0xfb,0xdb}, {0xfb,0xdc}, {0xfb,0xdd}, {0xfb,0xde}, {0xfb,0xdf}, {0xfb,0xe0}, {0xfb,0xe1}, {0xfb,0xe2}, {0xfb,0xe3}, {0xfb,0xe4}, {0xfb,0xe5}, {0xfb,0xe6}, {0xfb,0xe7}, {0xfb,0xe8}, {0xfb,0xe9}, {0xfb,0xea}, {0xfb,0xeb}, {0xfb,0xec}, {0xfb,0xed}, {0xfb,0xee}, {0xfb,0xef}, {0xfb,0xf0}, {0xfb,0xf1}, {0xfb,0xf2}, {0xc9,0xdb}, {0xfb,0xf4}, {0xfb,0xf5}, {0xfb,0xf6}, {0xfb,0xf7}, {0xfb,0xf8}, {0x9d,0xfb}, {0xfb,0xfa}, {0xfb,0xfb}, {0xfb,0xfc}, {0xfb,0xfd}, {0xfb,0xfe}, {0xfc,0x40}, {0xfc,0x41}, {0xfc,0x42}, {0xfc,0x43}, {0xfc,0x44}, {0xfc,0x45}, {0xfc,0x46}, {0xfc,0x47}, {0xfc,0x48}, {0xfc,0x49}, {0xfc,0x4a}, {0xfc,0x4b}, {0xfc,0x4c}, {0xfc,0x4d}, {0xfc,0x4e}, {0xd8,0xf4}, {0xfc,0x50}, {0xfc,0x51}, {0xfc,0x52}, {0xfc,0x53}, {0xfc,0x54}, {0xfc,0x55}, {0xfc,0x56}, {0xfc,0x57}, {0xfc,0x58}, {0xfc,0x59}, {0xfc,0x5a}, {0xfc,0x5b}, {0xfc,0x5c}, {0xfc,0x5d}, {0xfc,0x5e}, {0xfc,0x5f}, {0xfc,0x60}, {0xfc,0x61}, {0xfc,0x62}, {0xfc,0x63}, {0xfc,0x64}, {0xfc,0x65}, {0xfc,0x66}, {0xfc,0x67}, {0xfc,0x68}, {0xfc,0x69}, {0xfc,0x6a}, {0xfc,0x6b}, {0xa0,0xdc}, {0xfc,0x6d}, {0xfc,0x6e}, {0xfc,0x6f}, {0xfc,0x70}, {0xfc,0x71}, {0xfc,0x72}, {0xfc,0x73}, {0xfc,0x74}, {0xfc,0x75}, {0xfc,0x76}, {0xfc,0x77}, {0xfc,0x78}, {0xfc,0x79}, {0xfc,0x7a}, {0xfc,0x7b}, {0xfc,0x7c}, {0xfc,0x7d}, {0xfc,0x7e}, {0xfc,0xa1}, {0xfc,0xa2}, {0xfc,0xa3}, {0xfc,0xa4}, {0xfc,0xa5}, {0xfc,0xa6}, {0xfc,0xa7}, {0xfc,0xa8}, {0xfc,0xa9}, {0xfc,0xaa}, {0xfc,0xab}, {0xfc,0xac}, {0xfc,0xad}, {0xfc,0xae}, {0xfc,0xaf}, {0xfc,0xb0}, {0xfc,0xb1}, {0xfc,0xb2}, {0xfc,0xb3}, {0xfc,0xb4}, {0xfc,0xb5}, {0xfc,0xb6}, {0xfc,0xb7}, {0xfc,0xb8}, {0xbc,0xb5}, {0xfc,0xba}, {0xfc,0xbb}, {0xfc,0xbc}, {0xfc,0xbd}, {0xfc,0xbe}, {0xfc,0xbf}, {0xfc,0xc0}, {0xfc,0xc1}, {0xfc,0xc2}, {0xfc,0xc3}, {0xfc,0xc4}, {0xfc,0xc5}, {0xfc,0xc6}, {0xfc,0xc7}, {0xfc,0xc8}, {0xfc,0xc9}, {0xfc,0xca}, {0xfc,0xcb}, {0xfc,0xcc}, {0xfc,0xcd}, {0xfc,0xce}, {0xfc,0xcf}, {0xfc,0xd0}, {0xfc,0xd1}, {0xfc,0xd2}, {0xfc,0xd3}, {0xfc,0xd4}, {0xfc,0xd5}, {0xfc,0xd6}, {0xfc,0xd7}, {0xfc,0xd8}, {0xfc,0xd9}, {0xfc,0xda}, {0xfc,0xdb}, {0xfc,0xdc}, {0xfc,0xdd}, {0xfc,0xde}, {0xfc,0xdf}, {0xfc,0xe0}, {0xfc,0xe1}, {0xb4,0xb8}, {0xfc,0xe3}, {0xfc,0xe4}, {0xfc,0xe5}, {0xfc,0xe6}, {0xfc,0xe7}, {0xfc,0xe8}, {0xfc,0xe9}, {0xfc,0xea}, {0xfc,0xeb}, {0xfc,0xec}, {0xfc,0xed}, {0xfc,0xee}, {0xfc,0xef}, {0xfc,0xf0}, {0xa7,0xfb}, {0xfc,0xf2}, {0xfc,0xf3}, {0xfc,0xf4}, {0xfc,0xf5}, {0xfc,0xf6}, {0xfc,0xf7}, {0xfc,0xf8}, {0xfc,0xf9}, {0xfc,0xfa}, {0xfc,0xfb}, {0xfc,0xfc}, {0xfc,0xfd}, {0xfc,0xfe}, {0xfd,0x40}, {0xfd,0x41}, {0xfd,0x42}, {0xfd,0x43}, {0xfd,0x44}, {0xfd,0x45}, {0xfd,0x46}, {0xfd,0x47}, {0xfd,0x48}, {0xfd,0x49}, {0xfd,0x4a}, {0xfd,0x4b}, {0xfd,0x4c}, {0xfd,0x4d}, {0xfd,0x4e}, {0xfd,0x4f}, {0xfd,0x50}, {0xfd,0x51}, {0xfd,0x52}, {0xfd,0x53}, {0xfd,0x54}, {0xfd,0x55}, {0xfd,0x56}, {0xfd,0x57}, {0xfd,0x58}, {0xfd,0x59}, {0xfd,0x5a}, {0xfd,0x5b}, {0xfd,0x5c}, {0xfd,0x5d}, {0xfd,0x5e}, {0xfd,0x5f}, {0xfd,0x60}, {0xfd,0x61}, {0xfd,0x62}, {0xfd,0x63}, {0xfd,0x64}, {0xfd,0x65}, {0xfd,0x66}, {0xfd,0x67}, {0xfd,0x68}, {0xfd,0x69}, {0xfd,0x6a}, {0xfd,0x6b}, {0xfd,0x6c}, {0xfd,0x6d}, {0xfd,0x6e}, {0xfd,0x6f}, {0xfd,0x70}, {0xfd,0x71}, {0xfd,0x72}, {0xfd,0x73}, {0xfd,0x74}, {0xfd,0x75}, {0xfd,0x76}, {0xfd,0x77}, {0xfd,0x78}, {0xfd,0x79}, {0xfd,0x7a}, {0xfd,0x7b}, {0xfd,0x7c}, {0xfd,0x7d}, {0xfd,0x7e}, {0xfd,0xa1}, {0xfd,0xa2}, {0xfd,0xa3}, {0xfd,0xa4}, {0xfd,0xa5}, {0xfd,0xa6}, {0xfd,0xa7}, {0xfd,0xa8}, {0xfd,0xa9}, {0xfd,0xaa}, {0xfd,0xab}, {0xfd,0xac}, {0xfd,0xad}, {0xfd,0xae}, {0xfd,0xaf}, {0xfd,0xb0}, {0xfd,0xb1}, {0xfd,0xb2}, {0xfd,0xb3}, {0xfd,0xb4}, {0xfd,0xb5}, {0xfd,0xb6}, {0xcb,0x58}, {0xb4,0xfc}, {0xfd,0xb9}, {0xfd,0xba}, {0xb4,0xe4}, {0xfd,0xbc}, {0xfd,0xbd}, {0xfd,0xbe}, {0xfd,0xbf}, {0xfd,0xc0}, {0xfd,0xc1}, {0xfd,0xc2}, {0xfd,0xc3}, {0xfd,0xc4}, {0xfd,0xc5}, {0xfd,0xc6}, {0xfd,0xc7}, {0xfd,0xc8}, {0xfd,0xc9}, {0xfd,0xca}, {0xfd,0xcb}, {0xfd,0xcc}, {0xfd,0xcd}, {0xfd,0xce}, {0xfd,0xcf}, {0xfd,0xd0}, {0xfd,0xd1}, {0xfd,0xd2}, {0xfd,0xd3}, {0xfd,0xd4}, {0xfd,0xd5}, {0xfd,0xd6}, {0xfd,0xd7}, {0xfd,0xd8}, {0xfd,0xd9}, {0xfd,0xda}, {0xfd,0xdb}, {0xfd,0xdc}, {0xfd,0xdd}, {0xfd,0xde}, {0xfd,0xdf}, {0xfd,0xe0}, {0xfd,0xe1}, {0xfd,0xe2}, {0xfd,0xe3}, {0xfd,0xe4}, {0xfd,0xe5}, {0xfd,0xe6}, {0xfd,0xe7}, {0xfd,0xe8}, {0xfd,0xe9}, {0xfd,0xea}, {0xfd,0xeb}, {0xfd,0xec}, {0xfd,0xed}, {0xfd,0xee}, {0xfd,0xef}, {0xfd,0xf0}, {0xb5,0x4e}, {0xfd,0xf2}, {0xfd,0xf3}, {0xfd,0xf4}, {0xfd,0xf5}, {0xfd,0xf6}, {0xfd,0xf7}, {0xfd,0xf8}, {0xfd,0xf9}, {0xfd,0xfa}, {0xfd,0xfb}, {0xfd,0xfc}, {0xfd,0xfd}, {0xfd,0xfe}, {0xfe,0x40}, {0xfe,0x41}, {0xfe,0x42}, {0xfe,0x43}, {0xfe,0x44}, {0xfe,0x45}, {0xfe,0x46}, {0xfe,0x47}, {0xfe,0x48}, {0xfe,0x49}, {0xfe,0x4a}, {0xfe,0x4b}, {0xfe,0x4c}, {0xfe,0x4d}, {0xfe,0x4e}, {0xfe,0x4f}, {0xfe,0x50}, {0xfe,0x51}, {0x99,0x75}, {0xfe,0x53}, {0xfe,0x54}, {0xfe,0x55}, {0xfe,0x56}, {0xfe,0x57}, {0xfe,0x58}, {0xfe,0x59}, {0xfe,0x5a}, {0xfe,0x5b}, {0xfe,0x5c}, {0xfe,0x5d}, {0xfe,0x5e}, {0xfe,0x5f}, {0xfe,0x60}, {0xfe,0x61}, {0xfe,0x62}, {0xfe,0x63}, {0xfe,0x64}, {0xfe,0x65}, {0xfe,0x66}, {0xfe,0x67}, {0xfe,0x68}, {0xfe,0x69}, {0xfe,0x6a}, {0xfe,0x6b}, {0xfe,0x6c}, {0xfe,0x6d}, {0xfe,0x6e}, {0xb7,0xec}, {0xfe,0x70}, {0xfe,0x71}, {0xfe,0x72}, {0xfe,0x73}, {0xfe,0x74}, {0xfe,0x75}, {0xfe,0x76}, {0xfe,0x77}, {0xfe,0x78}, {0xfe,0x79}, {0xfe,0x7a}, {0xfe,0x7b}, {0xfe,0x7c}, {0xfe,0x7d}, {0xfe,0x7e}, {0xfe,0xa1}, {0xfe,0xa2}, {0xfe,0xa3}, {0xfe,0xa4}, {0xfe,0xa5}, {0xfe,0xa6}, {0xfe,0xa7}, {0xfe,0xa8}, {0xfe,0xa9}, {0xa2,0x60}, {0xfe,0xab}, {0xfe,0xac}, {0xfe,0xad}, {0xfe,0xae}, {0xfe,0xaf}, {0xfe,0xb0}, {0xfe,0xb1}, {0xfe,0xb2}, {0xfe,0xb3}, {0xfe,0xb4}, {0xfe,0xb5}, {0xfe,0xb6}, {0xfe,0xb7}, {0xfe,0xb8}, {0xfe,0xb9}, {0xfe,0xba}, {0xfe,0xbb}, {0xfe,0xbc}, {0xfe,0xbd}, {0xfe,0xbe}, {0xfe,0xbf}, {0xfe,0xc0}, {0xfe,0xc1}, {0xfe,0xc2}, {0xfe,0xc3}, {0xfe,0xc4}, {0xfe,0xc5}, {0xfe,0xc6}, {0xfe,0xc7}, {0xfe,0xc8}, {0xfe,0xc9}, {0xfe,0xca}, {0xfe,0xcb}, {0xfe,0xcc}, {0xfe,0xcd}, {0xfe,0xce}, {0xfe,0xcf}, {0xfe,0xd0}, {0xfe,0xd1}, {0xfe,0xd2}, {0xfe,0xd3}, {0xfe,0xd4}, {0xfe,0xd5}, {0xfe,0xd6}, {0xfe,0xd7}, {0xfe,0xd8}, {0xfe,0xd9}, {0xfe,0xda}, {0xfe,0xdb}, {0xfe,0xdc}, {0xcf,0xf1}, {0xfe,0xde}, {0xfe,0xdf}, {0xfe,0xe0}, {0xfe,0xe1}, {0xfe,0xe2}, {0xfe,0xe3}, {0xfe,0xe4}, {0xfe,0xe5}, {0xfe,0xe6}, {0xfe,0xe7}, {0xfe,0xe8}, {0xfe,0xe9}, {0xfe,0xea}, {0xfe,0xeb}, {0xfe,0xec}, {0xfe,0xed}, {0xfe,0xee}, {0xfe,0xef}, {0xfe,0xf0}, {0xfe,0xf1}, {0xfe,0xf2}, {0xfe,0xf3}, {0xfe,0xf4}, {0xfe,0xf5}, {0xfe,0xf6}, {0xfe,0xf7}, {0xfe,0xf8}, {0xfe,0xf9}, {0xfe,0xfa}, {0xfe,0xfb}, {0xfe,0xfc}, {0xfe,0xfd}, {0xfe,0xfe}, {0x8e,0x40}, {0x8e,0x41}, {0x8e,0x42}, {0x8e,0x43}, {0x8e,0x44}, {0x8e,0x45}, {0x8e,0x46}, {0x8e,0x47}, {0x8e,0x48}, {0x8e,0x49}, {0x8e,0x4a}, {0x8e,0x4b}, {0x8e,0x4c}, {0x8e,0x4d}, {0x8e,0x4e}, {0x8e,0x4f}, {0x8e,0x50}, {0x8e,0x51}, {0x8e,0x52}, {0x8e,0x53}, {0x8e,0x54}, {0x8e,0x55}, {0x8e,0x56}, {0x8e,0x57}, {0x8e,0x58}, {0x8e,0x59}, {0x8e,0x5a}, {0x8e,0x5b}, {0x8e,0x5c}, {0x8e,0x5d}, {0x8e,0x5e}, {0x8e,0x5f}, {0x8e,0x60}, {0x8e,0x61}, {0x8e,0x62}, {0x8e,0x63}, {0x8e,0x64}, {0x8e,0x65}, {0x8e,0x66}, {0x8e,0x67}, {0x8e,0x68}, {0xba,0xe6}, {0x8e,0x6a}, {0x8e,0x6b}, {0x8e,0x6c}, {0x8e,0x6d}, {0x8e,0x6e}, {0xed,0xca}, {0x8e,0x70}, {0x8e,0x71}, {0x8e,0x72}, {0x8e,0x73}, {0x8e,0x74}, {0x8e,0x75}, {0x8e,0x76}, {0x8e,0x77}, {0x8e,0x78}, {0x8e,0x79}, {0x8e,0x7a}, {0x8e,0x7b}, {0x8e,0x7c}, {0x8e,0x7d}, {0xa2,0x61}, {0x8e,0xa1}, {0x8e,0xa2}, {0x8e,0xa3}, {0x8e,0xa4}, {0x8e,0xa5}, {0x8e,0xa6}, {0x8e,0xa7}, {0x8e,0xa8}, {0x8e,0xa9}, {0x8e,0xaa}, {0xba,0xfc}, {0x8e,0xac}, {0x8e,0xad}, {0x8e,0xae}, {0x8e,0xaf}, {0x8e,0xb0}, {0x8e,0xb1}, {0x8e,0xb2}, {0x8e,0xb3}, {0xbf,0xa6}, {0x8e,0xb5}, {0x8e,0xb6}, {0x8e,0xb7}, {0x8e,0xb8}, {0x8e,0xb9}, {0x8e,0xba}, {0x8e,0xbb}, {0x8e,0xbc}, {0x8e,0xbd}, {0x8e,0xbe}, {0x8e,0xbf}, {0x8e,0xc0}, {0x8e,0xc1}, {0x8e,0xc2}, {0x8e,0xc3}, {0x8e,0xc4}, {0x8e,0xc5}, {0x8e,0xc6}, {0x8e,0xc7}, {0x8e,0xc8}, {0x8e,0xc9}, {0x8e,0xca}, {0x8e,0xcb}, {0x8e,0xcc}, {0xaa,0xcc}, {0x8e,0xce}, {0x8e,0xcf}, {0xbf,0xae}, {0x8e,0xd1}, {0x8e,0xd2}, {0x8e,0xd3}, {0x8e,0xd4}, {0x8e,0xd5}, {0x8e,0xd6}, {0x8e,0xd7}, {0x8e,0xd8}, {0x8e,0xd9}, {0x8e,0xda}, {0x8e,0xdb}, {0x8e,0xdc}, {0x8e,0xdd}, {0x8e,0xde}, {0x8e,0xdf}, {0x8e,0xe0}, {0x8e,0xe1}, {0x8e,0xe2}, {0x8e,0xe3}, {0x8e,0xe4}, {0x8e,0xe5}, {0x8e,0xe6}, {0x8e,0xe7}, {0x8e,0xe8}, {0x8e,0xe9}, {0x8e,0xea}, {0x8e,0xeb}, {0x8e,0xec}, {0x8e,0xed}, {0x8e,0xee}, {0x8e,0xef}, {0x8e,0xf0}, {0x8e,0xf1}, {0x8e,0xf2}, {0x8e,0xf3}, {0x8e,0xf4}, {0x8e,0xf5}, {0x8e,0xf6}, {0x8e,0xf7}, {0x8e,0xf8}, {0x8e,0xf9}, {0x8e,0xfa}, {0x8e,0xfb}, {0x8e,0xfc}, {0x8e,0xfd}, {0x8e,0xfe}, {0x8f,0x40}, {0x8f,0x41}, {0x8f,0x42}, {0x8f,0x43}, {0x8f,0x44}, {0x8f,0x45}, {0x8f,0x46}, {0x8f,0x47}, {0x8f,0x48}, {0x8f,0x49}, {0x8f,0x4a}, {0x8f,0x4b}, {0x8f,0x4c}, {0x8f,0x4d}, {0x8f,0x4e}, {0x8f,0x4f}, {0x8f,0x50}, {0x8f,0x51}, {0x8f,0x52}, {0x8f,0x53}, {0x8f,0x54}, {0x8f,0x55}, {0x8f,0x56}, {0xb5,0xd7}, {0x8f,0x58}, {0x8f,0x59}, {0x8f,0x5a}, {0x8f,0x5b}, {0x8f,0x5c}, {0x8f,0x5d}, {0x8f,0x5e}, {0x8f,0x5f}, {0x8f,0x60}, {0x8f,0x61}, {0x8f,0x62}, {0x8f,0x63}, {0x8f,0x64}, {0x8f,0x65}, {0x8f,0x66}, {0x8f,0x67}, {0x8f,0x68}, {0xe3,0xc8}, {0x8f,0x6a}, {0x8f,0x6b}, {0x8f,0x6c}, {0x8f,0x6d}, {0xdb,0x79}, {0x8f,0x6f}, {0x8f,0x70}, {0x8f,0x71}, {0x8f,0x72}, {0x8f,0x73}, {0x8f,0x74}, {0x8f,0x75}, {0x8f,0x76}, {0x8f,0x77}, {0x8f,0x78}, {0x8f,0x79}, {0x8f,0x7a}, {0x8f,0x7b}, {0x8f,0x7c}, {0x8f,0x7d}, {0x8f,0x7e}, {0x8f,0xa1}, {0x8f,0xa2}, {0x8f,0xa3}, {0x8f,0xa4}, {0x8f,0xa5}, {0x8f,0xa6}, {0x8f,0xa7}, {0x8f,0xa8}, {0x8f,0xa9}, {0x8f,0xaa}, {0x8f,0xab}, {0x8f,0xac}, {0x8f,0xad}, {0x8f,0xae}, {0x8f,0xaf}, {0x8f,0xb0}, {0x8f,0xb1}, {0x8f,0xb2}, {0x8f,0xb3}, {0x8f,0xb4}, {0x8f,0xb5}, {0x8f,0xb6}, {0x8f,0xb7}, {0x8f,0xb8}, {0x8f,0xb9}, {0x8f,0xba}, {0x8f,0xbb}, {0x8f,0xbc}, {0x8f,0xbd}, {0x8f,0xbe}, {0x8f,0xbf}, {0x8f,0xc0}, {0x8f,0xc1}, {0x8f,0xc2}, {0x8f,0xc3}, {0x8f,0xc4}, {0x8f,0xc5}, {0x8f,0xc6}, {0x8f,0xc7}, {0x8f,0xc8}, {0x8f,0xc9}, {0x8f,0xca}, {0xbf,0xcc}, {0xa0,0xd4}, {0x8f,0xcd}, {0x8f,0xce}, {0x8f,0xcf}, {0x8f,0xd0}, {0x8f,0xd1}, {0x8f,0xd2}, {0x8f,0xd3}, {0x8f,0xd4}, {0x8f,0xd5}, {0x8f,0xd6}, {0x8f,0xd7}, {0x8f,0xd8}, {0x8f,0xd9}, {0x8f,0xda}, {0x8f,0xdb}, {0x8f,0xdc}, {0x8f,0xdd}, {0x8f,0xde}, {0x8f,0xdf}, {0x8f,0xe0}, {0x8f,0xe1}, {0x8f,0xe2}, {0x8f,0xe3}, {0x8f,0xe4}, {0x8f,0xe5}, {0x8f,0xe6}, {0x8f,0xe7}, {0x8f,0xe8}, {0x8f,0xe9}, {0x8f,0xea}, {0x8f,0xeb}, {0x8f,0xec}, {0x8f,0xed}, {0x8f,0xee}, {0x8f,0xef}, {0x8f,0xf0}, {0x8f,0xf1}, {0x8f,0xf2}, {0x8f,0xf3}, {0x8f,0xf4}, {0x8f,0xf5}, {0x8f,0xf6}, {0x8f,0xf7}, {0x8f,0xf8}, {0x8f,0xf9}, {0x8f,0xfa}, {0x8f,0xfb}, {0x8f,0xfc}, {0x8f,0xfd}, {0xb0,0x5f}, {0x90,0x40}, {0x90,0x41}, {0x90,0x42}, {0x90,0x43}, {0x90,0x44}, {0x90,0x45}, {0x90,0x46}, {0x90,0x47}, {0x90,0x48}, {0x90,0x49}, {0x90,0x4a}, {0x90,0x4b}, {0x90,0x4c}, {0x90,0x4d}, {0x90,0x4e}, {0x90,0x4f}, {0x90,0x50}, {0x90,0x51}, {0x90,0x52}, {0x90,0x53}, {0x90,0x54}, {0x90,0x55}, {0x90,0x56}, {0x90,0x57}, {0x90,0x58}, {0x90,0x59}, {0x90,0x5a}, {0x90,0x5b}, {0x90,0x5c}, {0x90,0x5d}, {0x90,0x5e}, {0x90,0x5f}, {0x90,0x60}, {0x90,0x61}, {0x90,0x62}, {0x90,0x63}, {0x90,0x64}, {0x90,0x65}, {0x90,0x66}, {0x90,0x67}, {0x90,0x68}, {0x90,0x69}, {0x90,0x6a}, {0x90,0x6b}, {0x90,0x6c}, {0xb3,0xa3}, {0x90,0x6e}, {0x90,0x6f}, {0x90,0x70}, {0x90,0x71}, {0x90,0x72}, {0x90,0x73}, {0x90,0x74}, {0x90,0x75}, {0x90,0x76}, {0x90,0x77}, {0x90,0x78}, {0x90,0x79}, {0xf9,0xd7}, {0x90,0x7b}, {0x90,0x7c}, {0x90,0x7d}, {0x90,0x7e}, {0x90,0xa1}, {0x90,0xa2}, {0x90,0xa3}, {0x90,0xa4}, {0x90,0xa5}, {0x90,0xa6}, {0x90,0xa7}, {0x90,0xa8}, {0x90,0xa9}, {0x90,0xaa}, {0x90,0xab}, {0x90,0xac}, {0x90,0xad}, {0x90,0xae}, {0x90,0xaf}, {0x90,0xb0}, {0x90,0xb1}, {0x90,0xb2}, {0x90,0xb3}, {0x90,0xb4}, {0x90,0xb5}, {0x90,0xb6}, {0x90,0xb7}, {0x90,0xb8}, {0x90,0xb9}, {0x90,0xba}, {0x90,0xbb}, {0x90,0xbc}, {0x90,0xbd}, {0x90,0xbe}, {0x90,0xbf}, {0x90,0xc0}, {0x90,0xc1}, {0x90,0xc2}, {0x90,0xc3}, {0x90,0xc4}, {0x90,0xc5}, {0x90,0xc6}, {0x90,0xc7}, {0x90,0xc8}, {0x90,0xc9}, {0x90,0xca}, {0x90,0xcb}, {0x90,0xcc}, {0x90,0xcd}, {0x90,0xce}, {0x90,0xcf}, {0x90,0xd0}, {0x90,0xd1}, {0x90,0xd2}, {0x90,0xd3}, {0x90,0xd4}, {0x90,0xd5}, {0x90,0xd6}, {0x90,0xd7}, {0x90,0xd8}, {0x90,0xd9}, {0x90,0xda}, {0x90,0xdb}, {0xc0,0x52}, {0x90,0xdd}, {0x90,0xde}, {0x90,0xdf}, {0x90,0xe0}, {0x90,0xe1}, {0x90,0xe2}, {0x90,0xe3}, {0x90,0xe4}, {0x90,0xe5}, {0x90,0xe6}, {0x90,0xe7}, {0x90,0xe8}, {0x90,0xe9}, {0x90,0xea}, {0x90,0xeb}, {0x90,0xec}, {0x90,0xed}, {0x90,0xee}, {0x90,0xef}, {0x90,0xf0}, {0xc5,0x54}, {0x90,0xf2}, {0x90,0xf3}, {0x90,0xf4}, {0x90,0xf5}, {0x90,0xf6}, {0x90,0xf7}, {0x90,0xf8}, {0x90,0xf9}, {0x90,0xfa}, {0x90,0xfb}, {0x90,0xfc}, {0x90,0xfd}, {0x90,0xfe}, {0x91,0x40}, {0x91,0x41}, {0x91,0x42}, {0x91,0x43}, {0x91,0x44}, {0x91,0x45}, {0x91,0x46}, {0x91,0x47}, {0x91,0x48}, {0x91,0x49}, {0x91,0x4a}, {0x91,0x4b}, {0x91,0x4c}, {0x91,0x4d}, {0x91,0x4e}, {0x91,0x4f}, {0x91,0x50}, {0x91,0x51}, {0x91,0x52}, {0x91,0x53}, {0x91,0x54}, {0x91,0x55}, {0x91,0x56}, {0x91,0x57}, {0x91,0x58}, {0x91,0x59}, {0x91,0x5a}, {0x91,0x5b}, {0x91,0x5c}, {0x91,0x5d}, {0x91,0x5e}, {0x91,0x5f}, {0x91,0x60}, {0x91,0x61}, {0x91,0x62}, {0x91,0x63}, {0x91,0x64}, {0x91,0x65}, {0x91,0x66}, {0x91,0x67}, {0x91,0x68}, {0x91,0x69}, {0x91,0x6a}, {0x91,0x6b}, {0x91,0x6c}, {0x91,0x6d}, {0x91,0x6e}, {0x91,0x6f}, {0x91,0x70}, {0x91,0x71}, {0x91,0x72}, {0x91,0x73}, {0x91,0x74}, {0x91,0x75}, {0x91,0x76}, {0x91,0x77}, {0x91,0x78}, {0x91,0x79}, {0x91,0x7a}, {0x91,0x7b}, {0x91,0x7c}, {0x91,0x7d}, {0x91,0x7e}, {0x91,0xa1}, {0x91,0xa2}, {0x91,0xa3}, {0x91,0xa4}, {0x91,0xa5}, {0x91,0xa6}, {0x91,0xa7}, {0x91,0xa8}, {0x91,0xa9}, {0x91,0xaa}, {0x91,0xab}, {0x91,0xac}, {0x91,0xad}, {0x91,0xae}, {0x91,0xaf}, {0x91,0xb0}, {0x91,0xb1}, {0x91,0xb2}, {0x91,0xb3}, {0x91,0xb4}, {0x91,0xb5}, {0x91,0xb6}, {0x91,0xb7}, {0x91,0xb8}, {0x91,0xb9}, {0x91,0xba}, {0x91,0xbb}, {0x91,0xbc}, {0x91,0xbd}, {0x91,0xbe}, {0xf1,0xe3}, {0x91,0xc0}, {0x91,0xc1}, {0x91,0xc2}, {0x91,0xc3}, {0x91,0xc4}, {0x91,0xc5}, {0x91,0xc6}, {0x91,0xc7}, {0x91,0xc8}, {0x91,0xc9}, {0x91,0xca}, {0x91,0xcb}, {0x91,0xcc}, {0x91,0xcd}, {0x91,0xce}, {0x91,0xcf}, {0x91,0xd0}, {0x91,0xd1}, {0x91,0xd2}, {0x91,0xd3}, {0x91,0xd4}, {0x91,0xd5}, {0x91,0xd6}, {0x91,0xd7}, {0x91,0xd8}, {0x91,0xd9}, {0x91,0xda}, {0x91,0xdb}, {0x91,0xdc}, {0x91,0xdd}, {0x91,0xde}, {0x91,0xdf}, {0x91,0xe0}, {0x91,0xe1}, {0x91,0xe2}, {0x91,0xe3}, {0x91,0xe4}, {0x91,0xe5}, {0x91,0xe6}, {0x91,0xe7}, {0x91,0xe8}, {0x91,0xe9}, {0x91,0xea}, {0x91,0xeb}, {0x91,0xec}, {0x91,0xed}, {0x91,0xee}, {0x91,0xef}, {0x91,0xf0}, {0x91,0xf1}, {0x91,0xf2}, {0x91,0xf3}, {0x91,0xf4}, {0x91,0xf5}, {0x91,0xf6}, {0x91,0xf7}, {0x91,0xf8}, {0x91,0xf9}, {0x91,0xfa}, {0x91,0xfb}, {0x91,0xfc}, {0x91,0xfd}, {0x91,0xfe}, {0x92,0x40}, {0x92,0x41}, {0x92,0x42}, {0x92,0x43}, {0x92,0x42}, {0x92,0x45}, {0x92,0x46}, {0x92,0x47}, {0x92,0x48}, {0x92,0x49}, {0x92,0x4a}, {0x92,0x4b}, {0x92,0x4c}, {0x92,0x4d}, {0x92,0x4e}, {0x92,0x4f}, {0x92,0x50}, {0x92,0x51}, {0x92,0x52}, {0x92,0x53}, {0x92,0x54}, {0x92,0x55}, {0x92,0x56}, {0x92,0x57}, {0x92,0x58}, {0x92,0x59}, {0x92,0x5a}, {0x92,0x5b}, {0x92,0x5c}, {0x92,0x5d}, {0x92,0x5e}, {0x92,0x5f}, {0x92,0x60}, {0x92,0x61}, {0x92,0x62}, {0x92,0x63}, {0x92,0x64}, {0x92,0x65}, {0x92,0x66}, {0x92,0x67}, {0x92,0x68}, {0x92,0x69}, {0x92,0x6a}, {0x92,0x6b}, {0x92,0x6c}, {0x92,0x6d}, {0x92,0x6e}, {0x92,0x6f}, {0x92,0x70}, {0x92,0x71}, {0x92,0x72}, {0x92,0x73}, {0x92,0x74}, {0x92,0x75}, {0x92,0x76}, {0x92,0x77}, {0x92,0x78}, {0x92,0x79}, {0x92,0x7a}, {0x92,0x7b}, {0x92,0x7c}, {0x92,0x7d}, {0x92,0x7e}, {0x92,0xa1}, {0x92,0xa2}, {0x92,0xa3}, {0x92,0xa4}, {0x92,0xa5}, {0x92,0xa6}, {0x92,0xa7}, {0x92,0xa8}, {0x92,0xa9}, {0x92,0xaa}, {0x92,0xab}, {0x92,0xac}, {0x92,0xad}, {0x92,0xae}, {0xa2,0x59}, {0xa2,0x5a}, {0xa2,0x5c}, {0xa2,0x5b}, {0x92,0xb3}, {0x92,0xb4}, {0x92,0xb5}, {0x92,0xb6}, {0x92,0xb7}, {0x92,0xb8}, {0x92,0xb9}, {0x92,0xba}, {0x92,0xbb}, {0x92,0xbc}, {0x92,0xbd}, {0x92,0xbe}, {0x92,0xbf}, {0x92,0xc0}, {0x92,0xc1}, {0x92,0xc2}, {0x92,0xc3}, {0x92,0xc4}, {0x92,0xc5}, {0x92,0xc6}, {0x92,0xc7}, {0xa0,0x5f}, {0x92,0xc9}, {0x92,0xca}, {0x92,0xcb}, {0x92,0xcc}, {0x92,0xcd}, {0x92,0xce}, {0x92,0xcf}, {0x92,0xd0}, {0xe6,0xab}, {0x92,0xd2}, {0x92,0xd3}, {0x92,0xd4}, {0x92,0xd5}, {0x92,0xd6}, {0x92,0xd7}, {0x92,0xd8}, {0x92,0xd9}, {0x92,0xda}, {0x92,0xdb}, {0x92,0xdc}, {0x92,0xdd}, {0x92,0xde}, {0x92,0xdf}, {0x92,0xe0}, {0x92,0xe1}, {0x92,0xe2}, {0x92,0xe3}, {0x92,0xe4}, {0x92,0xe5}, {0x92,0xe6}, {0x92,0xe7}, {0x92,0xe8}, {0x92,0xe9}, {0x92,0xea}, {0x92,0xeb}, {0x92,0xec}, {0x92,0xed}, {0x92,0xee}, {0x92,0xef}, {0x92,0xf0}, {0x92,0xf1}, {0x92,0xf2}, {0x92,0xf3}, {0x92,0xf4}, {0x92,0xf5}, {0x92,0xf6}, {0x92,0xf7}, {0x92,0xf8}, {0x92,0xf9}, {0x92,0xfa}, {0x92,0xfb}, {0x92,0xfc}, {0x92,0xfd}, {0x92,0xfe}, {0x93,0x40}, {0x93,0x41}, {0x93,0x42}, {0x93,0x43}, {0x93,0x44}, {0x93,0x45}, {0x93,0x46}, {0x93,0x47}, {0x93,0x48}, {0x93,0x49}, {0x93,0x4a}, {0x93,0x4b}, {0x93,0x4c}, {0x93,0x4d}, {0x93,0x4e}, {0x93,0x4f}, {0x93,0x50}, {0x93,0x51}, {0x93,0x52}, {0x93,0x53}, {0x93,0x54}, {0x93,0x55}, {0x93,0x56}, {0x93,0x57}, {0x93,0x58}, {0x93,0x59}, {0x93,0x5a}, {0x93,0x5b}, {0x93,0x5c}, {0x93,0x5d}, {0x93,0x5e}, {0x93,0x5f}, {0x93,0x60}, {0x93,0x61}, {0x93,0x62}, {0x93,0x63}, {0x93,0x64}, {0x93,0x65}, {0x93,0x66}, {0x93,0x67}, {0x93,0x68}, {0x93,0x69}, {0x93,0x6a}, {0x93,0x6b}, {0x93,0x6c}, {0x93,0x6d}, {0x93,0x6e}, {0x93,0x6f}, {0x93,0x70}, {0x93,0x71}, {0x93,0x72}, {0x93,0x73}, {0x93,0x74}, {0x93,0x75}, {0x93,0x76}, {0x93,0x77}, {0x93,0x78}, {0x93,0x79}, {0x93,0x7a}, {0x93,0x7b}, {0x93,0x7c}, {0x93,0x7d}, {0x93,0x7e}, {0x93,0xa1}, {0x93,0xa2}, {0x93,0xa3}, {0x93,0xa4}, {0x93,0xa5}, {0x93,0xa6}, {0x93,0xa7}, {0x93,0xa8}, {0x93,0xa9}, {0x93,0xaa}, {0x93,0xab}, {0x93,0xac}, {0x93,0xad}, {0x93,0xae}, {0x93,0xaf}, {0x93,0xb0}, {0x93,0xb1}, {0x93,0xb2}, {0x93,0xb3}, {0x93,0xb4}, {0x93,0xb5}, {0x93,0xb6}, {0x93,0xb7}, {0x93,0xb8}, {0x93,0xb9}, {0x93,0xba}, {0x93,0xbb}, {0x93,0xbc}, {0x93,0xbd}, {0x93,0xbe}, {0x93,0xbf}, {0x93,0xc0}, {0x93,0xc1}, {0x93,0xc2}, {0x93,0xc3}, {0x93,0xc4}, {0x93,0xc5}, {0x93,0xc6}, {0x93,0xc7}, {0x93,0xc8}, {0x93,0xc9}, {0x93,0xca}, {0x93,0xcb}, {0x93,0xcc}, {0x93,0xcd}, {0x93,0xce}, {0x93,0xcf}, {0x93,0xd0}, {0x93,0xd1}, {0x93,0xd2}, {0x93,0xd3}, {0x93,0xd4}, {0x93,0xd5}, {0x93,0xd6}, {0x93,0xd7}, {0x93,0xd8}, {0x93,0xd9}, {0x93,0xda}, {0x93,0xdb}, {0x93,0xdc}, {0x93,0xdd}, {0x93,0xde}, {0x93,0xdf}, {0x93,0xe0}, {0x93,0xe1}, {0x93,0xe2}, {0x93,0xe3}, {0x93,0xe4}, {0x93,0xe5}, {0x93,0xe6}, {0x93,0xe7}, {0x93,0xe8}, {0x93,0xe9}, {0x93,0xea}, {0x93,0xeb}, {0x93,0xec}, {0x93,0xed}, {0x93,0xee}, {0x93,0xef}, {0x93,0xf0}, {0x93,0xf1}, {0x93,0xf2}, {0x93,0xf3}, {0x93,0xf4}, {0x93,0xf5}, {0x93,0xf6}, {0x93,0xf7}, {0x93,0xf8}, {0x93,0xf9}, {0x93,0xfa}, {0x93,0xfb}, {0x93,0xfc}, {0x93,0xfd}, {0x93,0xfe}, {0x94,0x40}, {0x94,0x41}, {0x94,0x42}, {0x94,0x43}, {0x94,0x44}, {0x94,0x45}, {0x94,0x46}, {0xd2,0x56}, {0x94,0x48}, {0x94,0x49}, {0x94,0x4a}, {0x94,0x4b}, {0x94,0x4c}, {0x94,0x4d}, {0x94,0x4e}, {0x94,0x4f}, {0x94,0x50}, {0x94,0x51}, {0x94,0x52}, {0x94,0x53}, {0x94,0x54}, {0x94,0x55}, {0x94,0x56}, {0x94,0x57}, {0x94,0x58}, {0x94,0x59}, {0x94,0x5a}, {0x94,0x5b}, {0x94,0x5c}, {0x94,0x5d}, {0x94,0x5e}, {0x94,0x5f}, {0x94,0x60}, {0x94,0x61}, {0x94,0x62}, {0x94,0x63}, {0x94,0x64}, {0x94,0x65}, {0x94,0x66}, {0x94,0x67}, {0x94,0x68}, {0x94,0x69}, {0x94,0x6a}, {0x94,0x6b}, {0x94,0x6c}, {0x94,0x6d}, {0x94,0x6e}, {0x94,0x6f}, {0x94,0x70}, {0x94,0x71}, {0x94,0x72}, {0x94,0x73}, {0x94,0x74}, {0x94,0x75}, {0x94,0x76}, {0x94,0x77}, {0x94,0x78}, {0x94,0x79}, {0x94,0x7a}, {0x94,0x7b}, {0x94,0x7c}, {0x94,0x7d}, {0x94,0x7e}, {0x94,0xa1}, {0x94,0xa2}, {0x94,0xa3}, {0x94,0xa4}, {0x94,0xa5}, {0x94,0xa6}, {0x94,0xa7}, {0x94,0xa8}, {0x94,0xa9}, {0x94,0xaa}, {0x94,0xab}, {0x94,0xac}, {0x94,0xad}, {0x94,0xae}, {0x94,0xaf}, {0x94,0xb0}, {0x94,0xb1}, {0x94,0xb2}, {0x94,0xb3}, {0x94,0xb4}, {0x94,0xb5}, {0x94,0xb6}, {0x94,0xb7}, {0x94,0xb8}, {0x94,0xb9}, {0x94,0xba}, {0x94,0xbb}, {0x94,0xbc}, {0x94,0xbd}, {0x94,0xbe}, {0x94,0xbf}, {0x94,0xc0}, {0x94,0xc1}, {0x94,0xc2}, {0x94,0xc3}, {0x94,0xc4}, {0x94,0xc5}, {0x94,0xc6}, {0x94,0xc7}, {0x94,0xc8}, {0x94,0xc9}, {0xe6,0xd0}, {0x94,0xcb}, {0x94,0xcc}, {0x94,0xcd}, {0x94,0xce}, {0x94,0xcf}, {0x94,0xd0}, {0x94,0xd1}, {0x94,0xd2}, {0x94,0xd3}, {0x94,0xd4}, {0x94,0xd5}, {0x94,0xd6}, {0x94,0xd7}, {0x94,0xd8}, {0x94,0xd9}, {0x94,0xda}, {0x94,0xdb}, {0x94,0xdc}, {0x94,0xdd}, {0x94,0xde}, {0x94,0xdf}, {0x94,0xe0}, {0x94,0xe1}, {0x94,0xe2}, {0x94,0xe3}, {0x94,0xe4}, {0x94,0xe5}, {0x94,0xe6}, {0x94,0xe7}, {0x94,0xe8}, {0x94,0xe9}, {0x94,0xea}, {0x94,0xeb}, {0x94,0xec}, {0x94,0xed}, {0x94,0xee}, {0x94,0xef}, {0x94,0xf0}, {0x94,0xf1}, {0x94,0xf2}, {0x94,0xf3}, {0x94,0xf4}, {0x94,0xf5}, {0x94,0xf6}, {0x94,0xf7}, {0x94,0xf8}, {0x94,0xf9}, {0x94,0xfa}, {0x94,0xfb}, {0x94,0xfc}, {0x94,0xfd}, {0x94,0xfe}, {0x95,0x40}, {0x95,0x41}, {0x95,0x42}, {0x95,0x43}, {0x95,0x44}, {0x95,0x45}, {0x95,0x46}, {0x95,0x47}, {0x95,0x48}, {0x95,0x49}, {0x95,0x4a}, {0x95,0x4b}, {0x95,0x4c}, {0x95,0x4d}, {0x95,0x4e}, {0x95,0x4f}, {0x95,0x50}, {0x95,0x51}, {0x95,0x52}, {0x95,0x53}, {0x95,0x54}, {0x95,0x55}, {0x95,0x56}, {0x95,0x57}, {0x95,0x58}, {0x95,0x59}, {0x95,0x5a}, {0x95,0x5b}, {0x95,0x5c}, {0x95,0x5d}, {0x95,0x5e}, {0x95,0x5f}, {0x95,0x60}, {0x95,0x61}, {0x95,0x62}, {0x95,0x63}, {0x95,0x64}, {0x95,0x65}, {0x95,0x66}, {0x95,0x67}, {0x95,0x68}, {0x95,0x69}, {0x95,0x6a}, {0x95,0x6b}, {0x95,0x6c}, {0x95,0x6d}, {0x95,0x6e}, {0x95,0x6f}, {0x95,0x70}, {0x95,0x71}, {0x95,0x72}, {0x95,0x73}, {0x95,0x74}, {0x95,0x75}, {0x95,0x76}, {0x95,0x77}, {0x95,0x78}, {0x95,0x79}, {0x95,0x7a}, {0x95,0x7b}, {0x95,0x7c}, {0x95,0x7d}, {0x95,0x7e}, {0x95,0xa1}, {0x95,0xa2}, {0x95,0xa3}, {0x95,0xa4}, {0x95,0xa5}, {0x95,0xa6}, {0x95,0xa7}, {0x95,0xa8}, {0x95,0xa9}, {0x95,0xaa}, {0x95,0xab}, {0x95,0xac}, {0x95,0xad}, {0x95,0xae}, {0x95,0xaf}, {0x95,0xb0}, {0x95,0xb1}, {0x95,0xb2}, {0x95,0xb3}, {0x95,0xb4}, {0x95,0xb5}, {0x95,0xb6}, {0x95,0xb7}, {0x95,0xb8}, {0x95,0xb9}, {0x95,0xba}, {0x95,0xbb}, {0x95,0xbc}, {0x95,0xbd}, {0x95,0xbe}, {0x95,0xbf}, {0x95,0xc0}, {0x95,0xc1}, {0x95,0xc2}, {0x95,0xc3}, {0x95,0xc4}, {0x95,0xc5}, {0x95,0xc6}, {0x95,0xc7}, {0x95,0xc8}, {0x95,0xc9}, {0x95,0xca}, {0x95,0xcb}, {0x95,0xcc}, {0x95,0xcd}, {0x95,0xce}, {0x95,0xcf}, {0x95,0xd0}, {0x95,0xd1}, {0x95,0xd2}, {0x95,0xd3}, {0x95,0xd4}, {0x95,0xd5}, {0x95,0xd6}, {0x95,0xd7}, {0x95,0xd8}, {0xca,0x52}, {0x95,0xda}, {0x95,0xdb}, {0x95,0xdc}, {0x95,0xdd}, {0x95,0xde}, {0x95,0xdf}, {0x95,0xe0}, {0x95,0xe1}, {0x95,0xe2}, {0x95,0xe3}, {0x95,0xe4}, {0x95,0xe5}, {0x95,0xe6}, {0x95,0xe7}, {0x95,0xe8}, {0x95,0xe9}, {0x95,0xea}, {0x95,0xeb}, {0x95,0xec}, {0x95,0xed}, {0x95,0xee}, {0x95,0xef}, {0x95,0xf0}, {0x95,0xf1}, {0x95,0xf2}, {0x95,0xf3}, {0x95,0xf4}, {0x95,0xf5}, {0x95,0xf6}, {0x95,0xf7}, {0x95,0xf8}, {0x95,0xf9}, {0x95,0xfa}, {0x95,0xfb}, {0x95,0xfc}, {0x95,0xfd}, {0x95,0xfe}, {0x96,0x40}, {0x96,0x41}, {0x96,0x42}, {0x96,0x43}, {0x9c,0xe4}, {0x96,0x45}, {0x96,0x46}, {0x96,0x47}, {0x96,0x48}, {0x96,0x49}, {0x96,0x4a}, {0x96,0x4b}, {0x96,0x4c}, {0x96,0x4d}, {0x96,0x4e}, {0x96,0x4f}, {0x96,0x50}, {0x96,0x51}, {0x96,0x52}, {0x96,0x53}, {0x96,0x54}, {0x96,0x55}, {0x96,0x56}, {0x96,0x57}, {0x96,0x58}, {0x96,0x59}, {0x96,0x5a}, {0x96,0x5b}, {0x96,0x5c}, {0x96,0x5d}, {0x96,0x5e}, {0x96,0x5f}, {0x96,0x60}, {0x96,0x61}, {0x96,0x62}, {0x96,0x63}, {0x96,0x64}, {0x96,0x65}, {0x96,0x66}, {0x96,0x67}, {0x96,0x68}, {0x96,0x69}, {0x96,0x6a}, {0x96,0x6b}, {0x96,0x6c}, {0x96,0x6d}, {0x96,0x6e}, {0x96,0x6f}, {0x96,0x70}, {0x96,0x71}, {0x96,0x72}, {0x96,0x73}, {0x96,0x74}, {0x96,0x75}, {0x96,0x76}, {0x96,0x77}, {0x96,0x78}, {0x96,0x79}, {0x96,0x7a}, {0x96,0x7b}, {0x96,0x7c}, {0x96,0x7d}, {0x96,0x7e}, {0x96,0xa1}, {0x96,0xa2}, {0x96,0xa3}, {0x96,0xa4}, {0x96,0xa5}, {0x96,0xa6}, {0x96,0xa7}, {0x96,0xa8}, {0x96,0xa9}, {0x96,0xaa}, {0x96,0xab}, {0x96,0xac}, {0x96,0xad}, {0x96,0xae}, {0x96,0xaf}, {0x96,0xb0}, {0x96,0xb1}, {0x96,0xb2}, {0x96,0xb3}, {0x96,0xb4}, {0x96,0xb5}, {0x96,0xb6}, {0x96,0xb7}, {0x96,0xb8}, {0x96,0xb9}, {0x96,0xba}, {0x96,0xbb}, {0x96,0xbc}, {0x96,0xbd}, {0x96,0xbe}, {0x96,0xbf}, {0x96,0xc0}, {0x96,0xc1}, {0x96,0xc2}, {0x96,0xc3}, {0x96,0xc4}, {0x96,0xc5}, {0x96,0xc6}, {0x96,0xc7}, {0x96,0xc8}, {0x96,0xc9}, {0x96,0xca}, {0x96,0xcb}, {0x96,0xcc}, {0x96,0xcd}, {0x96,0xce}, {0x96,0xcf}, {0x96,0xd0}, {0x96,0xd1}, {0x96,0xd2}, {0x96,0xd3}, {0x96,0xd4}, {0x96,0xd5}, {0x96,0xd6}, {0x96,0xd7}, {0x96,0xd8}, {0x96,0xd9}, {0x96,0xda}, {0x96,0xdb}, {0x96,0xdc}, {0x96,0xdd}, {0x96,0xde}, {0x96,0xdf}, {0x96,0xe0}, {0x96,0xe1}, {0x96,0xe2}, {0x96,0xe3}, {0x96,0xe4}, {0x96,0xe5}, {0x96,0xe6}, {0x96,0xe7}, {0x96,0xe8}, {0x96,0xe9}, {0x96,0xea}, {0x96,0xeb}, {0x96,0xec}, {0x96,0xee}, {0x96,0xee}, {0x96,0xef}, {0x96,0xf0}, {0x96,0xf1}, {0x96,0xf2}, {0x96,0xf3}, {0x96,0xf4}, {0x96,0xf5}, {0x96,0xf6}, {0x96,0xf7}, {0x96,0xf8}, {0x96,0xf9}, {0x96,0xfa}, {0x96,0xfb}, {0xe9,0x59}, {0x96,0xfd}, {0x96,0xfe}, {0x97,0x40}, {0x97,0x41}, {0x97,0x42}, {0x97,0x43}, {0x97,0x44}, {0x97,0x45}, {0x97,0x46}, {0x97,0x47}, {0x97,0x48}, {0x97,0x49}, {0x97,0x4a}, {0x97,0x4b}, {0x97,0x4c}, {0x97,0x4d}, {0x97,0x4e}, {0x97,0x4f}, {0x97,0x50}, {0x97,0x51}, {0x97,0x52}, {0x97,0x53}, {0x97,0x54}, {0x97,0x55}, {0x97,0x56}, {0x97,0x57}, {0x97,0x58}, {0x97,0x59}, {0x97,0x5a}, {0x97,0x5b}, {0x97,0x5c}, {0x97,0x5d}, {0x97,0x5e}, {0x97,0x5f}, {0x97,0x60}, {0x97,0x61}, {0x97,0x62}, {0x97,0x63}, {0x97,0x64}, {0x97,0x65}, {0x97,0x66}, {0x97,0x67}, {0x97,0x68}, {0x97,0x69}, {0x97,0x6a}, {0x97,0x6b}, {0x97,0x6c}, {0x97,0x6d}, {0x97,0x6e}, {0x97,0x6f}, {0x97,0x70}, {0x97,0x71}, {0x97,0x72}, {0x97,0x73}, {0x97,0x74}, {0x97,0x75}, {0x97,0x76}, {0x97,0x77}, {0x97,0x78}, {0x97,0x79}, {0x97,0x7a}, {0x97,0x7b}, {0x97,0x7c}, {0x97,0x7d}, {0x97,0x7e}, {0x97,0xa1}, {0x97,0xa2}, {0x97,0xa3}, {0x97,0xa4}, {0x97,0xa5}, {0x97,0xa6}, {0x97,0xa7}, {0x97,0xa8}, {0x97,0xa9}, {0x97,0xaa}, {0x97,0xab}, {0x97,0xac}, {0x97,0xad}, {0x97,0xae}, {0x97,0xaf}, {0x97,0xb0}, {0x97,0xb1}, {0x97,0xb2}, {0x97,0xb3}, {0x97,0xb4}, {0x97,0xb5}, {0x97,0xb6}, {0x97,0xb7}, {0x97,0xb8}, {0x97,0xb9}, {0x97,0xba}, {0x97,0xbb}, {0x97,0xbc}, {0x97,0xbd}, {0x97,0xbe}, {0x97,0xbf}, {0x97,0xc0}, {0x97,0xc1}, {0x97,0xc2}, {0x97,0xc3}, {0x97,0xc4}, {0x97,0xc5}, {0x97,0xc6}, {0x97,0xc7}, {0x97,0xc8}, {0x97,0xc9}, {0x97,0xca}, {0x97,0xcb}, {0x97,0xcc}, {0x97,0xcd}, {0x97,0xce}, {0x97,0xcf}, {0x97,0xd0}, {0x97,0xd1}, {0x97,0xd2}, {0x97,0xd3}, {0x97,0xd4}, {0x97,0xd5}, {0x97,0xd6}, {0x97,0xd7}, {0x97,0xd8}, {0x97,0xd9}, {0x97,0xda}, {0x97,0xdb}, {0x97,0xdc}, {0x97,0xdd}, {0x97,0xde}, {0x97,0xdf}, {0x97,0xe0}, {0x97,0xe1}, {0x97,0xe2}, {0x97,0xe3}, {0x97,0xe4}, {0x97,0xe5}, {0x97,0xe6}, {0x97,0xe7}, {0x97,0xe8}, {0x97,0xe9}, {0x97,0xea}, {0x97,0xeb}, {0x97,0xec}, {0x97,0xed}, {0x97,0xee}, {0x97,0xef}, {0x97,0xf0}, {0x97,0xf1}, {0x97,0xf2}, {0x97,0xf3}, {0x97,0xf4}, {0x97,0xf5}, {0x97,0xf6}, {0x97,0xf7}, {0x97,0xf8}, {0x97,0xf9}, {0x97,0xfa}, {0x97,0xfb}, {0x97,0xfc}, {0x97,0xfd}, {0x97,0xfe}, {0x98,0x40}, {0x98,0x41}, {0x98,0x42}, {0x98,0x43}, {0x98,0x44}, {0x98,0x45}, {0x98,0x46}, {0x98,0x47}, {0x98,0x48}, {0x98,0x49}, {0x98,0x4a}, {0x98,0x4b}, {0x98,0x4c}, {0x98,0x4d}, {0x98,0x4e}, {0x98,0x4f}, {0x98,0x50}, {0x98,0x51}, {0x98,0x52}, {0x98,0x53}, {0x98,0x54}, {0x98,0x55}, {0x98,0x56}, {0x98,0x57}, {0x98,0x58}, {0x98,0x59}, {0x98,0x5a}, {0x98,0x5b}, {0x98,0x5c}, {0x98,0x5d}, {0x98,0x5e}, {0x98,0x5f}, {0x98,0x60}, {0x98,0x61}, {0x98,0x62}, {0x98,0x63}, {0x98,0x64}, {0x98,0x65}, {0x98,0x66}, {0x98,0x67}, {0x98,0x68}, {0x98,0x69}, {0x98,0x6a}, {0x98,0x6b}, {0x98,0x6c}, {0x98,0x6d}, {0x98,0x6e}, {0x98,0x6f}, {0x98,0x70}, {0x98,0x71}, {0x98,0x72}, {0x98,0x73}, {0x98,0x74}, {0x98,0x75}, {0x98,0x76}, {0x98,0x77}, {0x98,0x78}, {0x98,0x79}, {0x98,0x7a}, {0x98,0x7b}, {0x98,0x7c}, {0x98,0x7d}, {0x98,0x7e}, {0x98,0xa1}, {0x98,0xa2}, {0x98,0xa3}, {0x98,0xa4}, {0x98,0xa5}, {0x98,0xa6}, {0x98,0xa7}, {0x98,0xa8}, {0x98,0xa9}, {0x98,0xaa}, {0x98,0xab}, {0x98,0xac}, {0x98,0xad}, {0x98,0xae}, {0x98,0xaf}, {0x98,0xb0}, {0x98,0xb1}, {0x98,0xb2}, {0x98,0xb3}, {0x98,0xb4}, {0x98,0xb5}, {0x98,0xb6}, {0x98,0xb7}, {0x98,0xb8}, {0x98,0xb9}, {0x98,0xba}, {0x98,0xbb}, {0x98,0xbc}, {0x98,0xbd}, {0x98,0xbe}, {0x98,0xbf}, {0x98,0xc0}, {0x98,0xc1}, {0x98,0xc2}, {0x98,0xc3}, {0x98,0xc4}, {0x98,0xc5}, {0x98,0xc6}, {0x98,0xc7}, {0x98,0xc8}, {0x98,0xc9}, {0x98,0xca}, {0x98,0xcb}, {0x98,0xcc}, {0x98,0xcd}, {0x98,0xce}, {0x98,0xcf}, {0x98,0xd0}, {0x98,0xd1}, {0x98,0xd2}, {0x98,0xd3}, {0x98,0xd4}, {0x98,0xd5}, {0x98,0xd6}, {0x98,0xd7}, {0x98,0xd8}, {0x98,0xd9}, {0x98,0xda}, {0x98,0xdb}, {0x98,0xdc}, {0x98,0xdd}, {0x98,0xde}, {0x98,0xdf}, {0x98,0xe0}, {0x98,0xe1}, {0x98,0xe2}, {0x98,0xe3}, {0x98,0xe4}, {0x98,0xe5}, {0x98,0xe6}, {0x98,0xe7}, {0x98,0xe8}, {0x98,0xe9}, {0x98,0xea}, {0x98,0xeb}, {0x98,0xec}, {0x98,0xed}, {0x98,0xee}, {0x98,0xef}, {0x98,0xf0}, {0x98,0xf1}, {0x98,0xf2}, {0x98,0xf3}, {0x98,0xf4}, {0x98,0xf5}, {0x98,0xf6}, {0x98,0xf7}, {0x98,0xf8}, {0x98,0xf9}, {0x98,0xfa}, {0x98,0xfb}, {0x98,0xfc}, {0x98,0xfd}, {0x98,0xfe}, {0x99,0x40}, {0x99,0x41}, {0x99,0x42}, {0x99,0x43}, {0x99,0x44}, {0x99,0x45}, {0x99,0x46}, {0x99,0x47}, {0x99,0x48}, {0x99,0x49}, {0x99,0x4a}, {0x99,0x4b}, {0x99,0x4c}, {0x99,0x4d}, {0x99,0x4e}, {0x99,0x4f}, {0x99,0x50}, {0x99,0x51}, {0x99,0x52}, {0x99,0x53}, {0x99,0x54}, {0x99,0x55}, {0x99,0x56}, {0x99,0x57}, {0x99,0x58}, {0x99,0x59}, {0x99,0x5a}, {0x99,0x5b}, {0x99,0x5c}, {0x99,0x5d}, {0x99,0x5e}, {0x99,0x5f}, {0x99,0x60}, {0x99,0x61}, {0x99,0x62}, {0x99,0x63}, {0x99,0x64}, {0x99,0x65}, {0x99,0x66}, {0x99,0x67}, {0x99,0x68}, {0x99,0x69}, {0x99,0x6a}, {0x99,0x6b}, {0x99,0x6c}, {0x99,0x6d}, {0x99,0x6e}, {0x99,0x6f}, {0x99,0x70}, {0x99,0x71}, {0x99,0x72}, {0x99,0x73}, {0x99,0x74}, {0x99,0x75}, {0x99,0x76}, {0x99,0x77}, {0x99,0x78}, {0x99,0x79}, {0x99,0x7a}, {0x99,0x7b}, {0x99,0x7c}, {0x99,0x7d}, {0x99,0x7e}, {0x99,0xa1}, {0x99,0xa2}, {0x99,0xa3}, {0x99,0xa4}, {0x99,0xa5}, {0x99,0xa6}, {0x99,0xa7}, {0x99,0xa8}, {0x99,0xa9}, {0x99,0xaa}, {0x99,0xab}, {0x99,0xac}, {0x99,0xad}, {0x99,0xae}, {0x99,0xaf}, {0x99,0xb0}, {0x99,0xb1}, {0x99,0xb2}, {0x99,0xb3}, {0x99,0xb4}, {0x99,0xb5}, {0x99,0xb6}, {0x99,0xb7}, {0x99,0xb8}, {0x99,0xb9}, {0x99,0xba}, {0x99,0xbb}, {0x99,0xbc}, {0x99,0xbd}, {0x99,0xbe}, {0x99,0xbf}, {0x99,0xc0}, {0x99,0xc1}, {0x99,0xc2}, {0x99,0xc3}, {0x99,0xc4}, {0x99,0xc5}, {0x99,0xc6}, {0x99,0xc7}, {0x99,0xc8}, {0x99,0xc9}, {0x99,0xca}, {0x99,0xcb}, {0x99,0xcc}, {0x99,0xcd}, {0x99,0xce}, {0x99,0xcf}, {0x99,0xd0}, {0x99,0xd1}, {0x99,0xd2}, {0x99,0xd3}, {0x99,0xd4}, {0x99,0xd5}, {0x99,0xd6}, {0x99,0xd7}, {0x99,0xd8}, {0x99,0xd9}, {0x99,0xda}, {0x99,0xdb}, {0x99,0xdc}, {0x99,0xdd}, {0x99,0xde}, {0x99,0xdf}, {0x99,0xe0}, {0x99,0xe1}, {0x99,0xe2}, {0x99,0xe3}, {0x99,0xe4}, {0x99,0xe5}, {0x99,0xe6}, {0x99,0xe7}, {0x99,0xe8}, {0x99,0xe9}, {0x99,0xea}, {0x99,0xeb}, {0x99,0xec}, {0x99,0xed}, {0x99,0xee}, {0x99,0xef}, {0x99,0xf0}, {0x99,0xf1}, {0x99,0xf2}, {0x99,0xf3}, {0x99,0xf4}, {0x99,0xf5}, {0x99,0xf6}, {0x99,0xf7}, {0x99,0xf8}, {0x99,0xf9}, {0x99,0xfa}, {0x99,0xfb}, {0x99,0xfc}, {0x99,0xfd}, {0x99,0xfe}, {0x9a,0x40}, {0x9a,0x41}, {0x9a,0x42}, {0x9a,0x43}, {0x9a,0x44}, {0x9a,0x45}, {0x9a,0x46}, {0x9a,0x47}, {0x9a,0x48}, {0x9a,0x49}, {0x9a,0x4a}, {0x9a,0x4b}, {0x9a,0x4c}, {0x9a,0x4d}, {0x9a,0x4e}, {0x9a,0x4f}, {0x9a,0x50}, {0x9a,0x51}, {0x9a,0x52}, {0x9a,0x53}, {0x9a,0x54}, {0x9a,0x55}, {0x9a,0x56}, {0x9a,0x57}, {0x9a,0x58}, {0x9a,0x59}, {0x9a,0x5a}, {0x9a,0x5b}, {0x9a,0x5c}, {0x9a,0x5d}, {0x9a,0x5e}, {0x9a,0x5f}, {0x9a,0x60}, {0x9a,0x61}, {0x9a,0x62}, {0x9a,0x63}, {0x9a,0x64}, {0x9a,0x65}, {0x9a,0x66}, {0x9a,0x67}, {0x9a,0x68}, {0x9a,0x69}, {0x9a,0x6a}, {0x9a,0x6b}, {0x9a,0x6c}, {0x9a,0x6d}, {0x9a,0x6e}, {0x9a,0x6f}, {0x9a,0x70}, {0x9a,0x71}, {0x9a,0x72}, {0x9a,0x73}, {0x9a,0x74}, {0x9a,0x75}, {0x9a,0x76}, {0x9a,0x77}, {0x9a,0x78}, {0x9a,0x79}, {0x9a,0x7a}, {0x9a,0x7b}, {0x9a,0x7c}, {0x9a,0x7d}, {0x9a,0x7e}, {0x9a,0xa1}, {0x9a,0xa2}, {0x9a,0xa3}, {0x9a,0xa4}, {0x9a,0xa5}, {0x9a,0xa6}, {0x9a,0xa7}, {0x9a,0xa8}, {0x9a,0xa9}, {0x9a,0xaa}, {0x9a,0xab}, {0x9a,0xac}, {0x9a,0xad}, {0x9a,0xae}, {0x9a,0xaf}, {0x9a,0xb0}, {0x9a,0xb1}, {0x9a,0xb2}, {0x9a,0xb3}, {0x9a,0xb4}, {0x9a,0xb5}, {0x9a,0xb6}, {0x9a,0xb7}, {0x9a,0xb8}, {0x9a,0xb9}, {0x9a,0xba}, {0x9a,0xbb}, {0x9a,0xbc}, {0x9a,0xbd}, {0x9a,0xbe}, {0x9a,0xbf}, {0x9a,0xc0}, {0x9a,0xc1}, {0x9a,0xc2}, {0x9a,0xc3}, {0x9a,0xc4}, {0x9a,0xc5}, {0x9a,0xc6}, {0x9a,0xc7}, {0x9a,0xc8}, {0x9a,0xc9}, {0x9a,0xca}, {0x9a,0xcb}, {0x9a,0xcc}, {0x9a,0xcd}, {0x9a,0xce}, {0x9a,0xcf}, {0x9a,0xd0}, {0x9a,0xd1}, {0x9a,0xd2}, {0x9a,0xd3}, {0x9a,0xd4}, {0x9a,0xd5}, {0x9a,0xd6}, {0x9a,0xd7}, {0x9a,0xd8}, {0x9a,0xd9}, {0x9a,0xda}, {0x9a,0xdb}, {0x9a,0xdc}, {0x9a,0xdd}, {0x9a,0xde}, {0x9a,0xdf}, {0x9a,0xe0}, {0x9a,0xe1}, {0x9a,0xe2}, {0x9a,0xe3}, {0x9a,0xe4}, {0x9a,0xe5}, {0x9a,0xe6}, {0x9a,0xe7}, {0x9a,0xe8}, {0x9a,0xe9}, {0x9a,0xea}, {0x9a,0xeb}, {0x9a,0xec}, {0x9a,0xed}, {0x9a,0xee}, {0x9a,0xef}, {0x9a,0xf0}, {0x9a,0xf1}, {0x9a,0xf2}, {0x9a,0xf3}, {0x9a,0xf4}, {0x9a,0xf5}, {0x9a,0xf6}, {0x9a,0xf7}, {0x9a,0xf8}, {0x9a,0xf9}, {0x9a,0xfa}, {0x9a,0xfb}, {0x9a,0xfc}, {0x9a,0xfd}, {0x9a,0xfe}, {0x9b,0x40}, {0x9b,0x41}, {0x9b,0x42}, {0x9b,0x43}, {0x9b,0x44}, {0x9b,0x45}, {0x9b,0x46}, {0x9b,0x47}, {0x9b,0x48}, {0x9b,0x49}, {0x9b,0x4a}, {0x9b,0x4b}, {0x9b,0x4c}, {0x9b,0x4d}, {0x9b,0x4e}, {0x9b,0x4f}, {0x9b,0x50}, {0x9b,0x51}, {0x9b,0x52}, {0x9b,0x53}, {0x9b,0x54}, {0x9b,0x55}, {0x9b,0x56}, {0x9b,0x57}, {0x9b,0x58}, {0x9b,0x59}, {0x9b,0x5a}, {0x9b,0x5b}, {0x9b,0x5c}, {0x9b,0x5d}, {0x9b,0x5e}, {0x9b,0x5f}, {0x9b,0x60}, {0x9b,0x61}, {0x9b,0x62}, {0x9b,0x63}, {0x9b,0x64}, {0x9b,0x65}, {0x9b,0x66}, {0x9b,0x67}, {0x9b,0x68}, {0x9b,0x69}, {0x9b,0x6a}, {0x9b,0x6b}, {0x9b,0x6c}, {0x9b,0x6d}, {0x9b,0x6e}, {0x9b,0x6f}, {0x9b,0x70}, {0x9b,0x71}, {0x9b,0x72}, {0x9b,0x73}, {0x9b,0x74}, {0x9b,0x75}, {0xef,0xf9}, {0x9b,0x77}, {0xc5,0xf7}, {0x9b,0x79}, {0x9b,0x7a}, {0xf5,0xe8}, {0x9b,0x7c}, {0x9b,0x7d}, {0x9b,0x7e}, {0x9b,0xa1}, {0x9b,0xa2}, {0x9b,0xa3}, {0x9b,0xa4}, {0x9b,0xa5}, {0x9b,0xa6}, {0x9b,0xa7}, {0x9b,0xa8}, {0x9b,0xa9}, {0x9b,0xaa}, {0x9b,0xab}, {0x9b,0xac}, {0x9b,0xad}, {0x9b,0xae}, {0x9b,0xaf}, {0x9b,0xb0}, {0x9b,0xb1}, {0x9b,0xb2}, {0x9b,0xb3}, {0x9b,0xb4}, {0x9b,0xb5}, {0x9b,0xb6}, {0x9b,0xb7}, {0x9b,0xb8}, {0x9b,0xb9}, {0x9b,0xba}, {0x9b,0xbb}, {0x9b,0xbc}, {0x9b,0xbd}, {0x9b,0xbe}, {0x9b,0xbf}, {0x9b,0xc0}, {0x9b,0xc1}, {0x9b,0xc2}, {0x9b,0xc3}, {0x9b,0xc4}, {0x9b,0xc5}, {0xe8,0xcd}, {0x9b,0xc7}, {0x9b,0xc8}, {0x9b,0xc9}, {0x9b,0xca}, {0x9b,0xcb}, {0x9b,0xcc}, {0x9b,0xcd}, {0x9b,0xce}, {0x9b,0xcf}, {0x9b,0xd0}, {0x9b,0xd1}, {0x9b,0xd2}, {0x9b,0xd3}, {0x9b,0xd4}, {0x9b,0xd5}, {0x9b,0xd6}, {0x9b,0xd7}, {0x9b,0xd8}, {0x9b,0xd9}, {0x9b,0xda}, {0x9b,0xdb}, {0x9b,0xdc}, {0x9b,0xdd}, {0xd0,0xc0}, {0x9b,0xdf}, {0x9b,0xe0}, {0x9b,0xe1}, {0x9b,0xe2}, {0x9b,0xe3}, {0x9b,0xe4}, {0x9b,0xe5}, {0x9b,0xe6}, {0x9b,0xe7}, {0x9b,0xe8}, {0x9b,0xe9}, {0x9b,0xea}, {0x9b,0xeb}, {0xfd,0x64}, {0x9b,0xed}, {0x9b,0xee}, {0x9b,0xef}, {0x9b,0xf0}, {0x9b,0xf1}, {0x9b,0xf2}, {0x9b,0xf3}, {0x9b,0xf4}, {0x9b,0xf5}, {0xbf,0x47}, {0x9b,0xf7}, {0x9b,0xf8}, {0x9b,0xf9}, {0x9b,0xfa}, {0x9b,0xfb}, {0x9b,0xfc}, {0x9b,0xfd}, {0x9b,0xfe}, {0x9c,0x40}, {0x9c,0x41}, {0xeb,0xc9}, {0x9c,0x43}, {0x9c,0x44}, {0x9c,0x45}, {0x9c,0x46}, {0x9c,0x47}, {0x9c,0x48}, {0x9c,0x49}, {0x9c,0x4a}, {0x9c,0x4b}, {0x9c,0x4c}, {0x9c,0x4d}, {0x9c,0x4e}, {0x9c,0x4f}, {0x9c,0x50}, {0x9c,0x51}, {0x9c,0x52}, {0xcd,0xe7}, {0x9c,0x54}, {0x9c,0x55}, {0x9c,0x56}, {0x9c,0x57}, {0x9c,0x58}, {0x9c,0x59}, {0x9c,0x5a}, {0x9c,0x5b}, {0x9c,0x5c}, {0x9c,0x5d}, {0x9c,0x5e}, {0x9c,0x5f}, {0x9c,0x60}, {0x9c,0x61}, {0xc0,0xe7}, {0x9c,0x63}, {0x9c,0x64}, {0x9c,0x65}, {0x9c,0x66}, {0x9c,0x67}, {0xdc,0x52}, {0x9c,0x69}, {0x9c,0x6a}, {0xf8,0x6d}, {0x9c,0x6c}, {0x9c,0x6d}, {0x9c,0x6e}, {0x9c,0x6f}, {0x9c,0x70}, {0x9c,0x71}, {0x9c,0x72}, {0x9c,0x73}, {0x9c,0x74}, {0x9c,0x75}, {0x9c,0x76}, {0xdb,0x5d}, {0x9c,0x78}, {0x9c,0x79}, {0x9c,0x7a}, {0x9c,0x7b}, {0x9c,0x7c}, {0x9c,0x7d}, {0x9c,0x7e}, {0x9c,0xa1}, {0x9c,0xa2}, {0x9c,0xa3}, {0x9c,0xa4}, {0x9c,0xa5}, {0x9c,0xa6}, {0x9c,0xa7}, {0x9c,0xa8}, {0x9c,0xa9}, {0x9c,0xaa}, {0x9c,0xab}, {0x9c,0xac}, {0x9c,0xad}, {0x9c,0xae}, {0x9c,0xaf}, {0x9c,0xb0}, {0x9c,0xb1}, {0x9c,0xb2}, {0x9c,0xb3}, {0x9c,0xb4}, {0x9c,0xb5}, {0x9c,0xb6}, {0x9c,0xb7}, {0x9c,0xb8}, {0x9c,0xb9}, {0x9c,0xba}, {0x9c,0xbb}, {0xc9,0x5c}, {0xaf,0xb0}, {0x9c,0xbe}, {0x9c,0xbf}, {0x9c,0xc0}, {0x9c,0xc1}, {0x9c,0xc2}, {0x9c,0xc3}, {0x9c,0xc4}, {0x9c,0xc5}, {0x9c,0xc6}, {0x9c,0xc7}, {0x9c,0xc8}, {0x9c,0xc9}, {0x9c,0xca}, {0x9c,0xcb}, {0x9c,0xcc}, {0x9c,0xcd}, {0x9c,0xce}, {0x9c,0xcf}, {0xd4,0xd1}, {0x9c,0xd1}, {0x9c,0xd2}, {0x9c,0xd3}, {0x9c,0xd4}, {0x9c,0xd5}, {0x9c,0xd6}, {0x9c,0xd7}, {0x9c,0xd8}, {0x9c,0xd9}, {0x9c,0xda}, {0x9c,0xdb}, {0x9c,0xdc}, {0x9c,0xdd}, {0x9c,0xde}, {0x9c,0xdf}, {0x9c,0xe0}, {0x9c,0xe1}, {0x9c,0xe2}, {0x9c,0xe3}, {0x9c,0xe4}, {0x9c,0xe5}, {0x9c,0xe6}, {0x9c,0xe7}, {0x9c,0xe8}, {0x9c,0xe9}, {0x9c,0xea}, {0x9c,0xeb}, {0x9c,0xec}, {0x9c,0xed}, {0x9c,0xee}, {0x9c,0xef}, {0x9c,0xf0}, {0x9c,0xf1}, {0x9c,0xf2}, {0x9c,0xf3}, {0x9c,0xf4}, {0x9c,0xf5}, {0x9c,0xf6}, {0x9c,0xf7}, {0x9c,0xf8}, {0x9c,0xf9}, {0x9c,0xfa}, {0x9c,0xfb}, {0x9c,0xfc}, {0x9c,0xfd}, {0x9c,0xfe}, {0x9d,0x40}, {0x9d,0x41}, {0x9d,0x42}, {0x9d,0x43}, {0x9d,0x44}, {0x9d,0x45}, {0x9d,0x46}, {0x9d,0x47}, {0x9d,0x48}, {0x9d,0x49}, {0x9d,0x4a}, {0x9d,0x4b}, {0x9d,0x4c}, {0x9d,0x4d}, {0x9d,0x4e}, {0x9d,0x4f}, {0x9d,0x50}, {0x9d,0x51}, {0x9d,0x52}, {0x9d,0x53}, {0x9d,0x54}, {0x9d,0x55}, {0x9d,0x56}, {0xe0,0x7c}, {0x9d,0x58}, {0x9d,0x59}, {0xb5,0xae}, {0x9d,0x5b}, {0x9d,0x5c}, {0x9d,0x5d}, {0x9d,0x5e}, {0x9d,0x5f}, {0x9d,0x60}, {0x9d,0x61}, {0x9d,0x62}, {0x9d,0x63}, {0x9d,0x64}, {0x9d,0x65}, {0x9d,0x66}, {0x9d,0x67}, {0x9d,0x68}, {0x9d,0x69}, {0x9d,0x6a}, {0x9d,0x6b}, {0x9d,0x6c}, {0x9d,0x6d}, {0x9d,0x6e}, {0x9d,0x6f}, {0x9d,0x70}, {0x9d,0x71}, {0x9d,0x72}, {0x9d,0x73}, {0x9d,0x74}, {0x9d,0x75}, {0x9d,0x76}, {0x9d,0x77}, {0x9d,0x78}, {0x9d,0x79}, {0x9d,0x7a}, {0x9d,0x7b}, {0x9d,0x7c}, {0x9d,0x7d}, {0x9d,0x7e}, {0x9d,0xa1}, {0x9d,0xa2}, {0x9d,0xa3}, {0x9d,0xa4}, {0x9d,0xa5}, {0x9d,0xa6}, {0x9d,0xa7}, {0x9d,0xa8}, {0x9d,0xa9}, {0x9d,0xaa}, {0x9d,0xab}, {0x9d,0xac}, {0x9d,0xad}, {0x9d,0xae}, {0x9d,0xaf}, {0x9d,0xb0}, {0x9d,0xb1}, {0x9d,0xb2}, {0x9d,0xb3}, {0x9d,0xb4}, {0x9d,0xb5}, {0x9d,0xb6}, {0x9d,0xb7}, {0x9d,0xb8}, {0x9d,0xb9}, {0x9d,0xba}, {0x9d,0xbb}, {0x9d,0xbc}, {0x9d,0xbd}, {0x9d,0xbe}, {0x9d,0xbf}, {0x9d,0xc0}, {0x9d,0xc1}, {0x9d,0xc2}, {0x9d,0xc3}, {0xa9,0xe4}, {0x9d,0xc5}, {0x9d,0xc6}, {0x9d,0xc7}, {0x9d,0xc8}, {0x9d,0xc9}, {0x9d,0xca}, {0x9d,0xcb}, {0x9d,0xcc}, {0x9d,0xcd}, {0x9d,0xce}, {0x9d,0xcf}, {0x9d,0xd0}, {0x9d,0xd1}, {0x9d,0xd2}, {0x9d,0xd3}, {0x9d,0xd4}, {0x9d,0xd5}, {0x9d,0xd6}, {0x9d,0xd7}, {0x9d,0xd8}, {0x9d,0xd9}, {0x9d,0xda}, {0x9d,0xdb}, {0x9d,0xdc}, {0x9d,0xdd}, {0x9d,0xde}, {0x9d,0xdf}, {0x9d,0xe0}, {0x9d,0xe1}, {0x9d,0xe2}, {0x9d,0xe3}, {0x9d,0xe4}, {0x9d,0xe5}, {0x9d,0xe6}, {0x9d,0xe7}, {0x9d,0xe8}, {0x9d,0xe9}, {0x9d,0xea}, {0x9d,0xeb}, {0x9d,0xec}, {0x9d,0xed}, {0x9d,0xee}, {0x9d,0xef}, {0x9d,0xf0}, {0x9d,0xf1}, {0x9d,0xf2}, {0x9d,0xf3}, {0x9d,0xf4}, {0x9d,0xf5}, {0x9d,0xf6}, {0x9d,0xf7}, {0x9d,0xf8}, {0x9d,0xf9}, {0x9d,0xfa}, {0x9d,0xfb}, {0x9d,0xfc}, {0x9d,0xfd}, {0x9d,0xfe}, {0x9e,0x40}, {0x9e,0x41}, {0x9e,0x42}, {0x9e,0x43}, {0x9e,0x44}, {0x9e,0x45}, {0x9e,0x46}, {0x9e,0x47}, {0x9e,0x48}, {0x9e,0x49}, {0x9e,0x4a}, {0x9e,0x4b}, {0x9e,0x4c}, {0x9e,0x4d}, {0x9e,0x4e}, {0x9e,0x4f}, {0x9e,0x50}, {0x9e,0x51}, {0x9e,0x52}, {0x9e,0x53}, {0x9e,0x54}, {0x9e,0x55}, {0x9e,0x56}, {0x9e,0x57}, {0x9e,0x58}, {0x9e,0x59}, {0x9e,0x5a}, {0x9e,0x5b}, {0x9e,0x5c}, {0x9e,0x5d}, {0x9e,0x5e}, {0x9e,0x5f}, {0x9e,0x60}, {0x9e,0x61}, {0x9e,0x62}, {0x9e,0x63}, {0x9e,0x64}, {0x9e,0x65}, {0x9e,0x66}, {0x9e,0x67}, {0x9e,0x68}, {0x9e,0x69}, {0x9e,0x6a}, {0x9e,0x6b}, {0x9e,0x6c}, {0x9e,0x6d}, {0x9e,0x6e}, {0x9e,0x6f}, {0x9e,0x70}, {0x9e,0x71}, {0x9e,0x72}, {0x9e,0x73}, {0x9e,0x74}, {0x9e,0x75}, {0x9e,0x76}, {0x9e,0x77}, {0x9e,0x78}, {0x9e,0x79}, {0x9e,0x7a}, {0x9e,0x7b}, {0x9e,0x7c}, {0x9e,0x7d}, {0x9e,0x7e}, {0x9e,0xa1}, {0x9e,0xa2}, {0x9e,0xa3}, {0x9e,0xa4}, {0x9e,0xa5}, {0x9e,0xa6}, {0x9e,0xa7}, {0x9e,0xa8}, {0xab,0xec}, {0x9e,0xaa}, {0x9e,0xab}, {0x9e,0xac}, {0x9e,0xad}, {0x9e,0xae}, {0x9e,0xaf}, {0x9e,0xb0}, {0x9e,0xb1}, {0x9e,0xb2}, {0x9e,0xb3}, {0x9e,0xb4}, {0x9e,0xb5}, {0x9e,0xb6}, {0x9e,0xb7}, {0x9e,0xb8}, {0x9e,0xb9}, {0x9e,0xba}, {0x9e,0xbb}, {0x9e,0xbc}, {0x9e,0xbd}, {0x9e,0xbe}, {0x9e,0xbf}, {0x9e,0xc0}, {0x9e,0xc1}, {0x9e,0xc2}, {0x9e,0xc3}, {0x9e,0xc4}, {0x9e,0xc5}, {0x9e,0xc6}, {0x9e,0xc7}, {0x9e,0xc8}, {0x9e,0xc9}, {0x9e,0xca}, {0x9e,0xcb}, {0x9e,0xcc}, {0x9e,0xcd}, {0x9e,0xce}, {0x9e,0xcf}, {0x9e,0xd0}, {0x9e,0xd1}, {0x9e,0xd2}, {0x9e,0xd3}, {0x9e,0xd4}, {0x9e,0xd5}, {0x9e,0xd6}, {0x9e,0xd7}, {0x9e,0xd8}, {0x9e,0xd9}, {0x9e,0xda}, {0x9e,0xdb}, {0x9e,0xdc}, {0x9e,0xdd}, {0x9e,0xde}, {0x9e,0xdf}, {0x9e,0xe0}, {0x9e,0xe1}, {0x9e,0xe2}, {0x9e,0xe3}, {0x9e,0xe4}, {0x9e,0xe5}, {0x9e,0xe6}, {0x9e,0xe7}, {0x9e,0xe8}, {0x9e,0xe9}, {0x9e,0xea}, {0x9e,0xeb}, {0x9e,0xec}, {0x9e,0xed}, {0x9e,0xee}, {0xde,0xcd}, {0x9e,0xf0}, {0x9e,0xf1}, {0x9e,0xf2}, {0x9e,0xf3}, {0x9e,0xf4}, {0x9e,0xf5}, {0x9e,0xf6}, {0x9e,0xf7}, {0x9e,0xf8}, {0x9e,0xf9}, {0x9e,0xfa}, {0x9e,0xfb}, {0x9e,0xfc}, {0xc9,0xfc}, {0x9e,0xfe}, {0x9f,0x40}, {0x9f,0x41}, {0x9f,0x42}, {0x9f,0x43}, {0x9f,0x44}, {0x9f,0x45}, {0x9f,0x46}, {0x9f,0x47}, {0x9f,0x48}, {0x9f,0x49}, {0x9f,0x4a}, {0x9f,0x4b}, {0x9f,0x4c}, {0x9f,0x4d}, {0x9f,0x4e}, {0x9f,0x4f}, {0x9f,0x50}, {0x9f,0x51}, {0x9f,0x52}, {0x9f,0x53}, {0x9f,0x54}, {0x9f,0x55}, {0x9f,0x56}, {0x9f,0x57}, {0x9f,0x58}, {0x9f,0x59}, {0x9f,0x5a}, {0x9f,0x5b}, {0x9f,0x5c}, {0x9f,0x5d}, {0x9f,0x5e}, {0x9f,0x5f}, {0xf9,0xc4}, {0x9f,0x61}, {0x9f,0x62}, {0x9f,0x63}, {0x9f,0x64}, {0x9f,0x65}, {0x91,0xbe}, {0x9f,0x67}, {0x9f,0x68}, {0x9f,0x69}, {0x9f,0x6a}, {0x9f,0x6b}, {0x9f,0x6c}, {0x9f,0x6d}, {0x9f,0x6e}, {0x9f,0x6f}, {0x9f,0x70}, {0x9f,0x71}, {0x9f,0x72}, {0x9f,0x73}, {0x9f,0x74}, {0x9f,0x75}, {0x9f,0x76}, {0x9f,0x77}, {0x9f,0x78}, {0x9f,0x79}, {0x9f,0x7a}, {0x9f,0x7b}, {0x9f,0x7c}, {0x9f,0x7d}, {0x9f,0x7e}, {0x9f,0xa1}, {0x9f,0xa2}, {0x9f,0xa3}, {0x9f,0xa4}, {0x9f,0xa5}, {0x9f,0xa6}, {0x9f,0xa7}, {0x9f,0xa8}, {0x9f,0xa9}, {0x9f,0xaa}, {0x9f,0xab}, {0x9f,0xac}, {0x9f,0xad}, {0x9f,0xae}, {0x9f,0xaf}, {0x9f,0xb0}, {0x9f,0xb1}, {0x9f,0xb2}, {0x9f,0xb3}, {0x9f,0xb4}, {0x9f,0xb5}, {0x9f,0xb6}, {0x9f,0xb7}, {0x9f,0xb8}, {0x9f,0xb9}, {0x9f,0xba}, {0x9f,0xbb}, {0x9f,0xbc}, {0x9f,0xbd}, {0x9f,0xbe}, {0x9f,0xbf}, {0x9f,0xc0}, {0x9f,0xc1}, {0x9f,0xc2}, {0x9f,0xc3}, {0x9f,0xc4}, {0x9f,0xc5}, {0x9f,0xc6}, {0x9f,0xc7}, {0x9f,0xc8}, {0x9f,0xc9}, {0x9f,0xca}, {0xb9,0xb0}, {0x9f,0xcc}, {0x9f,0xcd}, {0x9f,0xce}, {0x9f,0xcf}, {0x9f,0xd0}, {0x9f,0xd1}, {0x9f,0xd2}, {0x9f,0xd3}, {0x9f,0xd4}, {0x9f,0xd5}, {0x9f,0xd6}, {0x9f,0xd7}, {0x93,0x61}, {0x9f,0xd9}, {0x9f,0xda}, {0x9f,0xdb}, {0x9f,0xdc}, {0x9f,0xdd}, {0x9f,0xde}, {0x9f,0xdf}, {0x9f,0xe0}, {0x9f,0xe1}, {0x9f,0xe2}, {0x9f,0xe3}, {0x9f,0xe4}, {0x9f,0xe5}, {0x9f,0xe6}, {0x9f,0xe7}, {0x9f,0xe8}, {0x9f,0xe9}, {0x9f,0xea}, {0x9f,0xeb}, {0x9f,0xec}, {0x9f,0xed}, {0x9f,0xee}, {0x9f,0xef}, {0x9f,0xf0}, {0x9f,0xf1}, {0x9f,0xf2}, {0x9f,0xf3}, {0x9f,0xf4}, {0x9f,0xf5}, {0x9f,0xf6}, {0x9f,0xf7}, {0x9f,0xf8}, {0x9f,0xf9}, {0x9f,0xfa}, {0x9f,0xfb}, {0x9f,0xfc}, {0x9f,0xfd}, {0x9f,0xfe}, {0xa0,0x40}, {0xa0,0x41}, {0xa0,0x42}, {0xa0,0x43}, {0xa0,0x44}, {0xa0,0x45}, {0xa0,0x46}, {0xa0,0x47}, {0xa0,0x48}, {0xa0,0x49}, {0xa0,0x4a}, {0xa0,0x4b}, {0xa0,0x4c}, {0xa0,0x4d}, {0xa0,0x4e}, {0xa0,0x4f}, {0xa0,0x50}, {0xa0,0x51}, {0xa0,0x52}, {0xa0,0x53}, {0xa0,0x54}, {0xa0,0x55}, {0xa0,0x56}, {0xa0,0x57}, {0xa0,0x58}, {0xa0,0x59}, {0xa0,0x5a}, {0xa0,0x5b}, {0xa0,0x5c}, {0xa0,0x5d}, {0xa0,0x5e}, {0xa0,0x5f}, {0xa0,0x60}, {0xa0,0x61}, {0xa0,0x62}, {0x8f,0xb6}, {0xa0,0x64}, {0xa0,0x65}, {0xa0,0x66}, {0xa0,0x67}, {0xa0,0x68}, {0xa0,0x69}, {0xa0,0x6a}, {0xa0,0x6b}, {0xa0,0x6c}, {0xa0,0x6d}, {0xa0,0x6e}, {0xa0,0x6f}, {0xa0,0x70}, {0xa0,0x71}, {0xa0,0x72}, {0xa0,0x73}, {0xa0,0x74}, {0xa0,0x75}, {0xa0,0x76}, {0xa9,0xf0}, {0xa0,0x78}, {0xa0,0x79}, {0xa0,0x7a}, {0xa0,0x7b}, {0xa0,0x7c}, {0xa0,0x7d}, {0xa0,0x7e}, {0xa0,0xa1}, {0xa0,0xa2}, {0xa0,0xa3}, {0xa0,0xa4}, {0xa0,0xa5}, {0xa0,0xa6}, {0xa0,0xa7}, {0xa0,0xa8}, {0xa0,0xa9}, {0xa0,0xaa}, {0xa0,0xab}, {0xa0,0xac}, {0xa0,0xad}, {0xa0,0xae}, {0xa0,0xaf}, {0xa0,0xb0}, {0xa0,0xb1}, {0xa0,0xb2}, {0xa0,0xb3}, {0xa0,0xb4}, {0xa0,0xb5}, {0xa0,0xb6}, {0xa0,0xb7}, {0xa0,0xb8}, {0xa0,0xb9}, {0xa0,0xba}, {0xa0,0xbb}, {0xa0,0xbc}, {0xa0,0xbd}, {0xa0,0xbe}, {0xa0,0xbf}, {0xa0,0xc0}, {0xa0,0xc1}, {0xa0,0xc2}, {0xa0,0xc3}, {0xa0,0xc4}, {0xa0,0xc5}, {0xa0,0xc6}, {0xa0,0xc7}, {0xa0,0xc8}, {0xa0,0xc9}, {0xa0,0xca}, {0xa0,0xcb}, {0xa0,0xcc}, {0xa0,0xcd}, {0xa0,0xce}, {0xa0,0xcf}, {0xa0,0xd0}, {0xa0,0xd1}, {0xa0,0xd2}, {0xa0,0xd3}, {0xa0,0xd4}, {0x94,0x7a}, {0xa0,0xd6}, {0xa0,0xd7}, {0xa0,0xd8}, {0xa0,0xd9}, {0xa0,0xda}, {0xa0,0xdb}, {0xa0,0xdc}, {0xa0,0xdd}, {0xa0,0xde}, {0xde,0x72}, {0xa0,0xe0}, {0xa0,0xe1}, {0xa0,0xe2}, {0xa0,0xe3}, {0x94,0x55}, {0xa0,0xe5}, {0xa0,0xe6}, {0xa0,0xe7}, {0xa0,0xe8}, {0xa0,0xe9}, {0xa0,0xea}, {0xa0,0xeb}, {0xa0,0xec}, {0xa0,0xed}, {0xa0,0xee}, {0xa0,0xef}, {0xa0,0xf0}, {0xa0,0xf1}, {0xa0,0xf2}, {0xa0,0xf3}, {0xa0,0xf4}, {0xa0,0xf5}, {0xa0,0xf6}, {0xa0,0xf7}, {0xa0,0xf8}, {0xa0,0xf9}, {0xa0,0xfa}, {0xa0,0xfb}, {0xa0,0xfc}, {0xa0,0xfd}, {0xa0,0xfe}, {0x81,0x40}, {0x81,0x41}, {0x81,0x42}, {0x81,0x43}, {0x81,0x44}, {0x81,0x45}, {0x81,0x46}, {0x81,0x47}, {0x81,0x48}, {0x81,0x49}, {0x81,0x4a}, {0x81,0x4b}, {0x81,0x4c}, {0x81,0x4d}, {0x81,0x4e}, {0x81,0x4f}, {0x81,0x50}, {0x81,0x51}, {0x81,0x52}, {0x81,0x53}, {0x81,0x54}, {0x81,0x55}, {0x81,0x56}, {0x81,0x57}, {0x81,0x58}, {0x81,0x59}, {0x81,0x5a}, {0x81,0x5b}, {0x81,0x5c}, {0x81,0x5d}, {0x81,0x5e}, {0x81,0x5f}, {0x81,0x60}, {0x81,0x61}, {0x81,0x62}, {0x81,0x63}, {0x81,0x64}, {0x81,0x65}, {0x81,0x66}, {0x81,0x67}, {0x81,0x68}, {0x81,0x69}, {0x81,0x6a}, {0x81,0x6b}, {0x81,0x6c}, {0x81,0x6d}, {0x81,0x6e}, {0x81,0x6f}, {0x81,0x70}, {0x81,0x71}, {0x81,0x72}, {0x81,0x73}, {0x81,0x74}, {0x81,0x75}, {0x81,0x76}, {0x81,0x77}, {0x81,0x78}, {0x81,0x79}, {0x81,0x7a}, {0x81,0x7b}, {0x81,0x7c}, {0x81,0x7d}, {0x81,0x7e}, {0x81,0xa1}, {0x81,0xa2}, {0x81,0xa3}, {0x81,0xa4}, {0x81,0xa5}, {0x81,0xa6}, {0x81,0xa7}, {0x81,0xa8}, {0x81,0xa9}, {0x81,0xaa}, {0x81,0xab}, {0x81,0xac}, {0x81,0xad}, {0x81,0xae}, {0x81,0xaf}, {0x81,0xb0}, {0x81,0xb1}, {0x81,0xb2}, {0x81,0xb3}, {0x81,0xb4}, {0x81,0xb5}, {0x81,0xb6}, {0x81,0xb7}, {0x81,0xb8}, {0x81,0xb9}, {0x81,0xba}, {0x81,0xbb}, {0x81,0xbc}, {0x81,0xbd}, {0x81,0xbe}, {0x81,0xbf}, {0x81,0xc0}, {0x81,0xc1}, {0x81,0xc2}, {0x81,0xc3}, {0x81,0xc4}, {0x81,0xc5}, {0x81,0xc6}, {0x81,0xc7}, {0x81,0xc8}, {0x81,0xc9}, {0x81,0xca}, {0x81,0xcb}, {0x81,0xcc}, {0x81,0xcd}, {0x81,0xce}, {0x81,0xcf}, {0x81,0xd0}, {0x81,0xd1}, {0x81,0xd2}, {0x81,0xd3}, {0x81,0xd4}, {0x81,0xd5}, {0x81,0xd6}, {0x81,0xd7}, {0x81,0xd8}, {0x81,0xd9}, {0x81,0xda}, {0x81,0xdb}, {0x81,0xdc}, {0x81,0xdd}, {0x81,0xde}, {0x81,0xdf}, {0x81,0xe0}, {0x81,0xe1}, {0x81,0xe2}, {0x81,0xe3}, {0x81,0xe4}, {0x81,0xe5}, {0x81,0xe6}, {0x81,0xe7}, {0x81,0xe8}, {0x81,0xe9}, {0x81,0xea}, {0x81,0xeb}, {0x81,0xec}, {0x81,0xed}, {0x81,0xee}, {0x81,0xef}, {0x81,0xf0}, {0x81,0xf1}, {0x81,0xf2}, {0x81,0xf3}, {0x81,0xf4}, {0x81,0xf5}, {0x81,0xf6}, {0x81,0xf7}, {0x81,0xf8}, {0x81,0xf9}, {0x81,0xfa}, {0x81,0xfb}, {0x81,0xfc}, {0x81,0xfd}, {0x81,0xfe}, {0x82,0x40}, {0x82,0x41}, {0x82,0x42}, {0x82,0x43}, {0x82,0x44}, {0x82,0x45}, {0x82,0x46}, {0x82,0x47}, {0x82,0x48}, {0x82,0x49}, {0x82,0x4a}, {0x82,0x4b}, {0x82,0x4c}, {0x82,0x4d}, {0x82,0x4e}, {0x82,0x4f}, {0x82,0x50}, {0x82,0x51}, {0x82,0x52}, {0x82,0x53}, {0x82,0x54}, {0x82,0x55}, {0x82,0x56}, {0x82,0x57}, {0x82,0x58}, {0x82,0x59}, {0x82,0x5a}, {0x82,0x5b}, {0x82,0x5c}, {0x82,0x5d}, {0x82,0x5e}, {0x82,0x5f}, {0x82,0x60}, {0x82,0x61}, {0x82,0x62}, {0x82,0x63}, {0x82,0x64}, {0x82,0x65}, {0x82,0x66}, {0x82,0x67}, {0x82,0x68}, {0x82,0x69}, {0x82,0x6a}, {0x82,0x6b}, {0x82,0x6c}, {0x82,0x6d}, {0x82,0x6e}, {0x82,0x6f}, {0x82,0x70}, {0x82,0x71}, {0x82,0x72}, {0x82,0x73}, {0x82,0x74}, {0x82,0x75}, {0x82,0x76}, {0x82,0x77}, {0x82,0x78}, {0x82,0x79}, {0x82,0x7a}, {0x82,0x7b}, {0x82,0x7c}, {0x82,0x7d}, {0x82,0x7e}, {0x82,0xa1}, {0x82,0xa2}, {0x82,0xa3}, {0x82,0xa4}, {0x82,0xa5}, {0x82,0xa6}, {0x82,0xa7}, {0x82,0xa8}, {0x82,0xa9}, {0x82,0xaa}, {0x82,0xab}, {0x82,0xac}, {0x82,0xad}, {0x82,0xae}, {0x82,0xaf}, {0x82,0xb0}, {0x82,0xb1}, {0x82,0xb2}, {0x82,0xb3}, {0x82,0xb4}, {0x82,0xb5}, {0x82,0xb6}, {0x82,0xb7}, {0x82,0xb8}, {0x82,0xb9}, {0x82,0xba}, {0x82,0xbb}, {0x82,0xbc}, {0x82,0xbd}, {0x82,0xbe}, {0x82,0xbf}, {0x82,0xc0}, {0x82,0xc1}, {0x82,0xc2}, {0x82,0xc3}, {0x82,0xc4}, {0x82,0xc5}, {0x82,0xc6}, {0x82,0xc7}, {0x82,0xc8}, {0x82,0xc9}, {0x82,0xca}, {0x82,0xcb}, {0x82,0xcc}, {0x82,0xcd}, {0x82,0xce}, {0x82,0xcf}, {0x82,0xd0}, {0x82,0xd1}, {0x82,0xd2}, {0x82,0xd3}, {0x82,0xd4}, {0x82,0xd5}, {0x82,0xd6}, {0x82,0xd7}, {0x82,0xd8}, {0x82,0xd9}, {0x82,0xda}, {0x82,0xdb}, {0x82,0xdc}, {0x82,0xdd}, {0x82,0xde}, {0x82,0xdf}, {0x82,0xe0}, {0x82,0xe1}, {0x82,0xe2}, {0x82,0xe3}, {0x82,0xe4}, {0x82,0xe5}, {0x82,0xe6}, {0x82,0xe7}, {0x82,0xe8}, {0x82,0xe9}, {0x82,0xea}, {0x82,0xeb}, {0x82,0xec}, {0x82,0xed}, {0x82,0xee}, {0x82,0xef}, {0x82,0xf0}, {0x82,0xf1}, {0x82,0xf2}, {0x82,0xf3}, {0x82,0xf4}, {0x82,0xf5}, {0x82,0xf6}, {0x82,0xf7}, {0x82,0xf8}, {0x82,0xf9}, {0x82,0xfa}, {0x82,0xfb}, {0x82,0xfc}, {0x82,0xfd}, {0x82,0xfe}, {0x83,0x40}, {0x83,0x41}, {0x83,0x42}, {0x83,0x43}, {0x83,0x44}, {0x83,0x45}, {0x83,0x46}, {0x83,0x47}, {0x83,0x48}, {0x83,0x49}, {0x83,0x4a}, {0x83,0x4b}, {0x83,0x4c}, {0x83,0x4d}, {0x83,0x4e}, {0x83,0x4f}, {0x83,0x50}, {0x83,0x51}, {0x83,0x52}, {0x83,0x53}, {0x83,0x54}, {0x83,0x55}, {0x83,0x56}, {0x83,0x57}, {0x83,0x58}, {0x83,0x59}, {0x83,0x5a}, {0x83,0x5b}, {0x83,0x5c}, {0x83,0x5d}, {0x83,0x5e}, {0x83,0x5f}, {0x83,0x60}, {0x83,0x61}, {0x83,0x62}, {0x83,0x63}, {0x83,0x64}, {0x83,0x65}, {0x83,0x66}, {0x83,0x67}, {0x83,0x68}, {0x83,0x69}, {0x83,0x6a}, {0x83,0x6b}, {0x83,0x6c}, {0x83,0x6d}, {0x83,0x6e}, {0x83,0x6f}, {0x83,0x70}, {0x83,0x71}, {0x83,0x72}, {0x83,0x73}, {0x83,0x74}, {0x83,0x75}, {0x83,0x76}, {0x83,0x77}, {0x83,0x78}, {0x83,0x79}, {0x83,0x7a}, {0x83,0x7b}, {0x83,0x7c}, {0x83,0x7d}, {0x83,0x7e}, {0x83,0xa1}, {0x83,0xa2}, {0x83,0xa3}, {0x83,0xa4}, {0x83,0xa5}, {0x83,0xa6}, {0x83,0xa7}, {0x83,0xa8}, {0x83,0xa9}, {0x83,0xaa}, {0x83,0xab}, {0x83,0xac}, {0x83,0xad}, {0x83,0xae}, {0x83,0xaf}, {0x83,0xb0}, {0x83,0xb1}, {0x83,0xb2}, {0x83,0xb3}, {0x83,0xb4}, {0x83,0xb5}, {0x83,0xb6}, {0x83,0xb7}, {0x83,0xb8}, {0x83,0xb9}, {0x83,0xba}, {0x83,0xbb}, {0x83,0xbc}, {0x83,0xbd}, {0x83,0xbe}, {0x83,0xbf}, {0x83,0xc0}, {0x83,0xc1}, {0x83,0xc2}, {0x83,0xc3}, {0x83,0xc4}, {0x83,0xc5}, {0x83,0xc6}, {0x83,0xc7}, {0x83,0xc8}, {0x83,0xc9}, {0x83,0xca}, {0x83,0xcb}, {0x83,0xcc}, {0x83,0xcd}, {0x83,0xce}, {0x83,0xcf}, {0x83,0xd0}, {0x83,0xd1}, {0x83,0xd2}, {0x83,0xd3}, {0x83,0xd4}, {0x83,0xd5}, {0x83,0xd6}, {0x83,0xd7}, {0x83,0xd8}, {0x83,0xd9}, {0x83,0xda}, {0x83,0xdb}, {0x83,0xdc}, {0x83,0xdd}, {0x83,0xde}, {0x83,0xdf}, {0x83,0xe0}, {0x83,0xe1}, {0x83,0xe2}, {0x83,0xe3}, {0x83,0xe4}, {0x83,0xe5}, {0x83,0xe6}, {0x83,0xe7}, {0x83,0xe8}, {0x83,0xe9}, {0x83,0xea}, {0x83,0xeb}, {0x83,0xec}, {0x83,0xed}, {0x83,0xee}, {0x83,0xef}, {0x83,0xf0}, {0x83,0xf1}, {0x83,0xf2}, {0x83,0xf3}, {0x83,0xf4}, {0x83,0xf5}, {0x83,0xf6}, {0x83,0xf7}, {0x83,0xf8}, {0x83,0xf9}, {0x83,0xfa}, {0x83,0xfb}, {0x83,0xfc}, {0x83,0xfd}, {0x83,0xfe}, {0x84,0x40}, {0x84,0x41}, {0x84,0x42}, {0x84,0x43}, {0x84,0x44}, {0x84,0x45}, {0x84,0x46}, {0x84,0x47}, {0x84,0x48}, {0x84,0x49}, {0x84,0x4a}, {0x84,0x4b}, {0x84,0x4c}, {0x84,0x4d}, {0x84,0x4e}, {0x84,0x4f}, {0x84,0x50}, {0x84,0x51}, {0x84,0x52}, {0x84,0x53}, {0x84,0x54}, {0x84,0x55}, {0x84,0x56}, {0x84,0x57}, {0x84,0x58}, {0x84,0x59}, {0x84,0x5a}, {0x84,0x5b}, {0x84,0x5c}, {0x84,0x5d}, {0x84,0x5e}, {0x84,0x5f}, {0x84,0x60}, {0x84,0x61}, {0x84,0x62}, {0x84,0x63}, {0x84,0x64}, {0x84,0x65}, {0x84,0x66}, {0x84,0x67}, {0x84,0x68}, {0x84,0x69}, {0x84,0x6a}, {0x84,0x6b}, {0x84,0x6c}, {0x84,0x6d}, {0x84,0x6e}, {0x84,0x6f}, {0x84,0x70}, {0x84,0x71}, {0x84,0x72}, {0x84,0x73}, {0x84,0x74}, {0x84,0x75}, {0x84,0x76}, {0x84,0x77}, {0x84,0x78}, {0x84,0x79}, {0x84,0x7a}, {0x84,0x7b}, {0x84,0x7c}, {0x84,0x7d}, {0x84,0x7e}, {0x84,0xa1}, {0x84,0xa2}, {0x84,0xa3}, {0x84,0xa4}, {0x84,0xa5}, {0x84,0xa6}, {0x84,0xa7}, {0x84,0xa8}, {0x84,0xa9}, {0x84,0xaa}, {0x84,0xab}, {0x84,0xac}, {0x84,0xad}, {0x84,0xae}, {0x84,0xaf}, {0x84,0xb0}, {0x84,0xb1}, {0x84,0xb2}, {0x84,0xb3}, {0x84,0xb4}, {0x84,0xb5}, {0x84,0xb6}, {0x84,0xb7}, {0x84,0xb8}, {0x84,0xb9}, {0x84,0xba}, {0x84,0xbb}, {0x84,0xbc}, {0x84,0xbd}, {0x84,0xbe}, {0x84,0xbf}, {0x84,0xc0}, {0x84,0xc1}, {0x84,0xc2}, {0x84,0xc3}, {0x84,0xc4}, {0x84,0xc5}, {0x84,0xc6}, {0x84,0xc7}, {0x84,0xc8}, {0x84,0xc9}, {0x84,0xca}, {0x84,0xcb}, {0x84,0xcc}, {0x84,0xcd}, {0x84,0xce}, {0x84,0xcf}, {0x84,0xd0}, {0x84,0xd1}, {0x84,0xd2}, {0x84,0xd3}, {0x84,0xd4}, {0x84,0xd5}, {0x84,0xd6}, {0x84,0xd7}, {0x84,0xd8}, {0x84,0xd9}, {0x84,0xda}, {0x84,0xdb}, {0x84,0xdc}, {0x84,0xdd}, {0x84,0xde}, {0x84,0xdf}, {0x84,0xe0}, {0x84,0xe1}, {0x84,0xe2}, {0x84,0xe3}, {0x84,0xe4}, {0x84,0xe5}, {0x84,0xe6}, {0x84,0xe7}, {0x84,0xe8}, {0x84,0xe9}, {0x84,0xea}, {0x84,0xeb}, {0x84,0xec}, {0x84,0xed}, {0x84,0xee}, {0x84,0xef}, {0x84,0xf0}, {0x84,0xf1}, {0x84,0xf2}, {0x84,0xf3}, {0x84,0xf4}, {0x84,0xf5}, {0x84,0xf6}, {0x84,0xf7}, {0x84,0xf8}, {0x84,0xf9}, {0x84,0xfa}, {0x84,0xfb}, {0x84,0xfc}, {0x84,0xfd}, {0x84,0xfe}, {0x85,0x40}, {0x85,0x41}, {0x85,0x42}, {0x85,0x43}, {0x85,0x44}, {0x85,0x45}, {0x85,0x46}, {0x85,0x47}, {0x85,0x48}, {0x85,0x49}, {0x85,0x4a}, {0x85,0x4b}, {0x85,0x4c}, {0x85,0x4d}, {0x85,0x4e}, {0x85,0x4f}, {0x85,0x50}, {0x85,0x51}, {0x85,0x52}, {0x85,0x53}, {0x85,0x54}, {0x85,0x55}, {0x85,0x56}, {0x85,0x57}, {0x85,0x58}, {0x85,0x59}, {0x85,0x5a}, {0x85,0x5b}, {0x85,0x5c}, {0x85,0x5d}, {0x85,0x5e}, {0x85,0x5f}, {0x85,0x60}, {0x85,0x61}, {0x85,0x62}, {0x85,0x63}, {0x85,0x64}, {0x85,0x65}, {0x85,0x66}, {0x85,0x67}, {0x85,0x68}, {0x85,0x69}, {0x85,0x6a}, {0x85,0x6b}, {0x85,0x6c}, {0x85,0x6d}, {0x85,0x6e}, {0x85,0x6f}, {0x85,0x70}, {0x85,0x71}, {0x85,0x72}, {0x85,0x73}, {0x85,0x74}, {0x85,0x75}, {0x85,0x76}, {0x85,0x77}, {0x85,0x78}, {0x85,0x79}, {0x85,0x7a}, {0x85,0x7b}, {0x85,0x7c}, {0x85,0x7d}, {0x85,0x7e}, {0x85,0xa1}, {0x85,0xa2}, {0x85,0xa3}, {0x85,0xa4}, {0x85,0xa5}, {0x85,0xa6}, {0x85,0xa7}, {0x85,0xa8}, {0x85,0xa9}, {0x85,0xaa}, {0x85,0xab}, {0x85,0xac}, {0x85,0xad}, {0x85,0xae}, {0x85,0xaf}, {0x85,0xb0}, {0x85,0xb1}, {0x85,0xb2}, {0x85,0xb3}, {0x85,0xb4}, {0x85,0xb5}, {0x85,0xb6}, {0x85,0xb7}, {0x85,0xb8}, {0x85,0xb9}, {0x85,0xba}, {0x85,0xbb}, {0x85,0xbc}, {0x85,0xbd}, {0x85,0xbe}, {0x85,0xbf}, {0x85,0xc0}, {0x85,0xc1}, {0x85,0xc2}, {0x85,0xc3}, {0x85,0xc4}, {0x85,0xc5}, {0x85,0xc6}, {0x85,0xc7}, {0x85,0xc8}, {0x85,0xc9}, {0x85,0xca}, {0x85,0xcb}, {0x85,0xcc}, {0x85,0xcd}, {0x85,0xce}, {0x85,0xcf}, {0x85,0xd0}, {0x85,0xd1}, {0x85,0xd2}, {0x85,0xd3}, {0x85,0xd4}, {0x85,0xd5}, {0x85,0xd6}, {0x85,0xd7}, {0x85,0xd8}, {0x85,0xd9}, {0x85,0xda}, {0x85,0xdb}, {0x85,0xdc}, {0x85,0xdd}, {0x85,0xde}, {0x85,0xdf}, {0x85,0xe0}, {0x85,0xe1}, {0x85,0xe2}, {0x85,0xe3}, {0x85,0xe4}, {0x85,0xe5}, {0x85,0xe6}, {0x85,0xe7}, {0x85,0xe8}, {0x85,0xe9}, {0x85,0xea}, {0x85,0xeb}, {0x85,0xec}, {0x85,0xed}, {0x85,0xee}, {0x85,0xef}, {0x85,0xf0}, {0x85,0xf1}, {0x85,0xf2}, {0x85,0xf3}, {0x85,0xf4}, {0x85,0xf5}, {0x85,0xf6}, {0x85,0xf7}, {0x85,0xf8}, {0x85,0xf9}, {0x85,0xfa}, {0x85,0xfb}, {0x85,0xfc}, {0x85,0xfd}, {0x85,0xfe}, {0x86,0x40}, {0x86,0x41}, {0x86,0x42}, {0x86,0x43}, {0x86,0x44}, {0x86,0x45}, {0x86,0x46}, {0x86,0x47}, {0x86,0x48}, {0x86,0x49}, {0x86,0x4a}, {0x86,0x4b}, {0x86,0x4c}, {0x86,0x4d}, {0x86,0x4e}, {0x86,0x4f}, {0x86,0x50}, {0x86,0x51}, {0x86,0x52}, {0x86,0x53}, {0x86,0x54}, {0x86,0x55}, {0x86,0x56}, {0x86,0x57}, {0x86,0x58}, {0x86,0x59}, {0x86,0x5a}, {0x86,0x5b}, {0x86,0x5c}, {0x86,0x5d}, {0x86,0x5e}, {0x86,0x5f}, {0x86,0x60}, {0x86,0x61}, {0x86,0x62}, {0x86,0x63}, {0x86,0x64}, {0x86,0x65}, {0x86,0x66}, {0x86,0x67}, {0x86,0x68}, {0x86,0x69}, {0x86,0x6a}, {0x86,0x6b}, {0x86,0x6c}, {0x86,0x6d}, {0x86,0x6e}, {0x86,0x6f}, {0x86,0x70}, {0x86,0x71}, {0x86,0x72}, {0x86,0x73}, {0x86,0x74}, {0x86,0x75}, {0x86,0x76}, {0x86,0x77}, {0x86,0x78}, {0x86,0x79}, {0x86,0x7a}, {0x86,0x7b}, {0x86,0x7c}, {0x86,0x7d}, {0x86,0x7e}, {0x86,0xa1}, {0x86,0xa2}, {0x86,0xa3}, {0x86,0xa4}, {0x86,0xa5}, {0x86,0xa6}, {0x86,0xa7}, {0x86,0xa8}, {0x86,0xa9}, {0x86,0xaa}, {0x86,0xab}, {0x86,0xac}, {0x86,0xad}, {0x86,0xae}, {0x86,0xaf}, {0x86,0xb0}, {0x86,0xb1}, {0x86,0xb2}, {0x86,0xb3}, {0x86,0xb4}, {0x86,0xb5}, {0x86,0xb6}, {0x86,0xb7}, {0x86,0xb8}, {0x86,0xb9}, {0x86,0xba}, {0x86,0xbb}, {0x86,0xbc}, {0x86,0xbd}, {0x86,0xbe}, {0x86,0xbf}, {0x86,0xc0}, {0x86,0xc1}, {0x86,0xc2}, {0x86,0xc3}, {0x86,0xc4}, {0x86,0xc5}, {0x86,0xc6}, {0x86,0xc7}, {0x86,0xc8}, {0x86,0xc9}, {0x86,0xca}, {0x86,0xcb}, {0x86,0xcc}, {0x86,0xcd}, {0x86,0xce}, {0x86,0xcf}, {0x86,0xd0}, {0x86,0xd1}, {0x86,0xd2}, {0x86,0xd3}, {0x86,0xd4}, {0x86,0xd5}, {0x86,0xd6}, {0x86,0xd7}, {0x86,0xd8}, {0x86,0xd9}, {0x86,0xda}, {0x86,0xdb}, {0x86,0xdc}, {0x86,0xdd}, {0x86,0xde}, {0x86,0xdf}, {0x86,0xe0}, {0x86,0xe1}, {0x86,0xe2}, {0x86,0xe3}, {0x86,0xe4}, {0x86,0xe5}, {0x86,0xe6}, {0x86,0xe7}, {0x86,0xe8}, {0x86,0xe9}, {0x86,0xea}, {0x86,0xeb}, {0x86,0xec}, {0x86,0xed}, {0x86,0xee}, {0x86,0xef}, {0x86,0xf0}, {0x86,0xf1}, {0x86,0xf2}, {0x86,0xf3}, {0x86,0xf4}, {0x86,0xf5}, {0x86,0xf6}, {0x86,0xf7}, {0x86,0xf8}, {0x86,0xf9}, {0x86,0xfa}, {0x86,0xfb}, {0x86,0xfc}, {0x86,0xfd}, {0x86,0xfe}, {0x87,0x40}, {0x87,0x41}, {0x87,0x42}, {0x87,0x43}, {0x87,0x44}, {0x87,0x45}, {0x87,0x46}, {0x87,0x47}, {0x87,0x48}, {0x87,0x49}, {0x87,0x4a}, {0x87,0x4b}, {0x87,0x4c}, {0x87,0x4d}, {0x87,0x4e}, {0x87,0x4f}, {0x87,0x50}, {0x87,0x51}, {0x87,0x52}, {0x87,0x53}, {0x87,0x54}, {0x87,0x55}, {0x87,0x56}, {0x87,0x57}, {0x87,0x58}, {0x87,0x59}, {0x87,0x5a}, {0x87,0x5b}, {0x87,0x5c}, {0x87,0x5d}, {0x87,0x5e}, {0x87,0x5f}, {0x87,0x60}, {0x87,0x61}, {0x87,0x62}, {0x87,0x63}, {0x87,0x64}, {0x87,0x65}, {0x87,0x66}, {0x87,0x67}, {0x87,0x68}, {0x87,0x69}, {0x87,0x6a}, {0x87,0x6b}, {0x87,0x6c}, {0x87,0x6d}, {0x87,0x6e}, {0x87,0x6f}, {0x87,0x70}, {0x87,0x71}, {0x87,0x72}, {0x87,0x73}, {0x87,0x74}, {0x87,0x75}, {0x87,0x76}, {0x87,0x77}, {0x87,0x78}, {0x87,0x79}, {0x87,0x7a}, {0x87,0x7b}, {0x87,0x7c}, {0x87,0x7d}, {0x87,0x7e}, {0x87,0xa1}, {0x87,0xa2}, {0x87,0xa3}, {0x87,0xa4}, {0x87,0xa5}, {0x87,0xa6}, {0x87,0xa7}, {0x87,0xa8}, {0x87,0xa9}, {0x87,0xaa}, {0x87,0xab}, {0x87,0xac}, {0x87,0xad}, {0x87,0xae}, {0x87,0xaf}, {0x87,0xb0}, {0x87,0xb1}, {0x87,0xb2}, {0x87,0xb3}, {0x87,0xb4}, {0x87,0xb5}, {0x87,0xb6}, {0x87,0xb7}, {0x87,0xb8}, {0x87,0xb9}, {0x87,0xba}, {0x87,0xbb}, {0x87,0xbc}, {0x87,0xbd}, {0x87,0xbe}, {0x87,0xbf}, {0x87,0xc0}, {0x87,0xc1}, {0x87,0xc2}, {0x87,0xc3}, {0x87,0xc4}, {0x87,0xc5}, {0x87,0xc6}, {0x87,0xc7}, {0x87,0xc8}, {0x87,0xc9}, {0x87,0xca}, {0x87,0xcb}, {0x87,0xcc}, {0x87,0xcd}, {0x87,0xce}, {0x87,0xcf}, {0x87,0xd0}, {0x87,0xd1}, {0x87,0xd2}, {0x87,0xd3}, {0x87,0xd4}, {0x87,0xd5}, {0x87,0xd6}, {0x87,0xd7}, {0x87,0xd8}, {0x87,0xd9}, {0x87,0xda}, {0x87,0xdb}, {0x87,0xdc}, {0x87,0xdd}, {0x87,0xde}, {0x87,0xdf}, {0x87,0xe0}, {0x87,0xe1}, {0x87,0xe2}, {0x87,0xe3}, {0x87,0xe4}, {0x87,0xe5}, {0x87,0xe6}, {0x87,0xe7}, {0x87,0xe8}, {0x87,0xe9}, {0x87,0xea}, {0x87,0xeb}, {0x87,0xec}, {0x87,0xed}, {0x87,0xee}, {0x87,0xef}, {0x87,0xf0}, {0x87,0xf1}, {0x87,0xf2}, {0x87,0xf3}, {0x87,0xf4}, {0x87,0xf5}, {0x87,0xf6}, {0x87,0xf7}, {0x87,0xf8}, {0x87,0xf9}, {0x87,0xfa}, {0x87,0xfb}, {0x87,0xfc}, {0x87,0xfd}, {0x87,0xfe}, {0x88,0x40}, {0x88,0x41}, {0x88,0x42}, {0x88,0x43}, {0x88,0x44}, {0x88,0x45}, {0x88,0x46}, {0x88,0x47}, {0x88,0x48}, {0x88,0x49}, {0x88,0x4a}, {0x88,0x4b}, {0x88,0x4c}, {0x88,0x4d}, {0x88,0x4e}, {0x88,0x4f}, {0x88,0x50}, {0x88,0x51}, {0x88,0x52}, {0x88,0x53}, {0x88,0x54}, {0x88,0x55}, {0x88,0x56}, {0x88,0x57}, {0x88,0x58}, {0x88,0x59}, {0x88,0x5a}, {0x88,0x5b}, {0x88,0x5c}, {0x88,0x5d}, {0x88,0x5e}, {0x88,0x5f}, {0x88,0x60}, {0x88,0x61}, {0x88,0x62}, {0x88,0x63}, {0x88,0x64}, {0x88,0x65}, {0x88,0x66}, {0x88,0x67}, {0x88,0x68}, {0x88,0x69}, {0x88,0x6a}, {0x88,0x6b}, {0x88,0x6c}, {0x88,0x6d}, {0x88,0x6e}, {0x88,0x6f}, {0x88,0x70}, {0x88,0x71}, {0x88,0x72}, {0x88,0x73}, {0x88,0x74}, {0x88,0x75}, {0x88,0x76}, {0x88,0x77}, {0x88,0x78}, {0x88,0x79}, {0x88,0x7a}, {0x88,0x7b}, {0x88,0x7c}, {0x88,0x7d}, {0x88,0x7e}, {0x88,0xa1}, {0x88,0xa2}, {0x88,0xa3}, {0x88,0xa4}, {0x88,0xa5}, {0x88,0xa6}, {0x88,0xa7}, {0x88,0xa8}, {0x88,0xa9}, {0x88,0xaa}, {0x88,0xab}, {0x88,0xac}, {0x88,0xad}, {0x88,0xae}, {0x88,0xaf}, {0x88,0xb0}, {0x88,0xb1}, {0x88,0xb2}, {0x88,0xb3}, {0x88,0xb4}, {0x88,0xb5}, {0x88,0xb6}, {0x88,0xb7}, {0x88,0xb8}, {0x88,0xb9}, {0x88,0xba}, {0x88,0xbb}, {0x88,0xbc}, {0x88,0xbd}, {0x88,0xbe}, {0x88,0xbf}, {0x88,0xc0}, {0x88,0xc1}, {0x88,0xc2}, {0x88,0xc3}, {0x88,0xc4}, {0x88,0xc5}, {0x88,0xc6}, {0x88,0xc7}, {0x88,0xc8}, {0x88,0xc9}, {0x88,0xca}, {0x88,0xcb}, {0x88,0xcc}, {0x88,0xcd}, {0x88,0xce}, {0x88,0xcf}, {0x88,0xd0}, {0x88,0xd1}, {0x88,0xd2}, {0x88,0xd3}, {0x88,0xd4}, {0x88,0xd5}, {0x88,0xd6}, {0x88,0xd7}, {0x88,0xd8}, {0x88,0xd9}, {0x88,0xda}, {0x88,0xdb}, {0x88,0xdc}, {0x88,0xdd}, {0x88,0xde}, {0x88,0xdf}, {0x88,0xe0}, {0x88,0xe1}, {0x88,0xe2}, {0x88,0xe3}, {0x88,0xe4}, {0x88,0xe5}, {0x88,0xe6}, {0x88,0xe7}, {0x88,0xe8}, {0x88,0xe9}, {0x88,0xea}, {0x88,0xeb}, {0x88,0xec}, {0x88,0xed}, {0x88,0xee}, {0x88,0xef}, {0x88,0xf0}, {0x88,0xf1}, {0x88,0xf2}, {0x88,0xf3}, {0x88,0xf4}, {0x88,0xf5}, {0x88,0xf6}, {0x88,0xf7}, {0x88,0xf8}, {0x88,0xf9}, {0x88,0xfa}, {0x88,0xfb}, {0x88,0xfc}, {0x88,0xfd}, {0x88,0xfe}, {0x89,0x40}, {0x89,0x41}, {0x89,0x42}, {0x89,0x43}, {0x89,0x44}, {0x89,0x45}, {0x89,0x46}, {0x89,0x47}, {0x89,0x48}, {0x89,0x49}, {0x89,0x4a}, {0x89,0x4b}, {0x89,0x4c}, {0x89,0x4d}, {0x89,0x4e}, {0x89,0x4f}, {0x89,0x50}, {0x89,0x51}, {0x89,0x52}, {0x89,0x53}, {0x89,0x54}, {0x89,0x55}, {0x89,0x56}, {0x89,0x57}, {0x89,0x58}, {0x89,0x59}, {0x89,0x5a}, {0x89,0x5b}, {0x89,0x5c}, {0x89,0x5d}, {0x89,0x5e}, {0x89,0x5f}, {0x89,0x60}, {0x89,0x61}, {0x89,0x62}, {0x89,0x63}, {0x89,0x64}, {0x89,0x65}, {0x89,0x66}, {0x89,0x67}, {0x89,0x68}, {0x89,0x69}, {0x89,0x6a}, {0x89,0x6b}, {0x89,0x6c}, {0x89,0x6d}, {0x89,0x6e}, {0x89,0x6f}, {0x89,0x70}, {0x89,0x71}, {0x89,0x72}, {0x89,0x73}, {0x89,0x74}, {0x89,0x75}, {0x89,0x76}, {0x89,0x77}, {0x89,0x78}, {0x89,0x79}, {0x89,0x7a}, {0x89,0x7b}, {0x89,0x7c}, {0x89,0x7d}, {0x89,0x7e}, {0x89,0xa1}, {0x89,0xa2}, {0x89,0xa3}, {0x89,0xa4}, {0x89,0xa5}, {0x89,0xa6}, {0x89,0xa7}, {0x89,0xa8}, {0x89,0xa9}, {0x89,0xaa}, {0x89,0xab}, {0x89,0xac}, {0x89,0xad}, {0x89,0xae}, {0x89,0xaf}, {0x89,0xb0}, {0x89,0xb1}, {0x89,0xb2}, {0x89,0xb3}, {0x89,0xb4}, {0x89,0xb5}, {0x89,0xb6}, {0x89,0xb7}, {0x89,0xb8}, {0x89,0xb9}, {0x89,0xba}, {0x89,0xbb}, {0x89,0xbc}, {0x89,0xbd}, {0x89,0xbe}, {0x89,0xbf}, {0x89,0xc0}, {0x89,0xc1}, {0x89,0xc2}, {0x89,0xc3}, {0x89,0xc4}, {0x89,0xc5}, {0x89,0xc6}, {0x89,0xc7}, {0x89,0xc8}, {0x89,0xc9}, {0x89,0xca}, {0x89,0xcb}, {0x89,0xcc}, {0x89,0xcd}, {0x89,0xce}, {0x89,0xcf}, {0x89,0xd0}, {0x89,0xd1}, {0x89,0xd2}, {0x89,0xd3}, {0x89,0xd4}, {0x89,0xd5}, {0x89,0xd6}, {0x89,0xd7}, {0x89,0xd8}, {0x89,0xd9}, {0x89,0xda}, {0x89,0xdb}, {0x89,0xdc}, {0x89,0xdd}, {0x89,0xde}, {0x89,0xdf}, {0x89,0xe0}, {0x89,0xe1}, {0x89,0xe2}, {0x89,0xe3}, {0x89,0xe4}, {0x89,0xe5}, {0x89,0xe6}, {0x89,0xe7}, {0x89,0xe8}, {0x89,0xe9}, {0x89,0xea}, {0x89,0xeb}, {0x89,0xec}, {0x89,0xed}, {0x89,0xee}, {0x89,0xef}, {0x89,0xf0}, {0x89,0xf1}, {0x89,0xf2}, {0x89,0xf3}, {0x89,0xf4}, {0x89,0xf5}, {0x89,0xf6}, {0x89,0xf7}, {0x89,0xf8}, {0x89,0xf9}, {0x89,0xfa}, {0x89,0xfb}, {0x89,0xfc}, {0x89,0xfd}, {0x89,0xfe}, {0x8a,0x40}, {0x8a,0x41}, {0x8a,0x42}, {0x8a,0x43}, {0x8a,0x44}, {0x8a,0x45}, {0x8a,0x46}, {0x8a,0x47}, {0x8a,0x48}, {0x8a,0x49}, {0x8a,0x4a}, {0x8a,0x4b}, {0x8a,0x4c}, {0x8a,0x4d}, {0x8a,0x4e}, {0x8a,0x4f}, {0x8a,0x50}, {0x8a,0x51}, {0x8a,0x52}, {0x8a,0x53}, {0x8a,0x54}, {0x8a,0x55}, {0x8a,0x56}, {0x8a,0x57}, {0x8a,0x58}, {0x8a,0x59}, {0x8a,0x5a}, {0x8a,0x5b}, {0x8a,0x5c}, {0x8a,0x5d}, {0x8a,0x5e}, {0x8a,0x5f}, {0x8a,0x60}, {0x8a,0x61}, {0x8a,0x62}, {0x8a,0x63}, {0x8a,0x64}, {0x8a,0x65}, {0x8a,0x66}, {0x8a,0x67}, {0x8a,0x68}, {0x8a,0x69}, {0x8a,0x6a}, {0x8a,0x6b}, {0x8a,0x6c}, {0x8a,0x6d}, {0x8a,0x6e}, {0x8a,0x6f}, {0x8a,0x70}, {0x8a,0x71}, {0x8a,0x72}, {0x8a,0x73}, {0x8a,0x74}, {0x8a,0x75}, {0x8a,0x76}, {0x8a,0x77}, {0x8a,0x78}, {0x8a,0x79}, {0x8a,0x7a}, {0x8a,0x7b}, {0x8a,0x7c}, {0x8a,0x7d}, {0x8a,0x7e}, {0x8a,0xa1}, {0x8a,0xa2}, {0x8a,0xa3}, {0x8a,0xa4}, {0x8a,0xa5}, {0x8a,0xa6}, {0x8a,0xa7}, {0x8a,0xa8}, {0x8a,0xa9}, {0x8a,0xaa}, {0x8a,0xab}, {0x8a,0xac}, {0x8a,0xad}, {0x8a,0xae}, {0x8a,0xaf}, {0x8a,0xb0}, {0x8a,0xb1}, {0x8a,0xb2}, {0x8a,0xb3}, {0x8a,0xb4}, {0x8a,0xb5}, {0x8a,0xb6}, {0x8a,0xb7}, {0x8a,0xb8}, {0x8a,0xb9}, {0x8a,0xba}, {0x8a,0xbb}, {0x8a,0xbc}, {0x8a,0xbd}, {0x8a,0xbe}, {0x8a,0xbf}, {0x8a,0xc0}, {0x8a,0xc1}, {0x8a,0xc2}, {0x8a,0xc3}, {0x8a,0xc4}, {0x8a,0xc5}, {0x8a,0xc6}, {0x8a,0xc7}, {0x8a,0xc8}, {0x8a,0xc9}, {0x8a,0xca}, {0x8a,0xcb}, {0x8a,0xcc}, {0x8a,0xcd}, {0x8a,0xce}, {0x8a,0xcf}, {0x8a,0xd0}, {0x8a,0xd1}, {0x8a,0xd2}, {0x8a,0xd3}, {0x8a,0xd4}, {0x8a,0xd5}, {0x8a,0xd6}, {0x8a,0xd7}, {0x8a,0xd8}, {0x8a,0xd9}, {0x8a,0xda}, {0x8a,0xdb}, {0x8a,0xdc}, {0x8a,0xdd}, {0x8a,0xde}, {0x8a,0xdf}, {0x8a,0xe0}, {0x8a,0xe1}, {0x8a,0xe2}, {0x8a,0xe3}, {0x8a,0xe4}, {0x8a,0xe5}, {0x8a,0xe6}, {0x8a,0xe7}, {0x8a,0xe8}, {0x8a,0xe9}, {0x8a,0xea}, {0x8a,0xeb}, {0x8a,0xec}, {0x8a,0xed}, {0x8a,0xee}, {0x8a,0xef}, {0x8a,0xf0}, {0x8a,0xf1}, {0x8a,0xf2}, {0x8a,0xf3}, {0x8a,0xf4}, {0x8a,0xf5}, {0x8a,0xf6}, {0x8a,0xf7}, {0x8a,0xf8}, {0x8a,0xf9}, {0x8a,0xfa}, {0x8a,0xfb}, {0x8a,0xfc}, {0x8a,0xfd}, {0x8a,0xfe}, {0x8b,0x40}, {0x8b,0x41}, {0x8b,0x42}, {0x8b,0x43}, {0x8b,0x44}, {0x8b,0x45}, {0x8b,0x46}, {0x8b,0x47}, {0x8b,0x48}, {0x8b,0x49}, {0x8b,0x4a}, {0x8b,0x4b}, {0x8b,0x4c}, {0x8b,0x4d}, {0x8b,0x4e}, {0x8b,0x4f}, {0x8b,0x50}, {0x8b,0x51}, {0x8b,0x52}, {0x8b,0x53}, {0x8b,0x54}, {0x8b,0x55}, {0x8b,0x56}, {0x8b,0x57}, {0x8b,0x58}, {0x8b,0x59}, {0x8b,0x5a}, {0x8b,0x5b}, {0x8b,0x5c}, {0x8b,0x5d}, {0x8b,0x5e}, {0x8b,0x5f}, {0x8b,0x60}, {0x8b,0x61}, {0x8b,0x62}, {0x8b,0x63}, {0x8b,0x64}, {0x8b,0x65}, {0x8b,0x66}, {0x8b,0x67}, {0x8b,0x68}, {0x8b,0x69}, {0x8b,0x6a}, {0x8b,0x6b}, {0x8b,0x6c}, {0x8b,0x6d}, {0x8b,0x6e}, {0x8b,0x6f}, {0x8b,0x70}, {0x8b,0x71}, {0x8b,0x72}, {0x8b,0x73}, {0x8b,0x74}, {0x8b,0x75}, {0x8b,0x76}, {0x8b,0x77}, {0x8b,0x78}, {0x8b,0x79}, {0x8b,0x7a}, {0x8b,0x7b}, {0x8b,0x7c}, {0x8b,0x7d}, {0x8b,0x7e}, {0x8b,0xa1}, {0x8b,0xa2}, {0x8b,0xa3}, {0x8b,0xa4}, {0x8b,0xa5}, {0x8b,0xa6}, {0x8b,0xa7}, {0x8b,0xa8}, {0x8b,0xa9}, {0x8b,0xaa}, {0x8b,0xab}, {0x8b,0xac}, {0x8b,0xad}, {0x8b,0xae}, {0x8b,0xaf}, {0x8b,0xb0}, {0x8b,0xb1}, {0x8b,0xb2}, {0x8b,0xb3}, {0x8b,0xb4}, {0x8b,0xb5}, {0x8b,0xb6}, {0x8b,0xb7}, {0x8b,0xb8}, {0x8b,0xb9}, {0x8b,0xba}, {0x8b,0xbb}, {0x8b,0xbc}, {0x8b,0xbd}, {0x8b,0xbe}, {0x8b,0xbf}, {0x8b,0xc0}, {0x8b,0xc1}, {0x8b,0xc2}, {0x8b,0xc3}, {0x8b,0xc4}, {0x8b,0xc5}, {0x8b,0xc6}, {0x8b,0xc7}, {0x8b,0xc8}, {0x8b,0xc9}, {0x8b,0xca}, {0x8b,0xcb}, {0x8b,0xcc}, {0x8b,0xcd}, {0x8b,0xce}, {0x8b,0xcf}, {0x8b,0xd0}, {0x8b,0xd1}, {0x8b,0xd2}, {0x8b,0xd3}, {0x8b,0xd4}, {0x8b,0xd5}, {0x8b,0xd6}, {0x8b,0xd7}, {0x8b,0xd8}, {0x8b,0xd9}, {0x8b,0xda}, {0x8b,0xdb}, {0x8b,0xdc}, {0x8b,0xdd}, {0x8b,0xde}, {0x8b,0xdf}, {0x8b,0xe0}, {0x8b,0xe1}, {0x8b,0xe2}, {0x8b,0xe3}, {0x8b,0xe4}, {0x8b,0xe5}, {0x8b,0xe6}, {0x8b,0xe7}, {0x8b,0xe8}, {0x8b,0xe9}, {0x8b,0xea}, {0x8b,0xeb}, {0x8b,0xec}, {0x8b,0xed}, {0x8b,0xee}, {0x8b,0xef}, {0x8b,0xf0}, {0x8b,0xf1}, {0x8b,0xf2}, {0x8b,0xf3}, {0x8b,0xf4}, {0x8b,0xf5}, {0x8b,0xf6}, {0x8b,0xf7}, {0x8b,0xf8}, {0x8b,0xf9}, {0x8b,0xfa}, {0x8b,0xfb}, {0x8b,0xfc}, {0x8b,0xfd}, {0x8b,0xfe}, {0x8c,0x40}, {0x8c,0x41}, {0x8c,0x42}, {0x8c,0x43}, {0x8c,0x44}, {0x8c,0x45}, {0x8c,0x46}, {0x8c,0x47}, {0x8c,0x48}, {0x8c,0x49}, {0x8c,0x4a}, {0x8c,0x4b}, {0x8c,0x4c}, {0x8c,0x4d}, {0x8c,0x4e}, {0x8c,0x4f}, {0x8c,0x50}, {0x8c,0x51}, {0x8c,0x52}, {0x8c,0x53}, {0x8c,0x54}, {0x8c,0x55}, {0x8c,0x56}, {0x8c,0x57}, {0x8c,0x58}, {0x8c,0x59}, {0x8c,0x5a}, {0x8c,0x5b}, {0x8c,0x5c}, {0x8c,0x5d}, {0x8c,0x5e}, {0x8c,0x5f}, {0x8c,0x60}, {0x8c,0x61}, {0x8c,0x62}, {0x8c,0x63}, {0x8c,0x64}, {0x8c,0x65}, {0x8c,0x66}, {0x8c,0x67}, {0x8c,0x68}, {0x8c,0x69}, {0x8c,0x6a}, {0x8c,0x6b}, {0x8c,0x6c}, {0x8c,0x6d}, {0x8c,0x6e}, {0x8c,0x6f}, {0x8c,0x70}, {0x8c,0x71}, {0x8c,0x72}, {0x8c,0x73}, {0x8c,0x74}, {0x8c,0x75}, {0x8c,0x76}, {0x8c,0x77}, {0x8c,0x78}, {0x8c,0x79}, {0x8c,0x7a}, {0x8c,0x7b}, {0x8c,0x7c}, {0x8c,0x7d}, {0x8c,0x7e}, {0x8c,0xa1}, {0x8c,0xa2}, {0x8c,0xa3}, {0x8c,0xa4}, {0x8c,0xa5}, {0x8c,0xa6}, {0x8c,0xa7}, {0x8c,0xa8}, {0x8c,0xa9}, {0x8c,0xaa}, {0x8c,0xab}, {0x8c,0xac}, {0x8c,0xad}, {0x8c,0xae}, {0x8c,0xaf}, {0x8c,0xb0}, {0x8c,0xb1}, {0x8c,0xb2}, {0x8c,0xb3}, {0x8c,0xb4}, {0x8c,0xb5}, {0x8c,0xb6}, {0x8c,0xb7}, {0x8c,0xb8}, {0x8c,0xb9}, {0x8c,0xba}, {0x8c,0xbb}, {0x8c,0xbc}, {0x8c,0xbd}, {0x8c,0xbe}, {0x8c,0xbf}, {0x8c,0xc0}, {0x8c,0xc1}, {0x8c,0xc2}, {0x8c,0xc3}, {0x8c,0xc4}, {0x8c,0xc5}, {0x8c,0xc6}, {0x8c,0xc7}, {0x8c,0xc8}, {0x8c,0xc9}, {0x8c,0xca}, {0x8c,0xcb}, {0x8c,0xcc}, {0x8c,0xcd}, {0x8c,0xce}, {0x8c,0xcf}, {0x8c,0xd0}, {0x8c,0xd1}, {0x8c,0xd2}, {0x8c,0xd3}, {0x8c,0xd4}, {0x8c,0xd5}, {0x8c,0xd6}, {0x8c,0xd7}, {0x8c,0xd8}, {0x8c,0xd9}, {0x8c,0xda}, {0x8c,0xdb}, {0x8c,0xdc}, {0x8c,0xdd}, {0x8c,0xde}, {0x8c,0xdf}, {0x8c,0xe0}, {0x8c,0xe1}, {0x8c,0xe2}, {0x8c,0xe3}, {0x8c,0xe4}, {0x8c,0xe5}, {0x8c,0xe6}, {0x8c,0xe7}, {0x8c,0xe8}, {0x8c,0xe9}, {0x8c,0xea}, {0x8c,0xeb}, {0x8c,0xec}, {0x8c,0xed}, {0x8c,0xee}, {0x8c,0xef}, {0x8c,0xf0}, {0x8c,0xf1}, {0x8c,0xf2}, {0x8c,0xf3}, {0x8c,0xf4}, {0x8c,0xf5}, {0x8c,0xf6}, {0x8c,0xf7}, {0x8c,0xf8}, {0x8c,0xf9}, {0x8c,0xfa}, {0x8c,0xfb}, {0x8c,0xfc}, {0x8c,0xfd}, {0x8c,0xfe}, {0x8d,0x40}, {0x8d,0x41}, {0x8d,0x42}, {0x8d,0x43}, {0x8d,0x44}, {0x8d,0x45}, {0x8d,0x46}, {0x8d,0x47}, {0x8d,0x48}, {0x8d,0x49}, {0x8d,0x4a}, {0x8d,0x4b}, {0x8d,0x4c}, {0x8d,0x4d}, {0x8d,0x4e}, {0x8d,0x4f}, {0x8d,0x50}, {0x8d,0x51}, {0x8d,0x52}, {0x8d,0x53}, {0x8d,0x54}, {0x8d,0x55}, {0x8d,0x56}, {0x8d,0x57}, {0x8d,0x58}, {0x8d,0x59}, {0x8d,0x5a}, {0x8d,0x5b}, {0x8d,0x5c}, {0x8d,0x5d}, {0x8d,0x5e}, {0x8d,0x5f}, {0x8d,0x60}, {0x8d,0x61}, {0x8d,0x62}, {0x8d,0x63}, {0x8d,0x64}, {0x8d,0x65}, {0x8d,0x66}, {0x8d,0x67}, {0x8d,0x68}, {0x8d,0x69}, {0x8d,0x6a}, {0x8d,0x6b}, {0x8d,0x6c}, {0x8d,0x6d}, {0x8d,0x6e}, {0x8d,0x6f}, {0x8d,0x70}, {0x8d,0x71}, {0x8d,0x72}, {0x8d,0x73}, {0x8d,0x74}, {0x8d,0x75}, {0x8d,0x76}, {0x8d,0x77}, {0x8d,0x78}, {0x8d,0x79}, {0x8d,0x7a}, {0x8d,0x7b}, {0x8d,0x7c}, {0x8d,0x7d}, {0x8d,0x7e}, {0x8d,0xa1}, {0x8d,0xa2}, {0x8d,0xa3}, {0x8d,0xa4}, {0x8d,0xa5}, {0x8d,0xa6}, {0x8d,0xa7}, {0x8d,0xa8}, {0x8d,0xa9}, {0x8d,0xaa}, {0x8d,0xab}, {0x8d,0xac}, {0x8d,0xad}, {0x8d,0xae}, {0x8d,0xaf}, {0x8d,0xb0}, {0x8d,0xb1}, {0x8d,0xb2}, {0x8d,0xb3}, {0x8d,0xb4}, {0x8d,0xb5}, {0x8d,0xb6}, {0x8d,0xb7}, {0x8d,0xb8}, {0x8d,0xb9}, {0x8d,0xba}, {0x8d,0xbb}, {0x8d,0xbc}, {0x8d,0xbd}, {0x8d,0xbe}, {0x8d,0xbf}, {0x8d,0xc0}, {0x8d,0xc1}, {0x8d,0xc2}, {0x8d,0xc3}, {0x8d,0xc4}, {0x8d,0xc5}, {0x8d,0xc6}, {0x8d,0xc7}, {0x8d,0xc8}, {0x8d,0xc9}, {0x8d,0xca}, {0x8d,0xcb}, {0x8d,0xcc}, {0x8d,0xcd}, {0x8d,0xce}, {0x8d,0xcf}, {0x8d,0xd0}, {0x8d,0xd1}, {0x8d,0xd2}, {0x8d,0xd3}, {0x8d,0xd4}, {0x8d,0xd5}, {0x8d,0xd6}, {0x8d,0xd7}, {0x8d,0xd8}, {0x8d,0xd9}, {0x8d,0xda}, {0x8d,0xdb}, {0x8d,0xdc}, {0x8d,0xdd}, {0x8d,0xde}, {0x8d,0xdf}, {0x8d,0xe0}, {0x8d,0xe1}, {0x8d,0xe2}, {0x8d,0xe3}, {0x8d,0xe4}, {0x8d,0xe5}, {0x8d,0xe6}, {0x8d,0xe7}, {0x8d,0xe8}, {0x8d,0xe9}, {0x8d,0xea}, {0x8d,0xeb}, {0x8d,0xec}, {0x8d,0xed}, {0x8d,0xee}, {0x8d,0xef}, {0x8d,0xf0}, {0x8d,0xf1}, {0x8d,0xf2}, {0x8d,0xf3}, {0x8d,0xf4}, {0x8d,0xf5}, {0x8d,0xf6}, {0x8d,0xf7}, {0x8d,0xf8}, {0x8d,0xf9}, {0x8d,0xfa}, {0x8d,0xfb}, {0x8d,0xfc}, {0x8d,0xfd}, {0x8d,0xfe}, {0xc6,0xa1}, {0xc6,0xa2}, {0xc6,0xa3}, {0xc6,0xa4}, {0xc6,0xa5}, {0xc6,0xa6}, {0xc6,0xa7}, {0xc6,0xa8}, {0xc6,0xa9}, {0xc6,0xaa}, {0xc6,0xab}, {0xc6,0xac}, {0xc6,0xad}, {0xc6,0xae}, {0xc6,0xaf}, {0xc6,0xb0}, {0xc6,0xb1}, {0xc6,0xb2}, {0xc6,0xb3}, {0xc6,0xb4}, {0xc6,0xb5}, {0xc6,0xb6}, {0xc6,0xb7}, {0xc6,0xb8}, {0xc6,0xb9}, {0xc6,0xba}, {0xc6,0xbb}, {0xc6,0xbc}, {0xc6,0xbd}, {0xc6,0xbe}, {0xc6,0xbf}, {0xc6,0xc0}, {0xc6,0xc1}, {0xc6,0xc2}, {0xc6,0xc3}, {0xc6,0xc4}, {0xc6,0xc5}, {0xc6,0xc6}, {0xc6,0xc7}, {0xc6,0xc8}, {0xc6,0xc9}, {0xc6,0xca}, {0xc6,0xcb}, {0xc6,0xcc}, {0xc6,0xcd}, {0xc6,0xce}, {0xc6,0xcf}, {0xc6,0xd0}, {0xc6,0xd1}, {0xc6,0xd2}, {0xc6,0xd3}, {0xc6,0xd4}, {0xc6,0xd5}, {0xc6,0xd6}, {0xc6,0xd7}, {0xc6,0xd8}, {0xc6,0xd9}, {0xc6,0xda}, {0xc6,0xdb}, {0xc6,0xdc}, {0xc6,0xdd}, {0xc6,0xde}, {0xc6,0xdf}, {0xc6,0xe0}, {0xc6,0xe1}, {0xc6,0xe2}, {0xc6,0xe3}, {0xc6,0xe4}, {0xc6,0xe5}, {0xc6,0xe6}, {0xc6,0xe7}, {0xc6,0xe8}, {0xc6,0xe9}, {0xc6,0xea}, {0xc6,0xeb}, {0xc6,0xec}, {0xc6,0xed}, {0xc6,0xee}, {0xc6,0xef}, {0xc6,0xf0}, {0xc6,0xf1}, {0xc6,0xf2}, {0xc6,0xf3}, {0xc6,0xf4}, {0xc6,0xf5}, {0xc6,0xf6}, {0xc6,0xf7}, {0xc6,0xf8}, {0xc6,0xf9}, {0xc6,0xfa}, {0xc6,0xfb}, {0xc6,0xfc}, {0xc6,0xfd}, {0xc6,0xfe}, {0xc7,0x40}, {0xc7,0x41}, {0xc7,0x42}, {0xc7,0x43}, {0xc7,0x44}, {0xc7,0x45}, {0xc7,0x46}, {0xc7,0x47}, {0xc7,0x48}, {0xc7,0x49}, {0xc7,0x4a}, {0xc7,0x4b}, {0xc7,0x4c}, {0xc7,0x4d}, {0xc7,0x4e}, {0xc7,0x4f}, {0xc7,0x50}, {0xc7,0x51}, {0xc7,0x52}, {0xc7,0x53}, {0xc7,0x54}, {0xc7,0x55}, {0xc7,0x56}, {0xc7,0x57}, {0xc7,0x58}, {0xc7,0x59}, {0xc7,0x5a}, {0xc7,0x5b}, {0xc7,0x5c}, {0xc7,0x5d}, {0xc7,0x5e}, {0xc7,0x5f}, {0xc7,0x60}, {0xc7,0x61}, {0xc7,0x62}, {0xc7,0x63}, {0xc7,0x64}, {0xc7,0x65}, {0xc7,0x66}, {0xc7,0x67}, {0xc7,0x68}, {0xc7,0x69}, {0xc7,0x6a}, {0xc7,0x6b}, {0xc7,0x6c}, {0xc7,0x6d}, {0xc7,0x6e}, {0xc7,0x6f}, {0xc7,0x70}, {0xc7,0x71}, {0xc7,0x72}, {0xc7,0x73}, {0xc7,0x74}, {0xc7,0x75}, {0xc7,0x76}, {0xc7,0x77}, {0xc7,0x78}, {0xc7,0x79}, {0xc7,0x7a}, {0xc7,0x7b}, {0xc7,0x7c}, {0xc7,0x7d}, {0xc7,0x7e}, {0xc7,0xa1}, {0xc7,0xa2}, {0xc7,0xa3}, {0xc7,0xa4}, {0xc7,0xa5}, {0xc7,0xa6}, {0xc7,0xa7}, {0xc7,0xa8}, {0xc7,0xa9}, {0xc7,0xaa}, {0xc7,0xab}, {0xc7,0xac}, {0xc7,0xad}, {0xc7,0xae}, {0xc7,0xaf}, {0xc7,0xb0}, {0xc7,0xb1}, {0xc7,0xb2}, {0xc7,0xb3}, {0xc7,0xb4}, {0xc7,0xb5}, {0xc7,0xb6}, {0xc7,0xb7}, {0xc7,0xb8}, {0xc7,0xb9}, {0xc7,0xba}, {0xc7,0xbb}, {0xc7,0xbc}, {0xc7,0xbd}, {0xc7,0xbe}, {0xc7,0xbf}, {0xc7,0xc0}, {0xc7,0xc1}, {0xc7,0xc2}, {0xc7,0xc3}, {0xc7,0xc4}, {0xc7,0xc5}, {0xc7,0xc6}, {0xc7,0xc7}, {0xc7,0xc8}, {0xc7,0xc9}, {0xc7,0xca}, {0xc7,0xcb}, {0xc7,0xcc}, {0xc7,0xcd}, {0xc7,0xce}, {0xc7,0xcf}, {0xc7,0xd0}, {0xc7,0xd1}, {0xc7,0xd2}, {0xc7,0xd3}, {0xc7,0xd4}, {0xc7,0xd5}, {0xc7,0xd6}, {0xc7,0xd7}, {0xc7,0xd8}, {0xc7,0xd9}, {0xc7,0xda}, {0xc7,0xdb}, {0xc7,0xdc}, {0xc7,0xdd}, {0xc7,0xde}, {0xc7,0xdf}, {0xc7,0xe0}, {0xc7,0xe1}, {0xc7,0xe2}, {0xc7,0xe3}, {0xc7,0xe4}, {0xc7,0xe5}, {0xc7,0xe6}, {0xc7,0xe7}, {0xc7,0xe8}, {0xc7,0xe9}, {0xc7,0xea}, {0xc7,0xeb}, {0xc7,0xec}, {0xc7,0xed}, {0xc7,0xee}, {0xc7,0xef}, {0xc7,0xf0}, {0xc7,0xf1}, {0xc7,0xf2}, {0xc7,0xf3}, {0xc7,0xf4}, {0xc7,0xf5}, {0xc7,0xf6}, {0xc7,0xf7}, {0xc7,0xf8}, {0xc7,0xf9}, {0xc7,0xfa}, {0xc7,0xfb}, {0xc7,0xfc}, {0xc7,0xfd}, {0xc7,0xfe}, {0xc8,0x40}, {0xc8,0x41}, {0xc8,0x42}, {0xc8,0x43}, {0xc8,0x44}, {0xc8,0x45}, {0xc8,0x46}, {0xc8,0x47}, {0xc8,0x48}, {0xc8,0x49}, {0xc8,0x4a}, {0xc8,0x4b}, {0xc8,0x4c}, {0xc8,0x4d}, {0xc8,0x4e}, {0xc8,0x4f}, {0xc8,0x50}, {0xc8,0x51}, {0xc8,0x52}, {0xc8,0x53}, {0xc8,0x54}, {0xc8,0x55}, {0xc8,0x56}, {0xc8,0x57}, {0xc8,0x58}, {0xc8,0x59}, {0xc8,0x5a}, {0xc8,0x5b}, {0xc8,0x5c}, {0xc8,0x5d}, {0xc8,0x5e}, {0xc8,0x5f}, {0xc8,0x60}, {0xc8,0x61}, {0xc8,0x62}, {0xc8,0x63}, {0xc8,0x64}, {0xc8,0x65}, {0xc8,0x66}, {0xc8,0x67}, {0xc8,0x68}, {0xc8,0x69}, {0xc8,0x6a}, {0xc8,0x6b}, {0xc8,0x6c}, {0xc8,0x6d}, {0xc8,0x6e}, {0xc8,0x6f}, {0xc8,0x70}, {0xc8,0x71}, {0xc8,0x72}, {0xc8,0x73}, {0xc8,0x74}, {0xc8,0x75}, {0xc8,0x76}, {0xc8,0x77}, {0xc8,0x78}, {0xc8,0x79}, {0xc8,0x7a}, {0xc8,0x7b}, {0xc8,0x7c}, {0xc8,0x7d}, {0xc8,0x7e}, {0xc8,0xa1}, {0xc8,0xa2}, {0xc8,0xa3}, {0xc8,0xa4}, {0xc8,0xa5}, {0xc8,0xa6}, {0xc8,0xa7}, {0xc8,0xa8}, {0xc8,0xa9}, {0xc8,0xaa}, {0xc8,0xab}, {0xc8,0xac}, {0xc8,0xad}, {0xc8,0xae}, {0xc8,0xaf}, {0xc8,0xb0}, {0xc8,0xb1}, {0xc8,0xb2}, {0xc8,0xb3}, {0xc8,0xb4}, {0xc8,0xb5}, {0xc8,0xb6}, {0xc8,0xb7}, {0xc8,0xb8}, {0xc8,0xb9}, {0xc8,0xba}, {0xc8,0xbb}, {0xc8,0xbc}, {0xc8,0xbd}, {0xc8,0xbe}, {0xc8,0xbf}, {0xc8,0xc0}, {0xc8,0xc1}, {0xc8,0xc2}, {0xc8,0xc3}, {0xc8,0xc4}, {0xc8,0xc5}, {0xc8,0xc6}, {0xc8,0xc7}, {0xc8,0xc8}, {0xc8,0xc9}, {0xc8,0xca}, {0xc8,0xcb}, {0xc8,0xcc}, {0xc8,0xcd}, {0xc8,0xce}, {0xc8,0xcf}, {0xc8,0xd0}, {0xc8,0xd1}, {0xc8,0xd2}, {0xc8,0xd3}, {0xc8,0xd4}, {0xc8,0xd5}, {0xc8,0xd6}, {0xc8,0xd7}, {0xc8,0xd8}, {0xc8,0xd9}, {0xc8,0xda}, {0xc8,0xdb}, {0xc8,0xdc}, {0xc8,0xdd}, {0xc8,0xde}, {0xc8,0xdf}, {0xc8,0xe0}, {0xc8,0xe1}, {0xc8,0xe2}, {0xc8,0xe3}, {0xc8,0xe4}, {0xc8,0xe5}, {0xc8,0xe6}, {0xc8,0xe7}, {0xc8,0xe8}, {0xc8,0xe9}, {0xc8,0xea}, {0xc8,0xeb}, {0xc8,0xec}, {0xc8,0xed}, {0xc8,0xee}, {0xc8,0xef}, {0xc8,0xf0}, {0xc8,0xf1}, {0xc8,0xf2}, {0xc8,0xf3}, {0xc8,0xf4}, {0xc8,0xf5}, {0xc8,0xf6}, {0xc8,0xf7}, {0xc8,0xf8}, {0xc8,0xf9}, {0xc8,0xfa}, {0xc8,0xfb}, {0xc8,0xfc}, {0xc8,0xfd}, {0xc8,0xfe}, {0xff,0x00}, {0xb0,0x5a}, {0xa7,0xf3}, {0xa8,0xae}, {0xb8,0xeb}, {0xb7,0xc6}, {0xa6,0xea}, {0xa5,0x79}, {0x8b,0xf8}, {0xc0,0x74}, {0xab,0xb4}, {0xaa,0xf7}, {0xb3,0xe2}, {0xa9,0x60}, {0xc3,0x69}, {0xc4,0xee}, {0xc3,0xb9}, {0xc5,0xda}, {0xc1,0xb3}, {0xbb,0x72}, {0xc5,0xde}, {0xbc,0xd6}, {0xac,0xa5}, {0xaf,0x4f}, {0xaf,0x5f}, {0xb8,0xa8}, {0xb9,0x54}, {0xc0,0x64}, {0xb6,0xc3}, {0xa7,0x5a}, {0xc4,0xe6}, {0xc4,0xea}, {0xc4,0xf5}, {0xc6,0x7d}, {0xb4,0x50}, {0xc0,0xdd}, {0xc2,0xc5}, {0xc4,0xb0}, {0xa9,0xd4}, {0xc3,0xbe}, {0xc4,0xfa}, {0xb4,0x59}, {0xae,0xd4}, {0xae,0xf6}, {0xaf,0x54}, {0xa8,0xd3}, {0xa7,0x4e}, {0xb3,0xd2}, {0xbe,0xdb}, {0xc3,0x72}, {0xc4,0x6c}, {0xbf,0x63}, {0xa6,0xd1}, {0xc4,0xaa}, {0xb8,0xb8}, {0xb8,0xf4}, {0xc5,0x53}, {0xbe,0x7c}, {0xc6,0x4f}, {0xb8,0x4c}, {0xb8,0x53}, {0xba,0xf1}, {0xdb,0x77}, {0xbf,0xfd}, {0xb3,0xc0}, {0xbd,0xd7}, {0xc3,0x62}, {0xa7,0xcb}, {0xc5,0xa2}, {0xc5,0xa4}, {0xa8,0x63}, {0xbd,0x55}, {0xb8,0xef}, {0xb9,0x70}, {0xc2,0x53}, {0xb9,0xf0}, {0xbc,0xd3}, {0xb2,0x5c}, {0xba,0x7c}, {0xb2,0xd6}, {0xc1,0x5c}, {0xad,0xae}, {0xb0,0xc7}, {0xa6,0xd8}, {0xbb,0xfe}, {0xad,0xe2}, {0xb8,0x57}, {0xba,0xf0}, {0xb5,0xd9}, {0xb3,0xae}, {0xc5,0xaa}, {0xce,0xd4}, {0xbc,0xd6}, {0xbf,0xd5}, {0xa4,0xa6}, {0xb9,0xe7}, {0xab,0xe3}, {0xb2,0x76}, {0xb2,0xa7}, {0xa5,0x5f}, {0xed,0xa8}, {0xab,0x4b}, {0xb4,0x5f}, {0xa4,0xa3}, {0xaa,0x63}, {0xbc,0xc6}, {0xaf,0xc1}, {0xb0,0xd1}, {0xb6,0xeb}, {0xac,0xd9}, {0xb8,0xad}, {0xbb,0xa1}, {0xb1,0xfe}, {0xa8,0xb0}, {0xa8,0x48}, {0xac,0x42}, {0xad,0x59}, {0xb1,0xb0}, {0xb2,0xa4}, {0xab,0x47}, {0xa8,0xe2}, {0xb1,0xe7}, {0xc2,0xb3}, {0xa8,0x7d}, {0xbd,0xcc}, {0xb6,0x71}, {0xc0,0x79}, {0xa7,0x66}, {0xa4,0x6b}, {0xc3,0x66}, {0xae,0xc8}, {0xc2,0x6f}, {0xc4,0x72}, {0xbe,0x5b}, {0xc6,0x7a}, {0xc4,0x52}, {0xbe,0xa4}, {0xa4,0x4f}, {0xbe,0xe4}, {0xbe,0xfa}, {0xf7,0x65}, {0xa6,0x7e}, {0xbc,0xa6}, {0xc5,0xca}, {0xbc,0xbf}, {0xba,0xa7}, {0xb7,0xd2}, {0xe6,0xa3}, {0xbd,0x6d}, {0xc1,0x70}, {0xbd,0xfb}, {0xbd,0xac}, {0xb3,0x73}, {0xc1,0xe5}, {0xa6,0x43}, {0xa6,0x48}, {0xab,0x7c}, {0xaf,0x50}, {0xb5,0xf5}, {0xbb,0xa1}, {0xb7,0x47}, {0xa9,0xc0}, {0xb1,0xc9}, {0xc0,0xd4}, {0xc3,0xae}, {0xc2,0x79}, {0xa5,0x4f}, {0xcb,0xf1}, {0xb9,0xe7}, {0xc0,0xad}, {0xcc,0xb0}, {0xac,0xc2}, {0xbc,0xfc}, {0xb2,0xdc}, {0xb2,0xe2}, {0xb9,0x61}, {0xb9,0x73}, {0xc6,0x46}, {0xbb,0xe2}, {0xa8,0xd2}, {0xc2,0xa7}, {0xc4,0xbf}, {0xc1,0xf5}, {0xb4,0x63}, {0xa4,0x46}, {0xb9,0xb1}, {0xbc,0x64}, {0xa7,0xbf}, {0xae,0xc6}, {0xbc,0xd6}, {0xbf,0x52}, {0xc0,0xf8}, {0xe7,0x64}, {0xbf,0xf1}, {0xc0,0x73}, {0xb7,0x77}, {0xa8,0xbf}, {0xbc,0x42}, {0xcc,0xd8}, {0xac,0x68}, {0xac,0x79}, {0xb7,0xc8}, {0xaf,0x5b}, {0xaf,0x64}, {0xb2,0xb8}, {0xaf,0xc3}, {0xc3,0xfe}, {0xa4,0xbb}, {0xbc,0xae}, {0xb3,0xb0}, {0xad,0xdb}, {0xb1,0x5b}, {0xb2,0x5f}, {0xbd,0xfc}, {0xab,0xdf}, {0xb7,0x58}, {0xae,0xdf}, {0xb2,0x76}, {0xb6,0xa9}, {0xa7,0x51}, {0xa6,0x4f}, {0xbc,0x69}, {0xa9,0xf6}, {0xa7,0xf5}, {0xb1,0xf9}, {0xaa,0x64}, {0xb2,0x7a}, {0xb5,0x67}, {0xbf,0xa9}, {0xb8,0xcc}, {0xa8,0xbd}, {0xc2,0xf7}, {0xb0,0xce}, {0xb7,0xc4}, {0xa7,0x5b}, {0xbf,0x4d}, {0xbf,0x5a}, {0xc4,0xa9}, {0xc5,0xec}, {0xc5,0xef}, {0xaa,0x4c}, {0xb2,0x4f}, {0xc1,0x7b}, {0xa5,0xdf}, {0xb2,0xc1}, {0xb2,0xc9}, {0xaa,0xac}, {0xaa,0xa5}, {0xc3,0xd1}, {0xa4,0xb0}, {0xaf,0xf9}, {0xa8,0xeb}, {0xa4,0xc1}, {0xab,0xd7}, {0xa9,0xdd}, {0xbf,0x7d}, {0xa6,0x76}, {0xac,0x7d}, {0xbc,0xc9}, {0xbf,0xe7}, {0xa6,0xe6}, {0xad,0xb0}, {0xa8,0xa3}, {0xb9,0xf8}, {0xc9,0x4a}, {0xdd,0xfc}, {0xb6,0xef}, {0xb4,0xb8}, {0xe8,0xf9}, {0xbd,0xde}, {0xaf,0x71}, {0xaf,0xab}, {0xb2,0xbb}, {0xba,0xd6}, {0xb9,0x74}, {0xba,0xeb}, {0xa6,0xd0}, {0xbd,0xd1}, {0xb6,0x68}, {0xb3,0xa3}, {0xb6,0xba}, {0xb9,0x7d}, {0xc0,0x5d}, {0xc5,0x62}, {0xa1,0x4a}, {0xa1,0x57}, {0xa1,0x59}, {0xa1,0x5b}, {0xa1,0x5f}, {0xa1,0x60}, {0xa1,0x63}, {0xa1,0x64}, {0xa1,0x67}, {0xa1,0x68}, {0xa1,0x6b}, {0xa1,0x6c}, {0xa1,0x6f}, {0xa1,0x70}, {0xa1,0x73}, {0xa1,0x74}, {0xa1,0x77}, {0xa1,0x78}, {0xa1,0x7b}, {0xa1,0x7c}, {0xa1,0xc6}, {0xa1,0xc7}, {0xa1,0xca}, {0xa1,0xcb}, {0xa1,0xc8}, {0xa1,0xc9}, {0xa1,0x5c}, {0xa1,0x4d}, {0xa1,0x4e}, {0xa1,0x4f}, {0xa1,0x51}, {0xa1,0x52}, {0xa1,0x53}, {0xa1,0x54}, {0xa1,0x7d}, {0xa1,0x7e}, {0xa1,0xa1}, {0xa1,0xa2}, {0xa1,0xa3}, {0xa1,0xa4}, {0xa1,0xcc}, {0xa1,0xcd}, {0xa1,0xce}, {0xa1,0xde}, {0xa1,0xdf}, {0xa1,0xe0}, {0xa1,0xe1}, {0xa1,0xe2}, {0xa2,0x42}, {0xa2,0x4c}, {0xa2,0x4d}, {0xa2,0x4e}, {0xa1,0x49}, {0xc8,0xd0}, {0xa1,0xad}, {0xa2,0x43}, {0xa2,0x48}, {0xa1,0xae}, {0xc8,0xcf}, {0xa1,0x5d}, {0xa1,0x5e}, {0xa1,0xaf}, {0xa1,0xcf}, {0xa1,0x41}, {0xa1,0xd0}, {0xa1,0x44}, {0xa1,0xfe}, {0xa2,0xaf}, {0xa2,0xb0}, {0xa2,0xb1}, {0xa2,0xb2}, {0xa2,0xb3}, {0xa2,0xb4}, {0xa2,0xb5}, {0xa2,0xb6}, {0xa2,0xb7}, {0xa2,0xb8}, {0xa1,0x47}, {0xa1,0x46}, {0xa1,0xd5}, {0xa1,0xd7}, {0xa1,0xd6}, {0xa1,0x48}, {0xa2,0x49}, {0xa2,0xcf}, {0xa2,0xd0}, {0xa2,0xd1}, {0xa2,0xd2}, {0xa2,0xd3}, {0xa2,0xd4}, {0xa2,0xd5}, {0xa2,0xd6}, {0xa2,0xd7}, {0xa2,0xd8}, {0xa2,0xd9}, {0xa2,0xda}, {0xa2,0xdb}, {0xa2,0xdc}, {0xa2,0xdd}, {0xa2,0xde}, {0xa2,0xdf}, {0xa2,0xe0}, {0xa2,0xe1}, {0xa2,0xe2}, {0xa2,0xe3}, {0xa2,0xe4}, {0xa2,0xe5}, {0xa2,0xe6}, {0xa2,0xe7}, {0xa2,0xe8}, {0xc6,0xe4}, {0xa2,0x40}, {0xc6,0xe5}, {0xa1,0x73}, {0xa1,0xc4}, {0xa1,0xa5}, {0xa2,0xe9}, {0xa2,0xea}, {0xa2,0xeb}, {0xa2,0xec}, {0xa2,0xed}, {0xa2,0xee}, {0xa2,0xef}, {0xa2,0xf0}, {0xa2,0xf1}, {0xa2,0xf2}, {0xa2,0xf3}, {0xa2,0xf4}, {0xa2,0xf5}, {0xa2,0xf6}, {0xa2,0xf7}, {0xa2,0xf8}, {0xa2,0xf9}, {0xa2,0xfa}, {0xa2,0xfb}, {0xa2,0xfc}, {0xa2,0xfd}, {0xa2,0xfe}, {0xa3,0x40}, {0xa3,0x41}, {0xa3,0x42}, {0xa3,0x43}, {0xa1,0x61}, {0xa1,0x55}, {0xa1,0x62}, {0xa1,0xe3}, {0xa1,0x4e}, {0xa2,0x46}, {0xa2,0x47}, {0xc8,0xcd}, {0xa1,0xc3}, {0xc8,0xce}, {0xa2,0x44}, {0xf9,0xfe}, {0x9c,0x71}, {0x93,0x75}, {0x93,0x76}, {0x95,0x48}, {0x8e,0xc6}, {0x8b,0xc5}, {0x8b,0xfa}, {0xc8,0x7c}, {0x9a,0xb4}, {0x88,0x4e}, {0x88,0x4b}, {0xc8,0x7a}, {0x88,0x48}, {0x88,0x47}, {0xa0,0xf6}, {0x88,0x45}, {0x88,0x53}, {0xfc,0xad}, {0x8a,0xad}, {0x92,0x72}, {0xfc,0x47}, {0x94,0xdf}, {0x9f,0xd1}, {0xfb,0xcb}, {0x92,0x7d}, {0x98,0xa4}, {0x94,0xe7}, {0x90,0xcb}, {0x92,0x7b}, {0x94,0xd8}, {0xfc,0x5f}, {0xfa,0x54}, {0x9a,0xb5}, {0x96,0xda}, {0x92,0x79}, {0xfa,0x74}, {0x92,0x75}, {0x8d,0xfb}, {0x8a,0x49}, {0x92,0xdf}, {0x9b,0x7c}, {0xfa,0x63}, {0xfa,0x60}, {0x92,0x6d}, {0xfa,0x62}, {0x9a,0xb6}, {0x97,0x6b}, {0xfd,0x6a}, {0xfd,0x54}, {0x92,0x73}, {0x97,0xd8}, {0x9f,0xbb}, {0x93,0x42}, {0x92,0x76}, {0xfa,0x65}, {0x92,0x6c}, {0xfa,0x6e}, {0x9e,0xe0}, {0x92,0xc0}, {0x92,0xbf}, {0x92,0xbe}, {0x9a,0xba}, {0x8a,0xb3}, {0x97,0x75}, {0xfa,0x40}, {0xfa,0x76}, {0xfb,0xd0}, {0xfa,0x7b}, {0xfe,0x6d}, {0x9b,0xb3}, {0x89,0xcc}, {0x9a,0xbe}, {0xfa,0x42}, {0x92,0xbc}, {0x94,0x5c}, {0x9b,0xb5}, {0x9a,0xbf}, {0x98,0xa7}, {0x97,0xa4}, {0x90,0xfd}, {0xfc,0x7b}, {0x9a,0xc0}, {0x92,0xc3}, {0x8a,0xaa}, {0x9b,0xd0}, {0x95,0x50}, {0x92,0xc6}, {0x98,0xa6}, {0x95,0x46}, {0xfd,0x63}, {0xfa,0xc2}, {0x9e,0xc3}, {0x89,0xb2}, {0x9c,0x66}, {0x90,0x53}, {0x97,0xc1}, {0x9a,0xc4}, {0x9a,0xc5}, {0x8e,0xef}, {0xfa,0xe9}, {0x92,0x62}, {0x8a,0xf7}, {0x9a,0xc6}, {0x92,0xe1}, {0x9a,0xc9}, {0xfa,0xc6}, {0x97,0xa5}, {0x9a,0xcb}, {0xfa,0x72}, {0x8a,0x5e}, {0x94,0xe0}, {0x92,0xcc}, {0x8a,0xe5}, {0xfe,0x5c}, {0x9a,0xcc}, {0x9d,0xf9}, {0x8a,0x43}, {0x8a,0xa6}, {0x9a,0xcd}, {0x9a,0xce}, {0xfa,0xee}, {0x9b,0xcc}, {0x9a,0xcf}, {0x9a,0xd1}, {0x9d,0xfa}, {0x9d,0x7c}, {0x9a,0xd3}, {0x97,0xa6}, {0x99,0x5f}, {0xfb,0xf6}, {0x9f,0xc5}, {0x8a,0x59}, {0x8b,0x6b}, {0x9a,0xd4}, {0x9a,0xd5}, {0x97,0xa2}, {0x8a,0x44}, {0x9f,0x4a}, {0x90,0xa1}, {0xfd,0xa4}, {0x8a,0x64}, {0x8a,0xf2}, {0x8a,0xf8}, {0x9d,0xd8}, {0x94,0xd6}, {0xfa,0xfe}, {0xfb,0xa7}, {0x9a,0xd6}, {0x9f,0x4d}, {0xfa,0xf6}, {0x8a,0x57}, {0x8b,0x43}, {0x8b,0x44}, {0x8a,0xb6}, {0x8a,0xc0}, {0x9e,0x54}, {0x9a,0xd7}, {0x9a,0xd8}, {0x9a,0xdc}, {0x8a,0xca}, {0x9e,0xa8}, {0x92,0x63}, {0x9a,0xdd}, {0x8b,0x65}, {0x8b,0x6f}, {0x8b,0x7e}, {0x8f,0x43}, {0x92,0xd0}, {0x8a,0xf4}, {0x9d,0xbe}, {0x9a,0xe1}, {0xfc,0xde}, {0x9d,0xfd}, {0x8b,0x66}, {0x8b,0x70}, {0x8b,0x75}, {0x8a,0xe4}, {0x8b,0xa4}, {0x8a,0xed}, {0x8a,0x5d}, {0x8b,0x48}, {0x9d,0xed}, {0x9e,0x40}, {0x8a,0xef}, {0x8a,0xf6}, {0x9e,0x76}, {0x9e,0xe3}, {0x9a,0xde}, {0x8d,0xfe}, {0xfa,0xfc}, {0x9c,0xb1}, {0x9e,0x77}, {0x8b,0x64}, {0x8b,0x67}, {0x97,0x4b}, {0x96,0x53}, {0x9a,0xe0}, {0x8b,0x4a}, {0x8a,0xf1}, {0x8a,0xd7}, {0xa0,0xab}, {0x8a,0xb5}, {0x8a,0x5f}, {0x8a,0xee}, {0x9a,0xdf}, {0x8a,0xfe}, {0x8a,0x58}, {0x8b,0xa3}, {0x8b,0xa7}, {0x9a,0xe3}, {0x92,0x61}, {0x9d,0xd7}, {0x9e,0x7d}, {0x9e,0xa7}, {0x9e,0xab}, {0x90,0x42}, {0x8b,0x79}, {0x8b,0x7a}, {0x9a,0xe6}, {0x9a,0xe5}, {0x8a,0x7e}, {0x9e,0x44}, {0x9a,0xe7}, {0x8a,0x7c}, {0x8b,0x71}, {0x9a,0xe9}, {0x9a,0xea}, {0x9a,0xeb}, {0x8a,0xbd}, {0xfb,0x4e}, {0x9a,0xed}, {0x8a,0xf9}, {0x9e,0x63}, {0x8b,0x49}, {0x8a,0xce}, {0x8b,0x6e}, {0x8a,0xe8}, {0x9a,0xee}, {0x92,0xce}, {0x8a,0x5a}, {0x8b,0x7b}, {0x8b,0x7c}, {0x9a,0xef}, {0x9a,0xf0}, {0x8a,0xfa}, {0x89,0x41}, {0x8b,0x72}, {0x8a,0xf3}, {0x8b,0xa8}, {0x9e,0xae}, {0x9e,0x72}, {0xfb,0x73}, {0xfb,0x5f}, {0x90,0xba}, {0x91,0xfe}, {0x9e,0xf6}, {0x97,0xed}, {0x9a,0xf3}, {0xa0,0xee}, {0x96,0x7c}, {0x93,0x45}, {0x98,0x6e}, {0xfa,0x56}, {0x9a,0xf5}, {0xfc,0x4b}, {0x9a,0xf4}, {0xfe,0xde}, {0xfc,0xb7}, {0x97,0xf1}, {0x97,0xc7}, {0x9c,0xcb}, {0x92,0x40}, {0x9c,0xe8}, {0x91,0xfd}, {0x97,0x4e}, {0xfb,0x68}, {0x97,0x6c}, {0x8c,0xc2}, {0x97,0xe8}, {0xfb,0x6a}, {0x8b,0x74}, {0x8e,0xe7}, {0xfd,0xc8}, {0x92,0x41}, {0x96,0xa1}, {0x8e,0xf3}, {0x9a,0xf7}, {0x8f,0xa6}, {0xfa,0xd6}, {0x9c,0xc7}, {0xfa,0xd7}, {0x9a,0xf8}, {0xfb,0xa1}, {0x8e,0xc5}, {0xfb,0xa4}, {0xfb,0xc2}, {0x9a,0xc1}, {0x91,0xfa}, {0xfe,0xdb}, {0x97,0xab}, {0x91,0x47}, {0xfb,0xb1}, {0x8f,0xea}, {0x94,0xd2}, {0xfe,0x61}, {0xfa,0xce}, {0x92,0xed}, {0x91,0xf3}, {0x93,0xc6}, {0x93,0x5a}, {0xfa,0xfb}, {0x92,0xef}, {0xfa,0xc8}, {0x98,0x47}, {0x93,0x66}, {0x98,0x55}, {0x96,0xe6}, {0x9f,0x43}, {0x9f,0xaa}, {0x94,0xda}, {0x92,0xee}, {0xfc,0xaf}, {0xfb,0xfb}, {0x8e,0xf9}, {0x91,0xf6}, {0x93,0x64}, {0x94,0xf5}, {0x9c,0xb6}, {0xfb,0xad}, {0x98,0x4e}, {0x8f,0x44}, {0x96,0xfd}, {0x9a,0xf9}, {0x9a,0xfa}, {0x97,0x69}, {0x95,0xd4}, {0x98,0x4b}, {0xfb,0xaa}, {0x98,0x7c}, {0x91,0xea}, {0x9d,0xaf}, {0x9d,0xc5}, {0x91,0xf1}, {0x8e,0xb1}, {0x97,0xa9}, {0xfb,0xac}, {0xfc,0xb8}, {0x9c,0xb9}, {0xfb,0xb0}, {0xfc,0xd2}, {0x93,0xcb}, {0x9a,0xfd}, {0x91,0xf4}, {0x8b,0xac}, {0xa0,0x55}, {0x95,0x74}, {0x95,0xbe}, {0x97,0xad}, {0x8e,0xe9}, {0x92,0xf8}, {0x97,0xbe}, {0x91,0x6c}, {0x94,0xaa}, {0xfc,0x63}, {0x9d,0xc6}, {0x97,0xb5}, {0x92,0xb8}, {0x91,0xef}, {0xfe,0xa6}, {0x97,0x60}, {0x93,0x58}, {0x95,0x76}, {0x8f,0xac}, {0x91,0xec}, {0x97,0xb4}, {0x91,0xf7}, {0x97,0x4a}, {0xfb,0x49}, {0x95,0x78}, {0x93,0xbc}, {0x91,0xd6}, {0x93,0x55}, {0x93,0x56}, {0x98,0x51}, {0x8f,0xf8}, {0xfb,0xc0}, {0x93,0xf2}, {0x90,0xd0}, {0x9c,0x44}, {0x92,0x55}, {0x93,0x63}, {0x91,0xa5}, {0xa0,0xed}, {0xfd,0x6b}, {0x9a,0xfe}, {0x93,0x51}, {0x8c,0x57}, {0xfa,0x78}, {0xfe,0xa8}, {0x93,0x50}, {0xfa,0x4c}, {0x92,0xf7}, {0x9b,0x40}, {0xfb,0xce}, {0x9b,0x41}, {0xfe,0xad}, {0xfb,0xd5}, {0x8b,0xc2}, {0x9a,0x7c}, {0x9b,0x42}, {0x9b,0x43}, {0x9e,0x79}, {0xfb,0xd9}, {0x9b,0x44}, {0xa0,0xa7}, {0x9b,0xf3}, {0x8c,0x79}, {0x93,0x5e}, {0x89,0xcb}, {0x9f,0x53}, {0x93,0xd7}, {0xfb,0xe1}, {0xfe,0xd0}, {0xfb,0xe2}, {0xfc,0xe3}, {0x90,0x74}, {0xfb,0xe6}, {0x9b,0xb7}, {0x9b,0x45}, {0x9b,0x47}, {0x9f,0x50}, {0x9b,0x48}, {0xfc,0x5b}, {0x98,0xa9}, {0x9c,0xfd}, {0x88,0x4c}, {0x9b,0x4b}, {0xfb,0xec}, {0x8c,0x69}, {0x9b,0xa8}, {0x8a,0xd5}, {0xfa,0x73}, {0xfd,0x59}, {0x91,0xa2}, {0xfb,0xed}, {0x9c,0xa9}, {0x8a,0xa8}, {0x9b,0xc3}, {0x8a,0xe1}, {0x9b,0x4e}, {0x95,0xd0}, {0x90,0x5f}, {0x97,0xee}, {0xfc,0x4e}, {0x9b,0x4f}, {0x9b,0x50}, {0x9e,0xc6}, {0xfc,0x50}, {0xfd,0x73}, {0xfd,0xa7}, {0x9d,0xa2}, {0xfa,0x58}, {0xfa,0x5e}, {0xa0,0x59}, {0xfa,0x75}, {0xfb,0xbe}, {0x9c,0xa2}, {0x93,0x70}, {0x93,0x71}, {0x93,0x77}, {0xfe,0xef}, {0x93,0x6d}, {0xfc,0x5d}, {0x90,0xb8}, {0x8a,0xfc}, {0xfb,0x41}, {0x9e,0x6b}, {0x94,0xe3}, {0x8e,0xe2}, {0x8c,0x7d}, {0x8e,0xd7}, {0x9c,0x4d}, {0x96,0xa3}, {0x9b,0x51}, {0x8a,0xc3}, {0x96,0xaa}, {0xfc,0x68}, {0x8b,0x6d}, {0xfd,0x67}, {0x8a,0xe9}, {0xfc,0xa1}, {0x93,0x6c}, {0x9b,0x52}, {0xfe,0x70}, {0xfc,0xa8}, {0xfc,0xe9}, {0x9c,0xb4}, {0x8a,0xea}, {0x9b,0x53}, {0x9b,0x55}, {0x96,0xab}, {0xfc,0xa7}, {0x9b,0x56}, {0x8a,0xbc}, {0x8a,0xcb}, {0x9b,0x57}, {0x89,0xcd}, {0x9b,0x59}, {0x9b,0x5b}, {0x93,0xa5}, {0x9b,0x5d}, {0x9e,0x4f}, {0x93,0xa3}, {0x8a,0x7b}, {0x8b,0x42}, {0x97,0x50}, {0x8f,0xb3}, {0x8a,0x50}, {0x9b,0x60}, {0x8b,0x45}, {0x8b,0x46}, {0x9d,0xfe}, {0x9b,0x62}, {0x93,0x7b}, {0x93,0xb1}, {0x8a,0x60}, {0x8a,0xd8}, {0x9b,0x63}, {0x8a,0x69}, {0x8a,0x47}, {0x8a,0xcc}, {0x93,0x7c}, {0x9b,0x65}, {0x9b,0x66}, {0x8a,0x72}, {0x8a,0x7a}, {0x93,0xaf}, {0x8a,0xb0}, {0x9b,0x68}, {0x9e,0xa3}, {0xfa,0xec}, {0x8b,0x77}, {0x9b,0x67}, {0x8b,0x59}, {0xfc,0xb1}, {0xfc,0xbb}, {0x9b,0x69}, {0x93,0xa8}, {0x8a,0xe0}, {0x9e,0x51}, {0x8f,0x5f}, {0x9b,0x6a}, {0x9b,0x6b}, {0x97,0xec}, {0x9b,0x6c}, {0xfe,0x4e}, {0xfd,0xc2}, {0x9b,0x6d}, {0x91,0x67}, {0xfc,0xcc}, {0x93,0xb6}, {0x90,0xe4}, {0x90,0xe5}, {0x9e,0xf2}, {0x93,0xca}, {0x8b,0xbc}, {0x8f,0x46}, {0x93,0xcf}, {0xfc,0xdb}, {0xfc,0xdc}, {0x93,0xc0}, {0xfc,0xe6}, {0x96,0xe7}, {0xfc,0xd8}, {0xfc,0xd9}, {0xfd,0xa6}, {0x93,0xce}, {0x95,0xf1}, {0x9c,0xe9}, {0xfc,0xe4}, {0x94,0xaf}, {0xfa,0x77}, {0x93,0xcc}, {0x90,0x5a}, {0x8c,0x54}, {0x93,0xbf}, {0xfb,0x51}, {0x93,0xb9}, {0xfe,0xd7}, {0x93,0xb7}, {0x93,0xd9}, {0x93,0xbb}, {0x93,0xda}, {0x98,0xa3}, {0x90,0xd1}, {0x9b,0x6e}, {0xfa,0x70}, {0x9b,0xeb}, {0x9b,0x6f}, {0xfc,0xfc}, {0x8b,0x40}, {0xa0,0x7b}, {0x8c,0xa1}, {0x97,0xf7}, {0x93,0xe2}, {0xfc,0xd6}, {0x95,0x59}, {0x93,0xa6}, {0xfd,0x40}, {0x93,0x5f}, {0x97,0xf2}, {0x9c,0x76}, {0x8e,0xf8}, {0x8f,0x47}, {0x9b,0x74}, {0x92,0xb4}, {0x91,0xed}, {0x96,0xd2}, {0xfd,0x46}, {0x8f,0x4f}, {0x95,0x49}, {0x9b,0x75}, {0xfa,0x5c}, {0x9b,0x79}, {0xfd,0x4b}, {0x96,0xd3}, {0xfd,0x58}, {0x94,0x5f}, {0xa0,0xf5}, {0x92,0x43}, {0x97,0xfa}, {0x9d,0xd9}, {0x97,0xf4}, {0x92,0x4d}, {0xfd,0x5b}, {0x9b,0x7a}, {0x9e,0xd5}, {0xfa,0xae}, {0x9c,0xc9}, {0x92,0x58}, {0x8e,0xc8}, {0x94,0xb4}, {0x93,0xe1}, {0x93,0xdf}, {0xfc,0xf0}, {0x93,0xec}, {0x97,0xf6}, {0x96,0xcf}, {0x93,0xde}, {0x8a,0xcf}, {0x9b,0xa2}, {0xfd,0x69}, {0x93,0x52}, {0x98,0xa2}, {0xfd,0x6e}, {0x8c,0xa4}, {0xfa,0x7c}, {0x93,0xfa}, {0x90,0x7c}, {0x8f,0x67}, {0x9d,0xb7}, {0xa0,0xe9}, {0xfa,0x4e}, {0xfd,0xa1}, {0x9e,0x74}, {0x9f,0xbf}, {0x9e,0xcb}, {0x9b,0xb9}, {0x9d,0xd4}, {0x97,0xb9}, {0x8e,0xf1}, {0x95,0x7b}, {0x9e,0xd2}, {0x97,0x53}, {0x96,0xa4}, {0x8f,0xbe}, {0x94,0xd9}, {0x90,0x58}, {0xfd,0x79}, {0xfd,0x7b}, {0x8e,0xda}, {0x8e,0xfa}, {0x9b,0xa5}, {0x9e,0xd9}, {0x97,0xd4}, {0x90,0xbb}, {0xfd,0xbc}, {0xfd,0xc6}, {0x92,0x48}, {0x92,0xb5}, {0x9d,0xc1}, {0x92,0xb9}, {0x92,0xa6}, {0x8f,0x4b}, {0x9b,0xa6}, {0x92,0xb6}, {0x8e,0x40}, {0x9e,0xd8}, {0x94,0x5e}, {0x98,0x5f}, {0x94,0xce}, {0x92,0x4a}, {0xfd,0x70}, {0x94,0x67}, {0x8d,0xec}, {0x9b,0xd8}, {0x94,0x48}, {0xfa,0xc1}, {0x9c,0xf7}, {0xfd,0xbe}, {0x8f,0xda}, {0xfd,0xd9}, {0xfc,0x7e}, {0x93,0xf9}, {0xfa,0x43}, {0xfa,0xeb}, {0xfa,0xc3}, {0x97,0xd3}, {0x95,0xf9}, {0x9c,0x48}, {0xfd,0xd8}, {0xa0,0xd8}, {0xfd,0xd7}, {0xfb,0x4a}, {0x9b,0xaf}, {0x94,0x4b}, {0xfd,0xc9}, {0x8e,0xac}, {0xfd,0xb2}, {0x92,0x5a}, {0xfc,0xbd}, {0x92,0xd9}, {0xfd,0xd5}, {0x92,0xdd}, {0x92,0x59}, {0x96,0xba}, {0x92,0x5b}, {0x9b,0xab}, {0xfd,0xda}, {0xfd,0xde}, {0xfd,0xd3}, {0x8c,0x46}, {0xfd,0xd6}, {0xfd,0xdc}, {0xfd,0xdd}, {0x90,0xfe}, {0xfe,0xa1}, {0x8b,0xad}, {0x9c,0xd8}, {0x9e,0x6d}, {0xfd,0x7c}, {0xfb,0x61}, {0x96,0xf8}, {0x96,0xf0}, {0xfc,0xf4}, {0xfe,0x60}, {0x98,0x52}, {0x96,0x4f}, {0x91,0x6e}, {0x98,0x6d}, {0x98,0x64}, {0x94,0x53}, {0xfd,0xec}, {0xfb,0x78}, {0x95,0xba}, {0x98,0x5d}, {0x92,0xf9}, {0x98,0x5a}, {0xfd,0xf6}, {0x93,0xd0}, {0x98,0x62}, {0x9b,0xad}, {0x97,0x4f}, {0x9b,0xae}, {0x94,0x52}, {0x9b,0xb0}, {0x91,0xd2}, {0x97,0xea}, {0xfb,0x6b}, {0x91,0xb1}, {0xfd,0xf3}, {0x92,0xcb}, {0x9b,0xb1}, {0xfc,0xec}, {0x98,0x6b}, {0x97,0x51}, {0x98,0x71}, {0x95,0xef}, {0x9e,0xf3}, {0x91,0xe8}, {0x9b,0xba}, {0xfb,0x4c}, {0x92,0x6a}, {0xfd,0xf8}, {0x98,0x61}, {0x91,0xe7}, {0x93,0xed}, {0x97,0x44}, {0x91,0xe1}, {0xfb,0xf5}, {0x98,0x69}, {0x8a,0x62}, {0x9b,0xbb}, {0x8c,0xa8}, {0x9c,0x55}, {0x8e,0x77}, {0x8a,0xb2}, {0x9e,0xbc}, {0x93,0xe6}, {0x93,0xa2}, {0x9b,0xbd}, {0x94,0xb3}, {0x93,0x7d}, {0x9e,0x66}, {0x94,0x59}, {0x9b,0xbf}, {0x94,0x58}, {0x9e,0xa5}, {0x9b,0xc7}, {0xfe,0x54}, {0x8e,0x74}, {0x8b,0xd6}, {0x94,0xb6}, {0xfd,0x74}, {0x98,0xc0}, {0x94,0xa5}, {0x9b,0xc8}, {0x95,0xed}, {0xfd,0x7e}, {0xfb,0xeb}, {0xfd,0x7d}, {0x97,0x6f}, {0x94,0x61}, {0x9f,0xc1}, {0x95,0xd7}, {0xfa,0x52}, {0x9c,0x58}, {0x9f,0x68}, {0x9b,0xe7}, {0xfc,0xce}, {0x96,0xe8}, {0xfa,0x49}, {0x97,0xa1}, {0x95,0x4d}, {0x9e,0xf8}, {0xfe,0x49}, {0x91,0xce}, {0x97,0x71}, {0x8c,0xcf}, {0xfd,0xb1}, {0xfc,0x6e}, {0x9c,0xf2}, {0x93,0xb8}, {0x90,0x43}, {0x97,0x59}, {0x94,0xd7}, {0xfe,0x66}, {0x94,0x7d}, {0xfc,0x6f}, {0x92,0x46}, {0xfa,0x6d}, {0x8e,0xf7}, {0xfb,0xb7}, {0x94,0x7c}, {0x92,0xcd}, {0x97,0xb2}, {0xfe,0x65}, {0x96,0x7e}, {0x97,0x58}, {0x9b,0x77}, {0x91,0xcf}, {0x94,0xa4}, {0x9c,0xad}, {0x8b,0xab}, {0x96,0xd5}, {0xfc,0xb3}, {0x93,0xae}, {0x97,0x6d}, {0x94,0x46}, {0x95,0xf7}, {0x9c,0x46}, {0x95,0x5b}, {0x91,0xd1}, {0x94,0xf4}, {0xfe,0x67}, {0x92,0xa5}, {0xfe,0xdf}, {0x8c,0xab}, {0x9b,0xc9}, {0xfc,0xed}, {0xfd,0xfa}, {0xfc,0xc8}, {0xfe,0x62}, {0x91,0xfc}, {0xfe,0x6b}, {0xfd,0xf9}, {0xfc,0xc7}, {0x91,0x4e}, {0x9c,0xb8}, {0x97,0x67}, {0x95,0xee}, {0x9b,0xb2}, {0x94,0x60}, {0x94,0xa2}, {0x98,0x75}, {0x97,0xac}, {0x91,0xd3}, {0x98,0x7b}, {0x8e,0xeb}, {0x97,0x6a}, {0x96,0x5e}, {0x97,0xeb}, {0x9f,0xf9}, {0x95,0xf8}, {0xfe,0xa2}, {0x8f,0xe6}, {0xfe,0x7e}, {0x9d,0xa4}, {0x97,0x68}, {0x8e,0xec}, {0x94,0xbd}, {0x94,0x5b}, {0x9c,0xf6}, {0xfa,0xa7}, {0x9b,0xd9}, {0xfa,0x5d}, {0x96,0x56}, {0x97,0x62}, {0x94,0xba}, {0xa0,0x4f}, {0x92,0xd8}, {0x9b,0xcb}, {0x94,0xbb}, {0x9d,0x5f}, {0x90,0xcf}, {0x94,0x65}, {0x9f,0x4c}, {0x90,0xd8}, {0x9e,0xbe}, {0xfb,0x6d}, {0x95,0xca}, {0x9d,0xc2}, {0x97,0xf8}, {0x8f,0xfc}, {0x94,0x73}, {0x94,0x74}, {0xfe,0xb7}, {0x8a,0x4b}, {0x8a,0x55}, {0x8b,0x69}, {0x8a,0xdc}, {0x8b,0x76}, {0x9b,0xce}, {0x8a,0x68}, {0xa0,0xf8}, {0x98,0xdf}, {0xfe,0xb5}, {0x9b,0xcf}, {0x96,0xfb}, {0x9b,0xfb}, {0x9e,0xce}, {0x8e,0xe5}, {0x9e,0x7b}, {0x9b,0xd2}, {0x8a,0xa5}, {0xfe,0xce}, {0x8a,0x45}, {0x9d,0xfc}, {0xfe,0xcf}, {0x8b,0xa5}, {0x8c,0x4a}, {0x8a,0xec}, {0xfc,0xe0}, {0x94,0xad}, {0xfe,0xd5}, {0x94,0xac}, {0xfc,0x5a}, {0x9b,0xd6}, {0x8a,0x6f}, {0x8b,0xa9}, {0x8e,0x5f}, {0x9d,0xcb}, {0xfc,0xe7}, {0x9b,0xd7}, {0x93,0xc8}, {0x91,0xf0}, {0x8f,0xe0}, {0x9b,0xdb}, {0x90,0xed}, {0x9b,0xdc}, {0xa0,0xec}, {0x98,0xfa}, {0x9b,0xe0}, {0x93,0xc7}, {0x92,0x49}, {0x96,0xe1}, {0x9b,0xe2}, {0x9b,0xe4}, {0x8f,0xe1}, {0x9b,0xe5}, {0x94,0xc0}, {0x93,0xc3}, {0x93,0xc5}, {0x90,0x79}, {0x97,0x7b}, {0x90,0x7e}, {0xfe,0xe6}, {0xfe,0x46}, {0x9d,0xb8}, {0x92,0x70}, {0x95,0xa8}, {0x8c,0xb0}, {0x94,0xc8}, {0x98,0xb9}, {0x91,0x40}, {0xfc,0xbe}, {0x91,0x57}, {0x8b,0xb2}, {0xfa,0xdf}, {0x9b,0xe6}, {0x96,0x43}, {0x8e,0x44}, {0x9c,0x4f}, {0xfe,0xf4}, {0x9b,0xe8}, {0x93,0xdc}, {0x96,0x6f}, {0x8e,0x4a}, {0x9b,0xed}, {0x92,0xf6}, {0x9d,0xb9}, {0x8e,0x4e}, {0xfb,0xcf}, {0x9e,0xc2}, {0x94,0xe5}, {0x9b,0xf0}, {0x94,0xe4}, {0x95,0x51}, {0x8b,0xbb}, {0x9b,0xf1}, {0x94,0xf0}, {0x8e,0x64}, {0x94,0xea}, {0x8f,0x61}, {0x9b,0x64}, {0x8e,0x5b}, {0x9b,0xf2}, {0x9f,0xbe}, {0x9d,0xc9}, {0x8e,0x6c}, {0x8f,0x73}, {0x8c,0xaf}, {0x8f,0x75}, {0x8e,0x71}, {0x8e,0x60}, {0x8e,0x6a}, {0x8c,0x4c}, {0x95,0x52}, {0x95,0x54}, {0x8a,0xd4}, {0x9d,0xbb}, {0x95,0x43}, {0x92,0xfe}, {0x94,0xf2}, {0x94,0xf1}, {0xa0,0xea}, {0x9d,0xd2}, {0xa0,0xb1}, {0x91,0xf8}, {0x94,0x62}, {0x9b,0xa4}, {0x8e,0xad}, {0x9e,0xad}, {0x96,0xd0}, {0xfe,0xee}, {0x8a,0xb4}, {0x97,0x57}, {0x8a,0x77}, {0x9b,0xf7}, {0x8e,0xb5}, {0xa0,0x6d}, {0x8e,0xb6}, {0x97,0x56}, {0x95,0x40}, {0xa0,0xf3}, {0x94,0xbe}, {0x9b,0xfa}, {0xfd,0xdf}, {0x9d,0xbc}, {0x94,0xfe}, {0x8b,0xdb}, {0xa0,0xfe}, {0x8e,0xc0}, {0x9f,0x47}, {0x8b,0xde}, {0xa0,0xfb}, {0x8e,0xc3}, {0x96,0x49}, {0xfe,0xc2}, {0x95,0x4c}, {0x9b,0xfd}, {0x90,0xcc}, {0x9c,0x60}, {0x95,0x4b}, {0x9b,0xfe}, {0x9c,0x70}, {0x9c,0x43}, {0x9c,0x47}, {0x8e,0xcc}, {0x8e,0x54}, {0x8e,0xe4}, {0x9c,0x49}, {0x8b,0x5e}, {0x95,0x5e}, {0x95,0x5c}, {0x9c,0x4b}, {0x8b,0xe1}, {0x8e,0xd9}, {0x9d,0xb4}, {0x92,0x5f}, {0x9c,0x4c}, {0x8a,0xa1}, {0x8e,0xdb}, {0x9c,0x56}, {0x8a,0xa2}, {0x97,0x54}, {0x9c,0x5e}, {0x9e,0xd4}, {0x95,0x68}, {0xa0,0xc3}, {0x8a,0xe6}, {0xa0,0xf7}, {0x9c,0x61}, {0x9c,0x5f}, {0xfc,0x4d}, {0x9e,0x5b}, {0x9e,0x69}, {0x9c,0x63}, {0xfe,0xc7}, {0xfe,0xc6}, {0x9c,0x67}, {0x9c,0x69}, {0x8b,0xe2}, {0x91,0x65}, {0x9c,0xe7}, {0x8a,0x54}, {0x9c,0x6c}, {0x9c,0x6e}, {0xfe,0x5d}, {0x9c,0x73}, {0x95,0x6a}, {0x95,0x6d}, {0x8e,0xf0}, {0x8f,0x4d}, {0x8e,0xf6}, {0xfa,0xbc}, {0x8c,0xd5}, {0xfb,0xda}, {0x8b,0x4c}, {0xfd,0x75}, {0x9b,0xdd}, {0xfa,0xf5}, {0x9c,0x74}, {0x95,0x45}, {0x96,0xc6}, {0x8f,0x6a}, {0x8f,0x4e}, {0x9c,0x78}, {0xfa,0x55}, {0x97,0xe4}, {0x9c,0x41}, {0x92,0x5c}, {0x96,0xfa}, {0xfb,0x66}, {0x8e,0x65}, {0x98,0x49}, {0xfb,0xa8}, {0x98,0x42}, {0x9c,0x7a}, {0x97,0xfb}, {0x90,0xca}, {0x9c,0x5b}, {0x97,0x4d}, {0x8e,0xd3}, {0x95,0x61}, {0x9f,0x4b}, {0x9f,0xb5}, {0x93,0xd2}, {0xfd,0xaa}, {0x98,0x40}, {0x91,0x46}, {0x98,0x67}, {0xfa,0x5a}, {0xfb,0xa9}, {0x98,0x41}, {0x8c,0xd3}, {0xfc,0xfd}, {0xfd,0xab}, {0x91,0xbd}, {0x8f,0x4c}, {0x96,0xc9}, {0x8f,0x55}, {0xfb,0xae}, {0x95,0x6f}, {0x9c,0x7d}, {0xa0,0xf0}, {0x94,0x6f}, {0xfd,0xac}, {0x96,0xcb}, {0x96,0xce}, {0xa0,0x56}, {0x9c,0xe1}, {0x96,0xc4}, {0x8f,0x5e}, {0x8f,0x6c}, {0x8e,0xa3}, {0xfb,0xb3}, {0xfc,0x53}, {0xfd,0xb3}, {0x8f,0x6b}, {0x96,0xca}, {0x8f,0x79}, {0x9e,0x6f}, {0xa0,0xc5}, {0xfc,0x78}, {0x8e,0x42}, {0x8f,0x5a}, {0x90,0xc2}, {0x8e,0xa5}, {0x90,0x61}, {0x92,0x4f}, {0x93,0x73}, {0xfd,0xb5}, {0xfe,0xcc}, {0xfb,0xbd}, {0x8c,0xd6}, {0x98,0x43}, {0x96,0xc5}, {0x89,0xbc}, {0x9c,0xa3}, {0x92,0x4b}, {0x98,0x4a}, {0x8f,0xa4}, {0xa0,0xf1}, {0x9e,0xfb}, {0x9c,0xd2}, {0x8f,0xa7}, {0xfc,0x5c}, {0x98,0x45}, {0x90,0x46}, {0x8c,0xd1}, {0xfe,0xfa}, {0x95,0x60}, {0x9f,0x48}, {0x92,0x47}, {0x90,0xfb}, {0x9c,0xa4}, {0x95,0x71}, {0x9c,0xa6}, {0x9c,0xa7}, {0x9c,0xaa}, {0x9e,0xd3}, {0x9e,0x70}, {0x9c,0xac}, {0x8f,0xae}, {0x95,0x7d}, {0x9c,0xb0}, {0x97,0xb6}, {0xa0,0xbd}, {0x8a,0xdf}, {0x9e,0xaa}, {0x8f,0xbd}, {0x8f,0xbf}, {0x93,0x69}, {0x9b,0xa7}, {0xc8,0xa4}, {0xfe,0xea}, {0x9b,0xe1}, {0x8b,0x41}, {0x9d,0xb6}, {0xa0,0xeb}, {0x9b,0xa3}, {0x8b,0xa1}, {0x8f,0xc8}, {0x89,0x4c}, {0x98,0x60}, {0x94,0xc7}, {0x8b,0x58}, {0x95,0xab}, {0x95,0xaa}, {0x9c,0xc3}, {0x9c,0xc4}, {0x93,0xd6}, {0x9d,0xac}, {0x8b,0xe6}, {0x8a,0x71}, {0x8f,0xd1}, {0x99,0xd5}, {0x90,0xf4}, {0x8a,0xa3}, {0x9c,0xce}, {0x9c,0xd4}, {0x9c,0xd5}, {0xfb,0xc8}, {0x9d,0xb3}, {0xfc,0x70}, {0x8f,0xd7}, {0x9b,0x73}, {0xfa,0x5b}, {0x8f,0xd2}, {0x90,0x64}, {0x98,0xb6}, {0x96,0x68}, {0x9c,0xd6}, {0x98,0xbd}, {0x8f,0xdc}, {0xfe,0xf6}, {0x8f,0xd9}, {0x95,0x41}, {0x97,0xf3}, {0x9b,0xf8}, {0x9e,0x6c}, {0x8f,0xf2}, {0x8f,0xee}, {0x9c,0xd7}, {0x9e,0x6e}, {0x8a,0x40}, {0x8f,0xef}, {0x8f,0xf4}, {0x8f,0xf5}, {0x95,0xc2}, {0x98,0x6a}, {0x97,0xcf}, {0x9e,0x7c}, {0x90,0x41}, {0x9c,0xdb}, {0x94,0x41}, {0x9c,0xe6}, {0x9d,0xb0}, {0x9c,0xea}, {0x9c,0xed}, {0x9c,0xfa}, {0x8b,0x62}, {0x8a,0x4e}, {0x9c,0xca}, {0x8a,0x66}, {0x9c,0xfb}, {0x9c,0xfc}, {0x9c,0xfe}, {0x8a,0x53}, {0x9c,0xe5}, {0x9d,0x40}, {0x9d,0x41}, {0x90,0x45}, {0x8b,0x73}, {0x97,0xca}, {0x9d,0x42}, {0x8a,0x61}, {0x8b,0xae}, {0x8a,0xd2}, {0x8b,0xa2}, {0x9d,0xf2}, {0x9d,0x43}, {0x9c,0xdf}, {0x9d,0x44}, {0x8e,0xca}, {0x90,0x4e}, {0x8e,0xb3}, {0x9f,0xf5}, {0x9d,0x45}, {0x90,0x4f}, {0x9d,0x47}, {0x89,0xca}, {0x9c,0xb5}, {0xfb,0xfe}, {0x90,0x5e}, {0x90,0x63}, {0x90,0x57}, {0x90,0x66}, {0x9b,0xc0}, {0xfc,0xe5}, {0x91,0x62}, {0x90,0x67}, {0x8f,0xa1}, {0x8f,0xa2}, {0x9d,0x48}, {0xfa,0xd3}, {0x90,0x5d}, {0x90,0xb9}, {0x90,0x6b}, {0x8c,0x5c}, {0x90,0x69}, {0xfe,0x57}, {0xfe,0x55}, {0x90,0x73}, {0x9b,0xef}, {0x9c,0xf0}, {0x9d,0x4b}, {0xfe,0xd9}, {0xfe,0xda}, {0x91,0xe0}, {0x91,0xd8}, {0x96,0x46}, {0x93,0x60}, {0xfa,0x53}, {0x9c,0xd3}, {0x9d,0x4e}, {0xfb,0x40}, {0x8d,0xe2}, {0x94,0x42}, {0x90,0x56}, {0x98,0x65}, {0x8c,0x6c}, {0xfa,0x4a}, {0x9d,0x50}, {0x9d,0x52}, {0x95,0xaf}, {0x97,0x5a}, {0x93,0x49}, {0x97,0x47}, {0xa0,0xf4}, {0x97,0x78}, {0x8f,0xcf}, {0xfc,0x60}, {0x8c,0x4e}, {0xfc,0x56}, {0x91,0xdc}, {0x96,0x61}, {0x92,0xec}, {0x93,0x5d}, {0x8e,0xde}, {0x96,0xfe}, {0xfd,0x4f}, {0x95,0xde}, {0x98,0xb0}, {0xa0,0x40}, {0x97,0xbd}, {0x97,0x7d}, {0x97,0xf5}, {0x9b,0xac}, {0xfa,0xda}, {0x92,0xc2}, {0x97,0xb1}, {0x90,0x7b}, {0x93,0xfe}, {0x94,0x7b}, {0x97,0x77}, {0xfa,0xbe}, {0xfd,0x43}, {0x90,0xc6}, {0x90,0xa4}, {0x90,0xa8}, {0x94,0xa9}, {0x90,0xa9}, {0x8c,0x65}, {0x95,0xe0}, {0x90,0x7d}, {0x92,0x65}, {0xfd,0xba}, {0x93,0xc4}, {0xfe,0xed}, {0x9d,0xab}, {0xa0,0xe3}, {0x96,0x48}, {0x9d,0x53}, {0x8a,0xa9}, {0x9b,0xc5}, {0x96,0x5d}, {0x97,0x5f}, {0x96,0x5f}, {0x96,0x6e}, {0xfb,0x5d}, {0x9d,0xb1}, {0xfe,0xa3}, {0x9d,0xb2}, {0x95,0xae}, {0xfc,0xa3}, {0xa0,0xa2}, {0x96,0x55}, {0x9d,0x54}, {0x93,0x41}, {0x95,0xad}, {0x91,0xd5}, {0x97,0x7a}, {0xfd,0xfc}, {0x8e,0x47}, {0x93,0xfd}, {0x90,0xa5}, {0x90,0xac}, {0x95,0xac}, {0x90,0xae}, {0xfe,0xa5}, {0x9d,0x56}, {0x97,0xe3}, {0x95,0xe2}, {0x94,0x66}, {0x96,0x47}, {0x91,0xb8}, {0x9c,0xec}, {0x90,0xad}, {0x95,0xe3}, {0x8b,0x4f}, {0x8a,0xe3}, {0x8b,0x4d}, {0x95,0xea}, {0x8b,0x4e}, {0x8c,0xc1}, {0x8b,0xed}, {0x91,0xd9}, {0xa0,0xa4}, {0x95,0xf5}, {0x95,0xf4}, {0x9f,0xb3}, {0xfe,0xaf}, {0xfe,0x72}, {0x92,0x7a}, {0xfe,0xac}, {0x95,0xf3}, {0x9d,0x58}, {0x93,0x72}, {0x91,0xc5}, {0x96,0x42}, {0x90,0xcd}, {0x95,0xfe}, {0x91,0x59}, {0x9c,0x65}, {0x97,0xcc}, {0x90,0xce}, {0x9d,0x59}, {0xfc,0xf5}, {0xfe,0xfd}, {0x9d,0x5b}, {0x9d,0x5c}, {0x93,0x7e}, {0x98,0xac}, {0x9d,0x5e}, {0xfd,0xd0}, {0xfd,0x60}, {0x9c,0xcf}, {0x90,0xdd}, {0x90,0xe0}, {0x90,0xf3}, {0x98,0xb1}, {0x90,0xf0}, {0x93,0xbd}, {0x95,0xb7}, {0x9f,0x46}, {0x8e,0x4b}, {0x96,0x58}, {0x8a,0x4c}, {0x9d,0x63}, {0x9e,0xcf}, {0x9d,0x65}, {0x9d,0x66}, {0x96,0x5a}, {0x9d,0x64}, {0x8a,0x6c}, {0x8a,0xd9}, {0x9d,0x67}, {0x8a,0x70}, {0x8b,0xf3}, {0x91,0x50}, {0x9c,0xc1}, {0x9d,0x68}, {0x93,0xa7}, {0x96,0x74}, {0xa0,0xef}, {0x91,0x51}, {0x96,0xc1}, {0x8c,0x64}, {0x96,0x76}, {0x9d,0x69}, {0xfc,0xa4}, {0x9d,0x6a}, {0x92,0x4e}, {0x9d,0x6b}, {0x9b,0xc1}, {0x9d,0x6c}, {0x8a,0x65}, {0x91,0x5d}, {0x9d,0x6d}, {0x91,0x5a}, {0x8c,0x42}, {0x9c,0xc0}, {0x91,0x6a}, {0x9d,0x6e}, {0x9e,0xa6}, {0x9d,0xcd}, {0x9d,0x6f}, {0x89,0xbb}, {0x9e,0xf9}, {0x96,0xb4}, {0x91,0x72}, {0x9e,0xc8}, {0x8b,0x55}, {0x9d,0x71}, {0x9d,0x72}, {0x9e,0xcc}, {0x91,0x74}, {0x9e,0xd0}, {0x90,0x5c}, {0x8e,0xd2}, {0x91,0xa8}, {0x91,0x77}, {0x96,0xbf}, {0x96,0xc0}, {0x8f,0xb1}, {0x96,0xb7}, {0x8c,0x55}, {0x91,0x78}, {0x89,0xbe}, {0x91,0x7c}, {0xfb,0x77}, {0x91,0x75}, {0x91,0xa3}, {0x91,0x76}, {0x96,0xbe}, {0x91,0x79}, {0x96,0xb6}, {0x91,0xa4}, {0x91,0xa6}, {0x9d,0x75}, {0x90,0x52}, {0xa0,0x45}, {0x91,0xa9}, {0x98,0xaa}, {0x8c,0x5f}, {0x8b,0xaa}, {0x9c,0xdd}, {0x9d,0x77}, {0x89,0x40}, {0x9e,0xec}, {0x93,0xaa}, {0x94,0x78}, {0x9d,0x7a}, {0x8a,0xc9}, {0x8b,0x4b}, {0x9f,0xec}, {0x8a,0xe2}, {0x9e,0x75}, {0x98,0x74}, {0x9a,0xc8}, {0xa0,0x47}, {0x8b,0xc3}, {0xfc,0x48}, {0xfc,0x77}, {0x9c,0x52}, {0x8e,0xfd}, {0x8f,0xa8}, {0x95,0x7a}, {0x8f,0xf0}, }; /* Index of the convert table */ static const Summary16 big5hkscs_uni2index_page00[70] = { /* 0x0000 */ { 0, 0x0000 }, { 0, 0x0000 }, { 0, 0x0000 }, { 0, 0x0000 }, { 0, 0x0000 }, { 0, 0x0000 }, { 0, 0x0000 }, { 0, 0x0000 }, { 0, 0x0000 }, { 0, 0x0000 }, { 0, 0xE7EE }, { 12, 0x87BF }, { 23, 0xFFFF }, { 39, 0xFFFF }, { 55, 0xFFFF }, { 71, 0xFFFF }, /* 0x0100 */ { 87, 0x0003 }, { 89, 0x0C0C }, { 93, 0x0800 }, { 94, 0x0000 }, { 94, 0x3800 }, { 97, 0x0008 }, { 98, 0x0800 }, { 99, 0x0000 }, { 99, 0x0000 }, { 99, 0x0000 }, { 99, 0x0000 }, { 99, 0x0000 }, { 99, 0x6000 }, { 101, 0x1557 }, { 109, 0x0000 }, { 109, 0x0000 }, /* 0x0200 */ { 109, 0x0000 }, { 109, 0x0000 }, { 109, 0x0000 }, { 109, 0x0000 }, { 109, 0x0000 }, { 109, 0x0813 }, { 113, 0x0402 }, { 115, 0x0020 }, { 116, 0x0408 }, { 118, 0x0000 }, { 118, 0x0000 }, { 118, 0x0000 }, { 118, 0x2EC0 }, { 124, 0x0200 }, { 125, 0x0000 }, { 125, 0x0000 }, /* 0x0300 */ { 125, 0x0020 }, { 126, 0x0000 }, { 126, 0x0000 }, { 126, 0x0000 }, { 126, 0x0000 }, { 126, 0x0000 }, { 126, 0x0000 }, { 126, 0x0000 }, { 126, 0x0000 }, { 126, 0xFFFE }, { 141, 0x03FB }, { 150, 0xFFFE }, { 165, 0x03FB }, { 174, 0x0000 }, { 174, 0x0000 }, { 174, 0x0000 }, /* 0x0400 */ { 174, 0x0002 }, { 175, 0xFFFF }, { 191, 0xFFFF }, { 207, 0xFFFF }, { 223, 0xFFFF }, { 239, 0x0002 }, }; static const Summary16 big5hkscs_uni2index_page1e[13] = { /* 0x1E00 */ { 240, 0x0000 }, { 240, 0x0000 }, { 240, 0x0000 }, { 240, 0x0000 }, { 240, 0x0000 }, { 240, 0x0000 }, { 240, 0x0000 }, { 240, 0x0000 }, { 240, 0x0000 }, { 240, 0x0000 }, { 240, 0x0000 }, { 240, 0xC000 }, { 242, 0x0003 }, }; static const Summary16 big5hkscs_uni2index_page20[116] = { /* 0x2000 */ { 244, 0x0000 }, { 244, 0x3378 }, { 252, 0x00F4 }, { 257, 0x482C }, { 262, 0x0000 }, { 262, 0x0000 }, { 262, 0x0000 }, { 262, 0x0000 }, { 262, 0x0000 }, { 262, 0x0000 }, { 262, 0x1000 }, { 263, 0x0000 }, { 263, 0x0000 }, { 263, 0x0000 }, { 263, 0x0000 }, { 263, 0x0000 }, /* 0x2100 */ { 263, 0x0228 }, { 266, 0x0040 }, { 267, 0x0002 }, { 268, 0x0000 }, { 268, 0x0000 }, { 268, 0x0000 }, { 268, 0x03FF }, { 278, 0x03FF }, { 288, 0x0000 }, { 288, 0x03CF }, { 296, 0x0000 }, { 296, 0x0300 }, { 298, 0x0000 }, { 298, 0x0000 }, { 298, 0x0080 }, { 299, 0x0000 }, /* 0x2200 */ { 299, 0x0000 }, { 299, 0xC560 }, { 305, 0x4E29 }, { 312, 0x0030 }, { 314, 0x0000 }, { 314, 0x0004 }, { 315, 0x00CB }, { 320, 0x0000 }, { 320, 0x0000 }, { 320, 0x0220 }, { 322, 0x0020 }, { 323, 0x8000 }, { 324, 0x0000 }, { 324, 0x0000 }, { 324, 0x0000 }, { 324, 0x0000 }, /* 0x2300 */ { 324, 0x0080 }, { 325, 0x0000 }, { 325, 0x0000 }, { 325, 0x0000 }, { 325, 0x0000 }, { 325, 0x0000 }, { 325, 0x0000 }, { 325, 0x0000 }, { 325, 0x0000 }, { 325, 0x0000 }, { 325, 0x0000 }, { 325, 0x0000 }, { 325, 0x0000 }, { 325, 0x0000 }, { 325, 0x0000 }, { 325, 0x0000 }, /* 0x2400 */ { 325, 0x0000 }, { 325, 0x0000 }, { 325, 0x0000 }, { 325, 0x0000 }, { 325, 0x0000 }, { 325, 0x0000 }, { 325, 0x03FF }, { 335, 0x3FF0 }, { 345, 0x0000 }, { 345, 0x0000 }, { 345, 0x0000 }, { 345, 0x0000 }, { 345, 0x0000 }, { 345, 0x0000 }, { 345, 0x0000 }, { 345, 0x0000 }, /* 0x2500 */ { 345, 0x1005 }, { 348, 0x1111 }, { 352, 0x1010 }, { 354, 0x1010 }, { 356, 0x0000 }, { 356, 0xFFFF }, { 372, 0xFFFF }, { 388, 0x001F }, { 393, 0xFFFE }, { 408, 0x0038 }, { 411, 0x0003 }, { 413, 0x300C }, { 417, 0xC8C0 }, { 422, 0x0000 }, { 422, 0x003C }, { 426, 0x0000 }, /* 0x2600 */ { 426, 0x0260 }, { 429, 0x0000 }, { 429, 0x0000 }, { 429, 0x0000 }, { 429, 0x0007 }, { 432, 0x0000 }, { 432, 0x0000 }, { 432, 0x0000 }, { 432, 0x0000 }, { 432, 0x0000 }, { 432, 0x0000 }, { 432, 0x0000 }, { 432, 0x0000 }, { 432, 0x0000 }, { 432, 0x0000 }, { 432, 0x0000 }, /* 0x2700 */ { 432, 0x0000 }, { 432, 0x0000 }, { 432, 0x0000 }, { 432, 0x2000 }, }; static const Summary16 big5hkscs_uni2index_page2e[1819] = { /* 0x2E00 */ { 433, 0x0000 }, { 433, 0x0000 }, { 433, 0x0000 }, { 433, 0x0000 }, { 433, 0x0000 }, { 433, 0x0000 }, { 433, 0x0000 }, { 433, 0x0000 }, { 433, 0x35D1 }, { 441, 0x3020 }, { 444, 0x54A0 }, { 449, 0x5040 }, { 452, 0xB440 }, { 457, 0x40C0 }, { 460, 0x0008 }, { 461, 0x0000 }, /* 0x2F00 */ { 461, 0x0000 }, { 461, 0x0000 }, { 461, 0x0000 }, { 461, 0x0008 }, { 462, 0x0000 }, { 462, 0x0000 }, { 462, 0x0000 }, { 462, 0x0000 }, { 462, 0x0000 }, { 462, 0x0000 }, { 462, 0x0000 }, { 462, 0x0000 }, { 462, 0x0000 }, { 462, 0x0000 }, { 462, 0x0000 }, { 462, 0x0000 }, /* 0x3000 */ { 462, 0xFFEF }, { 477, 0x7037 }, { 485, 0x03FE }, { 494, 0x0001 }, { 495, 0xFFFE }, { 510, 0xFFFF }, { 526, 0xFFFF }, { 542, 0xFFFF }, { 558, 0xFFFF }, { 574, 0x780F }, { 582, 0xFFFE }, { 597, 0xFFFF }, { 613, 0xFFFF }, { 629, 0xFFFF }, { 645, 0xFFFF }, { 661, 0x707F }, /* 0x3100 */ { 671, 0xFFE0 }, { 682, 0xFFFF }, { 698, 0x03FF }, { 708, 0x0000 }, { 708, 0x0000 }, { 708, 0x0000 }, { 708, 0x0000 }, { 708, 0x0000 }, { 708, 0x0000 }, { 708, 0xFFFC }, { 722, 0x0000 }, { 722, 0x0000 }, { 722, 0x0000 }, { 722, 0x0000 }, { 722, 0x0000 }, { 722, 0x0000 }, /* 0x3200 */ { 722, 0x0000 }, { 722, 0x0000 }, { 722, 0xFFFF }, { 738, 0xFFFF }, { 754, 0x000F }, { 758, 0x0000 }, { 758, 0x0000 }, { 758, 0x0000 }, { 758, 0xFFFF }, { 774, 0xFFFF }, { 790, 0xFFFF }, { 806, 0x0001 }, { 807, 0x0000 }, { 807, 0x0000 }, { 807, 0x0000 }, { 807, 0x0000 }, /* 0x3300 */ { 807, 0x0000 }, { 807, 0x0000 }, { 807, 0x0000 }, { 807, 0x0000 }, { 807, 0x0000 }, { 807, 0x0000 }, { 807, 0x0000 }, { 807, 0x0000 }, { 807, 0xC000 }, { 809, 0x7000 }, { 812, 0x0002 }, { 813, 0x0000 }, { 813, 0x4010 }, { 815, 0x0026 }, { 818, 0x0000 }, { 818, 0x0000 }, /* 0x3400 */ { 818, 0x0000 }, { 818, 0x0000 }, { 818, 0x0000 }, { 818, 0x0020 }, { 819, 0x1001 }, { 821, 0x0000 }, { 821, 0x0010 }, { 822, 0x6408 }, { 826, 0x0000 }, { 826, 0x0048 }, { 828, 0x8020 }, { 830, 0x1000 }, { 831, 0x0102 }, { 833, 0x8000 }, { 834, 0x0010 }, { 835, 0x0800 }, /* 0x3500 */ { 836, 0x0040 }, { 837, 0x0000 }, { 837, 0x0000 }, { 837, 0x4000 }, { 838, 0x0000 }, { 838, 0x020A }, { 841, 0x2002 }, { 843, 0x0185 }, { 847, 0x0010 }, { 848, 0x0180 }, { 850, 0x2022 }, { 853, 0x8000 }, { 854, 0x44A2 }, { 859, 0x2844 }, { 863, 0x0000 }, { 863, 0x480E }, /* 0x3600 */ { 868, 0x0200 }, { 869, 0x0500 }, { 871, 0x2008 }, { 873, 0x4220 }, { 876, 0x4380 }, { 880, 0x8000 }, { 881, 0x0000 }, { 881, 0x0400 }, { 882, 0x0002 }, { 883, 0x0400 }, { 884, 0x1420 }, { 887, 0x1223 }, { 892, 0x01BA }, { 898, 0x2058 }, { 902, 0x0066 }, { 906, 0x0020 }, /* 0x3700 */ { 907, 0x250A }, { 912, 0x1000 }, { 913, 0x302C }, { 918, 0x040D }, { 922, 0x0009 }, { 924, 0x0000 }, { 924, 0x8004 }, { 926, 0x0000 }, { 926, 0x0000 }, { 926, 0x0080 }, { 927, 0x0001 }, { 928, 0x4200 }, { 930, 0x0000 }, { 930, 0x0000 }, { 930, 0x0000 }, { 930, 0x0904 }, /* 0x3800 */ { 933, 0x8000 }, { 934, 0x0200 }, { 935, 0x2001 }, { 937, 0x0140 }, { 939, 0x0000 }, { 939, 0x0000 }, { 939, 0x0008 }, { 940, 0x0000 }, { 940, 0x0000 }, { 940, 0x0000 }, { 940, 0x0001 }, { 941, 0x0000 }, { 941, 0x1008 }, { 943, 0x0002 }, { 944, 0x0000 }, { 944, 0x0400 }, /* 0x3900 */ { 945, 0x0100 }, { 946, 0x0010 }, { 947, 0x0080 }, { 948, 0x8004 }, { 950, 0x2000 }, { 951, 0x0000 }, { 951, 0x0008 }, { 952, 0x0000 }, { 952, 0x0601 }, { 955, 0x0A04 }, { 958, 0x0012 }, { 960, 0x0100 }, { 961, 0x0000 }, { 961, 0x1000 }, { 962, 0x1024 }, { 965, 0x4900 }, /* 0x3A00 */ { 968, 0x004A }, { 971, 0x0180 }, { 973, 0x0600 }, { 975, 0x0010 }, { 976, 0x0800 }, { 977, 0x5084 }, { 981, 0x00C0 }, { 983, 0x0000 }, { 983, 0x0000 }, { 983, 0x0080 }, { 984, 0x0800 }, { 985, 0x2000 }, { 986, 0x0000 }, { 986, 0x4000 }, { 987, 0x0001 }, { 988, 0x0805 }, /* 0x3B00 */ { 991, 0x4000 }, { 992, 0x0200 }, { 993, 0x0804 }, { 995, 0x0200 }, { 996, 0x0004 }, { 997, 0x0100 }, { 998, 0x0001 }, { 999, 0x1806 }, { 1003, 0x0001 }, { 1004, 0x0240 }, { 1006, 0x0002 }, { 1007, 0x5000 }, { 1009, 0x0014 }, { 1011, 0x2080 }, { 1013, 0x1000 }, { 1014, 0x001C }, /* 0x3C00 */ { 1017, 0x2000 }, { 1018, 0x0122 }, { 1021, 0x0000 }, { 1021, 0x0000 }, { 1021, 0x0000 }, { 1021, 0x0010 }, { 1022, 0x0000 }, { 1022, 0x0000 }, { 1022, 0x0800 }, { 1023, 0x0000 }, { 1023, 0x0000 }, { 1023, 0x0000 }, { 1023, 0x2800 }, { 1025, 0x1042 }, { 1028, 0x8800 }, { 1030, 0x0000 }, /* 0x3D00 */ { 1030, 0x0000 }, { 1030, 0x2008 }, { 1032, 0x0000 }, { 1032, 0x0804 }, { 1034, 0x5040 }, { 1037, 0x8002 }, { 1039, 0x8604 }, { 1043, 0x2020 }, { 1045, 0x8420 }, { 1048, 0x0002 }, { 1049, 0x2020 }, { 1051, 0x8010 }, { 1053, 0x32C0 }, { 1058, 0x0808 }, { 1060, 0x0980 }, { 1063, 0x3088 }, /* 0x3E00 */ { 1067, 0x0040 }, { 1068, 0x0000 }, { 1068, 0x0000 }, { 1068, 0x0000 }, { 1068, 0x0109 }, { 1071, 0x0020 }, { 1072, 0x0000 }, { 1072, 0x0010 }, { 1073, 0x0000 }, { 1073, 0x0000 }, { 1073, 0x2700 }, { 1077, 0x8102 }, { 1080, 0x1484 }, { 1084, 0x4CC3 }, { 1091, 0x0A86 }, { 1096, 0x9419 }, /* 0x3F00 */ { 1102, 0x4051 }, { 1106, 0x0000 }, { 1106, 0x0000 }, { 1106, 0x0000 }, { 1106, 0x0000 }, { 1106, 0x0308 }, { 1109, 0x0008 }, { 1110, 0x1000 }, { 1111, 0x0000 }, { 1111, 0x0008 }, { 1112, 0x0000 }, { 1112, 0x0000 }, { 1112, 0x0001 }, { 1113, 0x1080 }, { 1115, 0x2020 }, { 1117, 0x0600 }, /* 0x4000 */ { 1119, 0x0210 }, { 1121, 0x2000 }, { 1122, 0x0000 }, { 1122, 0x0200 }, { 1123, 0x0020 }, { 1124, 0x0088 }, { 1126, 0x8424 }, { 1130, 0x0002 }, { 1131, 0x0000 }, { 1131, 0x0000 }, { 1131, 0x0100 }, { 1132, 0x8800 }, { 1134, 0x0100 }, { 1135, 0x8100 }, { 1137, 0x0000 }, { 1137, 0x0400 }, /* 0x4100 */ { 1138, 0x4218 }, { 1142, 0x0000 }, { 1142, 0x0000 }, { 1142, 0x0004 }, { 1143, 0x0000 }, { 1143, 0x0000 }, { 1143, 0x5080 }, { 1146, 0x8000 }, { 1147, 0x0000 }, { 1147, 0x0001 }, { 1148, 0x0000 }, { 1148, 0x0004 }, { 1149, 0x8410 }, { 1152, 0x0800 }, { 1153, 0x8000 }, { 1154, 0x0200 }, /* 0x4200 */ { 1155, 0x0000 }, { 1155, 0x0002 }, { 1156, 0x0008 }, { 1157, 0x0000 }, { 1157, 0x0001 }, { 1158, 0x0000 }, { 1158, 0x0401 }, { 1160, 0x0440 }, { 1162, 0x1000 }, { 1163, 0x0010 }, { 1164, 0x0004 }, { 1165, 0x1220 }, { 1168, 0x0000 }, { 1168, 0x0000 }, { 1168, 0x0000 }, { 1168, 0x1810 }, /* 0x4300 */ { 1171, 0x0000 }, { 1171, 0x0000 }, { 1171, 0x0800 }, { 1172, 0x0000 }, { 1172, 0x0000 }, { 1172, 0x0000 }, { 1172, 0x4000 }, { 1173, 0x0000 }, { 1173, 0x0000 }, { 1173, 0x0080 }, { 1174, 0x0000 }, { 1174, 0x0400 }, { 1175, 0x0002 }, { 1176, 0x8200 }, { 1178, 0x2000 }, { 1179, 0x0004 }, /* 0x4400 */ { 1180, 0x0006 }, { 1182, 0x0008 }, { 1183, 0x2020 }, { 1185, 0x0000 }, { 1185, 0x0000 }, { 1185, 0x0000 }, { 1185, 0x0000 }, { 1185, 0x0400 }, { 1186, 0x8000 }, { 1187, 0x8000 }, { 1188, 0x0005 }, { 1190, 0x0081 }, { 1192, 0x4021 }, { 1195, 0xA000 }, { 1197, 0x1E10 }, { 1202, 0x0010 }, /* 0x4500 */ { 1203, 0x0A18 }, { 1207, 0x2040 }, { 1209, 0x4080 }, { 1211, 0xA808 }, { 1215, 0x0008 }, { 1216, 0x1026 }, { 1220, 0x0404 }, { 1222, 0x0080 }, { 1223, 0x0020 }, { 1224, 0x0000 }, { 1224, 0x0000 }, { 1224, 0x0000 }, { 1224, 0x0000 }, { 1224, 0x0000 }, { 1224, 0x0200 }, { 1225, 0x0000 }, /* 0x4600 */ { 1225, 0x8040 }, { 1227, 0x00A0 }, { 1229, 0x0000 }, { 1229, 0x0000 }, { 1229, 0x0000 }, { 1229, 0x0800 }, { 1230, 0x0000 }, { 1230, 0x0400 }, { 1231, 0x0001 }, { 1232, 0x0000 }, { 1232, 0x0000 }, { 1232, 0x0000 }, { 1232, 0x8000 }, { 1233, 0x0001 }, { 1234, 0x0000 }, { 1234, 0x0020 }, /* 0x4700 */ { 1235, 0x0000 }, { 1235, 0x0108 }, { 1237, 0x0000 }, { 1237, 0x0000 }, { 1237, 0x4000 }, { 1238, 0x0000 }, { 1238, 0x0000 }, { 1238, 0x1000 }, { 1239, 0x0000 }, { 1239, 0x0100 }, { 1240, 0x0040 }, { 1241, 0x0040 }, { 1242, 0x0000 }, { 1242, 0x0020 }, { 1243, 0x2000 }, { 1244, 0x0010 }, /* 0x4800 */ { 1245, 0x0801 }, { 1247, 0x0000 }, { 1247, 0x0000 }, { 1247, 0x0080 }, { 1248, 0x0000 }, { 1248, 0x2000 }, { 1249, 0x0000 }, { 1249, 0x0002 }, { 1250, 0x0000 }, { 1250, 0x0800 }, { 1251, 0x6000 }, { 1253, 0x0000 }, { 1253, 0x0000 }, { 1253, 0x2001 }, { 1255, 0x2000 }, { 1256, 0x0408 }, /* 0x4900 */ { 1258, 0x0040 }, { 1259, 0x4002 }, { 1261, 0x2420 }, { 1264, 0x5020 }, { 1267, 0x0020 }, { 1268, 0x000A }, { 1270, 0x0420 }, { 1272, 0x0004 }, { 1273, 0x0200 }, { 1274, 0x0000 }, { 1274, 0x0082 }, { 1276, 0x0000 }, { 1276, 0x0000 }, { 1276, 0x8000 }, { 1277, 0x00A0 }, { 1279, 0x0000 }, /* 0x4A00 */ { 1279, 0x8000 }, { 1280, 0x2000 }, { 1281, 0x0010 }, { 1282, 0x0020 }, { 1283, 0x0000 }, { 1283, 0x0000 }, { 1283, 0x0000 }, { 1283, 0x0000 }, { 1283, 0x0000 }, { 1283, 0x0040 }, { 1284, 0x0000 }, { 1284, 0x0110 }, { 1286, 0x0000 }, { 1286, 0x0002 }, { 1287, 0x0010 }, { 1288, 0x8000 }, /* 0x4B00 */ { 1289, 0x0000 }, { 1289, 0x0201 }, { 1291, 0x1001 }, { 1293, 0x0080 }, { 1294, 0x0000 }, { 1294, 0x0000 }, { 1294, 0x8000 }, { 1295, 0x4805 }, { 1299, 0x4000 }, { 1300, 0x20C9 }, { 1305, 0x0000 }, { 1305, 0x6000 }, { 1307, 0x0001 }, { 1308, 0x0000 }, { 1308, 0x0000 }, { 1308, 0x0000 }, /* 0x4C00 */ { 1308, 0x4090 }, { 1311, 0x0000 }, { 1311, 0x0000 }, { 1311, 0x4800 }, { 1313, 0x0000 }, { 1313, 0x0800 }, { 1314, 0x2000 }, { 1315, 0x2000 }, { 1316, 0x0002 }, { 1317, 0x0000 }, { 1317, 0x4010 }, { 1319, 0x0081 }, { 1321, 0x2000 }, { 1322, 0x0000 }, { 1322, 0x2002 }, { 1324, 0x0000 }, /* 0x4D00 */ { 1324, 0x0200 }, { 1325, 0x0001 }, { 1326, 0x0000 }, { 1326, 0x0010 }, { 1327, 0x0000 }, { 1327, 0x0000 }, { 1327, 0x0000 }, { 1327, 0x0000 }, { 1327, 0x0000 }, { 1327, 0x1002 }, { 1329, 0x0000 }, { 1329, 0x0000 }, { 1329, 0x0000 }, { 1329, 0x0000 }, { 1329, 0x0000 }, { 1329, 0x0000 }, /* 0x4E00 */ { 1329, 0xFF9B }, { 1342, 0xD773 }, { 1353, 0xFD52 }, { 1363, 0xBBCF }, { 1375, 0xEBAC }, { 1385, 0xFF4C }, { 1396, 0x0600 }, { 1398, 0xC108 }, { 1402, 0x7BFF }, { 1416, 0xCF3E }, { 1427, 0x797F }, { 1439, 0x9EC8 }, { 1447, 0x6FDF }, { 1460, 0xF7F0 }, { 1471, 0x4F3A }, { 1480, 0xA9FF }, /* 0x4F00 */ { 1492, 0xEF3F }, { 1505, 0x27BF }, { 1516, 0xB304 }, { 1522, 0xFFDD }, { 1536, 0xFBEE }, { 1549, 0xFFFF }, { 1565, 0xDE9F }, { 1577, 0xFFFD }, { 1592, 0xAFFF }, { 1606, 0x7DF7 }, { 1619, 0xC904 }, { 1624, 0xAEED }, { 1635, 0xFFBF }, { 1650, 0xFFDB }, { 1664, 0xD033 }, { 1671, 0x67FF }, /* 0x5000 */ { 1684, 0xFBE9 }, { 1696, 0xDFFE }, { 1710, 0xFFEF }, { 1725, 0x18BB }, { 1733, 0xFFEB }, { 1747, 0xFDEA }, { 1759, 0xFF7F }, { 1774, 0x24FD }, { 1783, 0x79AF }, { 1794, 0x7F77 }, { 1807, 0xF04C }, { 1814, 0xFDFF }, { 1829, 0xEFF6 }, { 1842, 0xAEFB }, { 1854, 0xF7FB }, { 1868, 0xFB7B }, /* 0x5100 */ { 1881, 0x7FFF }, { 1896, 0x95BF }, { 1907, 0x6E77 }, { 1918, 0xBFBF }, { 1932, 0x3BFB }, { 1944, 0xFEF4 }, { 1956, 0x7FAF }, { 1969, 0x13F2 }, { 1977, 0xA7C5 }, { 1986, 0x55FE }, { 1997, 0x5DB5 }, { 2007, 0x73FF }, { 2020, 0xFFF8 }, { 2033, 0xF99F }, { 2045, 0x2017 }, { 2050, 0x777B }, /* 0x5200 */ { 2062, 0x5FEF }, { 2075, 0xF0CF }, { 2085, 0x47F3 }, { 2095, 0x1DFF }, { 2107, 0x7EDA }, { 2118, 0xFEF4 }, { 2130, 0xFF07 }, { 2141, 0xBFBC }, { 2153, 0xBF9F }, { 2166, 0x8FDB }, { 2177, 0x7F5B }, { 2189, 0x5A20 }, { 2194, 0x32AF }, { 2203, 0xEBEF }, { 2216, 0x8A5F }, { 2225, 0xDFBB }, /* 0x5300 */ { 2238, 0xEF62 }, { 2248, 0xB6E7 }, { 2259, 0xB49F }, { 2269, 0xFB9F }, { 2282, 0x77BF }, { 2295, 0xF49E }, { 2305, 0xF2DB }, { 2316, 0xFBBF }, { 2330, 0xC414 }, { 2335, 0xF7DC }, { 2347, 0x7FF5 }, { 2360, 0x0A55 }, { 2366, 0x3F2E }, { 2376, 0x8FD7 }, { 2387, 0xFF7F }, { 2402, 0x59EF }, /* 0x5400 */ { 2413, 0xFFDA }, { 2426, 0xFF5F }, { 2440, 0xFFFB }, { 2455, 0x7BFF }, { 2469, 0xEDEF }, { 2482, 0x0010 }, { 2483, 0xBFFF }, { 2498, 0xFDFF }, { 2513, 0xF9F7 }, { 2526, 0x55FF }, { 2538, 0xFFFF }, { 2554, 0xFFDF }, { 2569, 0xFBFF }, { 2584, 0x4441 }, { 2588, 0xEFFF }, { 2603, 0xBD8E }, /* 0x5500 */ { 2613, 0xFFFE }, { 2628, 0x459F }, { 2637, 0xFDE8 }, { 2648, 0xDBFF }, { 2662, 0xEFFB }, { 2676, 0xF0EF }, { 2687, 0x0E7E }, { 2696, 0xFAEE }, { 2708, 0xFFDF }, { 2723, 0xB73F }, { 2735, 0x7FFE }, { 2749, 0x9E3F }, { 2760, 0xFFFF }, { 2776, 0xFFFF }, { 2792, 0x97FE }, { 2804, 0xFEE7 }, /* 0x5600 */ { 2817, 0xF377 }, { 2829, 0xF8FF }, { 2842, 0xF6AF }, { 2854, 0xEFFD }, { 2868, 0xF76F }, { 2881, 0x679D }, { 2891, 0xFF7F }, { 2906, 0xDFDF }, { 2920, 0xFEFF }, { 2935, 0xF7AD }, { 2947, 0xFDF2 }, { 2959, 0xF2FE }, { 2971, 0x3F6F }, { 2983, 0xECDA }, { 2993, 0xECB7 }, { 3004, 0xA683 }, /* 0x5700 */ { 3011, 0x3F9F }, { 3023, 0xFD7C }, { 3035, 0xF70D }, { 3045, 0xE81D }, { 3053, 0xFEEF }, { 3067, 0x8897 }, { 3074, 0xAFD6 }, { 3085, 0xFCFF }, { 3099, 0xBD0D }, { 3108, 0xFFB9 }, { 3121, 0x44BF }, { 3130, 0xFF70 }, { 3141, 0xD9DE }, { 3152, 0xF0B5 }, { 3161, 0xF2FF }, { 3174, 0x7FFF }, /* 0x5800 */ { 3189, 0x7FFF }, { 3204, 0x7A15 }, { 3212, 0xF7FF }, { 3227, 0xAFFF }, { 3241, 0xFF91 }, { 3252, 0xFFBE }, { 3266, 0xBB3C }, { 3276, 0xFE7E }, { 3289, 0xCFEF }, { 3302, 0xF71F }, { 3314, 0xDFEB }, { 3327, 0xFC6B }, { 3338, 0xCBE6 }, { 3348, 0xFF7F }, { 3363, 0x9B9D }, { 3373, 0xFE1D }, /* 0x5900 */ { 3384, 0xF4FC }, { 3395, 0x96F6 }, { 3405, 0xFEB5 }, { 3417, 0x5196 }, { 3424, 0xC7B1 }, { 3433, 0x15BB }, { 3442, 0x6EA7 }, { 3452, 0xFBFF }, { 3467, 0xE63F }, { 3478, 0xE7DD }, { 3490, 0xD1FF }, { 3502, 0x7FFF }, { 3517, 0xFFFB }, { 3532, 0x7F5F }, { 3545, 0xFF7B }, { 3559, 0xFFFF }, /* 0x5A00 */ { 3575, 0xBE0F }, { 3585, 0xDFEE }, { 3598, 0x7EBB }, { 3610, 0x73E8 }, { 3619, 0x37FF }, { 3632, 0xFFFF }, { 3648, 0x7FFF }, { 3663, 0xFF83 }, { 3674, 0xDD5E }, { 3685, 0xFEFF }, { 3700, 0xDAE7 }, { 3711, 0xFFFF }, { 3727, 0xFFDF }, { 3742, 0xFFE8 }, { 3754, 0x7F7F }, { 3768, 0xEFFD }, /* 0x5B00 */ { 3782, 0xBBAE }, { 3793, 0xEEFB }, { 3806, 0xFDFB }, { 3820, 0xF115 }, { 3828, 0xFDFB }, { 3842, 0xBDFB }, { 3855, 0x7B7C }, { 3866, 0xBDFF }, { 3880, 0xDBBF }, { 3893, 0xFFED }, { 3907, 0x75FC }, { 3918, 0x8379 }, { 3926, 0x7CFF }, { 3939, 0xC3FF }, { 3951, 0xDFFF }, { 3966, 0x856F }, /* 0x5C00 */ { 3975, 0xFFBA }, { 3988, 0xD47F }, { 3999, 0x153D }, { 4007, 0xDF8B }, { 4018, 0xFFF3 }, { 4032, 0x737B }, { 4043, 0xF7BD }, { 4056, 0x5E1A }, { 4064, 0xBF60 }, { 4073, 0xF63F }, { 4085, 0xFFFF }, { 4101, 0x05EB }, { 4109, 0xDFC6 }, { 4120, 0xCFDF }, { 4133, 0xF720 }, { 4141, 0xABF3 }, /* 0x5D00 */ { 4152, 0xF8C3 }, { 4161, 0xEFF7 }, { 4175, 0xD3FD }, { 4187, 0xF7FF }, { 4202, 0x5FEF }, { 4215, 0x4AE7 }, { 4224, 0x9BAC }, { 4233, 0xFE97 }, { 4245, 0x6FF7 }, { 4258, 0xF6BC }, { 4269, 0xFF97 }, { 4282, 0x37F7 }, { 4294, 0xAACF }, { 4304, 0xE9F6 }, { 4315, 0x49E7 }, { 4324, 0xE2BF }, /* 0x5E00 */ { 4335, 0x5E5C }, { 4344, 0xAFF6 }, { 4356, 0x6B3F }, { 4367, 0x61D8 }, { 4374, 0xFD3F }, { 4387, 0xFBB8 }, { 4398, 0xFFCF }, { 4412, 0xFF7D }, { 4426, 0xBFDD }, { 4439, 0x1EE4 }, { 4447, 0x7DFD }, { 4460, 0x63FF }, { 4472, 0x7FF6 }, { 4485, 0xFFFF }, { 4501, 0xD3EF }, { 4513, 0xDFDE }, /* 0x5F00 */ { 4526, 0xFDB6 }, { 4538, 0xADBC }, { 4548, 0x63FC }, { 4558, 0x15EB }, { 4567, 0xFF59 }, { 4579, 0x33D3 }, { 4588, 0xBEBE }, { 4600, 0xFBDF }, { 4614, 0x1FEF }, { 4626, 0xDBC7 }, { 4637, 0xFFF3 }, { 4651, 0xFEE6 }, { 4663, 0xB23F }, { 4673, 0xEBF7 }, { 4686, 0xED3B }, { 4697, 0xADBA }, /* 0x6000 */ { 4707, 0xFE01 }, { 4715, 0x7EFF }, { 4729, 0xFFFF }, { 4745, 0x0ABE }, { 4753, 0x36FF }, { 4765, 0xEF3D }, { 4777, 0xFFFC }, { 4791, 0xC0A5 }, { 4797, 0x77FB }, { 4810, 0xFCF5 }, { 4822, 0x019D }, { 4828, 0xFFFF }, { 4844, 0xFFFB }, { 4859, 0xFFBA }, { 4872, 0x03DF }, { 4881, 0xFFFF }, /* 0x6100 */ { 4897, 0xFFFB }, { 4912, 0xBF7D }, { 4925, 0xDB8C }, { 4934, 0xE8D5 }, { 4943, 0xFFF7 }, { 4958, 0xFF7D }, { 4972, 0xDDFF }, { 4986, 0x76FF }, { 4999, 0x7E8F }, { 5010, 0xBF7F }, { 5024, 0xFF96 }, { 5036, 0xD7FF }, { 5050, 0xBFEF }, { 5064, 0xC549 }, { 5071, 0x6FFD }, { 5084, 0xFFE7 }, /* 0x6200 */ { 5098, 0x779B }, { 5109, 0x8E77 }, { 5119, 0x7EBF }, { 5132, 0xE6DD }, { 5143, 0x7FCF }, { 5156, 0x5F1F }, { 5167, 0xE17F }, { 5178, 0xFEDF }, { 5192, 0xD7FF }, { 5206, 0x21FF }, { 5216, 0xFF50 }, { 5226, 0xFB7B }, { 5239, 0xFFFC }, { 5253, 0x9FFF }, { 5267, 0xF820 }, { 5273, 0xFFFF }, /* 0x6300 */ { 5289, 0xFB8F }, { 5301, 0x017B }, { 5308, 0xFF00 }, { 5316, 0x7FFE }, { 5330, 0xFFFF }, { 5346, 0x07F3 }, { 5355, 0xFBB0 }, { 5365, 0xBFE7 }, { 5378, 0xFFBF }, { 5393, 0xFBD7 }, { 5406, 0xFFBF }, { 5421, 0x6203 }, { 5426, 0xFFFF }, { 5442, 0xFFEF }, { 5457, 0xEFFF }, { 5472, 0x5B7F }, /* 0x6400 */ { 5484, 0xFEC0 }, { 5493, 0xDDFD }, { 5506, 0xFDFF }, { 5521, 0xEFFD }, { 5535, 0x680B }, { 5541, 0xFF1F }, { 5554, 0xFBE3 }, { 5566, 0xBFFF }, { 5581, 0xBFA4 }, { 5591, 0xF7EF }, { 5605, 0xFA7D }, { 5617, 0xF85F }, { 5628, 0xEEBF }, { 5641, 0x2FDD }, { 5652, 0xBFFF }, { 5667, 0xFD9F }, /* 0x6500 */ { 5680, 0xF6DB }, { 5692, 0xFBFB }, { 5706, 0xFE7F }, { 5720, 0xEBFD }, { 5733, 0xA76A }, { 5742, 0xF3FA }, { 5754, 0xBDFC }, { 5766, 0x9FFC }, { 5778, 0x1BFF }, { 5790, 0xFAF7 }, { 5803, 0xDDB7 }, { 5815, 0xFBED }, { 5828, 0xF87E }, { 5839, 0xECDF }, { 5851, 0xF36F }, { 5863, 0xBC3F }, /* 0x6600 */ { 5874, 0xFFFD }, { 5889, 0xF13F }, { 5900, 0xE9FF }, { 5913, 0x067F }, { 5922, 0x9FBE }, { 5934, 0xFE8E }, { 5945, 0xDDFE }, { 5958, 0x7FDF }, { 5972, 0x7FF1 }, { 5984, 0xA7F7 }, { 5996, 0xEF17 }, { 6007, 0xEFFF }, { 6022, 0xFFD1 }, { 6034, 0x7F44 }, { 6043, 0x7B59 }, { 6053, 0xD3DF }, /* 0x6700 */ { 6065, 0xFF3F }, { 6079, 0xEBFD }, { 6092, 0x7DEF }, { 6105, 0xFF7A }, { 6118, 0xFBF0 }, { 6129, 0xF6EB }, { 6141, 0xBC87 }, { 6150, 0xFFFF }, { 6166, 0xFAFA }, { 6178, 0xB7BF }, { 6191, 0xD011 }, { 6196, 0x8FFF }, { 6209, 0xFF7F }, { 6224, 0xFFDF }, { 6239, 0xFEFC }, { 6252, 0xD7FF }, /* 0x6800 */ { 6266, 0x201F }, { 6272, 0xFDDD }, { 6285, 0xEF67 }, { 6297, 0x7FFE }, { 6311, 0xFFFF }, { 6327, 0x207B }, { 6334, 0xE820 }, { 6339, 0xFBF6 }, { 6352, 0x9FFF }, { 6366, 0xB9DF }, { 6378, 0xFFDF }, { 6393, 0x227F }, { 6402, 0x7FF8 }, { 6414, 0xF5FF }, { 6428, 0xDFDB }, { 6441, 0x3FFF }, /* 0x6900 */ { 6455, 0xFFFF }, { 6471, 0x0FBF }, { 6482, 0x9420 }, { 6486, 0xFBFD }, { 6500, 0xDF7F }, { 6514, 0xFFFE }, { 6529, 0xFFFF }, { 6545, 0x0FFF }, { 6557, 0x646D }, { 6565, 0xDFFB }, { 6579, 0xFFFF }, { 6595, 0xFAFF }, { 6609, 0xFE5F }, { 6622, 0x027B }, { 6629, 0x7BF6 }, { 6641, 0xFFDE }, /* 0x6A00 */ { 6655, 0xBFFF }, { 6670, 0xFFFA }, { 6684, 0x39EB }, { 6694, 0xFF3C }, { 6706, 0xFBFB }, { 6720, 0xEFFF }, { 6735, 0xAFFF }, { 6749, 0xC452 }, { 6755, 0xF6BF }, { 6768, 0xFEFF }, { 6783, 0xF9FF }, { 6797, 0x6FFE }, { 6810, 0xBFEC }, { 6822, 0xFF1B }, { 6834, 0xDDA3 }, { 6844, 0x1F4B }, /* 0x6B00 */ { 6853, 0x8F3D }, { 6863, 0x67CF }, { 6874, 0xB12B }, { 6882, 0xFFFE }, { 6897, 0x7FEE }, { 6910, 0xDAF7 }, { 6922, 0xA4FF }, { 6933, 0xCFD4 }, { 6943, 0xF75F }, { 6956, 0xCBF2 }, { 6966, 0xECFD }, { 6978, 0xB4ED }, { 6988, 0xBFFB }, { 7002, 0x5DDD }, { 7013, 0x9DDF }, { 7025, 0xFF8D }, /* 0x6C00 */ { 7037, 0xBB7F }, { 7050, 0xBF7B }, { 7063, 0xDDFB }, { 7076, 0xEFFB }, { 7090, 0xFE4F }, { 7102, 0xFFB5 }, { 7115, 0xEFE3 }, { 7127, 0xEF7F }, { 7141, 0xFFFF }, { 7157, 0xBF7D }, { 7170, 0xFC04 }, { 7177, 0xFFDF }, { 7192, 0xFEFF }, { 7207, 0xFEFF }, { 7222, 0xFFAF }, { 7236, 0x822F }, /* 0x6D00 */ { 7243, 0xFFFF }, { 7259, 0xEFC7 }, { 7271, 0xFFF5 }, { 7285, 0xFFFF }, { 7301, 0x4007 }, { 7305, 0xDF80 }, { 7313, 0xF7FF }, { 7328, 0xFFF7 }, { 7343, 0xFFFF }, { 7359, 0x01FF }, { 7368, 0xDC30 }, { 7375, 0xFFBE }, { 7389, 0xBFF5 }, { 7402, 0xFFFF }, { 7418, 0xFF7F }, { 7433, 0x7EFF }, /* 0x6E00 */ { 7447, 0x843D }, { 7454, 0xBF20 }, { 7462, 0xFFFF }, { 7478, 0xFF7F }, { 7493, 0xEEFB }, { 7506, 0xFF7F }, { 7521, 0xCBFF }, { 7534, 0x13DE }, { 7543, 0xEB40 }, { 7550, 0xFFDD }, { 7564, 0xCCFF }, { 7576, 0xFFFF }, { 7592, 0xFFFF }, { 7608, 0x3F7F }, { 7621, 0xFB04 }, { 7629, 0xFFF6 }, /* 0x6F00 */ { 7643, 0xFFFF }, { 7659, 0xD7FC }, { 7671, 0xFEFF }, { 7686, 0xFFFF }, { 7702, 0xC01B }, { 7708, 0xFDFF }, { 7723, 0xFEDF }, { 7737, 0xFFDD }, { 7751, 0x7FF7 }, { 7765, 0xE0FD }, { 7775, 0xFFFF }, { 7791, 0xFF7F }, { 7806, 0xFFDF }, { 7821, 0xFF38 }, { 7832, 0xFBDF }, { 7846, 0xDDD7 }, /* 0x7000 */ { 7858, 0xFEFB }, { 7872, 0xFFF2 }, { 7885, 0x9FDF }, { 7898, 0xDFBF }, { 7912, 0x3F7F }, { 7925, 0xFDF7 }, { 7939, 0x9FFF }, { 7953, 0xF7F3 }, { 7966, 0xCE7E }, { 7977, 0x877E }, { 7987, 0xFAFB }, { 8000, 0x7FBB }, { 8013, 0xFDF1 }, { 8025, 0xF7FF }, { 8040, 0x8017 }, { 8045, 0xFFFB }, /* 0x7100 */ { 8060, 0x7E75 }, { 8071, 0xFE89 }, { 8081, 0xDB6F }, { 8093, 0x4C7F }, { 8103, 0xFEFF }, { 8118, 0xF75F }, { 8131, 0x5FFF }, { 8145, 0x7DEF }, { 8158, 0xD7F7 }, { 8171, 0xFFD7 }, { 8185, 0xB7BF }, { 8198, 0xF7BF }, { 8212, 0xCFFF }, { 8226, 0xBF77 }, { 8239, 0x79F7 }, { 8251, 0xFB77 }, /* 0x7200 */ { 8264, 0xF6EF }, { 8277, 0xEEF9 }, { 8289, 0x7FDC }, { 8301, 0xEF61 }, { 8311, 0x9FD7 }, { 8323, 0xFFED }, { 8337, 0xD6CF }, { 8348, 0xFBDD }, { 8361, 0xFBF7 }, { 8375, 0xEDFF }, { 8389, 0xF7FE }, { 8403, 0xA435 }, { 8410, 0x7E7F }, { 8423, 0x97D7 }, { 8434, 0x0F5F }, { 8444, 0xFFD8 }, /* 0x7300 */ { 8456, 0x9D97 }, { 8466, 0x7BCF }, { 8478, 0x7FEC }, { 8490, 0xDFFF }, { 8505, 0xF73F }, { 8518, 0xEF87 }, { 8529, 0xDFE7 }, { 8542, 0xFDFF }, { 8557, 0xDFFF }, { 8572, 0xF1FC }, { 8583, 0x3FF7 }, { 8596, 0xDFFC }, { 8609, 0xFFED }, { 8623, 0x7FFD }, { 8637, 0xEFFF }, { 8652, 0xFFF8 }, /* 0x7400 */ { 8665, 0x3FFF }, { 8679, 0xFEF6 }, { 8692, 0xFF7F }, { 8707, 0x97FF }, { 8720, 0xEFFF }, { 8735, 0xFEFF }, { 8750, 0xFFBD }, { 8764, 0xF67F }, { 8777, 0x3FEF }, { 8790, 0xDFB5 }, { 8802, 0xAFFB }, { 8815, 0xEFF7 }, { 8829, 0x9D2F }, { 8839, 0xFFF9 }, { 8853, 0x53FF }, { 8865, 0xE9F7 }, /* 0x7500 */ { 8877, 0xF9BD }, { 8889, 0xF7FF }, { 8904, 0xFF66 }, { 8916, 0xEFBF }, { 8930, 0xFDC5 }, { 8941, 0xBE3A }, { 8951, 0xFCFD }, { 8964, 0xE7C5 }, { 8974, 0xFCD9 }, { 8985, 0x6737 }, { 8995, 0x0CBC }, { 9002, 0xFF7F }, { 9017, 0xFDBF }, { 9031, 0xFFB7 }, { 9045, 0xA0DF }, { 9054, 0xFFFF }, /* 0x7600 */ { 9070, 0xBF8F }, { 9082, 0xFE7B }, { 9095, 0xB3FF }, { 9108, 0x3D3F }, { 9119, 0xF3CD }, { 9130, 0x97DF }, { 9142, 0xF6F7 }, { 9155, 0xFF7F }, { 9170, 0xCFD6 }, { 9181, 0x7E6D }, { 9192, 0xEC72 }, { 9201, 0xEDB1 }, { 9211, 0x777C }, { 9222, 0xFE5C }, { 9233, 0xF6FA }, { 9245, 0x5FBF }, /* 0x7700 */ { 9258, 0xDFBA }, { 9270, 0xEE2F }, { 9281, 0xABFD }, { 9293, 0x7FFE }, { 9307, 0xFCF9 }, { 9319, 0xDF74 }, { 9330, 0xFFEF }, { 9345, 0xFF84 }, { 9355, 0xFBBF }, { 9369, 0xFFAA }, { 9381, 0xBDAF }, { 9393, 0xFEFF }, { 9408, 0xFEBC }, { 9420, 0x7FB9 }, { 9432, 0xF3ED }, { 9444, 0x7F9F }, /* 0x7800 */ { 9457, 0xF36C }, { 9467, 0xF11F }, { 9477, 0xFFEF }, { 9492, 0x33BF }, { 9503, 0x7FBC }, { 9515, 0x701F }, { 9523, 0xFF75 }, { 9536, 0xDE03 }, { 9544, 0xF3FB }, { 9557, 0xC7FA }, { 9568, 0xBFBF }, { 9582, 0x5F5F }, { 9594, 0xFFBA }, { 9607, 0xEDBF }, { 9620, 0xF7BF }, { 9634, 0xFEBF }, /* 0x7900 */ { 9648, 0x5276 }, { 9656, 0x7A9F }, { 9667, 0xFFFA }, { 9681, 0xFF7E }, { 9695, 0x9FF7 }, { 9708, 0xFFFF }, { 9724, 0x2FBF }, { 9736, 0xF61F }, { 9747, 0xEDCF }, { 9759, 0xBFFF }, { 9774, 0x7FF7 }, { 9788, 0xEFDF }, { 9802, 0xFB73 }, { 9814, 0xF176 }, { 9824, 0x7EDD }, { 9836, 0x0DD2 }, /* 0x7A00 */ { 9843, 0x3D7D }, { 9854, 0xDFBF }, { 9868, 0xED45 }, { 9877, 0xFE83 }, { 9887, 0x7FF9 }, { 9900, 0x9DD0 }, { 9908, 0x7BA7 }, { 9919, 0xEF73 }, { 9931, 0x9FFB }, { 9944, 0xC3FF }, { 9956, 0xDF0D }, { 9966, 0xDDFF }, { 9980, 0x8FBF }, { 9992, 0xBF0A }, { 10001, 0xEEFD }, { 10014, 0xEEC0 }, /* 0x7B00 */ { 10022, 0xDF73 }, { 10034, 0xEF1F }, { 10046, 0xFFFD }, { 10061, 0x0B3F }, { 10070, 0xFFFD }, { 10085, 0x0177 }, { 10092, 0xF2FF }, { 10105, 0x09FF }, { 10115, 0xFDB4 }, { 10126, 0x3BF7 }, { 10138, 0xB01F }, { 10146, 0x43B6 }, { 10154, 0xDED3 }, { 10165, 0xFF31 }, { 10176, 0x1FFF }, { 10189, 0xFF9F }, /* 0x7C00 */ { 10203, 0xFEEF }, { 10217, 0xFA27 }, { 10227, 0x3FEF }, { 10240, 0xFBA9 }, { 10251, 0x37BD }, { 10262, 0xBEDB }, { 10274, 0xFEF9 }, { 10287, 0xFF3D }, { 10300, 0x777B }, { 10312, 0xD1F6 }, { 10322, 0xD1EE }, { 10332, 0xFF3E }, { 10345, 0x7FAC }, { 10356, 0xF6FF }, { 10370, 0xF5C5 }, { 10380, 0x7BFF }, /* 0x7D00 */ { 10394, 0xFFFF }, { 10410, 0xFFFF }, { 10426, 0xDB27 }, { 10436, 0xFF6F }, { 10450, 0xE4FF }, { 10462, 0xFD7F }, { 10476, 0xEFCE }, { 10488, 0xBE0F }, { 10498, 0xFB7B }, { 10511, 0xF0DE }, { 10521, 0xFFDF }, { 10536, 0xFFBF }, { 10551, 0xFEF7 }, { 10565, 0xFF9D }, { 10578, 0xD7FB }, { 10591, 0x6EFF }, /* 0x7E00 */ { 10604, 0xFF88 }, { 10614, 0xFCFF }, { 10628, 0xEEBF }, { 10641, 0xFFFF }, { 10657, 0x13FF }, { 10668, 0xDFFF }, { 10683, 0xFFAF }, { 10697, 0xFFFD }, { 10712, 0xFDC7 }, { 10724, 0x9FFE }, { 10737, 0x1010 }, { 10739, 0x0400 }, { 10740, 0x8080 }, { 10742, 0x8000 }, { 10743, 0x0000 }, { 10743, 0x0000 }, /* 0x7F00 */ { 10743, 0x0040 }, { 10744, 0x0000 }, { 10744, 0x0000 }, { 10744, 0xE7C0 }, { 10752, 0xFFBB }, { 10766, 0xF93F }, { 10778, 0x7FEB }, { 10791, 0xFFEF }, { 10806, 0xFFE8 }, { 10818, 0x7CFE }, { 10830, 0xF3FF }, { 10844, 0xFFFF }, { 10860, 0xFEAF }, { 10873, 0xF8B7 }, { 10884, 0xFFEF }, { 10899, 0xFFBF }, /* 0x8000 */ { 10914, 0xF9FF }, { 10928, 0xFBF7 }, { 10942, 0xD773 }, { 10953, 0xFAFB }, { 10966, 0x85C8 }, { 10972, 0x7D57 }, { 10983, 0x90DE }, { 10991, 0xE3EF }, { 11003, 0x9EF5 }, { 11014, 0xBF6D }, { 11026, 0xEEAE }, { 11037, 0x35F6 }, { 11047, 0xF7FC }, { 11060, 0x7FF3 }, { 11073, 0xB27B }, { 11083, 0x7F7F }, /* 0x8100 */ { 11097, 0x57EF }, { 11109, 0xEFF4 }, { 11121, 0xBEBE }, { 11133, 0x6695 }, { 11141, 0xFDDC }, { 11153, 0x5E7F }, { 11165, 0xEAF7 }, { 11177, 0x97DF }, { 11189, 0xBFDD }, { 11202, 0xFFA8 }, { 11213, 0x5FED }, { 11225, 0xFEFF }, { 11240, 0xB7FF }, { 11254, 0xEFA7 }, { 11266, 0xF7FF }, { 11281, 0xDFDC }, /* 0x8200 */ { 11293, 0x3FB7 }, { 11305, 0xFD77 }, { 11318, 0xBF67 }, { 11330, 0xF7FC }, { 11343, 0xCAB5 }, { 11352, 0xDFFF }, { 11367, 0xFB7E }, { 11380, 0xFFF6 }, { 11394, 0xECB9 }, { 11404, 0xEF1F }, { 11416, 0xFFFF }, { 11432, 0xFFFB }, { 11447, 0x841D }, { 11453, 0xDBFF }, { 11467, 0xFDFF }, { 11482, 0xFFFF }, /* 0x8300 */ { 11498, 0x3BFF }, { 11511, 0x7FC0 }, { 11520, 0xBFF5 }, { 11533, 0xBFFE }, { 11547, 0xFFBF }, { 11562, 0x00DF }, { 11569, 0x804C }, { 11573, 0xFDF8 }, { 11585, 0xFFEA }, { 11598, 0x7FFF }, { 11613, 0xDFFD }, { 11627, 0xE201 }, { 11632, 0xFFFF }, { 11648, 0xFBFA }, { 11661, 0xFFBF }, { 11676, 0xFF7F }, /* 0x8400 */ { 11691, 0xFEFA }, { 11704, 0x195F }, { 11713, 0xFA5B }, { 11724, 0xFFFF }, { 11740, 0x7FFD }, { 11754, 0xFFFF }, { 11770, 0xFBFF }, { 11785, 0xE7FF }, { 11799, 0xE145 }, { 11806, 0xFFDF }, { 11821, 0xFF9F }, { 11835, 0xFF57 }, { 11848, 0xFEF7 }, { 11862, 0x4CDF }, { 11872, 0xDFB6 }, { 11884, 0xFFDF }, /* 0x8500 */ { 11899, 0xFFED }, { 11913, 0xF7FF }, { 11928, 0xFFFB }, { 11943, 0x691B }, { 11951, 0x7FFF }, { 11966, 0xEFFE }, { 11980, 0xFFFF }, { 11996, 0x5FEB }, { 12008, 0xFFFF }, { 12024, 0xFFF3 }, { 12038, 0x87DF }, { 12049, 0xE7FB }, { 12062, 0xEBFF }, { 12076, 0xF7E7 }, { 12089, 0xFF7F }, { 12104, 0xFFC7 }, /* 0x8600 */ { 12117, 0xBEF7 }, { 12130, 0xDFD3 }, { 12142, 0xF7FF }, { 12157, 0xDF7E }, { 12170, 0x79ED }, { 12181, 0xDA7D }, { 12192, 0xFFBE }, { 12206, 0x5E9F }, { 12217, 0x7CE0 }, { 12225, 0x77FF }, { 12239, 0xA7BF }, { 12251, 0xFFFF }, { 12267, 0x1BFF }, { 12279, 0xFFDB }, { 12293, 0xBF5C }, { 12304, 0x4FE0 }, /* 0x8700 */ { 12312, 0x7FFF }, { 12327, 0x5F0E }, { 12336, 0x77FF }, { 12350, 0xDDBF }, { 12363, 0xF04F }, { 12372, 0xFFFF }, { 12388, 0xFFFF }, { 12404, 0x2FFB }, { 12416, 0xBBFE }, { 12429, 0xFDDF }, { 12443, 0xFE3C }, { 12454, 0xFFFF }, { 12470, 0x5F7F }, { 12483, 0xFFDE }, { 12497, 0xFDFF }, { 12512, 0xDEFC }, /* 0x8800 */ { 12524, 0xBF7F }, { 12538, 0xBBFB }, { 12551, 0xFFFF }, { 12567, 0xFBEF }, { 12581, 0xFD7F }, { 12595, 0x6EEC }, { 12605, 0xEFBF }, { 12619, 0xF2F7 }, { 12631, 0xFB9F }, { 12644, 0xDFEF }, { 12658, 0x5D97 }, { 12668, 0xF7F6 }, { 12681, 0xFEA7 }, { 12693, 0xFFF5 }, { 12707, 0xD9C2 }, { 12715, 0xFFFF }, /* 0x8900 */ { 12731, 0x5EE7 }, { 12742, 0xC7FF }, { 12755, 0xFEFE }, { 12769, 0x79EF }, { 12781, 0xBADE }, { 12792, 0xFFDF }, { 12807, 0xFE7F }, { 12821, 0xDEDE }, { 12833, 0x8FEF }, { 12845, 0xF9FA }, { 12857, 0xF6FE }, { 12870, 0xF6C4 }, { 12879, 0x0043 }, { 12882, 0xBE7C }, { 12893, 0x3BFF }, { 12906, 0xDDDF }, /* 0x8A00 */ { 12919, 0xD59D }, { 12929, 0xF9EF }, { 12942, 0x3EAC }, { 12951, 0xFF53 }, { 12963, 0xF773 }, { 12975, 0x4BF7 }, { 12986, 0x7BCF }, { 12998, 0xDEFF }, { 13012, 0xB8FE }, { 13023, 0x577F }, { 13035, 0x8FFB }, { 13047, 0xFF55 }, { 13059, 0xABFD }, { 13071, 0xFFFE }, { 13086, 0xEDD7 }, { 13098, 0xDDFF }, /* 0x8B00 */ { 13112, 0xFDF7 }, { 13126, 0xFFFF }, { 13142, 0xFDFD }, { 13156, 0xFEEB }, { 13169, 0xFFEF }, { 13184, 0xF7FF }, { 13199, 0xBFED }, { 13212, 0xEF91 }, { 13222, 0x5D7F }, { 13234, 0xDF7D }, { 13247, 0x0001 }, { 13248, 0x4000 }, { 13249, 0x0000 }, { 13249, 0x0000 }, { 13249, 0x0004 }, { 13250, 0x0000 }, /* 0x8C00 */ { 13250, 0x0000 }, { 13250, 0x0000 }, { 13250, 0x0000 }, { 13250, 0xFA80 }, { 13257, 0xFFEE }, { 13271, 0xB4F3 }, { 13281, 0xBF76 }, { 13293, 0x2FEF }, { 13305, 0xB677 }, { 13316, 0xFFBF }, { 13331, 0xBFBF }, { 13345, 0xFFFD }, { 13360, 0xB5BF }, { 13372, 0xFEFE }, { 13386, 0x7FFF }, { 13401, 0x7FBF }, /* 0x8D00 */ { 13415, 0xBFFD }, { 13429, 0x3BFF }, { 13442, 0x0000 }, { 13442, 0x0000 }, { 13442, 0x0000 }, { 13442, 0x0000 }, { 13442, 0xFBD0 }, { 13452, 0x2FDD }, { 13463, 0xF637 }, { 13474, 0x9A7F }, { 13485, 0xFFEB }, { 13499, 0xD6FC }, { 13510, 0xF9EF }, { 13523, 0xBFFB }, { 13537, 0xDFDF }, { 13551, 0xF41F }, /* 0x8E00 */ { 13561, 0xE6FF }, { 13574, 0xFFFF }, { 13590, 0x6FFF }, { 13604, 0xF77B }, { 13617, 0xFFF7 }, { 13632, 0xFEF9 }, { 13645, 0xB7FF }, { 13659, 0x5DFE }, { 13671, 0x7FF7 }, { 13685, 0xE5FF }, { 13698, 0x3FFB }, { 13711, 0x3645 }, { 13718, 0xFE0D }, { 13728, 0xFD9E }, { 13740, 0xFBF7 }, { 13754, 0xDFF6 }, /* 0x8F00 */ { 13767, 0x6FEF }, { 13780, 0xFFFF }, { 13796, 0xF679 }, { 13807, 0xCBFD }, { 13819, 0xEFFF }, { 13834, 0xFFFF }, { 13850, 0x40DF }, { 13858, 0x0000 }, { 13858, 0x0000 }, { 13858, 0x9808 }, { 13862, 0xE1E9 }, { 13871, 0xDFFF }, { 13886, 0xFE76 }, { 13898, 0x04FF }, { 13907, 0x6D7F }, { 13919, 0xFFF1 }, /* 0x9000 */ { 13932, 0xB97F }, { 13944, 0xFEF7 }, { 13958, 0xE01F }, { 13966, 0xF1FE }, { 13978, 0xFE96 }, { 13989, 0x7B7F }, { 14002, 0xFB9F }, { 14015, 0xFFFD }, { 14030, 0xADFF }, { 14043, 0xCBB3 }, { 14053, 0xC5EF }, { 14064, 0xE97F }, { 14076, 0x4DBA }, { 14085, 0xBFF0 }, { 14096, 0xBF3F }, { 14109, 0xFE3F }, /* 0x9100 */ { 14122, 0xEBFF }, { 14136, 0xFFD7 }, { 14150, 0xFFDF }, { 14165, 0xCF7F }, { 14178, 0xFFFB }, { 14193, 0xD7EF }, { 14206, 0xD7BF }, { 14219, 0x17FD }, { 14230, 0xFEFF }, { 14245, 0xFE0F }, { 14256, 0xFFAF }, { 14270, 0x7EFF }, { 14284, 0xFAFF }, { 14298, 0xB7FB }, { 14311, 0x7FFC }, { 14324, 0xE7FA }, /* 0x9200 */ { 14336, 0xF7FF }, { 14351, 0x56FF }, { 14363, 0x6DFA }, { 14374, 0xF7FF }, { 14389, 0xFF73 }, { 14402, 0xEDFF }, { 14416, 0xF8FF }, { 14429, 0xFFC5 }, { 14441, 0xFFFF }, { 14457, 0x3FFA }, { 14469, 0x5FFF }, { 14483, 0xDEFE }, { 14496, 0xFFFF }, { 14512, 0xEBBF }, { 14525, 0xDFFB }, { 14539, 0xFFDF }, /* 0x9300 */ { 14554, 0xFBDF }, { 14568, 0xEF7D }, { 14581, 0xFFFF }, { 14597, 0x137B }, { 14606, 0xFFFF }, { 14622, 0xDFF7 }, { 14636, 0x7FFF }, { 14651, 0x7FFB }, { 14665, 0xF7FF }, { 14680, 0xFFF7 }, { 14695, 0xF7FF }, { 14710, 0xA9BF }, { 14721, 0xFDDD }, { 14734, 0xFFFF }, { 14750, 0x51DF }, { 14760, 0xFFFB }, /* 0x9400 */ { 14775, 0xFFDB }, { 14789, 0x2BFF }, { 14801, 0x7FF1 }, { 14813, 0xFFEF }, { 14828, 0xBFFD }, { 14842, 0x69B7 }, { 14852, 0xFFBD }, { 14866, 0xFBFF }, { 14881, 0x002F }, { 14886, 0x8000 }, { 14887, 0x0004 }, { 14888, 0x0000 }, { 14888, 0x000A }, { 14890, 0x1000 }, { 14891, 0x0000 }, { 14891, 0x0040 }, /* 0x9500 */ { 14892, 0x0000 }, { 14892, 0x0000 }, { 14892, 0x2000 }, { 14893, 0x0000 }, { 14893, 0x0080 }, { 14894, 0x0000 }, { 14894, 0x0000 }, { 14894, 0xBD80 }, { 14901, 0xFB6D }, { 14913, 0xDBDF }, { 14926, 0x7FFF }, { 14941, 0xFEE3 }, { 14953, 0x3FE9 }, { 14964, 0xDC7F }, { 14976, 0x013F }, { 14983, 0x0010 }, /* 0x9600 */ { 14984, 0x0000 }, { 14984, 0x7000 }, { 14987, 0xF51F }, { 14998, 0xBF0F }, { 15009, 0xFC3F }, { 15021, 0xF95B }, { 15032, 0xBE1E }, { 15042, 0x79FF }, { 15055, 0xEFFB }, { 15069, 0x5BFE }, { 15081, 0x57BE }, { 15092, 0xBB5B }, { 15103, 0x7FFF }, { 15118, 0xFFFC }, { 15132, 0x872E }, { 15140, 0xAFF7 }, /* 0x9700 */ { 15153, 0xEBFD }, { 15166, 0xFB4F }, { 15178, 0xDFFF }, { 15193, 0xE767 }, { 15204, 0x0BDF }, { 15214, 0xFDE6 }, { 15226, 0x7747 }, { 15236, 0xFDDF }, { 15250, 0xEFBF }, { 15264, 0xFF90 }, { 15274, 0x7D7F }, { 15287, 0xEFDE }, { 15300, 0xFBFF }, { 15315, 0xF3FD }, { 15328, 0x606B }, { 15335, 0xEF6F }, /* 0x9800 */ { 15348, 0xF5FF }, { 15362, 0xF9FF }, { 15376, 0xEBDB }, { 15388, 0x0BBD }, { 15397, 0xFFFA }, { 15411, 0xFB8F }, { 15423, 0x9FFD }, { 15436, 0x003F }, { 15442, 0x0000 }, { 15442, 0x0000 }, { 15442, 0xF300 }, { 15448, 0xFFDE }, { 15462, 0x5FDF }, { 15475, 0xD800 }, { 15479, 0xBEEF }, { 15492, 0x7676 }, /* 0x9900 */ { 15502, 0x57AD }, { 15512, 0xDFFF }, { 15527, 0xFFB2 }, { 15539, 0xFFAF }, { 15553, 0x7FAF }, { 15566, 0xFBFF }, { 15581, 0x000E }, { 15584, 0x0000 }, { 15584, 0x0000 }, { 15584, 0x7BC0 }, { 15592, 0xFDFA }, { 15605, 0x3F3F }, { 15617, 0xFABE }, { 15629, 0xBFFF }, { 15644, 0x76FF }, { 15657, 0xFFF3 }, /* 0x9A00 */ { 15671, 0xFEFE }, { 15685, 0xFE73 }, { 15697, 0xFEFF }, { 15712, 0xFFF7 }, { 15727, 0xF77F }, { 15741, 0xDFFD }, { 15755, 0x1FFD }, { 15767, 0x0000 }, { 15767, 0x8000 }, { 15768, 0x0000 }, { 15768, 0xA900 }, { 15772, 0xFFDF }, { 15787, 0xA4C7 }, { 15795, 0x91FF }, { 15806, 0xF8CF }, { 15817, 0xFEDE }, /* 0x9B00 */ { 15830, 0xFF7E }, { 15844, 0xC7F7 }, { 15856, 0xEFBD }, { 15869, 0xDEBE }, { 15881, 0xFD7F }, { 15895, 0x8F77 }, { 15906, 0x93D3 }, { 15915, 0xFCF3 }, { 15927, 0xE9EF }, { 15939, 0xECAF }, { 15950, 0xED77 }, { 15962, 0xA361 }, { 15969, 0x87DB }, { 15979, 0x7EF8 }, { 15990, 0x3FF7 }, { 16003, 0xA193 }, /* 0x9C00 */ { 16010, 0x7FE4 }, { 16021, 0xB8BD }, { 16031, 0xBB7B }, { 16043, 0xFEFE }, { 16057, 0xFF73 }, { 16070, 0xE3FD }, { 16082, 0x61CD }, { 16090, 0x1FBE }, { 16101, 0x0000 }, { 16101, 0x0000 }, { 16101, 0x0000 }, { 16101, 0x0000 }, { 16101, 0x0000 }, { 16101, 0x0000 }, { 16101, 0x26E0 }, { 16107, 0xBEFE }, /* 0x9D00 */ { 16120, 0x13FD }, { 16130, 0xEBF5 }, { 16142, 0xE36F }, { 16153, 0xEBDB }, { 16165, 0xDE3F }, { 16177, 0xFFDF }, { 16192, 0xFF83 }, { 16203, 0xFBBF }, { 16217, 0x1FFF }, { 16230, 0xFFDD }, { 16244, 0xBFFF }, { 16259, 0xFFFE }, { 16274, 0xFFBF }, { 16289, 0xFFFF }, { 16305, 0xFB7E }, { 16318, 0xFFFD }, /* 0x9E00 */ { 16333, 0xFEFF }, { 16348, 0xFFBF }, { 16363, 0x0000 }, { 16363, 0x0000 }, { 16363, 0x0000 }, { 16363, 0x0000 }, { 16363, 0x0000 }, { 16363, 0xBE20 }, { 16370, 0x7FFF }, { 16385, 0xFFFF }, { 16401, 0xFFF7 }, { 16416, 0xF8F3 }, { 16427, 0xF1DF }, { 16439, 0xFD7B }, { 16452, 0xE9F5 }, { 16463, 0xFFFF }, /* 0x9F00 */ { 16479, 0xC7C7 }, { 16489, 0x5FED }, { 16501, 0xFFFD }, { 16516, 0x6BFF }, { 16529, 0xFFFF }, { 16545, 0xFFFD }, { 16560, 0xDEFF }, { 16574, 0xCFF7 }, { 16587, 0x6000 }, { 16589, 0x9337 }, { 16598, 0x0035 }, }; static const Summary16 big5hkscs_uni2index_pagee0[419] = { /* 0xE000 */ { 16602, 0xFFFF }, { 16618, 0xFFFF }, { 16634, 0xFFFF }, { 16650, 0xFFFF }, { 16666, 0xFFFF }, { 16682, 0xFFFF }, { 16698, 0xFFFF }, { 16714, 0xFFFF }, { 16730, 0xFFFF }, { 16746, 0xFFFF }, { 16762, 0xFFFF }, { 16778, 0xFFFF }, { 16794, 0xFFFF }, { 16810, 0xFFFF }, { 16826, 0xFFFF }, { 16842, 0xFFFF }, /* 0xE100 */ { 16858, 0xFFFF }, { 16874, 0xFFFF }, { 16890, 0xFFFF }, { 16906, 0xFFFF }, { 16922, 0xFFFF }, { 16938, 0xFFFF }, { 16954, 0xFFFF }, { 16970, 0xFFFF }, { 16986, 0xFFFF }, { 17002, 0xFFFF }, { 17018, 0xFFFF }, { 17034, 0xFFFF }, { 17050, 0xFFFF }, { 17066, 0xFFFF }, { 17082, 0xFFFF }, { 17098, 0xFFFF }, /* 0xE200 */ { 17114, 0xFFFF }, { 17130, 0xFFFF }, { 17146, 0xFFFF }, { 17162, 0xFFFF }, { 17178, 0xFFFF }, { 17194, 0xFFFF }, { 17210, 0xFFFF }, { 17226, 0xFFFF }, { 17242, 0xFFFF }, { 17258, 0xFFFF }, { 17274, 0xFFFF }, { 17290, 0xFFFF }, { 17306, 0xFFFF }, { 17322, 0xFFFF }, { 17338, 0xFFFF }, { 17354, 0xFFFF }, /* 0xE300 */ { 17370, 0xFFFF }, { 17386, 0xFFFF }, { 17402, 0xFFFF }, { 17418, 0xFFFF }, { 17434, 0xFFFF }, { 17450, 0xFFFF }, { 17466, 0xFFFF }, { 17482, 0xFFFF }, { 17498, 0xFFFF }, { 17514, 0xFFFF }, { 17530, 0xFFFF }, { 17546, 0xFFFF }, { 17562, 0xFFFF }, { 17578, 0xFFFF }, { 17594, 0xFFFF }, { 17610, 0xFFFF }, /* 0xE400 */ { 17626, 0xFFFF }, { 17642, 0xFFFF }, { 17658, 0xFFFF }, { 17674, 0xFFFF }, { 17690, 0xFFFF }, { 17706, 0xFFFF }, { 17722, 0xFFFF }, { 17738, 0xFFFF }, { 17754, 0xFFFF }, { 17770, 0xFFFF }, { 17786, 0xFFFF }, { 17802, 0xFFFF }, { 17818, 0xFFFF }, { 17834, 0xFFFF }, { 17850, 0xFFFF }, { 17866, 0xFFFF }, /* 0xE500 */ { 17882, 0xFFFF }, { 17898, 0xFFFF }, { 17914, 0xFFFF }, { 17930, 0xFFFF }, { 17946, 0xFFFF }, { 17962, 0xFFFF }, { 17978, 0xFFFF }, { 17994, 0xFFFF }, { 18010, 0xFFFF }, { 18026, 0xFFFF }, { 18042, 0xFFFF }, { 18058, 0xFFFF }, { 18074, 0xFFFF }, { 18090, 0xFFFF }, { 18106, 0xFFFF }, { 18122, 0xFFFF }, /* 0xE600 */ { 18138, 0xFFFF }, { 18154, 0xFFFF }, { 18170, 0xFFFF }, { 18186, 0xFFFF }, { 18202, 0xFFFF }, { 18218, 0xFFFF }, { 18234, 0xFFFF }, { 18250, 0xFFFF }, { 18266, 0xFFFF }, { 18282, 0xFFFF }, { 18298, 0xFFFF }, { 18314, 0xFFFF }, { 18330, 0xFFFF }, { 18346, 0xFFFF }, { 18362, 0xFFFF }, { 18378, 0xFFFF }, /* 0xE700 */ { 18394, 0xFFFF }, { 18410, 0xFFFF }, { 18426, 0xFFFF }, { 18442, 0xFFFF }, { 18458, 0xFFFF }, { 18474, 0xFFFF }, { 18490, 0xFFFF }, { 18506, 0xFFFF }, { 18522, 0xFFFF }, { 18538, 0xFFFF }, { 18554, 0xFFFF }, { 18570, 0xFFFF }, { 18586, 0xFFFF }, { 18602, 0xFFFF }, { 18618, 0xFFFF }, { 18634, 0xFFFF }, /* 0xE800 */ { 18650, 0xFFFF }, { 18666, 0xFFFF }, { 18682, 0xFFFF }, { 18698, 0xFFFF }, { 18714, 0xFFFF }, { 18730, 0xFFFF }, { 18746, 0xFFFF }, { 18762, 0xFFFF }, { 18778, 0xFFFF }, { 18794, 0xFFFF }, { 18810, 0xFFFF }, { 18826, 0xFFFF }, { 18842, 0xFFFF }, { 18858, 0xFFFF }, { 18874, 0xFFFF }, { 18890, 0xFFFF }, /* 0xE900 */ { 18906, 0xFFFF }, { 18922, 0xFFFF }, { 18938, 0xFFFF }, { 18954, 0xFFFF }, { 18970, 0xFFFF }, { 18986, 0xFFFF }, { 19002, 0xFFFF }, { 19018, 0xFFFF }, { 19034, 0xFFFF }, { 19050, 0xFFFF }, { 19066, 0xFFFF }, { 19082, 0xFFFF }, { 19098, 0xFFFF }, { 19114, 0xFFFF }, { 19130, 0xFFFF }, { 19146, 0xFFFF }, /* 0xEA00 */ { 19162, 0xFFFF }, { 19178, 0xFFFF }, { 19194, 0xFFFF }, { 19210, 0xFFFF }, { 19226, 0xFFFF }, { 19242, 0xFFFF }, { 19258, 0xFFFF }, { 19274, 0xFFFF }, { 19290, 0xFFFF }, { 19306, 0xFFFF }, { 19322, 0xFFFF }, { 19338, 0xFFFF }, { 19354, 0xFFFF }, { 19370, 0xFFFF }, { 19386, 0xFFFF }, { 19402, 0xFFFF }, /* 0xEB00 */ { 19418, 0xFFFF }, { 19434, 0xFFFF }, { 19450, 0xFFFF }, { 19466, 0xFFFF }, { 19482, 0xFFFF }, { 19498, 0xFFFF }, { 19514, 0xFFFF }, { 19530, 0xFFFF }, { 19546, 0xFFFF }, { 19562, 0xFFFF }, { 19578, 0xFFFF }, { 19594, 0xFFFF }, { 19610, 0xFFFF }, { 19626, 0xFFFF }, { 19642, 0xFFFF }, { 19658, 0xFFFF }, /* 0xEC00 */ { 19674, 0xFFFF }, { 19690, 0xFFFF }, { 19706, 0xFFFF }, { 19722, 0xFFFF }, { 19738, 0xFFFF }, { 19754, 0xFFFF }, { 19770, 0xFFFF }, { 19786, 0xFFFF }, { 19802, 0xFFFF }, { 19818, 0xFFFF }, { 19834, 0xFFFF }, { 19850, 0xFFFF }, { 19866, 0xFFFF }, { 19882, 0xFFFF }, { 19898, 0xFFFF }, { 19914, 0xFFFF }, /* 0xED00 */ { 19930, 0xFFFF }, { 19946, 0xFFFF }, { 19962, 0xFFFF }, { 19978, 0xFFFF }, { 19994, 0xFFFF }, { 20010, 0xFFFF }, { 20026, 0xFFFF }, { 20042, 0xFFFF }, { 20058, 0xFFFF }, { 20074, 0xFFFF }, { 20090, 0xFFFF }, { 20106, 0xFFFF }, { 20122, 0xFFFF }, { 20138, 0xFFFF }, { 20154, 0xFFFF }, { 20170, 0xFFFF }, /* 0xEE00 */ { 20186, 0xFFFF }, { 20202, 0xFFFF }, { 20218, 0xFFFF }, { 20234, 0xFFFF }, { 20250, 0xFFFF }, { 20266, 0xFFFF }, { 20282, 0xFFFF }, { 20298, 0xFFFF }, { 20314, 0xFFFF }, { 20330, 0xFFFF }, { 20346, 0xFFFF }, { 20362, 0xFFFF }, { 20378, 0xFFFF }, { 20394, 0xFFFF }, { 20410, 0xFFFF }, { 20426, 0xFFFF }, /* 0xEF00 */ { 20442, 0xFFFF }, { 20458, 0xFFFF }, { 20474, 0xFFFF }, { 20490, 0xFFFF }, { 20506, 0xFFFF }, { 20522, 0xFFFF }, { 20538, 0xFFFF }, { 20554, 0xFFFF }, { 20570, 0xFFFF }, { 20586, 0xFFFF }, { 20602, 0xFFFF }, { 20618, 0xFFFF }, { 20634, 0xFFFF }, { 20650, 0xFFFF }, { 20666, 0xFFFF }, { 20682, 0xFFFF }, /* 0xF000 */ { 20698, 0xFFFF }, { 20714, 0xFFFF }, { 20730, 0xFFFF }, { 20746, 0xFFFF }, { 20762, 0xFFFF }, { 20778, 0xFFFF }, { 20794, 0xFFFF }, { 20810, 0xFFFF }, { 20826, 0xFFFF }, { 20842, 0xFFFF }, { 20858, 0xFFFF }, { 20874, 0xFFFF }, { 20890, 0xFFFF }, { 20906, 0xFFFF }, { 20922, 0xFFFF }, { 20938, 0xFFFF }, /* 0xF100 */ { 20954, 0xFFFF }, { 20970, 0xFFFF }, { 20986, 0xFFFF }, { 21002, 0xFFFF }, { 21018, 0xFFFF }, { 21034, 0xFFFF }, { 21050, 0xFFFF }, { 21066, 0xFFFF }, { 21082, 0xFFFF }, { 21098, 0xFFFF }, { 21114, 0xFFFF }, { 21130, 0xFFFF }, { 21146, 0xFFFF }, { 21162, 0xFFFF }, { 21178, 0xFFFF }, { 21194, 0xFFFF }, /* 0xF200 */ { 21210, 0xFFFF }, { 21226, 0xFFFF }, { 21242, 0xFFFF }, { 21258, 0xFFFF }, { 21274, 0xFFFF }, { 21290, 0xFFFF }, { 21306, 0xFFFF }, { 21322, 0xFFFF }, { 21338, 0xFFFF }, { 21354, 0xFFFF }, { 21370, 0xFFFF }, { 21386, 0xFFFF }, { 21402, 0xFFFF }, { 21418, 0xFFFF }, { 21434, 0xFFFF }, { 21450, 0xFFFF }, /* 0xF300 */ { 21466, 0xFFFF }, { 21482, 0xFFFF }, { 21498, 0xFFFF }, { 21514, 0xFFFF }, { 21530, 0xFFFF }, { 21546, 0xFFFF }, { 21562, 0xFFFF }, { 21578, 0xFFFF }, { 21594, 0xFFFF }, { 21610, 0xFFFF }, { 21626, 0xFFFF }, { 21642, 0xFFFF }, { 21658, 0xFFFF }, { 21674, 0xFFFF }, { 21690, 0xFFFF }, { 21706, 0xFFFF }, /* 0xF400 */ { 21722, 0xFFFF }, { 21738, 0xFFFF }, { 21754, 0xFFFF }, { 21770, 0xFFFF }, { 21786, 0xFFFF }, { 21802, 0xFFFF }, { 21818, 0xFFFF }, { 21834, 0xFFFF }, { 21850, 0xFFFF }, { 21866, 0xFFFF }, { 21882, 0xFFFF }, { 21898, 0xFFFF }, { 21914, 0xFFFF }, { 21930, 0xFFFF }, { 21946, 0xFFFF }, { 21962, 0xFFFF }, /* 0xF500 */ { 21978, 0xFFFF }, { 21994, 0xFFFF }, { 22010, 0xFFFF }, { 22026, 0xFFFF }, { 22042, 0xFFFF }, { 22058, 0xFFFF }, { 22074, 0xFFFF }, { 22090, 0xFFFF }, { 22106, 0xFFFF }, { 22122, 0xFFFF }, { 22138, 0xFFFF }, { 22154, 0xFFFF }, { 22170, 0xFFFF }, { 22186, 0xFFFF }, { 22202, 0xFFFF }, { 22218, 0xFFFF }, /* 0xF600 */ { 22234, 0xFFFF }, { 22250, 0xFFFF }, { 22266, 0xFFFF }, { 22282, 0xFFFF }, { 22298, 0xFFFF }, { 22314, 0xFFFF }, { 22330, 0xFFFF }, { 22346, 0xFFFF }, { 22362, 0xFFFF }, { 22378, 0xFFFF }, { 22394, 0xFFFF }, { 22410, 0xFFFF }, { 22426, 0xFFFF }, { 22442, 0xFFFF }, { 22458, 0xFFFF }, { 22474, 0xFFFF }, /* 0xF700 */ { 22490, 0xFFFF }, { 22506, 0xFFFF }, { 22522, 0xFFFF }, { 22538, 0xFFFF }, { 22554, 0xFFFF }, { 22570, 0xFFFF }, { 22586, 0xFFFF }, { 22602, 0xFFFF }, { 22618, 0xFFFF }, { 22634, 0xFFFF }, { 22650, 0xFFFF }, { 22666, 0xFFFF }, { 22682, 0xFFFF }, { 22698, 0xFFFF }, { 22714, 0xFFFF }, { 22730, 0xFFFF }, /* 0xF800 */ { 22746, 0xFFFF }, { 22762, 0xFFFF }, { 22778, 0xFFFF }, { 22794, 0xFFFF }, { 22810, 0x01FF }, { 22819, 0x0000 }, { 22819, 0x0000 }, { 22819, 0x0000 }, { 22819, 0x0000 }, { 22819, 0x0000 }, { 22819, 0x0000 }, { 22819, 0x0000 }, { 22819, 0x0000 }, { 22819, 0x0000 }, { 22819, 0x0000 }, { 22819, 0x0100 }, /* 0xF900 */ { 22820, 0xFFFF }, { 22836, 0xFFFF }, { 22852, 0xEFFF }, { 22867, 0xFFFF }, { 22883, 0xFFFF }, { 22899, 0xFFFF }, { 22915, 0xFFFF }, { 22931, 0xFDFF }, { 22946, 0xFFFF }, { 22962, 0xFFDF }, { 22977, 0xFFFF }, { 22993, 0xFFFF }, { 23009, 0xFFFF }, { 23025, 0xFFFF }, { 23041, 0xFF7F }, { 23056, 0xFFFD }, /* 0xFA00 */ { 23071, 0x3FFF }, { 23085, 0x7EE5 }, { 23096, 0x3C64 }, }; static const Summary16 big5hkscs_uni2index_pagefe[31] = { /* 0xFE00 */ { 23103, 0x0000 }, { 23103, 0x0000 }, { 23103, 0x0000 }, { 23103, 0xFFFB }, { 23118, 0xFE1F }, { 23130, 0xFEF7 }, { 23144, 0x0F7F }, { 23155, 0x0000 }, { 23155, 0x0000 }, { 23155, 0x0000 }, { 23155, 0x0000 }, { 23155, 0x0000 }, { 23155, 0x0000 }, { 23155, 0x0000 }, { 23155, 0x0000 }, { 23155, 0x0000 }, /* 0xFF00 */ { 23155, 0xFFFE }, { 23170, 0xFFFF }, { 23186, 0xFFFF }, { 23202, 0xFFFF }, { 23218, 0xFFFF }, { 23234, 0x7FFF }, { 23249, 0x0010 }, { 23250, 0x0000 }, { 23250, 0x0000 }, { 23250, 0x0000 }, { 23250, 0x0000 }, { 23250, 0x0000 }, { 23250, 0x0000 }, { 23250, 0x0000 }, { 23250, 0x203F }, }; static const Summary16 big5hkscs_uni2index_page200[2335] = { /* 0x20000 */ { 23257, 0x0000 }, { 23257, 0x0000 }, { 23257, 0x0002 }, { 23258, 0x4000 }, { 23259, 0x4040 }, { 23261, 0x0000 }, { 23261, 0x0100 }, { 23262, 0x0000 }, { 23262, 0x04C0 }, { 23265, 0x0010 }, { 23266, 0x0000 }, { 23266, 0x0000 }, { 23266, 0x3C00 }, { 23270, 0x0002 }, { 23271, 0x4000 }, { 23272, 0x0000 }, /* 0x20100 */ { 23272, 0x5000 }, { 23274, 0x0100 }, { 23275, 0x0000 }, { 23275, 0x0000 }, { 23275, 0x0000 }, { 23275, 0x0000 }, { 23275, 0x0000 }, { 23275, 0x0000 }, { 23275, 0x0000 }, { 23275, 0x0000 }, { 23275, 0x0A00 }, { 23277, 0x0000 }, { 23277, 0x0002 }, { 23278, 0x0010 }, { 23279, 0x0000 }, { 23279, 0x0004 }, /* 0x20200 */ { 23280, 0x1010 }, { 23282, 0x0010 }, { 23283, 0x0000 }, { 23283, 0x0000 }, { 23283, 0x0000 }, { 23283, 0x0800 }, { 23284, 0x0000 }, { 23284, 0x0030 }, { 23286, 0x0000 }, { 23286, 0x4200 }, { 23288, 0x0001 }, { 23289, 0x8080 }, { 23291, 0x0001 }, { 23292, 0x0000 }, { 23292, 0x0020 }, { 23293, 0x0000 }, /* 0x20300 */ { 23293, 0x0400 }, { 23294, 0x0000 }, { 23294, 0x0020 }, { 23295, 0x0000 }, { 23295, 0x00E2 }, { 23299, 0x0000 }, { 23299, 0x0000 }, { 23299, 0xC000 }, { 23301, 0x0001 }, { 23302, 0x0000 }, { 23302, 0x0081 }, { 23304, 0x0020 }, { 23305, 0x0A00 }, { 23307, 0x0000 }, { 23307, 0x0000 }, { 23307, 0x1020 }, /* 0x20400 */ { 23309, 0x0000 }, { 23309, 0x8018 }, { 23312, 0x0000 }, { 23312, 0x0000 }, { 23312, 0x0000 }, { 23312, 0x0000 }, { 23312, 0x0020 }, { 23313, 0x0000 }, { 23313, 0x4080 }, { 23315, 0x0006 }, { 23317, 0x0008 }, { 23318, 0x0000 }, { 23318, 0x0000 }, { 23318, 0x0080 }, { 23319, 0x0000 }, { 23319, 0x5000 }, /* 0x20500 */ { 23321, 0x0000 }, { 23321, 0x0000 }, { 23321, 0x0000 }, { 23321, 0x0000 }, { 23321, 0x0080 }, { 23322, 0x0000 }, { 23322, 0x0000 }, { 23322, 0x0000 }, { 23322, 0x4000 }, { 23323, 0x0000 }, { 23323, 0x0020 }, { 23324, 0x0008 }, { 23325, 0x0408 }, { 23327, 0x8021 }, { 23330, 0x0801 }, { 23332, 0x0000 }, /* 0x20600 */ { 23332, 0x0000 }, { 23332, 0x0622 }, { 23336, 0x0000 }, { 23336, 0x0001 }, { 23337, 0x0000 }, { 23337, 0x0040 }, { 23338, 0x0000 }, { 23338, 0x0040 }, { 23339, 0x0000 }, { 23339, 0x0000 }, { 23339, 0x0000 }, { 23339, 0x0000 }, { 23339, 0x0000 }, { 23339, 0x0000 }, { 23339, 0x0000 }, { 23339, 0x0000 }, /* 0x20700 */ { 23339, 0x4000 }, { 23340, 0x0000 }, { 23340, 0x0000 }, { 23340, 0x0002 }, { 23341, 0x0000 }, { 23341, 0x0000 }, { 23341, 0x0000 }, { 23341, 0x0200 }, { 23342, 0x0000 }, { 23342, 0x0000 }, { 23342, 0x0000 }, { 23342, 0x0000 }, { 23342, 0x0000 }, { 23342, 0x0000 }, { 23342, 0x0000 }, { 23342, 0x0000 }, /* 0x20800 */ { 23342, 0x0000 }, { 23342, 0x0000 }, { 23342, 0x1000 }, { 23343, 0x0000 }, { 23343, 0x0000 }, { 23343, 0x0000 }, { 23343, 0x0000 }, { 23343, 0x0008 }, { 23344, 0x0000 }, { 23344, 0x0000 }, { 23344, 0x0000 }, { 23344, 0x0000 }, { 23344, 0x0000 }, { 23344, 0x0020 }, { 23345, 0x0000 }, { 23345, 0x0000 }, /* 0x20900 */ { 23345, 0x0000 }, { 23345, 0x0040 }, { 23346, 0x0008 }, { 23347, 0x0000 }, { 23347, 0x0000 }, { 23347, 0x0010 }, { 23348, 0x0000 }, { 23348, 0x0200 }, { 23349, 0x0000 }, { 23349, 0x0000 }, { 23349, 0x0000 }, { 23349, 0x0000 }, { 23349, 0x0000 }, { 23349, 0x0000 }, { 23349, 0x0080 }, { 23350, 0x0000 }, /* 0x20A00 */ { 23350, 0x0000 }, { 23350, 0x0002 }, { 23351, 0x0000 }, { 23351, 0x0000 }, { 23351, 0x0000 }, { 23351, 0x0001 }, { 23352, 0x0000 }, { 23352, 0x0000 }, { 23352, 0x0000 }, { 23352, 0x0000 }, { 23352, 0x0000 }, { 23352, 0x0010 }, { 23353, 0x2004 }, { 23355, 0x0000 }, { 23355, 0x0000 }, { 23355, 0x0000 }, /* 0x20B00 */ { 23355, 0x2000 }, { 23356, 0x0000 }, { 23356, 0x0000 }, { 23356, 0x0000 }, { 23356, 0x0000 }, { 23356, 0x0000 }, { 23356, 0x0000 }, { 23356, 0x0000 }, { 23356, 0x8000 }, { 23357, 0x0000 }, { 23357, 0x0300 }, { 23359, 0x8000 }, { 23360, 0x0840 }, { 23362, 0x0000 }, { 23362, 0x0804 }, { 23364, 0x8800 }, /* 0x20C00 */ { 23366, 0x2800 }, { 23368, 0x0000 }, { 23368, 0x0001 }, { 23369, 0x0C10 }, { 23372, 0x000E }, { 23375, 0x0008 }, { 23376, 0x0020 }, { 23377, 0x1180 }, { 23380, 0x2000 }, { 23381, 0x1040 }, { 23383, 0x0000 }, { 23383, 0x0120 }, { 23385, 0x8000 }, { 23386, 0x2078 }, { 23391, 0x2000 }, { 23392, 0x8000 }, /* 0x20D00 */ { 23393, 0x0000 }, { 23393, 0x0020 }, { 23394, 0x0100 }, { 23395, 0x0006 }, { 23397, 0x73C0 }, { 23404, 0x0000 }, { 23404, 0x8000 }, { 23405, 0xD012 }, { 23410, 0x0000 }, { 23410, 0x1040 }, { 23412, 0x0080 }, { 23413, 0x0004 }, { 23414, 0x0100 }, { 23415, 0x0000 }, { 23415, 0x0000 }, { 23415, 0x0000 }, /* 0x20E00 */ { 23415, 0xE610 }, { 23421, 0x2043 }, { 23425, 0x0000 }, { 23425, 0x0000 }, { 23425, 0x1000 }, { 23426, 0x0000 }, { 23426, 0x2000 }, { 23427, 0x0FE8 }, { 23435, 0x1000 }, { 23436, 0x2140 }, { 23439, 0x1C04 }, { 23443, 0x0040 }, { 23444, 0x0000 }, { 23444, 0x2180 }, { 23447, 0x0000 }, { 23447, 0x0F00 }, /* 0x20F00 */ { 23451, 0x0000 }, { 23451, 0x2000 }, { 23452, 0x6040 }, { 23455, 0x0803 }, { 23458, 0x1000 }, { 23459, 0x0000 }, { 23459, 0x0010 }, { 23460, 0x0000 }, { 23460, 0x2000 }, { 23461, 0x0001 }, { 23462, 0x2000 }, { 23463, 0x1070 }, { 23467, 0x0000 }, { 23467, 0x8000 }, { 23468, 0x3C00 }, { 23472, 0x0000 }, /* 0x21000 */ { 23472, 0x0000 }, { 23472, 0x6010 }, { 23475, 0x0000 }, { 23475, 0x0000 }, { 23475, 0x8000 }, { 23476, 0x1000 }, { 23477, 0x8000 }, { 23478, 0x09E0 }, { 23483, 0x0100 }, { 23484, 0x2040 }, { 23486, 0x0000 }, { 23486, 0x8010 }, { 23488, 0x8383 }, { 23494, 0x0008 }, { 23495, 0x0010 }, { 23496, 0x0070 }, /* 0x21100 */ { 23499, 0x0000 }, { 23499, 0x0000 }, { 23499, 0x8000 }, { 23500, 0x2800 }, { 23502, 0x8120 }, { 23505, 0x0000 }, { 23505, 0x0000 }, { 23505, 0x0000 }, { 23505, 0x0081 }, { 23507, 0x0000 }, { 23507, 0x0000 }, { 23507, 0x0000 }, { 23507, 0x0000 }, { 23507, 0x0200 }, { 23508, 0x0000 }, { 23508, 0x0000 }, /* 0x21200 */ { 23508, 0x0000 }, { 23508, 0x0000 }, { 23508, 0x0000 }, { 23508, 0x1000 }, { 23509, 0x8000 }, { 23510, 0x0000 }, { 23510, 0x0000 }, { 23510, 0x1000 }, { 23511, 0x0000 }, { 23511, 0x0000 }, { 23511, 0x0300 }, { 23513, 0x0001 }, { 23514, 0x0000 }, { 23514, 0x0000 }, { 23514, 0x0008 }, { 23515, 0x4000 }, /* 0x21300 */ { 23516, 0x003C }, { 23520, 0x0000 }, { 23520, 0x0000 }, { 23520, 0x0440 }, { 23522, 0x0000 }, { 23522, 0x0000 }, { 23522, 0x0000 }, { 23522, 0x0060 }, { 23524, 0x4000 }, { 23525, 0x1100 }, { 23527, 0x0000 }, { 23527, 0x0000 }, { 23527, 0x0060 }, { 23529, 0x0000 }, { 23529, 0x2000 }, { 23530, 0x4000 }, /* 0x21400 */ { 23531, 0x0000 }, { 23531, 0x0048 }, { 23533, 0x0010 }, { 23534, 0x8000 }, { 23535, 0x0000 }, { 23535, 0x0034 }, { 23538, 0x0000 }, { 23538, 0x0000 }, { 23538, 0x0400 }, { 23539, 0x0080 }, { 23540, 0x0000 }, { 23540, 0x0040 }, { 23541, 0x0000 }, { 23541, 0x0000 }, { 23541, 0x0100 }, { 23542, 0x2000 }, /* 0x21500 */ { 23543, 0x0000 }, { 23543, 0x0000 }, { 23543, 0x0000 }, { 23543, 0x0000 }, { 23543, 0x0000 }, { 23543, 0x0000 }, { 23543, 0x0000 }, { 23543, 0x0080 }, { 23544, 0x0004 }, { 23545, 0x0040 }, { 23546, 0x0000 }, { 23546, 0x0000 }, { 23546, 0x0000 }, { 23546, 0x0000 }, { 23546, 0x0000 }, { 23546, 0x0000 }, /* 0x21600 */ { 23546, 0x0400 }, { 23547, 0x0208 }, { 23549, 0x0000 }, { 23549, 0x4000 }, { 23550, 0x0000 }, { 23550, 0x0000 }, { 23550, 0x0002 }, { 23551, 0x0000 }, { 23551, 0x0000 }, { 23551, 0x0004 }, { 23552, 0x0000 }, { 23552, 0x0500 }, { 23554, 0x0007 }, { 23557, 0x8028 }, { 23560, 0x01C0 }, { 23563, 0x5C00 }, /* 0x21700 */ { 23567, 0x2000 }, { 23568, 0x0001 }, { 23569, 0x0040 }, { 23570, 0x1C00 }, { 23573, 0x0000 }, { 23573, 0x0080 }, { 23574, 0xF000 }, { 23578, 0x001B }, { 23582, 0x0000 }, { 23582, 0x0000 }, { 23582, 0x0800 }, { 23583, 0x003F }, { 23589, 0x0088 }, { 23591, 0x9E00 }, { 23596, 0x8000 }, { 23597, 0x1F60 }, /* 0x21800 */ { 23604, 0x0000 }, { 23604, 0x0000 }, { 23604, 0x2701 }, { 23609, 0x0E00 }, { 23612, 0x0021 }, { 23614, 0x4004 }, { 23616, 0x001E }, { 23620, 0x0880 }, { 23622, 0x0038 }, { 23625, 0xC000 }, { 23627, 0x0007 }, { 23630, 0xC000 }, { 23632, 0x0000 }, { 23632, 0x03C2 }, { 23637, 0x0000 }, { 23637, 0x0400 }, /* 0x21900 */ { 23638, 0x0038 }, { 23641, 0x1027 }, { 23646, 0x0084 }, { 23648, 0x0800 }, { 23649, 0x0010 }, { 23650, 0x0100 }, { 23651, 0x0400 }, { 23652, 0x1000 }, { 23653, 0x0109 }, { 23656, 0x0040 }, { 23657, 0x0000 }, { 23657, 0x0000 }, { 23657, 0x0000 }, { 23657, 0x0800 }, { 23658, 0x0000 }, { 23658, 0x0008 }, /* 0x21A00 */ { 23659, 0x0000 }, { 23659, 0x0000 }, { 23659, 0x2000 }, { 23660, 0x0010 }, { 23661, 0x0820 }, { 23663, 0x0000 }, { 23663, 0x0000 }, { 23663, 0x0000 }, { 23663, 0x0000 }, { 23663, 0x0000 }, { 23663, 0x0000 }, { 23663, 0x0000 }, { 23663, 0x0000 }, { 23663, 0x0000 }, { 23663, 0x0000 }, { 23663, 0x0000 }, /* 0x21B00 */ { 23663, 0x0000 }, { 23663, 0x0000 }, { 23663, 0x0000 }, { 23663, 0x0000 }, { 23663, 0x0010 }, { 23664, 0x0000 }, { 23664, 0x0000 }, { 23664, 0x0000 }, { 23664, 0x0000 }, { 23664, 0x0000 }, { 23664, 0x0000 }, { 23664, 0x0000 }, { 23664, 0x0006 }, { 23666, 0x0000 }, { 23666, 0x0000 }, { 23666, 0x0000 }, /* 0x21C00 */ { 23666, 0x0000 }, { 23666, 0x0000 }, { 23666, 0x0400 }, { 23667, 0x0000 }, { 23667, 0x0000 }, { 23667, 0x0000 }, { 23667, 0x0000 }, { 23667, 0x0001 }, { 23668, 0x0000 }, { 23668, 0x0000 }, { 23668, 0x1024 }, { 23671, 0x0000 }, { 23671, 0x0000 }, { 23671, 0x0000 }, { 23671, 0x0000 }, { 23671, 0x0000 }, /* 0x21D00 */ { 23671, 0x0000 }, { 23671, 0x0000 }, { 23671, 0x0000 }, { 23671, 0x0000 }, { 23671, 0x0040 }, { 23672, 0x0000 }, { 23672, 0x0000 }, { 23672, 0x0000 }, { 23672, 0x0000 }, { 23672, 0x0001 }, { 23673, 0x0000 }, { 23673, 0x0440 }, { 23675, 0x0400 }, { 23676, 0x0002 }, { 23677, 0x0800 }, { 23678, 0x0200 }, /* 0x21E00 */ { 23679, 0x0000 }, { 23679, 0x1000 }, { 23680, 0x0000 }, { 23680, 0x2080 }, { 23682, 0x0000 }, { 23682, 0x0000 }, { 23682, 0x0000 }, { 23682, 0x0000 }, { 23682, 0x0200 }, { 23683, 0x0000 }, { 23683, 0x0110 }, { 23685, 0x0000 }, { 23685, 0x0100 }, { 23686, 0x0020 }, { 23687, 0x0000 }, { 23687, 0x0000 }, /* 0x21F00 */ { 23687, 0x8000 }, { 23688, 0x0020 }, { 23689, 0x0000 }, { 23689, 0x0000 }, { 23689, 0x0000 }, { 23689, 0x0000 }, { 23689, 0x0400 }, { 23690, 0x0000 }, { 23690, 0x0000 }, { 23690, 0x4000 }, { 23691, 0x0002 }, { 23692, 0x0000 }, { 23692, 0x0000 }, { 23692, 0x0000 }, { 23692, 0x0100 }, { 23693, 0x0000 }, /* 0x22000 */ { 23693, 0x0000 }, { 23693, 0x0000 }, { 23693, 0x0000 }, { 23693, 0x0000 }, { 23693, 0x0220 }, { 23695, 0x0000 }, { 23695, 0x0000 }, { 23695, 0x4000 }, { 23696, 0x0000 }, { 23696, 0x0400 }, { 23697, 0x0000 }, { 23697, 0x0000 }, { 23697, 0x0080 }, { 23698, 0x0000 }, { 23698, 0x0000 }, { 23698, 0x1000 }, /* 0x22100 */ { 23699, 0x0000 }, { 23699, 0x0000 }, { 23699, 0x0400 }, { 23700, 0x0000 }, { 23700, 0x0000 }, { 23700, 0x0800 }, { 23701, 0x0000 }, { 23701, 0x0408 }, { 23703, 0x0000 }, { 23703, 0x0000 }, { 23703, 0x0002 }, { 23704, 0x0000 }, { 23704, 0x0008 }, { 23705, 0x0000 }, { 23705, 0x0000 }, { 23705, 0x0000 }, /* 0x22200 */ { 23705, 0x0100 }, { 23706, 0x0000 }, { 23706, 0x0000 }, { 23706, 0x0000 }, { 23706, 0x0000 }, { 23706, 0x0000 }, { 23706, 0x0000 }, { 23706, 0x1000 }, { 23707, 0x0000 }, { 23707, 0x0000 }, { 23707, 0x0000 }, { 23707, 0x0000 }, { 23707, 0x0000 }, { 23707, 0x0000 }, { 23707, 0x0000 }, { 23707, 0x0000 }, /* 0x22300 */ { 23707, 0x0000 }, { 23707, 0x0000 }, { 23707, 0x0022 }, { 23709, 0x0000 }, { 23709, 0x0000 }, { 23709, 0x0000 }, { 23709, 0x0000 }, { 23709, 0x0000 }, { 23709, 0x0000 }, { 23709, 0x0000 }, { 23709, 0x0000 }, { 23709, 0x2000 }, { 23710, 0x0000 }, { 23710, 0x0081 }, { 23712, 0x0000 }, { 23712, 0x0400 }, /* 0x22400 */ { 23713, 0x0000 }, { 23713, 0x0000 }, { 23713, 0x0000 }, { 23713, 0x0000 }, { 23713, 0x0000 }, { 23713, 0x0000 }, { 23713, 0x0020 }, { 23714, 0x0002 }, { 23715, 0x0800 }, { 23716, 0x0002 }, { 23717, 0x0000 }, { 23717, 0x0001 }, { 23718, 0x0000 }, { 23718, 0x0000 }, { 23718, 0x2000 }, { 23719, 0x0000 }, /* 0x22500 */ { 23719, 0x0000 }, { 23719, 0x0808 }, { 23721, 0x0000 }, { 23721, 0x0001 }, { 23722, 0x0000 }, { 23722, 0x0010 }, { 23723, 0x0000 }, { 23723, 0x0000 }, { 23723, 0x2000 }, { 23724, 0x0000 }, { 23724, 0x8000 }, { 23725, 0x4000 }, { 23726, 0x0000 }, { 23726, 0x0000 }, { 23726, 0x0000 }, { 23726, 0x0000 }, /* 0x22600 */ { 23726, 0x0000 }, { 23726, 0x1800 }, { 23728, 0x0800 }, { 23729, 0x0000 }, { 23729, 0x0000 }, { 23729, 0x0000 }, { 23729, 0x0100 }, { 23730, 0x0400 }, { 23731, 0x0000 }, { 23731, 0x0140 }, { 23733, 0x0000 }, { 23733, 0x0000 }, { 23733, 0x0000 }, { 23733, 0x0000 }, { 23733, 0x0000 }, { 23733, 0x0070 }, /* 0x22700 */ { 23736, 0x0000 }, { 23736, 0x8814 }, { 23740, 0x0400 }, { 23741, 0x0000 }, { 23741, 0x0000 }, { 23741, 0x0000 }, { 23741, 0x0000 }, { 23741, 0x0020 }, { 23742, 0x0002 }, { 23743, 0x0000 }, { 23743, 0x0000 }, { 23743, 0x0030 }, { 23745, 0x2000 }, { 23746, 0x0000 }, { 23746, 0x0000 }, { 23746, 0x0000 }, /* 0x22800 */ { 23746, 0x0008 }, { 23747, 0x0000 }, { 23747, 0x0000 }, { 23747, 0x0000 }, { 23747, 0x0000 }, { 23747, 0x8000 }, { 23748, 0x0001 }, { 23749, 0x0002 }, { 23750, 0x0000 }, { 23750, 0x0000 }, { 23750, 0x2000 }, { 23751, 0x0000 }, { 23751, 0x0002 }, { 23752, 0x0000 }, { 23752, 0x0000 }, { 23752, 0x0080 }, /* 0x22900 */ { 23753, 0x0000 }, { 23753, 0x0000 }, { 23753, 0x0040 }, { 23754, 0x0200 }, { 23755, 0x8000 }, { 23756, 0x0000 }, { 23756, 0x0880 }, { 23758, 0x0000 }, { 23758, 0x0001 }, { 23759, 0x0008 }, { 23760, 0x0000 }, { 23760, 0x0000 }, { 23760, 0x0000 }, { 23760, 0x0000 }, { 23760, 0x0000 }, { 23760, 0x0000 }, /* 0x22A00 */ { 23760, 0x0000 }, { 23760, 0x0000 }, { 23760, 0x0000 }, { 23760, 0x0000 }, { 23760, 0x0000 }, { 23760, 0x0000 }, { 23760, 0x0040 }, { 23761, 0x0000 }, { 23761, 0x0000 }, { 23761, 0x0000 }, { 23761, 0x0000 }, { 23761, 0x0000 }, { 23761, 0x8000 }, { 23762, 0x0020 }, { 23763, 0x0140 }, { 23765, 0x0000 }, /* 0x22B00 */ { 23765, 0x4000 }, { 23766, 0x0000 }, { 23766, 0x0004 }, { 23767, 0x8000 }, { 23768, 0x0008 }, { 23769, 0x0000 }, { 23769, 0x0400 }, { 23770, 0x0000 }, { 23770, 0x0000 }, { 23770, 0x0000 }, { 23770, 0x0000 }, { 23770, 0x0000 }, { 23770, 0x4400 }, { 23772, 0x0000 }, { 23772, 0x0000 }, { 23772, 0x0000 }, /* 0x22C00 */ { 23772, 0x0000 }, { 23772, 0x0000 }, { 23772, 0x00C0 }, { 23774, 0x0100 }, { 23775, 0x1000 }, { 23776, 0x0022 }, { 23778, 0x0004 }, { 23779, 0x0000 }, { 23779, 0x0100 }, { 23780, 0x0800 }, { 23781, 0x0202 }, { 23783, 0x0084 }, { 23785, 0x0244 }, { 23788, 0x0000 }, { 23788, 0x0000 }, { 23788, 0x0000 }, /* 0x22D00 */ { 23788, 0x0180 }, { 23790, 0x0004 }, { 23791, 0x0000 }, { 23791, 0x0000 }, { 23791, 0x1010 }, { 23793, 0x0000 }, { 23793, 0x0080 }, { 23794, 0x0000 }, { 23794, 0x2000 }, { 23795, 0x0020 }, { 23796, 0x0019 }, { 23799, 0x0080 }, { 23800, 0x0000 }, { 23800, 0x0000 }, { 23800, 0x4000 }, { 23801, 0x0000 }, /* 0x22E00 */ { 23801, 0x2000 }, { 23802, 0x0000 }, { 23802, 0x0000 }, { 23802, 0x0040 }, { 23803, 0x0004 }, { 23804, 0x0000 }, { 23804, 0x0000 }, { 23804, 0x0100 }, { 23805, 0x0800 }, { 23806, 0x0000 }, { 23806, 0x0000 }, { 23806, 0x0008 }, { 23807, 0x0000 }, { 23807, 0x0000 }, { 23807, 0x8000 }, { 23808, 0x0000 }, /* 0x22F00 */ { 23808, 0x0000 }, { 23808, 0x0000 }, { 23808, 0x0000 }, { 23808, 0x0000 }, { 23808, 0x0000 }, { 23808, 0x0000 }, { 23808, 0x0000 }, { 23808, 0x0010 }, { 23809, 0x0000 }, { 23809, 0x0000 }, { 23809, 0x0000 }, { 23809, 0x0000 }, { 23809, 0x1000 }, { 23810, 0x0000 }, { 23810, 0x0008 }, { 23811, 0x0000 }, /* 0x23000 */ { 23811, 0x0000 }, { 23811, 0x0000 }, { 23811, 0x0000 }, { 23811, 0x0008 }, { 23812, 0x0810 }, { 23814, 0x0000 }, { 23814, 0x0040 }, { 23815, 0x6000 }, { 23817, 0x4000 }, { 23818, 0x0000 }, { 23818, 0x0000 }, { 23818, 0x1080 }, { 23820, 0x0000 }, { 23820, 0x0400 }, { 23821, 0x0000 }, { 23821, 0x0000 }, /* 0x23100 */ { 23821, 0x0008 }, { 23822, 0x0000 }, { 23822, 0x0000 }, { 23822, 0x2000 }, { 23823, 0x0000 }, { 23823, 0x0000 }, { 23823, 0x0000 }, { 23823, 0x2000 }, { 23824, 0x0004 }, { 23825, 0x0000 }, { 23825, 0x0030 }, { 23827, 0x0008 }, { 23828, 0x0300 }, { 23830, 0x0000 }, { 23830, 0x0000 }, { 23830, 0x0380 }, /* 0x23200 */ { 23833, 0x8000 }, { 23834, 0x0000 }, { 23834, 0x8020 }, { 23836, 0x001E }, { 23840, 0x0000 }, { 23840, 0x0000 }, { 23840, 0x0004 }, { 23841, 0x0000 }, { 23841, 0x0602 }, { 23844, 0x0000 }, { 23844, 0x3800 }, { 23847, 0x0000 }, { 23847, 0x0000 }, { 23847, 0x0004 }, { 23848, 0x0003 }, { 23850, 0x0000 }, /* 0x23300 */ { 23850, 0x0401 }, { 23852, 0x8000 }, { 23853, 0x0000 }, { 23853, 0x0000 }, { 23853, 0x0000 }, { 23853, 0x0000 }, { 23853, 0x0000 }, { 23853, 0x0000 }, { 23853, 0x0000 }, { 23853, 0x0000 }, { 23853, 0x0000 }, { 23853, 0x0010 }, { 23854, 0x1000 }, { 23855, 0x4000 }, { 23856, 0x0040 }, { 23857, 0x4630 }, /* 0x23400 */ { 23862, 0x0001 }, { 23863, 0x0000 }, { 23863, 0x0000 }, { 23863, 0x8000 }, { 23864, 0x0000 }, { 23864, 0x0001 }, { 23865, 0x8000 }, { 23866, 0x0004 }, { 23867, 0x0000 }, { 23867, 0x0000 }, { 23867, 0x0000 }, { 23867, 0x0000 }, { 23867, 0x0000 }, { 23867, 0x0000 }, { 23867, 0x0020 }, { 23868, 0x0000 }, /* 0x23500 */ { 23868, 0x0000 }, { 23868, 0x0200 }, { 23869, 0x0000 }, { 23869, 0x0001 }, { 23870, 0x0000 }, { 23870, 0x0400 }, { 23871, 0x0080 }, { 23872, 0x0000 }, { 23872, 0x0000 }, { 23872, 0x1220 }, { 23875, 0x0000 }, { 23875, 0x0000 }, { 23875, 0xE000 }, { 23878, 0x0000 }, { 23878, 0x0000 }, { 23878, 0x0008 }, /* 0x23600 */ { 23879, 0x0001 }, { 23880, 0x0400 }, { 23881, 0x0000 }, { 23881, 0x1000 }, { 23882, 0x0001 }, { 23883, 0x8200 }, { 23885, 0x0000 }, { 23885, 0x0080 }, { 23886, 0x0000 }, { 23886, 0x0000 }, { 23886, 0x2040 }, { 23888, 0x0400 }, { 23889, 0x0000 }, { 23889, 0x8000 }, { 23890, 0x4000 }, { 23891, 0x0000 }, /* 0x23700 */ { 23891, 0x0008 }, { 23892, 0x0040 }, { 23893, 0xA001 }, { 23896, 0x8000 }, { 23897, 0x0000 }, { 23897, 0x0000 }, { 23897, 0x0040 }, { 23898, 0x0000 }, { 23898, 0x0002 }, { 23899, 0x0000 }, { 23899, 0x0004 }, { 23900, 0x1000 }, { 23901, 0x0004 }, { 23902, 0x00E0 }, { 23905, 0x0000 }, { 23905, 0x0000 }, /* 0x23800 */ { 23905, 0x0000 }, { 23905, 0x0000 }, { 23905, 0x0000 }, { 23905, 0x0400 }, { 23906, 0x0000 }, { 23906, 0x0000 }, { 23906, 0x0000 }, { 23906, 0x0000 }, { 23906, 0x0000 }, { 23906, 0x0000 }, { 23906, 0x0000 }, { 23906, 0x0000 }, { 23906, 0x0000 }, { 23906, 0x0000 }, { 23906, 0x0000 }, { 23906, 0x0000 }, /* 0x23900 */ { 23906, 0x0000 }, { 23906, 0x0000 }, { 23906, 0x0000 }, { 23906, 0x0000 }, { 23906, 0x0000 }, { 23906, 0x0000 }, { 23906, 0x0000 }, { 23906, 0x0000 }, { 23906, 0x0000 }, { 23906, 0x0000 }, { 23906, 0x0000 }, { 23906, 0x0000 }, { 23906, 0x0004 }, { 23907, 0x0000 }, { 23907, 0x0000 }, { 23907, 0x0000 }, /* 0x23A00 */ { 23907, 0x0000 }, { 23907, 0x0000 }, { 23907, 0x0000 }, { 23907, 0x0000 }, { 23907, 0x0000 }, { 23907, 0x0000 }, { 23907, 0x0000 }, { 23907, 0x0000 }, { 23907, 0x0000 }, { 23907, 0x0000 }, { 23907, 0x0080 }, { 23908, 0x0000 }, { 23908, 0x0000 }, { 23908, 0x0800 }, { 23909, 0x4000 }, { 23910, 0x0400 }, /* 0x23B00 */ { 23911, 0x0000 }, { 23911, 0x0000 }, { 23911, 0x0000 }, { 23911, 0x0000 }, { 23911, 0x0000 }, { 23911, 0x0400 }, { 23912, 0x0000 }, { 23912, 0x0000 }, { 23912, 0x0000 }, { 23912, 0x0000 }, { 23912, 0x0000 }, { 23912, 0x0000 }, { 23912, 0x0000 }, { 23912, 0x0000 }, { 23912, 0x0000 }, { 23912, 0x0000 }, /* 0x23C00 */ { 23912, 0x0000 }, { 23912, 0x0000 }, { 23912, 0x0000 }, { 23912, 0x0000 }, { 23912, 0x0000 }, { 23912, 0x0000 }, { 23912, 0x0008 }, { 23913, 0x0000 }, { 23913, 0x0000 }, { 23913, 0x0E00 }, { 23916, 0x0000 }, { 23916, 0x00A0 }, { 23918, 0x0380 }, { 23921, 0x0000 }, { 23921, 0x0000 }, { 23921, 0xF000 }, /* 0x23D00 */ { 23925, 0x0000 }, { 23925, 0x0000 }, { 23925, 0x0000 }, { 23925, 0x0000 }, { 23925, 0x0001 }, { 23926, 0x0800 }, { 23927, 0x0000 }, { 23927, 0x4000 }, { 23928, 0x8000 }, { 23929, 0x0000 }, { 23929, 0x0000 }, { 23929, 0x3FC0 }, { 23937, 0x0000 }, { 23937, 0x0000 }, { 23937, 0x0008 }, { 23938, 0x0100 }, /* 0x23E00 */ { 23939, 0x0000 }, { 23939, 0x0002 }, { 23940, 0xF000 }, { 23944, 0x0203 }, { 23947, 0x0000 }, { 23947, 0x0000 }, { 23947, 0x0000 }, { 23947, 0x0000 }, { 23947, 0x0F00 }, { 23951, 0x0000 }, { 23951, 0x0000 }, { 23951, 0x8200 }, { 23953, 0x0000 }, { 23953, 0x0080 }, { 23954, 0x0000 }, { 23954, 0x1F80 }, /* 0x23F00 */ { 23960, 0x0000 }, { 23960, 0x0000 }, { 23960, 0x0000 }, { 23960, 0x0020 }, { 23961, 0x0402 }, { 23963, 0x0000 }, { 23963, 0x0000 }, { 23963, 0x8000 }, { 23964, 0x8007 }, { 23968, 0x0000 }, { 23968, 0x0000 }, { 23968, 0x0090 }, { 23970, 0x0021 }, { 23972, 0x0000 }, { 23972, 0xF800 }, { 23977, 0x0001 }, /* 0x24000 */ { 23978, 0x0000 }, { 23978, 0x0002 }, { 23979, 0x0000 }, { 23979, 0x3E00 }, { 23984, 0x0000 }, { 23984, 0x0080 }, { 23985, 0x0000 }, { 23985, 0x0000 }, { 23985, 0x3820 }, { 23989, 0x0002 }, { 23990, 0x0000 }, { 23990, 0x0000 }, { 23990, 0x0200 }, { 23991, 0x0000 }, { 23991, 0x0002 }, { 23992, 0x0000 }, /* 0x24100 */ { 23992, 0x8010 }, { 23994, 0x0200 }, { 23995, 0x0000 }, { 23995, 0x8000 }, { 23996, 0x4011 }, { 23999, 0x90E0 }, { 24004, 0x0000 }, { 24004, 0x0480 }, { 24006, 0x0000 }, { 24006, 0x0000 }, { 24006, 0x1038 }, { 24010, 0x0020 }, { 24011, 0x2000 }, { 24012, 0x0000 }, { 24012, 0x0004 }, { 24013, 0x1000 }, /* 0x24200 */ { 24014, 0x0000 }, { 24014, 0x0800 }, { 24015, 0x0000 }, { 24015, 0x0000 }, { 24015, 0x0800 }, { 24016, 0x0240 }, { 24018, 0x0000 }, { 24018, 0x01C0 }, { 24021, 0x0010 }, { 24022, 0x0028 }, { 24024, 0x0020 }, { 24025, 0x0000 }, { 24025, 0x0602 }, { 24028, 0x0000 }, { 24028, 0x4000 }, { 24029, 0x0400 }, /* 0x24300 */ { 24030, 0x2000 }, { 24031, 0x0400 }, { 24032, 0x0000 }, { 24032, 0x0010 }, { 24033, 0x0100 }, { 24034, 0x0000 }, { 24034, 0x003C }, { 24038, 0x0000 }, { 24038, 0x1000 }, { 24039, 0x1040 }, { 24041, 0x0000 }, { 24041, 0x2000 }, { 24042, 0x0002 }, { 24043, 0x0000 }, { 24043, 0x0600 }, { 24045, 0x0104 }, /* 0x24400 */ { 24047, 0x0010 }, { 24048, 0x0000 }, { 24048, 0x0000 }, { 24048, 0x0060 }, { 24050, 0x0000 }, { 24050, 0x0C00 }, { 24052, 0x0000 }, { 24052, 0x0008 }, { 24053, 0x0180 }, { 24055, 0x0000 }, { 24055, 0x0000 }, { 24055, 0x1200 }, { 24057, 0x4000 }, { 24058, 0x0048 }, { 24060, 0x0000 }, { 24060, 0x0000 }, /* 0x24500 */ { 24060, 0x0020 }, { 24061, 0x0000 }, { 24061, 0x0002 }, { 24062, 0x0000 }, { 24062, 0x0000 }, { 24062, 0x0000 }, { 24062, 0x0000 }, { 24062, 0x0100 }, { 24063, 0x0000 }, { 24063, 0x0000 }, { 24063, 0x0000 }, { 24063, 0x0000 }, { 24063, 0x0100 }, { 24064, 0x0000 }, { 24064, 0x0000 }, { 24064, 0x0000 }, /* 0x24600 */ { 24064, 0x0000 }, { 24064, 0x0100 }, { 24065, 0x0400 }, { 24066, 0x0000 }, { 24066, 0x0000 }, { 24066, 0x0000 }, { 24066, 0x0020 }, { 24067, 0x0010 }, { 24068, 0x0000 }, { 24068, 0x0080 }, { 24069, 0x0000 }, { 24069, 0x0000 }, { 24069, 0x0000 }, { 24069, 0x0010 }, { 24070, 0x0000 }, { 24070, 0x0000 }, /* 0x24700 */ { 24070, 0x0040 }, { 24071, 0x0000 }, { 24071, 0x8020 }, { 24073, 0x0000 }, { 24073, 0x0000 }, { 24073, 0x0000 }, { 24073, 0x0000 }, { 24073, 0x0000 }, { 24073, 0x8000 }, { 24074, 0x0000 }, { 24074, 0x0000 }, { 24074, 0x0000 }, { 24074, 0x0000 }, { 24074, 0x0000 }, { 24074, 0x0001 }, { 24075, 0x0000 }, /* 0x24800 */ { 24075, 0x0000 }, { 24075, 0x0004 }, { 24076, 0x0008 }, { 24077, 0x0000 }, { 24077, 0x0000 }, { 24077, 0x0000 }, { 24077, 0x0000 }, { 24077, 0x0000 }, { 24077, 0x0004 }, { 24078, 0x0000 }, { 24078, 0x0000 }, { 24078, 0x0000 }, { 24078, 0x0000 }, { 24078, 0x0000 }, { 24078, 0x0200 }, { 24079, 0x880F }, /* 0x24900 */ { 24085, 0x1003 }, { 24088, 0x02C0 }, { 24091, 0x8000 }, { 24092, 0xC018 }, { 24096, 0x000F }, { 24100, 0x0000 }, { 24100, 0x000C }, { 24102, 0x8870 }, { 24107, 0xFF04 }, { 24116, 0x0010 }, { 24117, 0x3A90 }, { 24123, 0x0F80 }, { 24128, 0x0020 }, { 24129, 0xC401 }, { 24133, 0x3028 }, { 24137, 0x0BC0 }, /* 0x24A00 */ { 24142, 0x4000 }, { 24143, 0x002C }, { 24146, 0x07FE }, { 24156, 0x4000 }, { 24157, 0xC424 }, { 24162, 0x2003 }, { 24165, 0x00E0 }, { 24168, 0x0782 }, { 24173, 0x1000 }, { 24174, 0x0078 }, { 24178, 0x00F0 }, { 24182, 0x1C0E }, { 24188, 0x0481 }, { 24191, 0x8002 }, { 24193, 0x0204 }, { 24195, 0x0000 }, /* 0x24B00 */ { 24195, 0x0000 }, { 24195, 0x0000 }, { 24195, 0x0000 }, { 24195, 0x0000 }, { 24195, 0x0000 }, { 24195, 0x0000 }, { 24195, 0x4000 }, { 24196, 0x0000 }, { 24196, 0x0000 }, { 24196, 0x0000 }, { 24196, 0x0000 }, { 24196, 0x0000 }, { 24196, 0x0000 }, { 24196, 0x0000 }, { 24196, 0x0000 }, { 24196, 0x0020 }, /* 0x24C00 */ { 24197, 0x0200 }, { 24198, 0x0000 }, { 24198, 0x0000 }, { 24198, 0x0000 }, { 24198, 0x0000 }, { 24198, 0x0000 }, { 24198, 0x0000 }, { 24198, 0x0000 }, { 24198, 0x0000 }, { 24198, 0xC000 }, { 24200, 0x0000 }, { 24200, 0x0000 }, { 24200, 0x0200 }, { 24201, 0x0200 }, { 24202, 0x0000 }, { 24202, 0x0000 }, /* 0x24D00 */ { 24202, 0x0040 }, { 24203, 0x0008 }, { 24204, 0x0000 }, { 24204, 0x0000 }, { 24204, 0x0000 }, { 24204, 0x0000 }, { 24204, 0x0000 }, { 24204, 0x0000 }, { 24204, 0x0000 }, { 24204, 0x0000 }, { 24204, 0x0000 }, { 24204, 0x0100 }, { 24205, 0x0000 }, { 24205, 0x0000 }, { 24205, 0x0C00 }, { 24207, 0x0000 }, /* 0x24E00 */ { 24207, 0x0000 }, { 24207, 0x0000 }, { 24207, 0x0000 }, { 24207, 0x0800 }, { 24208, 0x0000 }, { 24208, 0x0001 }, { 24209, 0x0000 }, { 24209, 0x0000 }, { 24209, 0x0000 }, { 24209, 0x0000 }, { 24209, 0x00A0 }, { 24211, 0x0000 }, { 24211, 0x0000 }, { 24211, 0x0000 }, { 24211, 0x0000 }, { 24211, 0x0000 }, /* 0x24F00 */ { 24211, 0x4000 }, { 24212, 0x0000 }, { 24212, 0x0000 }, { 24212, 0x0000 }, { 24212, 0x0000 }, { 24212, 0x1000 }, { 24213, 0x0000 }, { 24213, 0x0000 }, { 24213, 0x0044 }, { 24215, 0x0480 }, { 24217, 0x0200 }, { 24218, 0x0100 }, { 24219, 0x0004 }, { 24220, 0x0000 }, { 24220, 0x0000 }, { 24220, 0x0000 }, /* 0x25000 */ { 24220, 0x0000 }, { 24220, 0x0000 }, { 24220, 0x1000 }, { 24221, 0x0000 }, { 24221, 0x0000 }, { 24221, 0x0004 }, { 24222, 0x0000 }, { 24222, 0x0000 }, { 24222, 0x0000 }, { 24222, 0x2000 }, { 24223, 0x0000 }, { 24223, 0x0000 }, { 24223, 0x0000 }, { 24223, 0x0000 }, { 24223, 0x0000 }, { 24223, 0x0000 }, /* 0x25100 */ { 24223, 0x0000 }, { 24223, 0x0000 }, { 24223, 0x0800 }, { 24224, 0x0000 }, { 24224, 0x0100 }, { 24225, 0x0000 }, { 24225, 0x0000 }, { 24225, 0x6000 }, { 24227, 0x0000 }, { 24227, 0x0000 }, { 24227, 0x0000 }, { 24227, 0x0000 }, { 24227, 0x2000 }, { 24228, 0x0000 }, { 24228, 0x00C8 }, { 24231, 0x0000 }, /* 0x25200 */ { 24231, 0x0000 }, { 24231, 0x0000 }, { 24231, 0x0003 }, { 24233, 0x0000 }, { 24233, 0x0000 }, { 24233, 0x0001 }, { 24234, 0x0000 }, { 24234, 0x0000 }, { 24234, 0x0000 }, { 24234, 0x0200 }, { 24235, 0x0000 }, { 24235, 0x0000 }, { 24235, 0x0080 }, { 24236, 0x0100 }, { 24237, 0x0000 }, { 24237, 0x0000 }, /* 0x25300 */ { 24237, 0x4000 }, { 24238, 0x000A }, { 24240, 0x0000 }, { 24240, 0x0000 }, { 24240, 0x0000 }, { 24240, 0x0000 }, { 24240, 0x0000 }, { 24240, 0x0000 }, { 24240, 0x0000 }, { 24240, 0x0000 }, { 24240, 0x0000 }, { 24240, 0x0000 }, { 24240, 0x0000 }, { 24240, 0x0000 }, { 24240, 0x0000 }, { 24240, 0x0000 }, /* 0x25400 */ { 24240, 0x0000 }, { 24240, 0x0200 }, { 24241, 0x8020 }, { 24243, 0x0001 }, { 24244, 0x0040 }, { 24245, 0x0000 }, { 24245, 0x5000 }, { 24247, 0x0000 }, { 24247, 0x0000 }, { 24247, 0x0000 }, { 24247, 0x0000 }, { 24247, 0x0000 }, { 24247, 0x0000 }, { 24247, 0x0000 }, { 24247, 0x0000 }, { 24247, 0x0000 }, /* 0x25500 */ { 24247, 0x0000 }, { 24247, 0x0000 }, { 24247, 0x0000 }, { 24247, 0x8022 }, { 24250, 0x0000 }, { 24250, 0x7800 }, { 24254, 0x0064 }, { 24257, 0x0000 }, { 24257, 0x8012 }, { 24260, 0x0000 }, { 24260, 0x0000 }, { 24260, 0x0200 }, { 24261, 0x0000 }, { 24261, 0x0820 }, { 24263, 0x0001 }, { 24264, 0x0000 }, /* 0x25600 */ { 24264, 0x0020 }, { 24265, 0x0000 }, { 24265, 0x0000 }, { 24265, 0x0020 }, { 24266, 0x0000 }, { 24266, 0x0002 }, { 24267, 0x0000 }, { 24267, 0x0000 }, { 24267, 0x0008 }, { 24268, 0x0020 }, { 24269, 0x0000 }, { 24269, 0x0000 }, { 24269, 0x0000 }, { 24269, 0x0000 }, { 24269, 0x0008 }, { 24270, 0x0040 }, /* 0x25700 */ { 24271, 0x0040 }, { 24272, 0x2000 }, { 24273, 0x0020 }, { 24274, 0x2000 }, { 24275, 0x0000 }, { 24275, 0x0000 }, { 24275, 0x0000 }, { 24275, 0x0004 }, { 24276, 0x0000 }, { 24276, 0x0000 }, { 24276, 0x0000 }, { 24276, 0x0000 }, { 24276, 0x0080 }, { 24277, 0x8000 }, { 24278, 0x0003 }, { 24280, 0x0000 }, /* 0x25800 */ { 24280, 0x0000 }, { 24280, 0x0000 }, { 24280, 0x0000 }, { 24280, 0x0000 }, { 24280, 0x0000 }, { 24280, 0x2080 }, { 24282, 0x0000 }, { 24282, 0x0004 }, { 24283, 0x0000 }, { 24283, 0x0000 }, { 24283, 0x0000 }, { 24283, 0x0000 }, { 24283, 0x0100 }, { 24284, 0x0000 }, { 24284, 0x0002 }, { 24285, 0x0000 }, /* 0x25900 */ { 24285, 0x0008 }, { 24286, 0x0000 }, { 24286, 0x0000 }, { 24286, 0x0000 }, { 24286, 0x0040 }, { 24287, 0x0040 }, { 24288, 0x0000 }, { 24288, 0x0000 }, { 24288, 0x0000 }, { 24288, 0x0000 }, { 24288, 0x1000 }, { 24289, 0x0000 }, { 24289, 0x1000 }, { 24290, 0x0000 }, { 24290, 0x0000 }, { 24290, 0x0000 }, /* 0x25A00 */ { 24290, 0x0000 }, { 24290, 0x0000 }, { 24290, 0x0000 }, { 24290, 0x0000 }, { 24290, 0x0000 }, { 24290, 0x0000 }, { 24290, 0x0000 }, { 24290, 0x0000 }, { 24290, 0x0000 }, { 24290, 0x1020 }, { 24292, 0xC000 }, { 24294, 0x0000 }, { 24294, 0x0000 }, { 24294, 0x0000 }, { 24294, 0x0200 }, { 24295, 0x0000 }, /* 0x25B00 */ { 24295, 0x0000 }, { 24295, 0x0000 }, { 24295, 0x0000 }, { 24295, 0x0000 }, { 24295, 0x0000 }, { 24295, 0x0000 }, { 24295, 0x0000 }, { 24295, 0x0010 }, { 24296, 0x0200 }, { 24297, 0x0000 }, { 24297, 0x0000 }, { 24297, 0x0018 }, { 24299, 0x0040 }, { 24300, 0x0000 }, { 24300, 0x0110 }, { 24302, 0x0000 }, /* 0x25C00 */ { 24302, 0x0042 }, { 24304, 0x0000 }, { 24304, 0x0002 }, { 24305, 0x0000 }, { 24305, 0x0400 }, { 24306, 0x0000 }, { 24306, 0x0020 }, { 24307, 0x0000 }, { 24307, 0x0000 }, { 24307, 0x0002 }, { 24308, 0x0010 }, { 24309, 0x0000 }, { 24309, 0x0003 }, { 24311, 0x0000 }, { 24311, 0x0000 }, { 24311, 0x4000 }, /* 0x25D00 */ { 24312, 0x0000 }, { 24312, 0x0000 }, { 24312, 0x0001 }, { 24313, 0x0001 }, { 24314, 0x0008 }, { 24315, 0x0000 }, { 24315, 0x0000 }, { 24315, 0x0000 }, { 24315, 0x0000 }, { 24315, 0x0000 }, { 24315, 0x0000 }, { 24315, 0x0000 }, { 24315, 0x0000 }, { 24315, 0x0000 }, { 24315, 0x0000 }, { 24315, 0x0000 }, /* 0x25E00 */ { 24315, 0x4000 }, { 24316, 0x0000 }, { 24316, 0x0000 }, { 24316, 0x0000 }, { 24316, 0x0200 }, { 24317, 0x0000 }, { 24317, 0x0000 }, { 24317, 0x0000 }, { 24317, 0x000E }, { 24320, 0x0000 }, { 24320, 0x0040 }, { 24321, 0x1000 }, { 24322, 0x0000 }, { 24322, 0x0180 }, { 24324, 0x0000 }, { 24324, 0x0000 }, /* 0x25F00 */ { 24324, 0x0000 }, { 24324, 0x0400 }, { 24325, 0x0000 }, { 24325, 0x0000 }, { 24325, 0x0800 }, { 24326, 0x0000 }, { 24326, 0x0000 }, { 24326, 0x0000 }, { 24326, 0x0000 }, { 24326, 0x0000 }, { 24326, 0x0000 }, { 24326, 0x0000 }, { 24326, 0x0000 }, { 24326, 0x0000 }, { 24326, 0x0006 }, { 24328, 0x0000 }, /* 0x26000 */ { 24328, 0x0000 }, { 24328, 0x0000 }, { 24328, 0x0200 }, { 24329, 0x0000 }, { 24329, 0x0100 }, { 24330, 0x0000 }, { 24330, 0x0010 }, { 24331, 0x0000 }, { 24331, 0x0008 }, { 24332, 0x0080 }, { 24333, 0x0030 }, { 24335, 0x0000 }, { 24335, 0x0000 }, { 24335, 0x0000 }, { 24335, 0x0000 }, { 24335, 0x0000 }, /* 0x26100 */ { 24335, 0x0004 }, { 24336, 0x0000 }, { 24336, 0x0002 }, { 24337, 0x0000 }, { 24337, 0x0000 }, { 24337, 0x1E00 }, { 24341, 0x0000 }, { 24341, 0x0000 }, { 24341, 0x0000 }, { 24341, 0x0000 }, { 24341, 0x6000 }, { 24343, 0x0004 }, { 24344, 0x0000 }, { 24344, 0x2000 }, { 24345, 0x0000 }, { 24345, 0x0000 }, /* 0x26200 */ { 24345, 0x0000 }, { 24345, 0x0000 }, { 24345, 0x0000 }, { 24345, 0x0000 }, { 24345, 0x0000 }, { 24345, 0x0100 }, { 24346, 0x0C02 }, { 24349, 0x0000 }, { 24349, 0x0000 }, { 24349, 0x0000 }, { 24349, 0x0000 }, { 24349, 0x0000 }, { 24349, 0x0000 }, { 24349, 0x0001 }, { 24350, 0x0000 }, { 24350, 0x0000 }, /* 0x26300 */ { 24350, 0x0000 }, { 24350, 0x0000 }, { 24350, 0x0000 }, { 24350, 0x0020 }, { 24351, 0x1800 }, { 24353, 0x0002 }, { 24354, 0x0000 }, { 24354, 0x0000 }, { 24354, 0x0000 }, { 24354, 0x0000 }, { 24354, 0x0000 }, { 24354, 0x4000 }, { 24355, 0x0000 }, { 24355, 0x0000 }, { 24355, 0x0000 }, { 24355, 0x0120 }, /* 0x26400 */ { 24357, 0x0004 }, { 24358, 0x0007 }, { 24361, 0x0000 }, { 24361, 0x0000 }, { 24361, 0x0400 }, { 24362, 0x0000 }, { 24362, 0x0200 }, { 24363, 0x0000 }, { 24363, 0x2310 }, { 24367, 0x0100 }, { 24368, 0x0000 }, { 24368, 0x0000 }, { 24368, 0x0000 }, { 24368, 0x0000 }, { 24368, 0x0000 }, { 24368, 0x0000 }, /* 0x26500 */ { 24368, 0x0000 }, { 24368, 0x0004 }, { 24369, 0x0000 }, { 24369, 0x0000 }, { 24369, 0x0000 }, { 24369, 0x0000 }, { 24369, 0x0000 }, { 24369, 0x0004 }, { 24370, 0x0000 }, { 24370, 0x0000 }, { 24370, 0x2001 }, { 24372, 0x8000 }, { 24373, 0x0000 }, { 24373, 0x0000 }, { 24373, 0x0000 }, { 24373, 0x0000 }, /* 0x26600 */ { 24373, 0x0000 }, { 24373, 0x0004 }, { 24374, 0x0040 }, { 24375, 0x0000 }, { 24375, 0x0000 }, { 24375, 0x0000 }, { 24375, 0x0000 }, { 24375, 0x0000 }, { 24375, 0x0000 }, { 24375, 0x0000 }, { 24375, 0x8000 }, { 24376, 0x0022 }, { 24378, 0x0000 }, { 24378, 0x0400 }, { 24379, 0x0100 }, { 24380, 0x1000 }, /* 0x26700 */ { 24381, 0x0000 }, { 24381, 0x0040 }, { 24382, 0x0000 }, { 24382, 0x0000 }, { 24382, 0x0002 }, { 24383, 0x0000 }, { 24383, 0x0000 }, { 24383, 0x0000 }, { 24383, 0x0000 }, { 24383, 0x0200 }, { 24384, 0x0000 }, { 24384, 0x0018 }, { 24386, 0x1000 }, { 24387, 0x0000 }, { 24387, 0x0000 }, { 24387, 0x0000 }, /* 0x26800 */ { 24387, 0x0000 }, { 24387, 0x1000 }, { 24388, 0x0000 }, { 24388, 0x0000 }, { 24388, 0x0040 }, { 24389, 0x4000 }, { 24390, 0x4000 }, { 24391, 0x0000 }, { 24391, 0x0500 }, { 24393, 0x0008 }, { 24394, 0x0000 }, { 24394, 0x0000 }, { 24394, 0x0080 }, { 24395, 0x0000 }, { 24395, 0x0000 }, { 24395, 0x0000 }, /* 0x26900 */ { 24395, 0x4000 }, { 24396, 0x0002 }, { 24397, 0x0040 }, { 24398, 0x0200 }, { 24399, 0x0000 }, { 24399, 0x0002 }, { 24400, 0x0000 }, { 24400, 0x0000 }, { 24400, 0x0000 }, { 24400, 0x0000 }, { 24400, 0x0100 }, { 24401, 0x0020 }, { 24402, 0x0000 }, { 24402, 0x0000 }, { 24402, 0x0000 }, { 24402, 0x0404 }, /* 0x26A00 */ { 24404, 0x0000 }, { 24404, 0x0000 }, { 24404, 0x6000 }, { 24406, 0x0010 }, { 24407, 0x0004 }, { 24408, 0x0006 }, { 24410, 0x0000 }, { 24410, 0x0000 }, { 24410, 0x0000 }, { 24410, 0x0000 }, { 24410, 0x0000 }, { 24410, 0x0000 }, { 24410, 0x0000 }, { 24410, 0x0000 }, { 24410, 0x0000 }, { 24410, 0x0000 }, /* 0x26B00 */ { 24410, 0x0420 }, { 24412, 0x0028 }, { 24414, 0x0100 }, { 24415, 0x0000 }, { 24415, 0x0000 }, { 24415, 0x080F }, { 24420, 0x0000 }, { 24420, 0x0020 }, { 24421, 0x0004 }, { 24422, 0x20C0 }, { 24425, 0x0000 }, { 24425, 0x0008 }, { 24426, 0x0001 }, { 24427, 0x0000 }, { 24427, 0x0000 }, { 24427, 0x0080 }, /* 0x26C00 */ { 24428, 0x0000 }, { 24428, 0x0000 }, { 24428, 0x0002 }, { 24429, 0x0000 }, { 24429, 0x0001 }, { 24430, 0x0000 }, { 24430, 0x0000 }, { 24430, 0xC000 }, { 24432, 0x0007 }, { 24435, 0x0000 }, { 24435, 0x0010 }, { 24436, 0x2180 }, { 24439, 0x0009 }, { 24441, 0x0002 }, { 24442, 0x0000 }, { 24442, 0x0000 }, /* 0x26D00 */ { 24442, 0x0000 }, { 24442, 0x0000 }, { 24442, 0x07FC }, { 24451, 0x0000 }, { 24451, 0x0000 }, { 24451, 0x0002 }, { 24452, 0x0000 }, { 24452, 0x0010 }, { 24453, 0x0000 }, { 24453, 0x0000 }, { 24453, 0x40FF }, { 24462, 0x0000 }, { 24462, 0x0000 }, { 24462, 0x1000 }, { 24463, 0x0C00 }, { 24465, 0x0001 }, /* 0x26E00 */ { 24466, 0x00A1 }, { 24469, 0x0004 }, { 24470, 0x0000 }, { 24470, 0x0000 }, { 24470, 0x003C }, { 24474, 0x0000 }, { 24474, 0x4000 }, { 24475, 0x0084 }, { 24477, 0x0010 }, { 24478, 0x0200 }, { 24479, 0x0000 }, { 24479, 0x0000 }, { 24479, 0x0000 }, { 24479, 0x00FF }, { 24487, 0x0000 }, { 24487, 0x0000 }, /* 0x26F00 */ { 24487, 0x0000 }, { 24487, 0x0000 }, { 24487, 0x0040 }, { 24488, 0x0000 }, { 24488, 0x0000 }, { 24488, 0x0000 }, { 24488, 0x0000 }, { 24488, 0x0018 }, { 24490, 0x0000 }, { 24490, 0x8000 }, { 24491, 0x0002 }, { 24492, 0x4000 }, { 24493, 0x0000 }, { 24493, 0xC000 }, { 24495, 0x0000 }, { 24495, 0x0000 }, /* 0x27000 */ { 24495, 0x4000 }, { 24496, 0x0000 }, { 24496, 0x0000 }, { 24496, 0x0000 }, { 24496, 0x0800 }, { 24497, 0x000C }, { 24499, 0x0000 }, { 24499, 0x0000 }, { 24499, 0x0100 }, { 24500, 0x0000 }, { 24500, 0xE000 }, { 24503, 0x0000 }, { 24503, 0x2000 }, { 24504, 0x0000 }, { 24504, 0x0000 }, { 24504, 0x0100 }, /* 0x27100 */ { 24505, 0x3200 }, { 24508, 0x0000 }, { 24508, 0x00C0 }, { 24510, 0x0000 }, { 24510, 0x0000 }, { 24510, 0x0000 }, { 24510, 0x0030 }, { 24512, 0x0020 }, { 24513, 0x0000 }, { 24513, 0x0000 }, { 24513, 0x0000 }, { 24513, 0x0000 }, { 24513, 0x2000 }, { 24514, 0x0000 }, { 24514, 0x0000 }, { 24514, 0x0000 }, /* 0x27200 */ { 24514, 0x0000 }, { 24514, 0x0800 }, { 24515, 0x0000 }, { 24515, 0x0000 }, { 24515, 0x0000 }, { 24515, 0x0000 }, { 24515, 0x0000 }, { 24515, 0x0000 }, { 24515, 0x0821 }, { 24518, 0x0000 }, { 24518, 0x0000 }, { 24518, 0x0044 }, { 24520, 0x0000 }, { 24520, 0x0000 }, { 24520, 0x0040 }, { 24521, 0x0000 }, /* 0x27300 */ { 24521, 0x0000 }, { 24521, 0x0000 }, { 24521, 0x0000 }, { 24521, 0x0000 }, { 24521, 0x0000 }, { 24521, 0x0000 }, { 24521, 0x0000 }, { 24521, 0x0000 }, { 24521, 0x0000 }, { 24521, 0x0400 }, { 24522, 0x0000 }, { 24522, 0x0000 }, { 24522, 0x0000 }, { 24522, 0x0000 }, { 24522, 0x0000 }, { 24522, 0x0000 }, /* 0x27400 */ { 24522, 0x0000 }, { 24522, 0x0000 }, { 24522, 0x0004 }, { 24523, 0x0000 }, { 24523, 0x0000 }, { 24523, 0x0001 }, { 24524, 0x0000 }, { 24524, 0x0000 }, { 24524, 0x0050 }, { 24526, 0x0000 }, { 24526, 0x0000 }, { 24526, 0x0000 }, { 24526, 0x0000 }, { 24526, 0x0000 }, { 24526, 0x0000 }, { 24526, 0x0000 }, /* 0x27500 */ { 24526, 0x0000 }, { 24526, 0x0000 }, { 24526, 0x0000 }, { 24526, 0x0000 }, { 24526, 0x0000 }, { 24526, 0x0000 }, { 24526, 0x0000 }, { 24526, 0x0010 }, { 24527, 0x0000 }, { 24527, 0x0000 }, { 24527, 0x0008 }, { 24528, 0x0000 }, { 24528, 0x0000 }, { 24528, 0x0000 }, { 24528, 0x0011 }, { 24530, 0x6000 }, /* 0x27600 */ { 24532, 0x1080 }, { 24534, 0x0000 }, { 24534, 0x0000 }, { 24534, 0x0204 }, { 24536, 0x0000 }, { 24536, 0x00E0 }, { 24539, 0x0000 }, { 24539, 0x0000 }, { 24539, 0x0000 }, { 24539, 0x0010 }, { 24540, 0x0000 }, { 24540, 0x0000 }, { 24540, 0x0000 }, { 24540, 0x0000 }, { 24540, 0x0000 }, { 24540, 0x0000 }, /* 0x27700 */ { 24540, 0x8000 }, { 24541, 0x0000 }, { 24541, 0x0000 }, { 24541, 0x0060 }, { 24543, 0x0002 }, { 24544, 0x4000 }, { 24545, 0x0000 }, { 24545, 0x0000 }, { 24545, 0x0030 }, { 24547, 0x0000 }, { 24547, 0x0000 }, { 24547, 0x0000 }, { 24547, 0x1000 }, { 24548, 0x0000 }, { 24548, 0x0000 }, { 24548, 0x0000 }, /* 0x27800 */ { 24548, 0x0000 }, { 24548, 0x0000 }, { 24548, 0x0000 }, { 24548, 0x0000 }, { 24548, 0x0000 }, { 24548, 0x0100 }, { 24549, 0x0000 }, { 24549, 0x0001 }, { 24550, 0x0000 }, { 24550, 0x2000 }, { 24551, 0x0000 }, { 24551, 0x0004 }, { 24552, 0x0100 }, { 24553, 0x0000 }, { 24553, 0x0000 }, { 24553, 0x0000 }, /* 0x27900 */ { 24553, 0x0000 }, { 24553, 0x0000 }, { 24553, 0x0010 }, { 24554, 0x0000 }, { 24554, 0x0000 }, { 24554, 0x0000 }, { 24554, 0x0080 }, { 24555, 0x0400 }, { 24556, 0x0000 }, { 24556, 0x0000 }, { 24556, 0x0001 }, { 24557, 0x0000 }, { 24557, 0x0000 }, { 24557, 0x2000 }, { 24558, 0x0000 }, { 24558, 0x2000 }, /* 0x27A00 */ { 24559, 0x4400 }, { 24561, 0x0000 }, { 24561, 0x0000 }, { 24561, 0x4000 }, { 24562, 0x0000 }, { 24562, 0x0208 }, { 24564, 0x0000 }, { 24564, 0x0200 }, { 24565, 0x0010 }, { 24566, 0x0000 }, { 24566, 0x0000 }, { 24566, 0x6000 }, { 24568, 0x0000 }, { 24568, 0x0000 }, { 24568, 0x0000 }, { 24568, 0x0010 }, /* 0x27B00 */ { 24569, 0x0840 }, { 24571, 0x0100 }, { 24572, 0x0000 }, { 24572, 0x0700 }, { 24575, 0x0100 }, { 24576, 0x0000 }, { 24576, 0x0000 }, { 24576, 0x0000 }, { 24576, 0x0000 }, { 24576, 0x0000 }, { 24576, 0x0000 }, { 24576, 0x0000 }, { 24576, 0x0000 }, { 24576, 0x0000 }, { 24576, 0x0000 }, { 24576, 0x0010 }, /* 0x27C00 */ { 24577, 0x0000 }, { 24577, 0x0004 }, { 24578, 0x0000 }, { 24578, 0x0000 }, { 24578, 0x0000 }, { 24578, 0x0000 }, { 24578, 0x0000 }, { 24578, 0x0000 }, { 24578, 0x0000 }, { 24578, 0x0000 }, { 24578, 0x0000 }, { 24578, 0x0000 }, { 24578, 0x0000 }, { 24578, 0x0000 }, { 24578, 0x0000 }, { 24578, 0x0000 }, /* 0x27D00 */ { 24578, 0x0000 }, { 24578, 0x0000 }, { 24578, 0x8000 }, { 24579, 0x0000 }, { 24579, 0x0000 }, { 24579, 0x0018 }, { 24581, 0x0040 }, { 24582, 0x0008 }, { 24583, 0x8010 }, { 24585, 0x0100 }, { 24586, 0x0000 }, { 24586, 0x2000 }, { 24587, 0x0000 }, { 24587, 0x1000 }, { 24588, 0x0000 }, { 24588, 0x0000 }, /* 0x27E00 */ { 24588, 0x0000 }, { 24588, 0x0000 }, { 24588, 0x0000 }, { 24588, 0x0000 }, { 24588, 0xA000 }, { 24590, 0x0000 }, { 24590, 0x0000 }, { 24590, 0x0000 }, { 24590, 0x0000 }, { 24590, 0x0000 }, { 24590, 0x0000 }, { 24590, 0x0000 }, { 24590, 0x0000 }, { 24590, 0x0000 }, { 24590, 0x0000 }, { 24590, 0x0000 }, /* 0x27F00 */ { 24590, 0x0000 }, { 24590, 0x0000 }, { 24590, 0x0000 }, { 24590, 0x0000 }, { 24590, 0x0000 }, { 24590, 0x0000 }, { 24590, 0x0000 }, { 24590, 0x0000 }, { 24590, 0x0000 }, { 24590, 0x0000 }, { 24590, 0x0000 }, { 24590, 0x0000 }, { 24590, 0x0000 }, { 24590, 0x0000 }, { 24590, 0x0000 }, { 24590, 0x0200 }, /* 0x28000 */ { 24591, 0x0204 }, { 24593, 0x4000 }, { 24594, 0x0018 }, { 24596, 0x0000 }, { 24596, 0x0100 }, { 24597, 0x0000 }, { 24597, 0x0000 }, { 24597, 0x0000 }, { 24597, 0x0008 }, { 24598, 0x0001 }, { 24599, 0x0000 }, { 24599, 0x6000 }, { 24601, 0x0000 }, { 24601, 0x0000 }, { 24601, 0x0300 }, { 24603, 0x0010 }, /* 0x28100 */ { 24604, 0x0000 }, { 24604, 0x0000 }, { 24604, 0x4000 }, { 24605, 0x0000 }, { 24605, 0x8000 }, { 24606, 0x2000 }, { 24607, 0x8000 }, { 24608, 0x0000 }, { 24608, 0x0200 }, { 24609, 0x0000 }, { 24609, 0x8000 }, { 24610, 0x1000 }, { 24611, 0x0000 }, { 24611, 0x0000 }, { 24611, 0x0000 }, { 24611, 0x0000 }, /* 0x28200 */ { 24611, 0x0080 }, { 24612, 0x0500 }, { 24614, 0x0000 }, { 24614, 0x0000 }, { 24614, 0x0000 }, { 24614, 0x0040 }, { 24615, 0x0000 }, { 24615, 0x1000 }, { 24616, 0x0000 }, { 24616, 0x0800 }, { 24617, 0x0000 }, { 24617, 0x0000 }, { 24617, 0x2000 }, { 24618, 0x0000 }, { 24618, 0x0004 }, { 24619, 0x0000 }, /* 0x28300 */ { 24619, 0x0040 }, { 24620, 0x0100 }, { 24621, 0x8000 }, { 24622, 0x0400 }, { 24623, 0x0000 }, { 24623, 0x0000 }, { 24623, 0x2020 }, { 24625, 0x2000 }, { 24626, 0x0400 }, { 24627, 0x0000 }, { 24627, 0x0000 }, { 24627, 0x0000 }, { 24627, 0x0000 }, { 24627, 0x0000 }, { 24627, 0x0000 }, { 24627, 0x0000 }, /* 0x28400 */ { 24627, 0x0000 }, { 24627, 0x0004 }, { 24628, 0x0000 }, { 24628, 0x0000 }, { 24628, 0x0000 }, { 24628, 0x0000 }, { 24628, 0x1100 }, { 24630, 0x0008 }, { 24631, 0x0004 }, { 24632, 0x0000 }, { 24632, 0x0000 }, { 24632, 0x0000 }, { 24632, 0x0000 }, { 24632, 0x0000 }, { 24632, 0x0000 }, { 24632, 0x0000 }, /* 0x28500 */ { 24632, 0x0002 }, { 24633, 0x0000 }, { 24633, 0x0000 }, { 24633, 0x3000 }, { 24635, 0x0000 }, { 24635, 0x0000 }, { 24635, 0x1000 }, { 24636, 0x0000 }, { 24636, 0x0000 }, { 24636, 0x0000 }, { 24636, 0x0000 }, { 24636, 0x0000 }, { 24636, 0x0000 }, { 24636, 0x0000 }, { 24636, 0x0100 }, { 24637, 0x0010 }, /* 0x28600 */ { 24638, 0x0801 }, { 24640, 0x0000 }, { 24640, 0x0020 }, { 24641, 0x0800 }, { 24642, 0x0000 }, { 24642, 0x0000 }, { 24642, 0x0000 }, { 24642, 0x0000 }, { 24642, 0x0000 }, { 24642, 0x0000 }, { 24642, 0x0C00 }, { 24644, 0x1000 }, { 24645, 0x0000 }, { 24645, 0x0100 }, { 24646, 0x0040 }, { 24647, 0x0000 }, /* 0x28700 */ { 24647, 0x8000 }, { 24648, 0x0008 }, { 24649, 0x0000 }, { 24649, 0x0000 }, { 24649, 0x0000 }, { 24649, 0x0000 }, { 24649, 0x0000 }, { 24649, 0x0000 }, { 24649, 0x0000 }, { 24649, 0x0000 }, { 24649, 0x0000 }, { 24649, 0x0000 }, { 24649, 0x0000 }, { 24649, 0x0000 }, { 24649, 0x0000 }, { 24649, 0x0000 }, /* 0x28800 */ { 24649, 0x0010 }, { 24650, 0x0000 }, { 24650, 0x0800 }, { 24651, 0x0000 }, { 24651, 0x0000 }, { 24651, 0x0000 }, { 24651, 0x0000 }, { 24651, 0x0000 }, { 24651, 0x0000 }, { 24651, 0x0000 }, { 24651, 0x0000 }, { 24651, 0x0000 }, { 24651, 0x0000 }, { 24651, 0x0000 }, { 24651, 0x0000 }, { 24651, 0x0000 }, /* 0x28900 */ { 24651, 0x0000 }, { 24651, 0x0000 }, { 24651, 0x0000 }, { 24651, 0x0008 }, { 24652, 0x0300 }, { 24654, 0x0040 }, { 24655, 0x1110 }, { 24658, 0x4000 }, { 24659, 0x0200 }, { 24660, 0x0000 }, { 24660, 0x0D00 }, { 24663, 0x1100 }, { 24665, 0x0001 }, { 24666, 0x5000 }, { 24668, 0x019A }, { 24673, 0x1E00 }, /* 0x28A00 */ { 24677, 0x8000 }, { 24678, 0x0040 }, { 24679, 0x0220 }, { 24681, 0x0044 }, { 24683, 0x0FF0 }, { 24691, 0x0600 }, { 24693, 0x0000 }, { 24693, 0x0000 }, { 24693, 0x000E }, { 24696, 0x1C00 }, { 24699, 0x0000 }, { 24699, 0x0000 }, { 24699, 0x5841 }, { 24704, 0xC000 }, { 24706, 0x042F }, { 24712, 0x1000 }, /* 0x28B00 */ { 24713, 0x1000 }, { 24714, 0x0008 }, { 24715, 0xB806 }, { 24721, 0x0000 }, { 24721, 0x5040 }, { 24724, 0x0001 }, { 24725, 0x1078 }, { 24730, 0x0000 }, { 24730, 0x8000 }, { 24731, 0x3200 }, { 24734, 0x0000 }, { 24734, 0x0000 }, { 24734, 0x0024 }, { 24736, 0x0690 }, { 24740, 0x1F80 }, { 24746, 0x8020 }, /* 0x28C00 */ { 24748, 0x0208 }, { 24750, 0x3000 }, { 24752, 0x0848 }, { 24755, 0x0A01 }, { 24758, 0x0000 }, { 24758, 0x0000 }, { 24758, 0x0000 }, { 24758, 0x0000 }, { 24758, 0x0000 }, { 24758, 0x0000 }, { 24758, 0x0000 }, { 24758, 0x0000 }, { 24758, 0x2400 }, { 24760, 0x0004 }, { 24761, 0x0000 }, { 24761, 0x0000 }, /* 0x28D00 */ { 24761, 0x0000 }, { 24761, 0x0000 }, { 24761, 0x0000 }, { 24761, 0x0010 }, { 24762, 0x0000 }, { 24762, 0x0000 }, { 24762, 0x0000 }, { 24762, 0x0000 }, { 24762, 0x0000 }, { 24762, 0x0200 }, { 24763, 0x0000 }, { 24763, 0x0200 }, { 24764, 0x0000 }, { 24764, 0x0000 }, { 24764, 0x0000 }, { 24764, 0x0000 }, /* 0x28E00 */ { 24764, 0x8000 }, { 24765, 0x0000 }, { 24765, 0x0000 }, { 24765, 0x0240 }, { 24767, 0x0000 }, { 24767, 0x0000 }, { 24767, 0x0060 }, { 24769, 0x0000 }, { 24769, 0x0000 }, { 24769, 0x0080 }, { 24770, 0x1000 }, { 24771, 0x000C }, { 24773, 0x0000 }, { 24773, 0x0200 }, { 24774, 0x0080 }, { 24775, 0x0000 }, /* 0x28F00 */ { 24775, 0x0000 }, { 24775, 0x0000 }, { 24775, 0x0000 }, { 24775, 0x0000 }, { 24775, 0x0000 }, { 24775, 0x0000 }, { 24775, 0x0000 }, { 24775, 0x0000 }, { 24775, 0x0000 }, { 24775, 0x0000 }, { 24775, 0x0000 }, { 24775, 0x0000 }, { 24775, 0x0020 }, { 24776, 0x0000 }, { 24776, 0x0000 }, { 24776, 0x0000 }, /* 0x29000 */ { 24776, 0x0000 }, { 24776, 0x0000 }, { 24776, 0x0000 }, { 24776, 0x0000 }, { 24776, 0x0000 }, { 24776, 0x0000 }, { 24776, 0x0000 }, { 24776, 0x0000 }, { 24776, 0x0900 }, { 24778, 0x0008 }, { 24779, 0x8000 }, { 24780, 0x0003 }, { 24782, 0x0001 }, { 24783, 0x0000 }, { 24783, 0x3030 }, { 24787, 0x0000 }, /* 0x29100 */ { 24787, 0x2000 }, { 24788, 0x0001 }, { 24789, 0x0000 }, { 24789, 0x1000 }, { 24790, 0x2000 }, { 24791, 0x4800 }, { 24793, 0x0000 }, { 24793, 0x0001 }, { 24794, 0x0000 }, { 24794, 0x1000 }, { 24795, 0x0100 }, { 24796, 0x0000 }, { 24796, 0x0000 }, { 24796, 0x0020 }, { 24797, 0x0800 }, }; static const Summary16 big5hkscs_uni2index_page294[32] = { /* 0x29400 */ { 24798, 0x0000 }, { 24798, 0x2000 }, { 24799, 0x0001 }, { 24800, 0x8008 }, { 24802, 0x0100 }, { 24803, 0x0000 }, { 24803, 0x0000 }, { 24803, 0x0000 }, { 24803, 0x0000 }, { 24803, 0x0000 }, { 24803, 0x0000 }, { 24803, 0x0000 }, { 24803, 0x0000 }, { 24803, 0x0601 }, { 24806, 0x00A0 }, { 24808, 0x0000 }, /* 0x29500 */ { 24808, 0x0000 }, { 24808, 0x0000 }, { 24808, 0x0000 }, { 24808, 0x0000 }, { 24808, 0x0000 }, { 24808, 0x0000 }, { 24808, 0x0000 }, { 24808, 0x0000 }, { 24808, 0x0000 }, { 24808, 0x4000 }, { 24809, 0x0000 }, { 24809, 0x0101 }, { 24811, 0x0000 }, { 24811, 0x0080 }, { 24812, 0x0200 }, { 24813, 0x0010 }, }; static const Summary16 big5hkscs_uni2index_page297[251] = { /* 0x29700 */ { 24814, 0x0000 }, { 24814, 0x0000 }, { 24814, 0x0001 }, { 24815, 0x0004 }, { 24816, 0x0000 }, { 24816, 0x0000 }, { 24816, 0x0000 }, { 24816, 0x0000 }, { 24816, 0x0000 }, { 24816, 0x0000 }, { 24816, 0x0000 }, { 24816, 0x0000 }, { 24816, 0x0000 }, { 24816, 0x0010 }, { 24817, 0x0000 }, { 24817, 0x0000 }, /* 0x29800 */ { 24817, 0x0000 }, { 24817, 0x0001 }, { 24818, 0x0000 }, { 24818, 0x0000 }, { 24818, 0x0000 }, { 24818, 0x0080 }, { 24819, 0x0000 }, { 24819, 0x0000 }, { 24819, 0x0000 }, { 24819, 0x0000 }, { 24819, 0x0010 }, { 24820, 0x0000 }, { 24820, 0x0000 }, { 24820, 0x0002 }, { 24821, 0x0400 }, { 24822, 0x0002 }, /* 0x29900 */ { 24823, 0x0028 }, { 24825, 0x0000 }, { 24825, 0x8000 }, { 24826, 0x0000 }, { 24826, 0x0380 }, { 24829, 0x2000 }, { 24830, 0x0400 }, { 24831, 0x0000 }, { 24831, 0x0000 }, { 24831, 0x2000 }, { 24832, 0x0000 }, { 24832, 0x0000 }, { 24832, 0x0208 }, { 24834, 0x0000 }, { 24834, 0x0000 }, { 24834, 0x0000 }, /* 0x29A00 */ { 24834, 0x0000 }, { 24834, 0x0000 }, { 24834, 0x0100 }, { 24835, 0x0000 }, { 24835, 0x2000 }, { 24836, 0x0000 }, { 24836, 0x0000 }, { 24836, 0x0000 }, { 24836, 0x0000 }, { 24836, 0x0000 }, { 24836, 0x0000 }, { 24836, 0x0000 }, { 24836, 0x0000 }, { 24836, 0x0000 }, { 24836, 0x0000 }, { 24836, 0x0000 }, /* 0x29B00 */ { 24836, 0x4020 }, { 24838, 0x0000 }, { 24838, 0x0000 }, { 24838, 0x0000 }, { 24838, 0x0000 }, { 24838, 0x0000 }, { 24838, 0x0000 }, { 24838, 0x0000 }, { 24838, 0x0000 }, { 24838, 0x0000 }, { 24838, 0x0000 }, { 24838, 0x0000 }, { 24838, 0x0000 }, { 24838, 0x0020 }, { 24839, 0x0000 }, { 24839, 0x0000 }, /* 0x29C00 */ { 24839, 0x0000 }, { 24839, 0x0000 }, { 24839, 0x0000 }, { 24839, 0x0000 }, { 24839, 0x0000 }, { 24839, 0x0000 }, { 24839, 0x0000 }, { 24839, 0x0008 }, { 24840, 0x0000 }, { 24840, 0x0000 }, { 24840, 0x2000 }, { 24841, 0x0000 }, { 24841, 0x0000 }, { 24841, 0x0000 }, { 24841, 0x0000 }, { 24841, 0x0000 }, /* 0x29D00 */ { 24841, 0x0000 }, { 24841, 0x0000 }, { 24841, 0x0000 }, { 24841, 0x4000 }, { 24842, 0x0000 }, { 24842, 0x0400 }, { 24843, 0x0000 }, { 24843, 0x1000 }, { 24844, 0x0000 }, { 24844, 0x0900 }, { 24846, 0x0000 }, { 24846, 0x0000 }, { 24846, 0x0000 }, { 24846, 0x0000 }, { 24846, 0x0000 }, { 24846, 0x0040 }, /* 0x29E00 */ { 24847, 0x0040 }, { 24848, 0x0000 }, { 24848, 0x2000 }, { 24849, 0x0000 }, { 24849, 0x0000 }, { 24849, 0x0000 }, { 24849, 0x0100 }, { 24850, 0x0000 }, { 24850, 0x0000 }, { 24850, 0x0000 }, { 24850, 0x1000 }, { 24851, 0x0000 }, { 24851, 0x0008 }, { 24852, 0x0000 }, { 24852, 0x0000 }, { 24852, 0x0100 }, /* 0x29F00 */ { 24853, 0x0000 }, { 24853, 0x0000 }, { 24853, 0x0008 }, { 24854, 0x0001 }, { 24855, 0x0000 }, { 24855, 0x0000 }, { 24855, 0x0000 }, { 24855, 0x0000 }, { 24855, 0x0000 }, { 24855, 0x0000 }, { 24855, 0x0000 }, { 24855, 0x0080 }, { 24856, 0x0000 }, { 24856, 0x4000 }, { 24857, 0x0000 }, { 24857, 0x0000 }, /* 0x2A000 */ { 24857, 0x0000 }, { 24857, 0x0010 }, { 24858, 0x0000 }, { 24858, 0x0000 }, { 24858, 0x0000 }, { 24858, 0x0000 }, { 24858, 0x0000 }, { 24858, 0x0000 }, { 24858, 0x0080 }, { 24859, 0x0000 }, { 24859, 0x0000 }, { 24859, 0x0200 }, { 24860, 0x0000 }, { 24860, 0x0000 }, { 24860, 0x2002 }, { 24862, 0x4108 }, /* 0x2A100 */ { 24865, 0x0080 }, { 24866, 0x0000 }, { 24866, 0x0008 }, { 24867, 0x0018 }, { 24869, 0x0000 }, { 24869, 0x0001 }, { 24870, 0x0000 }, { 24870, 0x0000 }, { 24870, 0x0000 }, { 24870, 0x000C }, { 24872, 0x0800 }, { 24873, 0x0010 }, { 24874, 0x0000 }, { 24874, 0x8000 }, { 24875, 0x0000 }, { 24875, 0x0020 }, /* 0x2A200 */ { 24876, 0x0000 }, { 24876, 0x0000 }, { 24876, 0x0001 }, { 24877, 0x0008 }, { 24878, 0x0000 }, { 24878, 0x0000 }, { 24878, 0x0000 }, { 24878, 0x0000 }, { 24878, 0x0000 }, { 24878, 0x8008 }, { 24880, 0x0000 }, { 24880, 0x2454 }, { 24885, 0x0000 }, { 24885, 0x8000 }, { 24886, 0x0000 }, { 24886, 0x8000 }, /* 0x2A300 */ { 24887, 0x0000 }, { 24887, 0x0000 }, { 24887, 0x0000 }, { 24887, 0x0000 }, { 24887, 0x0000 }, { 24887, 0x0000 }, { 24887, 0x0000 }, { 24887, 0x0000 }, { 24887, 0x0000 }, { 24887, 0x0000 }, { 24887, 0x0200 }, { 24888, 0x0000 }, { 24888, 0x0000 }, { 24888, 0x0000 }, { 24888, 0x0000 }, { 24888, 0x0000 }, /* 0x2A400 */ { 24888, 0x0000 }, { 24888, 0x0000 }, { 24888, 0x0000 }, { 24888, 0x0010 }, { 24889, 0x0000 }, { 24889, 0x0800 }, { 24890, 0x0000 }, { 24890, 0x0000 }, { 24890, 0x0000 }, { 24890, 0x0000 }, { 24890, 0x0000 }, { 24890, 0x0000 }, { 24890, 0x0000 }, { 24890, 0x0000 }, { 24890, 0x0000 }, { 24890, 0x0000 }, /* 0x2A500 */ { 24890, 0x0000 }, { 24890, 0x0000 }, { 24890, 0x0000 }, { 24890, 0x0000 }, { 24890, 0x0000 }, { 24890, 0x0000 }, { 24890, 0x0000 }, { 24890, 0x0000 }, { 24890, 0x0000 }, { 24890, 0x0000 }, { 24890, 0x0000 }, { 24890, 0x0000 }, { 24890, 0x0840 }, { 24892, 0x0000 }, { 24892, 0x0000 }, { 24892, 0x0000 }, /* 0x2A600 */ { 24892, 0x0002 }, { 24893, 0x0000 }, { 24893, 0x0000 }, { 24893, 0x0004 }, { 24894, 0x0400 }, { 24895, 0x0800 }, { 24896, 0x0000 }, { 24896, 0x0000 }, { 24896, 0x0000 }, { 24896, 0x0000 }, { 24896, 0x0200 }, }; static const Summary16 big5hkscs_uni2index_page2f8[30] = { /* 0x2F800 */ { 24897, 0x0000 }, { 24897, 0x0000 }, { 24897, 0x0020 }, { 24898, 0x0800 }, { 24899, 0x0001 }, { 24900, 0x0000 }, { 24900, 0x0000 }, { 24900, 0x0100 }, { 24901, 0x0000 }, { 24901, 0x0010 }, { 24902, 0x0040 }, { 24903, 0x0000 }, { 24903, 0x2000 }, { 24904, 0x0000 }, { 24904, 0x0000 }, { 24904, 0x0000 }, /* 0x2F900 */ { 24904, 0x0000 }, { 24904, 0x0000 }, { 24904, 0x0000 }, { 24904, 0x0000 }, { 24904, 0x0000 }, { 24904, 0x0000 }, { 24904, 0x0000 }, { 24904, 0x0000 }, { 24904, 0x0000 }, { 24904, 0x0010 }, { 24905, 0x0000 }, { 24905, 0x1004 }, { 24907, 0x0000 }, { 24907, 0x0010 }, }; static int qt_UnicodeToBig5hkscs(unsigned wc, uint8_t *r) { const Summary16 *summary = NULL; if (wc < 0x80) { r[0] = (uint8_t)wc; return 1; } if (wc < 0x0460) summary = &big5hkscs_uni2index_page00[(wc >> 4)]; else if (wc >= 0x1e00 && wc < 0x1ed0) summary = &big5hkscs_uni2index_page1e[(wc >> 4) - 0x1e0]; else if (wc >= 0x2000 && wc < 0x2740) summary = &big5hkscs_uni2index_page20[(wc >> 4) - 0x200]; else if (wc >= 0x2e00 && wc < 0x9fb0) summary = &big5hkscs_uni2index_page2e[(wc >> 4) - 0x2e0]; else if (wc >= 0xe000 && wc < 0xfa30) summary = &big5hkscs_uni2index_pagee0[(wc >> 4) - 0xe00]; else if (wc >= 0xfe00 && wc < 0xfff0) summary = &big5hkscs_uni2index_pagefe[(wc >> 4) - 0xfe0]; else if (wc >= 0x20000 && wc < 0x291f0) summary = &big5hkscs_uni2index_page200[(wc >> 4) - 0x2000]; else if (wc >= 0x29400 && wc < 0x29600) summary = &big5hkscs_uni2index_page294[(wc >> 4) - 0x2940]; else if (wc >= 0x29700 && wc < 0x2a6b0) summary = &big5hkscs_uni2index_page297[(wc >> 4) - 0x2970]; else if (wc >= 0x2f800 && wc < 0x2f9e0) summary = &big5hkscs_uni2index_page2f8[(wc >> 4) - 0x2f80]; if (summary) { uint16_t used = summary->used; unsigned i = wc & 0x0f; if (used & ((uint16_t)1 << i)) { /* Keep in `used' only the bits 0..i-1. */ used &= ((uint16_t)1 << i) - 1; /* Add `summary->index' and the number of bits set in `used'. */ used = (used & 0x5555) + ((used & 0xaaaa) >> 1); used = (used & 0x3333) + ((used & 0xcccc) >> 2); used = (used & 0x0f0f) + ((used & 0xf0f0) >> 4); used = (used & 0x00ff) + (used >> 8); const uint8_t *c = big5hkscs_to_charset[summary->index + used]; if (c[1] != 0) { r[0] = c[0]; r[1] = c[1]; return 2; } else { // (c [1] == 0) r[0] = c[0]; return 1; } } } return 0; } static int qt_UnicodeToBig5(unsigned ch, uint8_t *buf) { //all the tables are individually sorted on Y for (int i = 0; i < 5; i++) { int start = 0; int end = b5_map_table[i].tableSize - 1; while (start <= end) { int middle = (end + start + 1) / 2; if (b5_map_table[i].table[middle].y == ch) { buf[0] = b5_map_table[i].table[middle].x >> 8; buf[1] = b5_map_table[i].table[middle].x & 0xff; return 2; } else if (b5_map_table[i].table[middle].y > ch) { end = middle - 1; } else { start = middle + 1; } } } return qt_UnicodeToBig5hkscs(ch, buf); } void Big5TextEncoder::EncodeBig5(const std::wstring& str, std::string& bytes) { static const char replacement = '?'; //int invalid = 0; bytes.resize(2 * str.length() + 1); int index = 0; uint8_t c[2]; for (wchar_t ch : str) { if (ch < 0x80) { // ASCII bytes[index++] = static_cast(ch); } else if (qt_UnicodeToBig5(ch, c) == 2 && c[0] >= 0xa1 && c[0] <= 0xf9) { bytes[index++] = c[0]; bytes[index++] = c[1]; } else { bytes[index++] = replacement; //++invalid; } } bytes.resize(index); } zxing-cpp-1.0.8+ds2/core/src/textcodec/Big5TextEncoder.h000066400000000000000000000032661361167020700227420ustar00rootroot00000000000000#pragma once /**************************************************************************** ** ** Copyright (C) 2015 The Qt Company Ltd. ** Contact: http://www.qt.io/licensing/ ** ** This file is part of the QtCore module of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:LGPL21$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and The Qt Company. For licensing terms ** and conditions see http://www.qt.io/terms-conditions. For further ** information use the contact form at http://www.qt.io/contact-us. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 or version 3 as published by the Free ** Software Foundation and appearing in the file LICENSE.LGPLv21 and ** LICENSE.LGPLv3 included in the packaging of this file. Please review the ** following information to ensure the GNU Lesser General Public License ** requirements will be met: https://www.gnu.org/licenses/lgpl.html and ** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** As a special exception, The Qt Company gives you certain additional ** rights. These rights are described in The Qt Company LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** $QT_END_LICENSE$ ** ****************************************************************************/ #include class Big5TextEncoder { public: static void EncodeBig5(const std::wstring& str, std::string& bytes); }; zxing-cpp-1.0.8+ds2/core/src/textcodec/GBTextDecoder.cpp000066400000000000000000012074401361167020700227660ustar00rootroot00000000000000/**************************************************************************** ** ** Copyright (C) 2015 The Qt Company Ltd. ** Contact: http://www.qt.io/licensing/ ** ** This file is part of the QtCore module of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:LGPL21$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and The Qt Company. For licensing terms ** and conditions see http://www.qt.io/terms-conditions. For further ** information use the contact form at http://www.qt.io/contact-us. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 or version 3 as published by the Free ** Software Foundation and appearing in the file LICENSE.LGPLv21 and ** LICENSE.LGPLv3 included in the packaging of this file. Please review the ** following information to ensure the GNU Lesser General Public License ** requirements will be met: https://www.gnu.org/licenses/lgpl.html and ** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** As a special exception, The Qt Company gives you certain additional ** rights. These rights are described in The Qt Company LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** $QT_END_LICENSE$ ** ****************************************************************************/ #include "GBTextDecoder.h" struct indexTbl_t { uint8_t tblBegin; uint8_t tblEnd; uint16_t tblOffset; uint16_t algOffset; }; static const indexTbl_t gb18030_to_ucs_index[154] = { /* U+00__ */ {0x00, 0xFF, 0x0000, 0x0000}, {0x00, 0xFF, 0x0000, 0x0000}, /* U+02__ */ {0x00, 0xFF, 0x0000, 0x0000}, {0x00, 0x33, 0x0000, 0x041E}, /* U+04__ */ {0xFF, 0x00, 0x1BBE, 0x051E}, {0xFF, 0x00, 0x1BBE, 0x061E}, /* U+06__ */ {0xFF, 0x00, 0x1BBE, 0x071E}, {0xFF, 0x00, 0x1BBE, 0x081E}, /* U+08__ */ {0xFF, 0x00, 0x1BBE, 0x091E}, {0xFF, 0x00, 0x1BBE, 0x0A1E}, /* U+0A__ */ {0xFF, 0x00, 0x1BBE, 0x0B1E}, {0xFF, 0x00, 0x1BBE, 0x0C1E}, /* U+0C__ */ {0xFF, 0x00, 0x1BBE, 0x0D1E}, {0xFF, 0x00, 0x1BBE, 0x0E1E}, /* U+0E__ */ {0xFF, 0x00, 0x1BBE, 0x0F1E}, {0xFF, 0x00, 0x1BBE, 0x101E}, /* U+10__ */ {0xFF, 0x00, 0x1BBE, 0x111E}, {0xFF, 0x00, 0x1BBE, 0x121E}, /* U+12__ */ {0xFF, 0x00, 0x1BBE, 0x131E}, {0xFF, 0x00, 0x1BBE, 0x141E}, /* U+14__ */ {0xFF, 0x00, 0x1BBE, 0x151E}, {0xFF, 0x00, 0x1BBE, 0x161E}, /* U+16__ */ {0xFF, 0x00, 0x1BBE, 0x171E}, {0xFF, 0x00, 0x1BBE, 0x181E}, /* U+18__ */ {0xFF, 0x00, 0x1BBE, 0x191E}, {0xFF, 0x00, 0x1BBE, 0x1A1E}, /* U+1A__ */ {0xFF, 0x00, 0x1BBE, 0x1B1E}, {0xFF, 0x00, 0x1BBE, 0x1C1E}, /* U+1C__ */ {0xFF, 0x00, 0x1BBE, 0x1D1E}, {0xFF, 0x00, 0x1BBE, 0x1E1E}, /* U+1E__ */ {0xF2, 0xFF, 0x1BBE, 0x1F1E}, {0x00, 0xFF, 0x1BBE, 0x0000}, /* U+20__ */ {0x00, 0xFF, 0x1BBE, 0x0000}, {0x00, 0xFF, 0x1BBE, 0x0000}, /* U+22__ */ {0x00, 0xFF, 0x1BBE, 0x0000}, {0x00, 0xFF, 0x1BBE, 0x0000}, /* U+24__ */ {0x00, 0x02, 0x1BBE, 0x2640}, {0xFF, 0x00, 0x23FC, 0x2740}, /* U+26__ */ {0xFF, 0x00, 0x23FC, 0x2840}, {0xFF, 0x00, 0x23FC, 0x2940}, /* U+28__ */ {0xFF, 0x00, 0x23FC, 0x2A40}, {0xFF, 0x00, 0x23FC, 0x2B40}, /* U+2A__ */ {0xFF, 0x00, 0x23FC, 0x2C40}, {0xFF, 0x00, 0x23FC, 0x2D40}, /* U+2C__ */ {0x41, 0xFF, 0x23FC, 0x2E40}, {0x00, 0xFF, 0x23FC, 0x0000}, /* U+2E__ */ {0x00, 0xFF, 0x23FC, 0x0000}, {0x00, 0xFF, 0x23FC, 0x0000}, /* U+30__ */ {0x00, 0xFF, 0x23FC, 0x0000}, {0x00, 0xFF, 0x23FC, 0x0000}, /* U+32__ */ {0x00, 0xAC, 0x23FC, 0x356E}, {0xFF, 0x00, 0x26F9, 0x366E}, /* U+34__ */ {0xFF, 0x00, 0x26F9, 0x376E}, {0xAA, 0xFF, 0x26F9, 0x386E}, /* U+36__ */ {0x00, 0xFF, 0x26F9, 0x0000}, {0x00, 0xFF, 0x26F9, 0x0000}, /* U+38__ */ {0x00, 0xFF, 0x26F9, 0x0000}, {0x00, 0x69, 0x26F9, 0x3C77}, /* U+3A__ */ {0xFF, 0x00, 0x2A6E, 0x3D77}, {0xFF, 0x00, 0x2A6E, 0x3E77}, /* U+3C__ */ {0xDF, 0xFF, 0x2A6E, 0x3F77}, {0x00, 0xE6, 0x2A6E, 0x4079}, /* U+3E__ */ {0xFF, 0x00, 0x2C45, 0x4179}, {0xBE, 0xFF, 0x2C45, 0x4279}, /* U+40__ */ {0x00, 0xFF, 0x2C45, 0x0000}, {0x00, 0x58, 0x2C45, 0x447E}, /* U+42__ */ {0xCE, 0xFF, 0x2DBA, 0x457E}, {0x00, 0xFF, 0x2DBA, 0x0000}, /* U+44__ */ {0x00, 0x09, 0x2DBA, 0x4784}, {0xC3, 0xFF, 0x2F73, 0x4884}, /* U+46__ */ {0x00, 0x28, 0x2F73, 0x498F}, {0xFF, 0x00, 0x3232, 0x4A8F}, /* U+48__ */ {0xE8, 0xFF, 0x3232, 0x4B8F}, {0x00, 0xFF, 0x3232, 0x0000}, /* U+4A__ */ {0x00, 0x62, 0x3232, 0x9F43}, {0xFF, 0x00, 0x6A8C, 0xA043}, /* U+4C__ */ {0xFF, 0x00, 0x6A8C, 0xA143}, {0xFF, 0x00, 0x6A8C, 0xA243}, /* U+4E__ */ {0xFF, 0x00, 0x6A8C, 0xA343}, {0xFF, 0x00, 0x6A8C, 0xA443}, /* U+50__ */ {0xFF, 0x00, 0x6A8C, 0xA543}, {0xFF, 0x00, 0x6A8C, 0xA643}, /* U+52__ */ {0xFF, 0x00, 0x6A8C, 0xA743}, {0xFF, 0x00, 0x6A8C, 0xA843}, /* U+54__ */ {0xFF, 0x00, 0x6A8C, 0xA943}, {0xFF, 0x00, 0x6A8C, 0xAA43}, /* U+56__ */ {0xFF, 0x00, 0x6A8C, 0xAB43}, {0xFF, 0x00, 0x6A8C, 0xAC43}, /* U+58__ */ {0xFF, 0x00, 0x6A8C, 0xAD43}, {0xFF, 0x00, 0x6A8C, 0xAE43}, /* U+5A__ */ {0xFF, 0x00, 0x6A8C, 0xAF43}, {0xFF, 0x00, 0x6A8C, 0xB043}, /* U+5C__ */ {0xFF, 0x00, 0x6A8C, 0xB143}, {0xFF, 0x00, 0x6A8C, 0xB243}, /* U+5E__ */ {0xFF, 0x00, 0x6A8C, 0xB343}, {0xFF, 0x00, 0x6A8C, 0xB443}, /* U+60__ */ {0xFF, 0x00, 0x6A8C, 0xB543}, {0xFF, 0x00, 0x6A8C, 0xB643}, /* U+62__ */ {0xFF, 0x00, 0x6A8C, 0xB743}, {0xFF, 0x00, 0x6A8C, 0xB843}, /* U+64__ */ {0xFF, 0x00, 0x6A8C, 0xB943}, {0xFF, 0x00, 0x6A8C, 0xBA43}, /* U+66__ */ {0xFF, 0x00, 0x6A8C, 0xBB43}, {0xFF, 0x00, 0x6A8C, 0xBC43}, /* U+68__ */ {0xFF, 0x00, 0x6A8C, 0xBD43}, {0xFF, 0x00, 0x6A8C, 0xBE43}, /* U+6A__ */ {0xFF, 0x00, 0x6A8C, 0xBF43}, {0xFF, 0x00, 0x6A8C, 0xC043}, /* U+6C__ */ {0xFF, 0x00, 0x6A8C, 0xC143}, {0xFF, 0x00, 0x6A8C, 0xC243}, /* U+6E__ */ {0xFF, 0x00, 0x6A8C, 0xC343}, {0xFF, 0x00, 0x6A8C, 0xC443}, /* U+70__ */ {0xFF, 0x00, 0x6A8C, 0xC543}, {0xFF, 0x00, 0x6A8C, 0xC643}, /* U+72__ */ {0xFF, 0x00, 0x6A8C, 0xC743}, {0xFF, 0x00, 0x6A8C, 0xC843}, /* U+74__ */ {0xFF, 0x00, 0x6A8C, 0xC943}, {0xFF, 0x00, 0x6A8C, 0xCA43}, /* U+76__ */ {0xFF, 0x00, 0x6A8C, 0xCB43}, {0xFF, 0x00, 0x6A8C, 0xCC43}, /* U+78__ */ {0xFF, 0x00, 0x6A8C, 0xCD43}, {0xFF, 0x00, 0x6A8C, 0xCE43}, /* U+7A__ */ {0xFF, 0x00, 0x6A8C, 0xCF43}, {0xFF, 0x00, 0x6A8C, 0xD043}, /* U+7C__ */ {0xFF, 0x00, 0x6A8C, 0xD143}, {0xFF, 0x00, 0x6A8C, 0xD243}, /* U+7E__ */ {0xFF, 0x00, 0x6A8C, 0xD343}, {0xFF, 0x00, 0x6A8C, 0xD443}, /* U+80__ */ {0xFF, 0x00, 0x6A8C, 0xD543}, {0xFF, 0x00, 0x6A8C, 0xD643}, /* U+82__ */ {0xBD, 0xFF, 0x6A8C, 0xD743}, {0x00, 0x0D, 0x6A8C, 0xE857}, /* U+84__ */ {0xFF, 0x00, 0x7B53, 0xE957}, {0xFF, 0x00, 0x7B53, 0xEA57}, /* U+86__ */ {0xFF, 0x00, 0x7B53, 0xEB57}, {0xFF, 0x00, 0x7B53, 0xEC57}, /* U+88__ */ {0xFF, 0x00, 0x7B53, 0xED57}, {0xFF, 0x00, 0x7B53, 0xEE57}, /* U+8A__ */ {0xFF, 0x00, 0x7B53, 0xEF57}, {0xFF, 0x00, 0x7B53, 0xF057}, /* U+8C__ */ {0xFF, 0x00, 0x7B53, 0xF157}, {0xFF, 0x00, 0x7B53, 0xF257}, /* U+8E__ */ {0xFF, 0x00, 0x7B53, 0xF357}, {0xFF, 0x00, 0x7B53, 0xF457}, /* U+90__ */ {0xFF, 0x00, 0x7B53, 0xF557}, {0xFF, 0x00, 0x7B53, 0xF657}, /* U+92__ */ {0xFF, 0x00, 0x7B53, 0xF757}, {0xD5, 0xFF, 0x7B53, 0xF857}, /* U+94__ */ {0x00, 0xBD, 0x7B53, 0xF96C}, {0xFF, 0x00, 0x7F59, 0xFA6C}, /* U+96__ */ {0xFF, 0x00, 0x7F59, 0xFB6C}, {0xFF, 0x00, 0x7F59, 0xFC6C}, /* U+98__ */ {0xC4, 0xFF, 0x7F59, 0xFD6C}, {0x00, 0xE1, 0x7F59, 0xFF04}, }; static const uint16_t gb18030_2byte_to_ucs[22046] = { // GB 0x8140..0x817E 0x4E02, 0x4E04, 0x4E05, 0x4E06, 0x4E0F, 0x4E12, 0x4E17, 0x4E1F, 0x4E20, 0x4E21, 0x4E23, 0x4E26, 0x4E29, 0x4E2E, 0x4E2F, 0x4E31, 0x4E33, 0x4E35, 0x4E37, 0x4E3C, 0x4E40, 0x4E41, 0x4E42, 0x4E44, 0x4E46, 0x4E4A, 0x4E51, 0x4E55, 0x4E57, 0x4E5A, 0x4E5B, 0x4E62, 0x4E63, 0x4E64, 0x4E65, 0x4E67, 0x4E68, 0x4E6A, 0x4E6B, 0x4E6C, 0x4E6D, 0x4E6E, 0x4E6F, 0x4E72, 0x4E74, 0x4E75, 0x4E76, 0x4E77, 0x4E78, 0x4E79, 0x4E7A, 0x4E7B, 0x4E7C, 0x4E7D, 0x4E7F, 0x4E80, 0x4E81, 0x4E82, 0x4E83, 0x4E84, 0x4E85, 0x4E87, 0x4E8A, // GB 0x8180..0x81FE 0x4E90, 0x4E96, 0x4E97, 0x4E99, 0x4E9C, 0x4E9D, 0x4E9E, 0x4EA3, 0x4EAA, 0x4EAF, 0x4EB0, 0x4EB1, 0x4EB4, 0x4EB6, 0x4EB7, 0x4EB8, 0x4EB9, 0x4EBC, 0x4EBD, 0x4EBE, 0x4EC8, 0x4ECC, 0x4ECF, 0x4ED0, 0x4ED2, 0x4EDA, 0x4EDB, 0x4EDC, 0x4EE0, 0x4EE2, 0x4EE6, 0x4EE7, 0x4EE9, 0x4EED, 0x4EEE, 0x4EEF, 0x4EF1, 0x4EF4, 0x4EF8, 0x4EF9, 0x4EFA, 0x4EFC, 0x4EFE, 0x4F00, 0x4F02, 0x4F03, 0x4F04, 0x4F05, 0x4F06, 0x4F07, 0x4F08, 0x4F0B, 0x4F0C, 0x4F12, 0x4F13, 0x4F14, 0x4F15, 0x4F16, 0x4F1C, 0x4F1D, 0x4F21, 0x4F23, 0x4F28, 0x4F29, 0x4F2C, 0x4F2D, 0x4F2E, 0x4F31, 0x4F33, 0x4F35, 0x4F37, 0x4F39, 0x4F3B, 0x4F3E, 0x4F3F, 0x4F40, 0x4F41, 0x4F42, 0x4F44, 0x4F45, 0x4F47, 0x4F48, 0x4F49, 0x4F4A, 0x4F4B, 0x4F4C, 0x4F52, 0x4F54, 0x4F56, 0x4F61, 0x4F62, 0x4F66, 0x4F68, 0x4F6A, 0x4F6B, 0x4F6D, 0x4F6E, 0x4F71, 0x4F72, 0x4F75, 0x4F77, 0x4F78, 0x4F79, 0x4F7A, 0x4F7D, 0x4F80, 0x4F81, 0x4F82, 0x4F85, 0x4F86, 0x4F87, 0x4F8A, 0x4F8C, 0x4F8E, 0x4F90, 0x4F92, 0x4F93, 0x4F95, 0x4F96, 0x4F98, 0x4F99, 0x4F9A, 0x4F9C, 0x4F9E, 0x4F9F, 0x4FA1, 0x4FA2, // GB 0x8240..0x827E 0x4FA4, 0x4FAB, 0x4FAD, 0x4FB0, 0x4FB1, 0x4FB2, 0x4FB3, 0x4FB4, 0x4FB6, 0x4FB7, 0x4FB8, 0x4FB9, 0x4FBA, 0x4FBB, 0x4FBC, 0x4FBD, 0x4FBE, 0x4FC0, 0x4FC1, 0x4FC2, 0x4FC6, 0x4FC7, 0x4FC8, 0x4FC9, 0x4FCB, 0x4FCC, 0x4FCD, 0x4FD2, 0x4FD3, 0x4FD4, 0x4FD5, 0x4FD6, 0x4FD9, 0x4FDB, 0x4FE0, 0x4FE2, 0x4FE4, 0x4FE5, 0x4FE7, 0x4FEB, 0x4FEC, 0x4FF0, 0x4FF2, 0x4FF4, 0x4FF5, 0x4FF6, 0x4FF7, 0x4FF9, 0x4FFB, 0x4FFC, 0x4FFD, 0x4FFF, 0x5000, 0x5001, 0x5002, 0x5003, 0x5004, 0x5005, 0x5006, 0x5007, 0x5008, 0x5009, 0x500A, // GB 0x8280..0x82FE 0x500B, 0x500E, 0x5010, 0x5011, 0x5013, 0x5015, 0x5016, 0x5017, 0x501B, 0x501D, 0x501E, 0x5020, 0x5022, 0x5023, 0x5024, 0x5027, 0x502B, 0x502F, 0x5030, 0x5031, 0x5032, 0x5033, 0x5034, 0x5035, 0x5036, 0x5037, 0x5038, 0x5039, 0x503B, 0x503D, 0x503F, 0x5040, 0x5041, 0x5042, 0x5044, 0x5045, 0x5046, 0x5049, 0x504A, 0x504B, 0x504D, 0x5050, 0x5051, 0x5052, 0x5053, 0x5054, 0x5056, 0x5057, 0x5058, 0x5059, 0x505B, 0x505D, 0x505E, 0x505F, 0x5060, 0x5061, 0x5062, 0x5063, 0x5064, 0x5066, 0x5067, 0x5068, 0x5069, 0x506A, 0x506B, 0x506D, 0x506E, 0x506F, 0x5070, 0x5071, 0x5072, 0x5073, 0x5074, 0x5075, 0x5078, 0x5079, 0x507A, 0x507C, 0x507D, 0x5081, 0x5082, 0x5083, 0x5084, 0x5086, 0x5087, 0x5089, 0x508A, 0x508B, 0x508C, 0x508E, 0x508F, 0x5090, 0x5091, 0x5092, 0x5093, 0x5094, 0x5095, 0x5096, 0x5097, 0x5098, 0x5099, 0x509A, 0x509B, 0x509C, 0x509D, 0x509E, 0x509F, 0x50A0, 0x50A1, 0x50A2, 0x50A4, 0x50A6, 0x50AA, 0x50AB, 0x50AD, 0x50AE, 0x50AF, 0x50B0, 0x50B1, 0x50B3, 0x50B4, 0x50B5, 0x50B6, 0x50B7, 0x50B8, 0x50B9, 0x50BC, // GB 0x8340..0x837E 0x50BD, 0x50BE, 0x50BF, 0x50C0, 0x50C1, 0x50C2, 0x50C3, 0x50C4, 0x50C5, 0x50C6, 0x50C7, 0x50C8, 0x50C9, 0x50CA, 0x50CB, 0x50CC, 0x50CD, 0x50CE, 0x50D0, 0x50D1, 0x50D2, 0x50D3, 0x50D4, 0x50D5, 0x50D7, 0x50D8, 0x50D9, 0x50DB, 0x50DC, 0x50DD, 0x50DE, 0x50DF, 0x50E0, 0x50E1, 0x50E2, 0x50E3, 0x50E4, 0x50E5, 0x50E8, 0x50E9, 0x50EA, 0x50EB, 0x50EF, 0x50F0, 0x50F1, 0x50F2, 0x50F4, 0x50F6, 0x50F7, 0x50F8, 0x50F9, 0x50FA, 0x50FC, 0x50FD, 0x50FE, 0x50FF, 0x5100, 0x5101, 0x5102, 0x5103, 0x5104, 0x5105, 0x5108, // GB 0x8380..0x83FE 0x5109, 0x510A, 0x510C, 0x510D, 0x510E, 0x510F, 0x5110, 0x5111, 0x5113, 0x5114, 0x5115, 0x5116, 0x5117, 0x5118, 0x5119, 0x511A, 0x511B, 0x511C, 0x511D, 0x511E, 0x511F, 0x5120, 0x5122, 0x5123, 0x5124, 0x5125, 0x5126, 0x5127, 0x5128, 0x5129, 0x512A, 0x512B, 0x512C, 0x512D, 0x512E, 0x512F, 0x5130, 0x5131, 0x5132, 0x5133, 0x5134, 0x5135, 0x5136, 0x5137, 0x5138, 0x5139, 0x513A, 0x513B, 0x513C, 0x513D, 0x513E, 0x5142, 0x5147, 0x514A, 0x514C, 0x514E, 0x514F, 0x5150, 0x5152, 0x5153, 0x5157, 0x5158, 0x5159, 0x515B, 0x515D, 0x515E, 0x515F, 0x5160, 0x5161, 0x5163, 0x5164, 0x5166, 0x5167, 0x5169, 0x516A, 0x516F, 0x5172, 0x517A, 0x517E, 0x517F, 0x5183, 0x5184, 0x5186, 0x5187, 0x518A, 0x518B, 0x518E, 0x518F, 0x5190, 0x5191, 0x5193, 0x5194, 0x5198, 0x519A, 0x519D, 0x519E, 0x519F, 0x51A1, 0x51A3, 0x51A6, 0x51A7, 0x51A8, 0x51A9, 0x51AA, 0x51AD, 0x51AE, 0x51B4, 0x51B8, 0x51B9, 0x51BA, 0x51BE, 0x51BF, 0x51C1, 0x51C2, 0x51C3, 0x51C5, 0x51C8, 0x51CA, 0x51CD, 0x51CE, 0x51D0, 0x51D2, 0x51D3, 0x51D4, 0x51D5, 0x51D6, 0x51D7, // GB 0x8440..0x847E 0x51D8, 0x51D9, 0x51DA, 0x51DC, 0x51DE, 0x51DF, 0x51E2, 0x51E3, 0x51E5, 0x51E6, 0x51E7, 0x51E8, 0x51E9, 0x51EA, 0x51EC, 0x51EE, 0x51F1, 0x51F2, 0x51F4, 0x51F7, 0x51FE, 0x5204, 0x5205, 0x5209, 0x520B, 0x520C, 0x520F, 0x5210, 0x5213, 0x5214, 0x5215, 0x521C, 0x521E, 0x521F, 0x5221, 0x5222, 0x5223, 0x5225, 0x5226, 0x5227, 0x522A, 0x522C, 0x522F, 0x5231, 0x5232, 0x5234, 0x5235, 0x523C, 0x523E, 0x5244, 0x5245, 0x5246, 0x5247, 0x5248, 0x5249, 0x524B, 0x524E, 0x524F, 0x5252, 0x5253, 0x5255, 0x5257, 0x5258, // GB 0x8480..0x84FE 0x5259, 0x525A, 0x525B, 0x525D, 0x525F, 0x5260, 0x5262, 0x5263, 0x5264, 0x5266, 0x5268, 0x526B, 0x526C, 0x526D, 0x526E, 0x5270, 0x5271, 0x5273, 0x5274, 0x5275, 0x5276, 0x5277, 0x5278, 0x5279, 0x527A, 0x527B, 0x527C, 0x527E, 0x5280, 0x5283, 0x5284, 0x5285, 0x5286, 0x5287, 0x5289, 0x528A, 0x528B, 0x528C, 0x528D, 0x528E, 0x528F, 0x5291, 0x5292, 0x5294, 0x5295, 0x5296, 0x5297, 0x5298, 0x5299, 0x529A, 0x529C, 0x52A4, 0x52A5, 0x52A6, 0x52A7, 0x52AE, 0x52AF, 0x52B0, 0x52B4, 0x52B5, 0x52B6, 0x52B7, 0x52B8, 0x52B9, 0x52BA, 0x52BB, 0x52BC, 0x52BD, 0x52C0, 0x52C1, 0x52C2, 0x52C4, 0x52C5, 0x52C6, 0x52C8, 0x52CA, 0x52CC, 0x52CD, 0x52CE, 0x52CF, 0x52D1, 0x52D3, 0x52D4, 0x52D5, 0x52D7, 0x52D9, 0x52DA, 0x52DB, 0x52DC, 0x52DD, 0x52DE, 0x52E0, 0x52E1, 0x52E2, 0x52E3, 0x52E5, 0x52E6, 0x52E7, 0x52E8, 0x52E9, 0x52EA, 0x52EB, 0x52EC, 0x52ED, 0x52EE, 0x52EF, 0x52F1, 0x52F2, 0x52F3, 0x52F4, 0x52F5, 0x52F6, 0x52F7, 0x52F8, 0x52FB, 0x52FC, 0x52FD, 0x5301, 0x5302, 0x5303, 0x5304, 0x5307, 0x5309, 0x530A, 0x530B, 0x530C, 0x530E, // GB 0x8540..0x857E 0x5311, 0x5312, 0x5313, 0x5314, 0x5318, 0x531B, 0x531C, 0x531E, 0x531F, 0x5322, 0x5324, 0x5325, 0x5327, 0x5328, 0x5329, 0x532B, 0x532C, 0x532D, 0x532F, 0x5330, 0x5331, 0x5332, 0x5333, 0x5334, 0x5335, 0x5336, 0x5337, 0x5338, 0x533C, 0x533D, 0x5340, 0x5342, 0x5344, 0x5346, 0x534B, 0x534C, 0x534D, 0x5350, 0x5354, 0x5358, 0x5359, 0x535B, 0x535D, 0x5365, 0x5368, 0x536A, 0x536C, 0x536D, 0x5372, 0x5376, 0x5379, 0x537B, 0x537C, 0x537D, 0x537E, 0x5380, 0x5381, 0x5383, 0x5387, 0x5388, 0x538A, 0x538E, 0x538F, // GB 0x8580..0x85FE 0x5390, 0x5391, 0x5392, 0x5393, 0x5394, 0x5396, 0x5397, 0x5399, 0x539B, 0x539C, 0x539E, 0x53A0, 0x53A1, 0x53A4, 0x53A7, 0x53AA, 0x53AB, 0x53AC, 0x53AD, 0x53AF, 0x53B0, 0x53B1, 0x53B2, 0x53B3, 0x53B4, 0x53B5, 0x53B7, 0x53B8, 0x53B9, 0x53BA, 0x53BC, 0x53BD, 0x53BE, 0x53C0, 0x53C3, 0x53C4, 0x53C5, 0x53C6, 0x53C7, 0x53CE, 0x53CF, 0x53D0, 0x53D2, 0x53D3, 0x53D5, 0x53DA, 0x53DC, 0x53DD, 0x53DE, 0x53E1, 0x53E2, 0x53E7, 0x53F4, 0x53FA, 0x53FE, 0x53FF, 0x5400, 0x5402, 0x5405, 0x5407, 0x540B, 0x5414, 0x5418, 0x5419, 0x541A, 0x541C, 0x5422, 0x5424, 0x5425, 0x542A, 0x5430, 0x5433, 0x5436, 0x5437, 0x543A, 0x543D, 0x543F, 0x5441, 0x5442, 0x5444, 0x5445, 0x5447, 0x5449, 0x544C, 0x544D, 0x544E, 0x544F, 0x5451, 0x545A, 0x545D, 0x545E, 0x545F, 0x5460, 0x5461, 0x5463, 0x5465, 0x5467, 0x5469, 0x546A, 0x546B, 0x546C, 0x546D, 0x546E, 0x546F, 0x5470, 0x5474, 0x5479, 0x547A, 0x547E, 0x547F, 0x5481, 0x5483, 0x5485, 0x5487, 0x5488, 0x5489, 0x548A, 0x548D, 0x5491, 0x5493, 0x5497, 0x5498, 0x549C, 0x549E, 0x549F, 0x54A0, 0x54A1, // GB 0x8640..0x867E 0x54A2, 0x54A5, 0x54AE, 0x54B0, 0x54B2, 0x54B5, 0x54B6, 0x54B7, 0x54B9, 0x54BA, 0x54BC, 0x54BE, 0x54C3, 0x54C5, 0x54CA, 0x54CB, 0x54D6, 0x54D8, 0x54DB, 0x54E0, 0x54E1, 0x54E2, 0x54E3, 0x54E4, 0x54EB, 0x54EC, 0x54EF, 0x54F0, 0x54F1, 0x54F4, 0x54F5, 0x54F6, 0x54F7, 0x54F8, 0x54F9, 0x54FB, 0x54FE, 0x5500, 0x5502, 0x5503, 0x5504, 0x5505, 0x5508, 0x550A, 0x550B, 0x550C, 0x550D, 0x550E, 0x5512, 0x5513, 0x5515, 0x5516, 0x5517, 0x5518, 0x5519, 0x551A, 0x551C, 0x551D, 0x551E, 0x551F, 0x5521, 0x5525, 0x5526, // GB 0x8680..0x86FE 0x5528, 0x5529, 0x552B, 0x552D, 0x5532, 0x5534, 0x5535, 0x5536, 0x5538, 0x5539, 0x553A, 0x553B, 0x553D, 0x5540, 0x5542, 0x5545, 0x5547, 0x5548, 0x554B, 0x554C, 0x554D, 0x554E, 0x554F, 0x5551, 0x5552, 0x5553, 0x5554, 0x5557, 0x5558, 0x5559, 0x555A, 0x555B, 0x555D, 0x555E, 0x555F, 0x5560, 0x5562, 0x5563, 0x5568, 0x5569, 0x556B, 0x556F, 0x5570, 0x5571, 0x5572, 0x5573, 0x5574, 0x5579, 0x557A, 0x557D, 0x557F, 0x5585, 0x5586, 0x558C, 0x558D, 0x558E, 0x5590, 0x5592, 0x5593, 0x5595, 0x5596, 0x5597, 0x559A, 0x559B, 0x559E, 0x55A0, 0x55A1, 0x55A2, 0x55A3, 0x55A4, 0x55A5, 0x55A6, 0x55A8, 0x55A9, 0x55AA, 0x55AB, 0x55AC, 0x55AD, 0x55AE, 0x55AF, 0x55B0, 0x55B2, 0x55B4, 0x55B6, 0x55B8, 0x55BA, 0x55BC, 0x55BF, 0x55C0, 0x55C1, 0x55C2, 0x55C3, 0x55C6, 0x55C7, 0x55C8, 0x55CA, 0x55CB, 0x55CE, 0x55CF, 0x55D0, 0x55D5, 0x55D7, 0x55D8, 0x55D9, 0x55DA, 0x55DB, 0x55DE, 0x55E0, 0x55E2, 0x55E7, 0x55E9, 0x55ED, 0x55EE, 0x55F0, 0x55F1, 0x55F4, 0x55F6, 0x55F8, 0x55F9, 0x55FA, 0x55FB, 0x55FC, 0x55FF, 0x5602, 0x5603, 0x5604, 0x5605, // GB 0x8740..0x877E 0x5606, 0x5607, 0x560A, 0x560B, 0x560D, 0x5610, 0x5611, 0x5612, 0x5613, 0x5614, 0x5615, 0x5616, 0x5617, 0x5619, 0x561A, 0x561C, 0x561D, 0x5620, 0x5621, 0x5622, 0x5625, 0x5626, 0x5628, 0x5629, 0x562A, 0x562B, 0x562E, 0x562F, 0x5630, 0x5633, 0x5635, 0x5637, 0x5638, 0x563A, 0x563C, 0x563D, 0x563E, 0x5640, 0x5641, 0x5642, 0x5643, 0x5644, 0x5645, 0x5646, 0x5647, 0x5648, 0x5649, 0x564A, 0x564B, 0x564F, 0x5650, 0x5651, 0x5652, 0x5653, 0x5655, 0x5656, 0x565A, 0x565B, 0x565D, 0x565E, 0x565F, 0x5660, 0x5661, // GB 0x8780..0x87FE 0x5663, 0x5665, 0x5666, 0x5667, 0x566D, 0x566E, 0x566F, 0x5670, 0x5672, 0x5673, 0x5674, 0x5675, 0x5677, 0x5678, 0x5679, 0x567A, 0x567D, 0x567E, 0x567F, 0x5680, 0x5681, 0x5682, 0x5683, 0x5684, 0x5687, 0x5688, 0x5689, 0x568A, 0x568B, 0x568C, 0x568D, 0x5690, 0x5691, 0x5692, 0x5694, 0x5695, 0x5696, 0x5697, 0x5698, 0x5699, 0x569A, 0x569B, 0x569C, 0x569D, 0x569E, 0x569F, 0x56A0, 0x56A1, 0x56A2, 0x56A4, 0x56A5, 0x56A6, 0x56A7, 0x56A8, 0x56A9, 0x56AA, 0x56AB, 0x56AC, 0x56AD, 0x56AE, 0x56B0, 0x56B1, 0x56B2, 0x56B3, 0x56B4, 0x56B5, 0x56B6, 0x56B8, 0x56B9, 0x56BA, 0x56BB, 0x56BD, 0x56BE, 0x56BF, 0x56C0, 0x56C1, 0x56C2, 0x56C3, 0x56C4, 0x56C5, 0x56C6, 0x56C7, 0x56C8, 0x56C9, 0x56CB, 0x56CC, 0x56CD, 0x56CE, 0x56CF, 0x56D0, 0x56D1, 0x56D2, 0x56D3, 0x56D5, 0x56D6, 0x56D8, 0x56D9, 0x56DC, 0x56E3, 0x56E5, 0x56E6, 0x56E7, 0x56E8, 0x56E9, 0x56EA, 0x56EC, 0x56EE, 0x56EF, 0x56F2, 0x56F3, 0x56F6, 0x56F7, 0x56F8, 0x56FB, 0x56FC, 0x5700, 0x5701, 0x5702, 0x5705, 0x5707, 0x570B, 0x570C, 0x570D, 0x570E, 0x570F, 0x5710, 0x5711, // GB 0x8840..0x887E 0x5712, 0x5713, 0x5714, 0x5715, 0x5716, 0x5717, 0x5718, 0x5719, 0x571A, 0x571B, 0x571D, 0x571E, 0x5720, 0x5721, 0x5722, 0x5724, 0x5725, 0x5726, 0x5727, 0x572B, 0x5731, 0x5732, 0x5734, 0x5735, 0x5736, 0x5737, 0x5738, 0x573C, 0x573D, 0x573F, 0x5741, 0x5743, 0x5744, 0x5745, 0x5746, 0x5748, 0x5749, 0x574B, 0x5752, 0x5753, 0x5754, 0x5755, 0x5756, 0x5758, 0x5759, 0x5762, 0x5763, 0x5765, 0x5767, 0x576C, 0x576E, 0x5770, 0x5771, 0x5772, 0x5774, 0x5775, 0x5778, 0x5779, 0x577A, 0x577D, 0x577E, 0x577F, 0x5780, // GB 0x8880..0x88FE 0x5781, 0x5787, 0x5788, 0x5789, 0x578A, 0x578D, 0x578E, 0x578F, 0x5790, 0x5791, 0x5794, 0x5795, 0x5796, 0x5797, 0x5798, 0x5799, 0x579A, 0x579C, 0x579D, 0x579E, 0x579F, 0x57A5, 0x57A8, 0x57AA, 0x57AC, 0x57AF, 0x57B0, 0x57B1, 0x57B3, 0x57B5, 0x57B6, 0x57B7, 0x57B9, 0x57BA, 0x57BB, 0x57BC, 0x57BD, 0x57BE, 0x57BF, 0x57C0, 0x57C1, 0x57C4, 0x57C5, 0x57C6, 0x57C7, 0x57C8, 0x57C9, 0x57CA, 0x57CC, 0x57CD, 0x57D0, 0x57D1, 0x57D3, 0x57D6, 0x57D7, 0x57DB, 0x57DC, 0x57DE, 0x57E1, 0x57E2, 0x57E3, 0x57E5, 0x57E6, 0x57E7, 0x57E8, 0x57E9, 0x57EA, 0x57EB, 0x57EC, 0x57EE, 0x57F0, 0x57F1, 0x57F2, 0x57F3, 0x57F5, 0x57F6, 0x57F7, 0x57FB, 0x57FC, 0x57FE, 0x57FF, 0x5801, 0x5803, 0x5804, 0x5805, 0x5808, 0x5809, 0x580A, 0x580C, 0x580E, 0x580F, 0x5810, 0x5812, 0x5813, 0x5814, 0x5816, 0x5817, 0x5818, 0x581A, 0x581B, 0x581C, 0x581D, 0x581F, 0x5822, 0x5823, 0x5825, 0x5826, 0x5827, 0x5828, 0x5829, 0x582B, 0x582C, 0x582D, 0x582E, 0x582F, 0x5831, 0x5832, 0x5833, 0x5834, 0x5836, 0x5837, 0x5838, 0x5839, 0x583A, 0x583B, 0x583C, 0x583D, // GB 0x8940..0x897E 0x583E, 0x583F, 0x5840, 0x5841, 0x5842, 0x5843, 0x5845, 0x5846, 0x5847, 0x5848, 0x5849, 0x584A, 0x584B, 0x584E, 0x584F, 0x5850, 0x5852, 0x5853, 0x5855, 0x5856, 0x5857, 0x5859, 0x585A, 0x585B, 0x585C, 0x585D, 0x585F, 0x5860, 0x5861, 0x5862, 0x5863, 0x5864, 0x5866, 0x5867, 0x5868, 0x5869, 0x586A, 0x586D, 0x586E, 0x586F, 0x5870, 0x5871, 0x5872, 0x5873, 0x5874, 0x5875, 0x5876, 0x5877, 0x5878, 0x5879, 0x587A, 0x587B, 0x587C, 0x587D, 0x587F, 0x5882, 0x5884, 0x5886, 0x5887, 0x5888, 0x588A, 0x588B, 0x588C, // GB 0x8980..0x89FE 0x588D, 0x588E, 0x588F, 0x5890, 0x5891, 0x5894, 0x5895, 0x5896, 0x5897, 0x5898, 0x589B, 0x589C, 0x589D, 0x58A0, 0x58A1, 0x58A2, 0x58A3, 0x58A4, 0x58A5, 0x58A6, 0x58A7, 0x58AA, 0x58AB, 0x58AC, 0x58AD, 0x58AE, 0x58AF, 0x58B0, 0x58B1, 0x58B2, 0x58B3, 0x58B4, 0x58B5, 0x58B6, 0x58B7, 0x58B8, 0x58B9, 0x58BA, 0x58BB, 0x58BD, 0x58BE, 0x58BF, 0x58C0, 0x58C2, 0x58C3, 0x58C4, 0x58C6, 0x58C7, 0x58C8, 0x58C9, 0x58CA, 0x58CB, 0x58CC, 0x58CD, 0x58CE, 0x58CF, 0x58D0, 0x58D2, 0x58D3, 0x58D4, 0x58D6, 0x58D7, 0x58D8, 0x58D9, 0x58DA, 0x58DB, 0x58DC, 0x58DD, 0x58DE, 0x58DF, 0x58E0, 0x58E1, 0x58E2, 0x58E3, 0x58E5, 0x58E6, 0x58E7, 0x58E8, 0x58E9, 0x58EA, 0x58ED, 0x58EF, 0x58F1, 0x58F2, 0x58F4, 0x58F5, 0x58F7, 0x58F8, 0x58FA, 0x58FB, 0x58FC, 0x58FD, 0x58FE, 0x58FF, 0x5900, 0x5901, 0x5903, 0x5905, 0x5906, 0x5908, 0x5909, 0x590A, 0x590B, 0x590C, 0x590E, 0x5910, 0x5911, 0x5912, 0x5913, 0x5917, 0x5918, 0x591B, 0x591D, 0x591E, 0x5920, 0x5921, 0x5922, 0x5923, 0x5926, 0x5928, 0x592C, 0x5930, 0x5932, 0x5933, 0x5935, 0x5936, 0x593B, // GB 0x8A40..0x8A7E 0x593D, 0x593E, 0x593F, 0x5940, 0x5943, 0x5945, 0x5946, 0x594A, 0x594C, 0x594D, 0x5950, 0x5952, 0x5953, 0x5959, 0x595B, 0x595C, 0x595D, 0x595E, 0x595F, 0x5961, 0x5963, 0x5964, 0x5966, 0x5967, 0x5968, 0x5969, 0x596A, 0x596B, 0x596C, 0x596D, 0x596E, 0x596F, 0x5970, 0x5971, 0x5972, 0x5975, 0x5977, 0x597A, 0x597B, 0x597C, 0x597E, 0x597F, 0x5980, 0x5985, 0x5989, 0x598B, 0x598C, 0x598E, 0x598F, 0x5990, 0x5991, 0x5994, 0x5995, 0x5998, 0x599A, 0x599B, 0x599C, 0x599D, 0x599F, 0x59A0, 0x59A1, 0x59A2, 0x59A6, // GB 0x8A80..0x8AFE 0x59A7, 0x59AC, 0x59AD, 0x59B0, 0x59B1, 0x59B3, 0x59B4, 0x59B5, 0x59B6, 0x59B7, 0x59B8, 0x59BA, 0x59BC, 0x59BD, 0x59BF, 0x59C0, 0x59C1, 0x59C2, 0x59C3, 0x59C4, 0x59C5, 0x59C7, 0x59C8, 0x59C9, 0x59CC, 0x59CD, 0x59CE, 0x59CF, 0x59D5, 0x59D6, 0x59D9, 0x59DB, 0x59DE, 0x59DF, 0x59E0, 0x59E1, 0x59E2, 0x59E4, 0x59E6, 0x59E7, 0x59E9, 0x59EA, 0x59EB, 0x59ED, 0x59EE, 0x59EF, 0x59F0, 0x59F1, 0x59F2, 0x59F3, 0x59F4, 0x59F5, 0x59F6, 0x59F7, 0x59F8, 0x59FA, 0x59FC, 0x59FD, 0x59FE, 0x5A00, 0x5A02, 0x5A0A, 0x5A0B, 0x5A0D, 0x5A0E, 0x5A0F, 0x5A10, 0x5A12, 0x5A14, 0x5A15, 0x5A16, 0x5A17, 0x5A19, 0x5A1A, 0x5A1B, 0x5A1D, 0x5A1E, 0x5A21, 0x5A22, 0x5A24, 0x5A26, 0x5A27, 0x5A28, 0x5A2A, 0x5A2B, 0x5A2C, 0x5A2D, 0x5A2E, 0x5A2F, 0x5A30, 0x5A33, 0x5A35, 0x5A37, 0x5A38, 0x5A39, 0x5A3A, 0x5A3B, 0x5A3D, 0x5A3E, 0x5A3F, 0x5A41, 0x5A42, 0x5A43, 0x5A44, 0x5A45, 0x5A47, 0x5A48, 0x5A4B, 0x5A4C, 0x5A4D, 0x5A4E, 0x5A4F, 0x5A50, 0x5A51, 0x5A52, 0x5A53, 0x5A54, 0x5A56, 0x5A57, 0x5A58, 0x5A59, 0x5A5B, 0x5A5C, 0x5A5D, 0x5A5E, 0x5A5F, 0x5A60, // GB 0x8B40..0x8B7E 0x5A61, 0x5A63, 0x5A64, 0x5A65, 0x5A66, 0x5A68, 0x5A69, 0x5A6B, 0x5A6C, 0x5A6D, 0x5A6E, 0x5A6F, 0x5A70, 0x5A71, 0x5A72, 0x5A73, 0x5A78, 0x5A79, 0x5A7B, 0x5A7C, 0x5A7D, 0x5A7E, 0x5A80, 0x5A81, 0x5A82, 0x5A83, 0x5A84, 0x5A85, 0x5A86, 0x5A87, 0x5A88, 0x5A89, 0x5A8A, 0x5A8B, 0x5A8C, 0x5A8D, 0x5A8E, 0x5A8F, 0x5A90, 0x5A91, 0x5A93, 0x5A94, 0x5A95, 0x5A96, 0x5A97, 0x5A98, 0x5A99, 0x5A9C, 0x5A9D, 0x5A9E, 0x5A9F, 0x5AA0, 0x5AA1, 0x5AA2, 0x5AA3, 0x5AA4, 0x5AA5, 0x5AA6, 0x5AA7, 0x5AA8, 0x5AA9, 0x5AAB, 0x5AAC, // GB 0x8B80..0x8BFE 0x5AAD, 0x5AAE, 0x5AAF, 0x5AB0, 0x5AB1, 0x5AB4, 0x5AB6, 0x5AB7, 0x5AB9, 0x5ABA, 0x5ABB, 0x5ABC, 0x5ABD, 0x5ABF, 0x5AC0, 0x5AC3, 0x5AC4, 0x5AC5, 0x5AC6, 0x5AC7, 0x5AC8, 0x5ACA, 0x5ACB, 0x5ACD, 0x5ACE, 0x5ACF, 0x5AD0, 0x5AD1, 0x5AD3, 0x5AD5, 0x5AD7, 0x5AD9, 0x5ADA, 0x5ADB, 0x5ADD, 0x5ADE, 0x5ADF, 0x5AE2, 0x5AE4, 0x5AE5, 0x5AE7, 0x5AE8, 0x5AEA, 0x5AEC, 0x5AED, 0x5AEE, 0x5AEF, 0x5AF0, 0x5AF2, 0x5AF3, 0x5AF4, 0x5AF5, 0x5AF6, 0x5AF7, 0x5AF8, 0x5AF9, 0x5AFA, 0x5AFB, 0x5AFC, 0x5AFD, 0x5AFE, 0x5AFF, 0x5B00, 0x5B01, 0x5B02, 0x5B03, 0x5B04, 0x5B05, 0x5B06, 0x5B07, 0x5B08, 0x5B0A, 0x5B0B, 0x5B0C, 0x5B0D, 0x5B0E, 0x5B0F, 0x5B10, 0x5B11, 0x5B12, 0x5B13, 0x5B14, 0x5B15, 0x5B18, 0x5B19, 0x5B1A, 0x5B1B, 0x5B1C, 0x5B1D, 0x5B1E, 0x5B1F, 0x5B20, 0x5B21, 0x5B22, 0x5B23, 0x5B24, 0x5B25, 0x5B26, 0x5B27, 0x5B28, 0x5B29, 0x5B2A, 0x5B2B, 0x5B2C, 0x5B2D, 0x5B2E, 0x5B2F, 0x5B30, 0x5B31, 0x5B33, 0x5B35, 0x5B36, 0x5B38, 0x5B39, 0x5B3A, 0x5B3B, 0x5B3C, 0x5B3D, 0x5B3E, 0x5B3F, 0x5B41, 0x5B42, 0x5B43, 0x5B44, 0x5B45, 0x5B46, 0x5B47, // GB 0x8C40..0x8C7E 0x5B48, 0x5B49, 0x5B4A, 0x5B4B, 0x5B4C, 0x5B4D, 0x5B4E, 0x5B4F, 0x5B52, 0x5B56, 0x5B5E, 0x5B60, 0x5B61, 0x5B67, 0x5B68, 0x5B6B, 0x5B6D, 0x5B6E, 0x5B6F, 0x5B72, 0x5B74, 0x5B76, 0x5B77, 0x5B78, 0x5B79, 0x5B7B, 0x5B7C, 0x5B7E, 0x5B7F, 0x5B82, 0x5B86, 0x5B8A, 0x5B8D, 0x5B8E, 0x5B90, 0x5B91, 0x5B92, 0x5B94, 0x5B96, 0x5B9F, 0x5BA7, 0x5BA8, 0x5BA9, 0x5BAC, 0x5BAD, 0x5BAE, 0x5BAF, 0x5BB1, 0x5BB2, 0x5BB7, 0x5BBA, 0x5BBB, 0x5BBC, 0x5BC0, 0x5BC1, 0x5BC3, 0x5BC8, 0x5BC9, 0x5BCA, 0x5BCB, 0x5BCD, 0x5BCE, 0x5BCF, // GB 0x8C80..0x8CFE 0x5BD1, 0x5BD4, 0x5BD5, 0x5BD6, 0x5BD7, 0x5BD8, 0x5BD9, 0x5BDA, 0x5BDB, 0x5BDC, 0x5BE0, 0x5BE2, 0x5BE3, 0x5BE6, 0x5BE7, 0x5BE9, 0x5BEA, 0x5BEB, 0x5BEC, 0x5BED, 0x5BEF, 0x5BF1, 0x5BF2, 0x5BF3, 0x5BF4, 0x5BF5, 0x5BF6, 0x5BF7, 0x5BFD, 0x5BFE, 0x5C00, 0x5C02, 0x5C03, 0x5C05, 0x5C07, 0x5C08, 0x5C0B, 0x5C0C, 0x5C0D, 0x5C0E, 0x5C10, 0x5C12, 0x5C13, 0x5C17, 0x5C19, 0x5C1B, 0x5C1E, 0x5C1F, 0x5C20, 0x5C21, 0x5C23, 0x5C26, 0x5C28, 0x5C29, 0x5C2A, 0x5C2B, 0x5C2D, 0x5C2E, 0x5C2F, 0x5C30, 0x5C32, 0x5C33, 0x5C35, 0x5C36, 0x5C37, 0x5C43, 0x5C44, 0x5C46, 0x5C47, 0x5C4C, 0x5C4D, 0x5C52, 0x5C53, 0x5C54, 0x5C56, 0x5C57, 0x5C58, 0x5C5A, 0x5C5B, 0x5C5C, 0x5C5D, 0x5C5F, 0x5C62, 0x5C64, 0x5C67, 0x5C68, 0x5C69, 0x5C6A, 0x5C6B, 0x5C6C, 0x5C6D, 0x5C70, 0x5C72, 0x5C73, 0x5C74, 0x5C75, 0x5C76, 0x5C77, 0x5C78, 0x5C7B, 0x5C7C, 0x5C7D, 0x5C7E, 0x5C80, 0x5C83, 0x5C84, 0x5C85, 0x5C86, 0x5C87, 0x5C89, 0x5C8A, 0x5C8B, 0x5C8E, 0x5C8F, 0x5C92, 0x5C93, 0x5C95, 0x5C9D, 0x5C9E, 0x5C9F, 0x5CA0, 0x5CA1, 0x5CA4, 0x5CA5, 0x5CA6, 0x5CA7, 0x5CA8, // GB 0x8D40..0x8D7E 0x5CAA, 0x5CAE, 0x5CAF, 0x5CB0, 0x5CB2, 0x5CB4, 0x5CB6, 0x5CB9, 0x5CBA, 0x5CBB, 0x5CBC, 0x5CBE, 0x5CC0, 0x5CC2, 0x5CC3, 0x5CC5, 0x5CC6, 0x5CC7, 0x5CC8, 0x5CC9, 0x5CCA, 0x5CCC, 0x5CCD, 0x5CCE, 0x5CCF, 0x5CD0, 0x5CD1, 0x5CD3, 0x5CD4, 0x5CD5, 0x5CD6, 0x5CD7, 0x5CD8, 0x5CDA, 0x5CDB, 0x5CDC, 0x5CDD, 0x5CDE, 0x5CDF, 0x5CE0, 0x5CE2, 0x5CE3, 0x5CE7, 0x5CE9, 0x5CEB, 0x5CEC, 0x5CEE, 0x5CEF, 0x5CF1, 0x5CF2, 0x5CF3, 0x5CF4, 0x5CF5, 0x5CF6, 0x5CF7, 0x5CF8, 0x5CF9, 0x5CFA, 0x5CFC, 0x5CFD, 0x5CFE, 0x5CFF, 0x5D00, // GB 0x8D80..0x8DFE 0x5D01, 0x5D04, 0x5D05, 0x5D08, 0x5D09, 0x5D0A, 0x5D0B, 0x5D0C, 0x5D0D, 0x5D0F, 0x5D10, 0x5D11, 0x5D12, 0x5D13, 0x5D15, 0x5D17, 0x5D18, 0x5D19, 0x5D1A, 0x5D1C, 0x5D1D, 0x5D1F, 0x5D20, 0x5D21, 0x5D22, 0x5D23, 0x5D25, 0x5D28, 0x5D2A, 0x5D2B, 0x5D2C, 0x5D2F, 0x5D30, 0x5D31, 0x5D32, 0x5D33, 0x5D35, 0x5D36, 0x5D37, 0x5D38, 0x5D39, 0x5D3A, 0x5D3B, 0x5D3C, 0x5D3F, 0x5D40, 0x5D41, 0x5D42, 0x5D43, 0x5D44, 0x5D45, 0x5D46, 0x5D48, 0x5D49, 0x5D4D, 0x5D4E, 0x5D4F, 0x5D50, 0x5D51, 0x5D52, 0x5D53, 0x5D54, 0x5D55, 0x5D56, 0x5D57, 0x5D59, 0x5D5A, 0x5D5C, 0x5D5E, 0x5D5F, 0x5D60, 0x5D61, 0x5D62, 0x5D63, 0x5D64, 0x5D65, 0x5D66, 0x5D67, 0x5D68, 0x5D6A, 0x5D6D, 0x5D6E, 0x5D70, 0x5D71, 0x5D72, 0x5D73, 0x5D75, 0x5D76, 0x5D77, 0x5D78, 0x5D79, 0x5D7A, 0x5D7B, 0x5D7C, 0x5D7D, 0x5D7E, 0x5D7F, 0x5D80, 0x5D81, 0x5D83, 0x5D84, 0x5D85, 0x5D86, 0x5D87, 0x5D88, 0x5D89, 0x5D8A, 0x5D8B, 0x5D8C, 0x5D8D, 0x5D8E, 0x5D8F, 0x5D90, 0x5D91, 0x5D92, 0x5D93, 0x5D94, 0x5D95, 0x5D96, 0x5D97, 0x5D98, 0x5D9A, 0x5D9B, 0x5D9C, 0x5D9E, 0x5D9F, 0x5DA0, // GB 0x8E40..0x8E7E 0x5DA1, 0x5DA2, 0x5DA3, 0x5DA4, 0x5DA5, 0x5DA6, 0x5DA7, 0x5DA8, 0x5DA9, 0x5DAA, 0x5DAB, 0x5DAC, 0x5DAD, 0x5DAE, 0x5DAF, 0x5DB0, 0x5DB1, 0x5DB2, 0x5DB3, 0x5DB4, 0x5DB5, 0x5DB6, 0x5DB8, 0x5DB9, 0x5DBA, 0x5DBB, 0x5DBC, 0x5DBD, 0x5DBE, 0x5DBF, 0x5DC0, 0x5DC1, 0x5DC2, 0x5DC3, 0x5DC4, 0x5DC6, 0x5DC7, 0x5DC8, 0x5DC9, 0x5DCA, 0x5DCB, 0x5DCC, 0x5DCE, 0x5DCF, 0x5DD0, 0x5DD1, 0x5DD2, 0x5DD3, 0x5DD4, 0x5DD5, 0x5DD6, 0x5DD7, 0x5DD8, 0x5DD9, 0x5DDA, 0x5DDC, 0x5DDF, 0x5DE0, 0x5DE3, 0x5DE4, 0x5DEA, 0x5DEC, 0x5DED, // GB 0x8E80..0x8EFE 0x5DF0, 0x5DF5, 0x5DF6, 0x5DF8, 0x5DF9, 0x5DFA, 0x5DFB, 0x5DFC, 0x5DFF, 0x5E00, 0x5E04, 0x5E07, 0x5E09, 0x5E0A, 0x5E0B, 0x5E0D, 0x5E0E, 0x5E12, 0x5E13, 0x5E17, 0x5E1E, 0x5E1F, 0x5E20, 0x5E21, 0x5E22, 0x5E23, 0x5E24, 0x5E25, 0x5E28, 0x5E29, 0x5E2A, 0x5E2B, 0x5E2C, 0x5E2F, 0x5E30, 0x5E32, 0x5E33, 0x5E34, 0x5E35, 0x5E36, 0x5E39, 0x5E3A, 0x5E3E, 0x5E3F, 0x5E40, 0x5E41, 0x5E43, 0x5E46, 0x5E47, 0x5E48, 0x5E49, 0x5E4A, 0x5E4B, 0x5E4D, 0x5E4E, 0x5E4F, 0x5E50, 0x5E51, 0x5E52, 0x5E53, 0x5E56, 0x5E57, 0x5E58, 0x5E59, 0x5E5A, 0x5E5C, 0x5E5D, 0x5E5F, 0x5E60, 0x5E63, 0x5E64, 0x5E65, 0x5E66, 0x5E67, 0x5E68, 0x5E69, 0x5E6A, 0x5E6B, 0x5E6C, 0x5E6D, 0x5E6E, 0x5E6F, 0x5E70, 0x5E71, 0x5E75, 0x5E77, 0x5E79, 0x5E7E, 0x5E81, 0x5E82, 0x5E83, 0x5E85, 0x5E88, 0x5E89, 0x5E8C, 0x5E8D, 0x5E8E, 0x5E92, 0x5E98, 0x5E9B, 0x5E9D, 0x5EA1, 0x5EA2, 0x5EA3, 0x5EA4, 0x5EA8, 0x5EA9, 0x5EAA, 0x5EAB, 0x5EAC, 0x5EAE, 0x5EAF, 0x5EB0, 0x5EB1, 0x5EB2, 0x5EB4, 0x5EBA, 0x5EBB, 0x5EBC, 0x5EBD, 0x5EBF, 0x5EC0, 0x5EC1, 0x5EC2, 0x5EC3, 0x5EC4, 0x5EC5, // GB 0x8F40..0x8F7E 0x5EC6, 0x5EC7, 0x5EC8, 0x5ECB, 0x5ECC, 0x5ECD, 0x5ECE, 0x5ECF, 0x5ED0, 0x5ED4, 0x5ED5, 0x5ED7, 0x5ED8, 0x5ED9, 0x5EDA, 0x5EDC, 0x5EDD, 0x5EDE, 0x5EDF, 0x5EE0, 0x5EE1, 0x5EE2, 0x5EE3, 0x5EE4, 0x5EE5, 0x5EE6, 0x5EE7, 0x5EE9, 0x5EEB, 0x5EEC, 0x5EED, 0x5EEE, 0x5EEF, 0x5EF0, 0x5EF1, 0x5EF2, 0x5EF3, 0x5EF5, 0x5EF8, 0x5EF9, 0x5EFB, 0x5EFC, 0x5EFD, 0x5F05, 0x5F06, 0x5F07, 0x5F09, 0x5F0C, 0x5F0D, 0x5F0E, 0x5F10, 0x5F12, 0x5F14, 0x5F16, 0x5F19, 0x5F1A, 0x5F1C, 0x5F1D, 0x5F1E, 0x5F21, 0x5F22, 0x5F23, 0x5F24, // GB 0x8F80..0x8FFE 0x5F28, 0x5F2B, 0x5F2C, 0x5F2E, 0x5F30, 0x5F32, 0x5F33, 0x5F34, 0x5F35, 0x5F36, 0x5F37, 0x5F38, 0x5F3B, 0x5F3D, 0x5F3E, 0x5F3F, 0x5F41, 0x5F42, 0x5F43, 0x5F44, 0x5F45, 0x5F46, 0x5F47, 0x5F48, 0x5F49, 0x5F4A, 0x5F4B, 0x5F4C, 0x5F4D, 0x5F4E, 0x5F4F, 0x5F51, 0x5F54, 0x5F59, 0x5F5A, 0x5F5B, 0x5F5C, 0x5F5E, 0x5F5F, 0x5F60, 0x5F63, 0x5F65, 0x5F67, 0x5F68, 0x5F6B, 0x5F6E, 0x5F6F, 0x5F72, 0x5F74, 0x5F75, 0x5F76, 0x5F78, 0x5F7A, 0x5F7D, 0x5F7E, 0x5F7F, 0x5F83, 0x5F86, 0x5F8D, 0x5F8E, 0x5F8F, 0x5F91, 0x5F93, 0x5F94, 0x5F96, 0x5F9A, 0x5F9B, 0x5F9D, 0x5F9E, 0x5F9F, 0x5FA0, 0x5FA2, 0x5FA3, 0x5FA4, 0x5FA5, 0x5FA6, 0x5FA7, 0x5FA9, 0x5FAB, 0x5FAC, 0x5FAF, 0x5FB0, 0x5FB1, 0x5FB2, 0x5FB3, 0x5FB4, 0x5FB6, 0x5FB8, 0x5FB9, 0x5FBA, 0x5FBB, 0x5FBE, 0x5FBF, 0x5FC0, 0x5FC1, 0x5FC2, 0x5FC7, 0x5FC8, 0x5FCA, 0x5FCB, 0x5FCE, 0x5FD3, 0x5FD4, 0x5FD5, 0x5FDA, 0x5FDB, 0x5FDC, 0x5FDE, 0x5FDF, 0x5FE2, 0x5FE3, 0x5FE5, 0x5FE6, 0x5FE8, 0x5FE9, 0x5FEC, 0x5FEF, 0x5FF0, 0x5FF2, 0x5FF3, 0x5FF4, 0x5FF6, 0x5FF7, 0x5FF9, 0x5FFA, 0x5FFC, 0x6007, // GB 0x9040..0x907E 0x6008, 0x6009, 0x600B, 0x600C, 0x6010, 0x6011, 0x6013, 0x6017, 0x6018, 0x601A, 0x601E, 0x601F, 0x6022, 0x6023, 0x6024, 0x602C, 0x602D, 0x602E, 0x6030, 0x6031, 0x6032, 0x6033, 0x6034, 0x6036, 0x6037, 0x6038, 0x6039, 0x603A, 0x603D, 0x603E, 0x6040, 0x6044, 0x6045, 0x6046, 0x6047, 0x6048, 0x6049, 0x604A, 0x604C, 0x604E, 0x604F, 0x6051, 0x6053, 0x6054, 0x6056, 0x6057, 0x6058, 0x605B, 0x605C, 0x605E, 0x605F, 0x6060, 0x6061, 0x6065, 0x6066, 0x606E, 0x6071, 0x6072, 0x6074, 0x6075, 0x6077, 0x607E, 0x6080, // GB 0x9080..0x90FE 0x6081, 0x6082, 0x6085, 0x6086, 0x6087, 0x6088, 0x608A, 0x608B, 0x608E, 0x608F, 0x6090, 0x6091, 0x6093, 0x6095, 0x6097, 0x6098, 0x6099, 0x609C, 0x609E, 0x60A1, 0x60A2, 0x60A4, 0x60A5, 0x60A7, 0x60A9, 0x60AA, 0x60AE, 0x60B0, 0x60B3, 0x60B5, 0x60B6, 0x60B7, 0x60B9, 0x60BA, 0x60BD, 0x60BE, 0x60BF, 0x60C0, 0x60C1, 0x60C2, 0x60C3, 0x60C4, 0x60C7, 0x60C8, 0x60C9, 0x60CC, 0x60CD, 0x60CE, 0x60CF, 0x60D0, 0x60D2, 0x60D3, 0x60D4, 0x60D6, 0x60D7, 0x60D9, 0x60DB, 0x60DE, 0x60E1, 0x60E2, 0x60E3, 0x60E4, 0x60E5, 0x60EA, 0x60F1, 0x60F2, 0x60F5, 0x60F7, 0x60F8, 0x60FB, 0x60FC, 0x60FD, 0x60FE, 0x60FF, 0x6102, 0x6103, 0x6104, 0x6105, 0x6107, 0x610A, 0x610B, 0x610C, 0x6110, 0x6111, 0x6112, 0x6113, 0x6114, 0x6116, 0x6117, 0x6118, 0x6119, 0x611B, 0x611C, 0x611D, 0x611E, 0x6121, 0x6122, 0x6125, 0x6128, 0x6129, 0x612A, 0x612C, 0x612D, 0x612E, 0x612F, 0x6130, 0x6131, 0x6132, 0x6133, 0x6134, 0x6135, 0x6136, 0x6137, 0x6138, 0x6139, 0x613A, 0x613B, 0x613C, 0x613D, 0x613E, 0x6140, 0x6141, 0x6142, 0x6143, 0x6144, 0x6145, 0x6146, // GB 0x9140..0x917E 0x6147, 0x6149, 0x614B, 0x614D, 0x614F, 0x6150, 0x6152, 0x6153, 0x6154, 0x6156, 0x6157, 0x6158, 0x6159, 0x615A, 0x615B, 0x615C, 0x615E, 0x615F, 0x6160, 0x6161, 0x6163, 0x6164, 0x6165, 0x6166, 0x6169, 0x616A, 0x616B, 0x616C, 0x616D, 0x616E, 0x616F, 0x6171, 0x6172, 0x6173, 0x6174, 0x6176, 0x6178, 0x6179, 0x617A, 0x617B, 0x617C, 0x617D, 0x617E, 0x617F, 0x6180, 0x6181, 0x6182, 0x6183, 0x6184, 0x6185, 0x6186, 0x6187, 0x6188, 0x6189, 0x618A, 0x618C, 0x618D, 0x618F, 0x6190, 0x6191, 0x6192, 0x6193, 0x6195, // GB 0x9180..0x91FE 0x6196, 0x6197, 0x6198, 0x6199, 0x619A, 0x619B, 0x619C, 0x619E, 0x619F, 0x61A0, 0x61A1, 0x61A2, 0x61A3, 0x61A4, 0x61A5, 0x61A6, 0x61AA, 0x61AB, 0x61AD, 0x61AE, 0x61AF, 0x61B0, 0x61B1, 0x61B2, 0x61B3, 0x61B4, 0x61B5, 0x61B6, 0x61B8, 0x61B9, 0x61BA, 0x61BB, 0x61BC, 0x61BD, 0x61BF, 0x61C0, 0x61C1, 0x61C3, 0x61C4, 0x61C5, 0x61C6, 0x61C7, 0x61C9, 0x61CC, 0x61CD, 0x61CE, 0x61CF, 0x61D0, 0x61D3, 0x61D5, 0x61D6, 0x61D7, 0x61D8, 0x61D9, 0x61DA, 0x61DB, 0x61DC, 0x61DD, 0x61DE, 0x61DF, 0x61E0, 0x61E1, 0x61E2, 0x61E3, 0x61E4, 0x61E5, 0x61E7, 0x61E8, 0x61E9, 0x61EA, 0x61EB, 0x61EC, 0x61ED, 0x61EE, 0x61EF, 0x61F0, 0x61F1, 0x61F2, 0x61F3, 0x61F4, 0x61F6, 0x61F7, 0x61F8, 0x61F9, 0x61FA, 0x61FB, 0x61FC, 0x61FD, 0x61FE, 0x6200, 0x6201, 0x6202, 0x6203, 0x6204, 0x6205, 0x6207, 0x6209, 0x6213, 0x6214, 0x6219, 0x621C, 0x621D, 0x621E, 0x6220, 0x6223, 0x6226, 0x6227, 0x6228, 0x6229, 0x622B, 0x622D, 0x622F, 0x6230, 0x6231, 0x6232, 0x6235, 0x6236, 0x6238, 0x6239, 0x623A, 0x623B, 0x623C, 0x6242, 0x6244, 0x6245, 0x6246, 0x624A, // GB 0x9240..0x927E 0x624F, 0x6250, 0x6255, 0x6256, 0x6257, 0x6259, 0x625A, 0x625C, 0x625D, 0x625E, 0x625F, 0x6260, 0x6261, 0x6262, 0x6264, 0x6265, 0x6268, 0x6271, 0x6272, 0x6274, 0x6275, 0x6277, 0x6278, 0x627A, 0x627B, 0x627D, 0x6281, 0x6282, 0x6283, 0x6285, 0x6286, 0x6287, 0x6288, 0x628B, 0x628C, 0x628D, 0x628E, 0x628F, 0x6290, 0x6294, 0x6299, 0x629C, 0x629D, 0x629E, 0x62A3, 0x62A6, 0x62A7, 0x62A9, 0x62AA, 0x62AD, 0x62AE, 0x62AF, 0x62B0, 0x62B2, 0x62B3, 0x62B4, 0x62B6, 0x62B7, 0x62B8, 0x62BA, 0x62BE, 0x62C0, 0x62C1, // GB 0x9280..0x92FE 0x62C3, 0x62CB, 0x62CF, 0x62D1, 0x62D5, 0x62DD, 0x62DE, 0x62E0, 0x62E1, 0x62E4, 0x62EA, 0x62EB, 0x62F0, 0x62F2, 0x62F5, 0x62F8, 0x62F9, 0x62FA, 0x62FB, 0x6300, 0x6303, 0x6304, 0x6305, 0x6306, 0x630A, 0x630B, 0x630C, 0x630D, 0x630F, 0x6310, 0x6312, 0x6313, 0x6314, 0x6315, 0x6317, 0x6318, 0x6319, 0x631C, 0x6326, 0x6327, 0x6329, 0x632C, 0x632D, 0x632E, 0x6330, 0x6331, 0x6333, 0x6334, 0x6335, 0x6336, 0x6337, 0x6338, 0x633B, 0x633C, 0x633E, 0x633F, 0x6340, 0x6341, 0x6344, 0x6347, 0x6348, 0x634A, 0x6351, 0x6352, 0x6353, 0x6354, 0x6356, 0x6357, 0x6358, 0x6359, 0x635A, 0x635B, 0x635C, 0x635D, 0x6360, 0x6364, 0x6365, 0x6366, 0x6368, 0x636A, 0x636B, 0x636C, 0x636F, 0x6370, 0x6372, 0x6373, 0x6374, 0x6375, 0x6378, 0x6379, 0x637C, 0x637D, 0x637E, 0x637F, 0x6381, 0x6383, 0x6384, 0x6385, 0x6386, 0x638B, 0x638D, 0x6391, 0x6393, 0x6394, 0x6395, 0x6397, 0x6399, 0x639A, 0x639B, 0x639C, 0x639D, 0x639E, 0x639F, 0x63A1, 0x63A4, 0x63A6, 0x63AB, 0x63AF, 0x63B1, 0x63B2, 0x63B5, 0x63B6, 0x63B9, 0x63BB, 0x63BD, 0x63BF, 0x63C0, // GB 0x9340..0x937E 0x63C1, 0x63C2, 0x63C3, 0x63C5, 0x63C7, 0x63C8, 0x63CA, 0x63CB, 0x63CC, 0x63D1, 0x63D3, 0x63D4, 0x63D5, 0x63D7, 0x63D8, 0x63D9, 0x63DA, 0x63DB, 0x63DC, 0x63DD, 0x63DF, 0x63E2, 0x63E4, 0x63E5, 0x63E6, 0x63E7, 0x63E8, 0x63EB, 0x63EC, 0x63EE, 0x63EF, 0x63F0, 0x63F1, 0x63F3, 0x63F5, 0x63F7, 0x63F9, 0x63FA, 0x63FB, 0x63FC, 0x63FE, 0x6403, 0x6404, 0x6406, 0x6407, 0x6408, 0x6409, 0x640A, 0x640D, 0x640E, 0x6411, 0x6412, 0x6415, 0x6416, 0x6417, 0x6418, 0x6419, 0x641A, 0x641D, 0x641F, 0x6422, 0x6423, 0x6424, // GB 0x9380..0x93FE 0x6425, 0x6427, 0x6428, 0x6429, 0x642B, 0x642E, 0x642F, 0x6430, 0x6431, 0x6432, 0x6433, 0x6435, 0x6436, 0x6437, 0x6438, 0x6439, 0x643B, 0x643C, 0x643E, 0x6440, 0x6442, 0x6443, 0x6449, 0x644B, 0x644C, 0x644D, 0x644E, 0x644F, 0x6450, 0x6451, 0x6453, 0x6455, 0x6456, 0x6457, 0x6459, 0x645A, 0x645B, 0x645C, 0x645D, 0x645F, 0x6460, 0x6461, 0x6462, 0x6463, 0x6464, 0x6465, 0x6466, 0x6468, 0x646A, 0x646B, 0x646C, 0x646E, 0x646F, 0x6470, 0x6471, 0x6472, 0x6473, 0x6474, 0x6475, 0x6476, 0x6477, 0x647B, 0x647C, 0x647D, 0x647E, 0x647F, 0x6480, 0x6481, 0x6483, 0x6486, 0x6488, 0x6489, 0x648A, 0x648B, 0x648C, 0x648D, 0x648E, 0x648F, 0x6490, 0x6493, 0x6494, 0x6497, 0x6498, 0x649A, 0x649B, 0x649C, 0x649D, 0x649F, 0x64A0, 0x64A1, 0x64A2, 0x64A3, 0x64A5, 0x64A6, 0x64A7, 0x64A8, 0x64AA, 0x64AB, 0x64AF, 0x64B1, 0x64B2, 0x64B3, 0x64B4, 0x64B6, 0x64B9, 0x64BB, 0x64BD, 0x64BE, 0x64BF, 0x64C1, 0x64C3, 0x64C4, 0x64C6, 0x64C7, 0x64C8, 0x64C9, 0x64CA, 0x64CB, 0x64CC, 0x64CF, 0x64D1, 0x64D3, 0x64D4, 0x64D5, 0x64D6, 0x64D9, 0x64DA, // GB 0x9440..0x947E 0x64DB, 0x64DC, 0x64DD, 0x64DF, 0x64E0, 0x64E1, 0x64E3, 0x64E5, 0x64E7, 0x64E8, 0x64E9, 0x64EA, 0x64EB, 0x64EC, 0x64ED, 0x64EE, 0x64EF, 0x64F0, 0x64F1, 0x64F2, 0x64F3, 0x64F4, 0x64F5, 0x64F6, 0x64F7, 0x64F8, 0x64F9, 0x64FA, 0x64FB, 0x64FC, 0x64FD, 0x64FE, 0x64FF, 0x6501, 0x6502, 0x6503, 0x6504, 0x6505, 0x6506, 0x6507, 0x6508, 0x650A, 0x650B, 0x650C, 0x650D, 0x650E, 0x650F, 0x6510, 0x6511, 0x6513, 0x6514, 0x6515, 0x6516, 0x6517, 0x6519, 0x651A, 0x651B, 0x651C, 0x651D, 0x651E, 0x651F, 0x6520, 0x6521, // GB 0x9480..0x94FE 0x6522, 0x6523, 0x6524, 0x6526, 0x6527, 0x6528, 0x6529, 0x652A, 0x652C, 0x652D, 0x6530, 0x6531, 0x6532, 0x6533, 0x6537, 0x653A, 0x653C, 0x653D, 0x6540, 0x6541, 0x6542, 0x6543, 0x6544, 0x6546, 0x6547, 0x654A, 0x654B, 0x654D, 0x654E, 0x6550, 0x6552, 0x6553, 0x6554, 0x6557, 0x6558, 0x655A, 0x655C, 0x655F, 0x6560, 0x6561, 0x6564, 0x6565, 0x6567, 0x6568, 0x6569, 0x656A, 0x656D, 0x656E, 0x656F, 0x6571, 0x6573, 0x6575, 0x6576, 0x6578, 0x6579, 0x657A, 0x657B, 0x657C, 0x657D, 0x657E, 0x657F, 0x6580, 0x6581, 0x6582, 0x6583, 0x6584, 0x6585, 0x6586, 0x6588, 0x6589, 0x658A, 0x658D, 0x658E, 0x658F, 0x6592, 0x6594, 0x6595, 0x6596, 0x6598, 0x659A, 0x659D, 0x659E, 0x65A0, 0x65A2, 0x65A3, 0x65A6, 0x65A8, 0x65AA, 0x65AC, 0x65AE, 0x65B1, 0x65B2, 0x65B3, 0x65B4, 0x65B5, 0x65B6, 0x65B7, 0x65B8, 0x65BA, 0x65BB, 0x65BE, 0x65BF, 0x65C0, 0x65C2, 0x65C7, 0x65C8, 0x65C9, 0x65CA, 0x65CD, 0x65D0, 0x65D1, 0x65D3, 0x65D4, 0x65D5, 0x65D8, 0x65D9, 0x65DA, 0x65DB, 0x65DC, 0x65DD, 0x65DE, 0x65DF, 0x65E1, 0x65E3, 0x65E4, 0x65EA, 0x65EB, // GB 0x9540..0x957E 0x65F2, 0x65F3, 0x65F4, 0x65F5, 0x65F8, 0x65F9, 0x65FB, 0x65FC, 0x65FD, 0x65FE, 0x65FF, 0x6601, 0x6604, 0x6605, 0x6607, 0x6608, 0x6609, 0x660B, 0x660D, 0x6610, 0x6611, 0x6612, 0x6616, 0x6617, 0x6618, 0x661A, 0x661B, 0x661C, 0x661E, 0x6621, 0x6622, 0x6623, 0x6624, 0x6626, 0x6629, 0x662A, 0x662B, 0x662C, 0x662E, 0x6630, 0x6632, 0x6633, 0x6637, 0x6638, 0x6639, 0x663A, 0x663B, 0x663D, 0x663F, 0x6640, 0x6642, 0x6644, 0x6645, 0x6646, 0x6647, 0x6648, 0x6649, 0x664A, 0x664D, 0x664E, 0x6650, 0x6651, 0x6658, // GB 0x9580..0x95FE 0x6659, 0x665B, 0x665C, 0x665D, 0x665E, 0x6660, 0x6662, 0x6663, 0x6665, 0x6667, 0x6669, 0x666A, 0x666B, 0x666C, 0x666D, 0x6671, 0x6672, 0x6673, 0x6675, 0x6678, 0x6679, 0x667B, 0x667C, 0x667D, 0x667F, 0x6680, 0x6681, 0x6683, 0x6685, 0x6686, 0x6688, 0x6689, 0x668A, 0x668B, 0x668D, 0x668E, 0x668F, 0x6690, 0x6692, 0x6693, 0x6694, 0x6695, 0x6698, 0x6699, 0x669A, 0x669B, 0x669C, 0x669E, 0x669F, 0x66A0, 0x66A1, 0x66A2, 0x66A3, 0x66A4, 0x66A5, 0x66A6, 0x66A9, 0x66AA, 0x66AB, 0x66AC, 0x66AD, 0x66AF, 0x66B0, 0x66B1, 0x66B2, 0x66B3, 0x66B5, 0x66B6, 0x66B7, 0x66B8, 0x66BA, 0x66BB, 0x66BC, 0x66BD, 0x66BF, 0x66C0, 0x66C1, 0x66C2, 0x66C3, 0x66C4, 0x66C5, 0x66C6, 0x66C7, 0x66C8, 0x66C9, 0x66CA, 0x66CB, 0x66CC, 0x66CD, 0x66CE, 0x66CF, 0x66D0, 0x66D1, 0x66D2, 0x66D3, 0x66D4, 0x66D5, 0x66D6, 0x66D7, 0x66D8, 0x66DA, 0x66DE, 0x66DF, 0x66E0, 0x66E1, 0x66E2, 0x66E3, 0x66E4, 0x66E5, 0x66E7, 0x66E8, 0x66EA, 0x66EB, 0x66EC, 0x66ED, 0x66EE, 0x66EF, 0x66F1, 0x66F5, 0x66F6, 0x66F8, 0x66FA, 0x66FB, 0x66FD, 0x6701, 0x6702, 0x6703, // GB 0x9640..0x967E 0x6704, 0x6705, 0x6706, 0x6707, 0x670C, 0x670E, 0x670F, 0x6711, 0x6712, 0x6713, 0x6716, 0x6718, 0x6719, 0x671A, 0x671C, 0x671E, 0x6720, 0x6721, 0x6722, 0x6723, 0x6724, 0x6725, 0x6727, 0x6729, 0x672E, 0x6730, 0x6732, 0x6733, 0x6736, 0x6737, 0x6738, 0x6739, 0x673B, 0x673C, 0x673E, 0x673F, 0x6741, 0x6744, 0x6745, 0x6747, 0x674A, 0x674B, 0x674D, 0x6752, 0x6754, 0x6755, 0x6757, 0x6758, 0x6759, 0x675A, 0x675B, 0x675D, 0x6762, 0x6763, 0x6764, 0x6766, 0x6767, 0x676B, 0x676C, 0x676E, 0x6771, 0x6774, 0x6776, // GB 0x9680..0x96FE 0x6778, 0x6779, 0x677A, 0x677B, 0x677D, 0x6780, 0x6782, 0x6783, 0x6785, 0x6786, 0x6788, 0x678A, 0x678C, 0x678D, 0x678E, 0x678F, 0x6791, 0x6792, 0x6793, 0x6794, 0x6796, 0x6799, 0x679B, 0x679F, 0x67A0, 0x67A1, 0x67A4, 0x67A6, 0x67A9, 0x67AC, 0x67AE, 0x67B1, 0x67B2, 0x67B4, 0x67B9, 0x67BA, 0x67BB, 0x67BC, 0x67BD, 0x67BE, 0x67BF, 0x67C0, 0x67C2, 0x67C5, 0x67C6, 0x67C7, 0x67C8, 0x67C9, 0x67CA, 0x67CB, 0x67CC, 0x67CD, 0x67CE, 0x67D5, 0x67D6, 0x67D7, 0x67DB, 0x67DF, 0x67E1, 0x67E3, 0x67E4, 0x67E6, 0x67E7, 0x67E8, 0x67EA, 0x67EB, 0x67ED, 0x67EE, 0x67F2, 0x67F5, 0x67F6, 0x67F7, 0x67F8, 0x67F9, 0x67FA, 0x67FB, 0x67FC, 0x67FE, 0x6801, 0x6802, 0x6803, 0x6804, 0x6806, 0x680D, 0x6810, 0x6812, 0x6814, 0x6815, 0x6818, 0x6819, 0x681A, 0x681B, 0x681C, 0x681E, 0x681F, 0x6820, 0x6822, 0x6823, 0x6824, 0x6825, 0x6826, 0x6827, 0x6828, 0x682B, 0x682C, 0x682D, 0x682E, 0x682F, 0x6830, 0x6831, 0x6834, 0x6835, 0x6836, 0x683A, 0x683B, 0x683F, 0x6847, 0x684B, 0x684D, 0x684F, 0x6852, 0x6856, 0x6857, 0x6858, 0x6859, 0x685A, 0x685B, // GB 0x9740..0x977E 0x685C, 0x685D, 0x685E, 0x685F, 0x686A, 0x686C, 0x686D, 0x686E, 0x686F, 0x6870, 0x6871, 0x6872, 0x6873, 0x6875, 0x6878, 0x6879, 0x687A, 0x687B, 0x687C, 0x687D, 0x687E, 0x687F, 0x6880, 0x6882, 0x6884, 0x6887, 0x6888, 0x6889, 0x688A, 0x688B, 0x688C, 0x688D, 0x688E, 0x6890, 0x6891, 0x6892, 0x6894, 0x6895, 0x6896, 0x6898, 0x6899, 0x689A, 0x689B, 0x689C, 0x689D, 0x689E, 0x689F, 0x68A0, 0x68A1, 0x68A3, 0x68A4, 0x68A5, 0x68A9, 0x68AA, 0x68AB, 0x68AC, 0x68AE, 0x68B1, 0x68B2, 0x68B4, 0x68B6, 0x68B7, 0x68B8, // GB 0x9780..0x97FE 0x68B9, 0x68BA, 0x68BB, 0x68BC, 0x68BD, 0x68BE, 0x68BF, 0x68C1, 0x68C3, 0x68C4, 0x68C5, 0x68C6, 0x68C7, 0x68C8, 0x68CA, 0x68CC, 0x68CE, 0x68CF, 0x68D0, 0x68D1, 0x68D3, 0x68D4, 0x68D6, 0x68D7, 0x68D9, 0x68DB, 0x68DC, 0x68DD, 0x68DE, 0x68DF, 0x68E1, 0x68E2, 0x68E4, 0x68E5, 0x68E6, 0x68E7, 0x68E8, 0x68E9, 0x68EA, 0x68EB, 0x68EC, 0x68ED, 0x68EF, 0x68F2, 0x68F3, 0x68F4, 0x68F6, 0x68F7, 0x68F8, 0x68FB, 0x68FD, 0x68FE, 0x68FF, 0x6900, 0x6902, 0x6903, 0x6904, 0x6906, 0x6907, 0x6908, 0x6909, 0x690A, 0x690C, 0x690F, 0x6911, 0x6913, 0x6914, 0x6915, 0x6916, 0x6917, 0x6918, 0x6919, 0x691A, 0x691B, 0x691C, 0x691D, 0x691E, 0x6921, 0x6922, 0x6923, 0x6925, 0x6926, 0x6927, 0x6928, 0x6929, 0x692A, 0x692B, 0x692C, 0x692E, 0x692F, 0x6931, 0x6932, 0x6933, 0x6935, 0x6936, 0x6937, 0x6938, 0x693A, 0x693B, 0x693C, 0x693E, 0x6940, 0x6941, 0x6943, 0x6944, 0x6945, 0x6946, 0x6947, 0x6948, 0x6949, 0x694A, 0x694B, 0x694C, 0x694D, 0x694E, 0x694F, 0x6950, 0x6951, 0x6952, 0x6953, 0x6955, 0x6956, 0x6958, 0x6959, 0x695B, 0x695C, 0x695F, // GB 0x9840..0x987E 0x6961, 0x6962, 0x6964, 0x6965, 0x6967, 0x6968, 0x6969, 0x696A, 0x696C, 0x696D, 0x696F, 0x6970, 0x6972, 0x6973, 0x6974, 0x6975, 0x6976, 0x697A, 0x697B, 0x697D, 0x697E, 0x697F, 0x6981, 0x6983, 0x6985, 0x698A, 0x698B, 0x698C, 0x698E, 0x698F, 0x6990, 0x6991, 0x6992, 0x6993, 0x6996, 0x6997, 0x6999, 0x699A, 0x699D, 0x699E, 0x699F, 0x69A0, 0x69A1, 0x69A2, 0x69A3, 0x69A4, 0x69A5, 0x69A6, 0x69A9, 0x69AA, 0x69AC, 0x69AE, 0x69AF, 0x69B0, 0x69B2, 0x69B3, 0x69B5, 0x69B6, 0x69B8, 0x69B9, 0x69BA, 0x69BC, 0x69BD, // GB 0x9880..0x98FE 0x69BE, 0x69BF, 0x69C0, 0x69C2, 0x69C3, 0x69C4, 0x69C5, 0x69C6, 0x69C7, 0x69C8, 0x69C9, 0x69CB, 0x69CD, 0x69CF, 0x69D1, 0x69D2, 0x69D3, 0x69D5, 0x69D6, 0x69D7, 0x69D8, 0x69D9, 0x69DA, 0x69DC, 0x69DD, 0x69DE, 0x69E1, 0x69E2, 0x69E3, 0x69E4, 0x69E5, 0x69E6, 0x69E7, 0x69E8, 0x69E9, 0x69EA, 0x69EB, 0x69EC, 0x69EE, 0x69EF, 0x69F0, 0x69F1, 0x69F3, 0x69F4, 0x69F5, 0x69F6, 0x69F7, 0x69F8, 0x69F9, 0x69FA, 0x69FB, 0x69FC, 0x69FE, 0x6A00, 0x6A01, 0x6A02, 0x6A03, 0x6A04, 0x6A05, 0x6A06, 0x6A07, 0x6A08, 0x6A09, 0x6A0B, 0x6A0C, 0x6A0D, 0x6A0E, 0x6A0F, 0x6A10, 0x6A11, 0x6A12, 0x6A13, 0x6A14, 0x6A15, 0x6A16, 0x6A19, 0x6A1A, 0x6A1B, 0x6A1C, 0x6A1D, 0x6A1E, 0x6A20, 0x6A22, 0x6A23, 0x6A24, 0x6A25, 0x6A26, 0x6A27, 0x6A29, 0x6A2B, 0x6A2C, 0x6A2D, 0x6A2E, 0x6A30, 0x6A32, 0x6A33, 0x6A34, 0x6A36, 0x6A37, 0x6A38, 0x6A39, 0x6A3A, 0x6A3B, 0x6A3C, 0x6A3F, 0x6A40, 0x6A41, 0x6A42, 0x6A43, 0x6A45, 0x6A46, 0x6A48, 0x6A49, 0x6A4A, 0x6A4B, 0x6A4C, 0x6A4D, 0x6A4E, 0x6A4F, 0x6A51, 0x6A52, 0x6A53, 0x6A54, 0x6A55, 0x6A56, 0x6A57, 0x6A5A, // GB 0x9940..0x997E 0x6A5C, 0x6A5D, 0x6A5E, 0x6A5F, 0x6A60, 0x6A62, 0x6A63, 0x6A64, 0x6A66, 0x6A67, 0x6A68, 0x6A69, 0x6A6A, 0x6A6B, 0x6A6C, 0x6A6D, 0x6A6E, 0x6A6F, 0x6A70, 0x6A72, 0x6A73, 0x6A74, 0x6A75, 0x6A76, 0x6A77, 0x6A78, 0x6A7A, 0x6A7B, 0x6A7D, 0x6A7E, 0x6A7F, 0x6A81, 0x6A82, 0x6A83, 0x6A85, 0x6A86, 0x6A87, 0x6A88, 0x6A89, 0x6A8A, 0x6A8B, 0x6A8C, 0x6A8D, 0x6A8F, 0x6A92, 0x6A93, 0x6A94, 0x6A95, 0x6A96, 0x6A98, 0x6A99, 0x6A9A, 0x6A9B, 0x6A9C, 0x6A9D, 0x6A9E, 0x6A9F, 0x6AA1, 0x6AA2, 0x6AA3, 0x6AA4, 0x6AA5, 0x6AA6, // GB 0x9980..0x99FE 0x6AA7, 0x6AA8, 0x6AAA, 0x6AAD, 0x6AAE, 0x6AAF, 0x6AB0, 0x6AB1, 0x6AB2, 0x6AB3, 0x6AB4, 0x6AB5, 0x6AB6, 0x6AB7, 0x6AB8, 0x6AB9, 0x6ABA, 0x6ABB, 0x6ABC, 0x6ABD, 0x6ABE, 0x6ABF, 0x6AC0, 0x6AC1, 0x6AC2, 0x6AC3, 0x6AC4, 0x6AC5, 0x6AC6, 0x6AC7, 0x6AC8, 0x6AC9, 0x6ACA, 0x6ACB, 0x6ACC, 0x6ACD, 0x6ACE, 0x6ACF, 0x6AD0, 0x6AD1, 0x6AD2, 0x6AD3, 0x6AD4, 0x6AD5, 0x6AD6, 0x6AD7, 0x6AD8, 0x6AD9, 0x6ADA, 0x6ADB, 0x6ADC, 0x6ADD, 0x6ADE, 0x6ADF, 0x6AE0, 0x6AE1, 0x6AE2, 0x6AE3, 0x6AE4, 0x6AE5, 0x6AE6, 0x6AE7, 0x6AE8, 0x6AE9, 0x6AEA, 0x6AEB, 0x6AEC, 0x6AED, 0x6AEE, 0x6AEF, 0x6AF0, 0x6AF1, 0x6AF2, 0x6AF3, 0x6AF4, 0x6AF5, 0x6AF6, 0x6AF7, 0x6AF8, 0x6AF9, 0x6AFA, 0x6AFB, 0x6AFC, 0x6AFD, 0x6AFE, 0x6AFF, 0x6B00, 0x6B01, 0x6B02, 0x6B03, 0x6B04, 0x6B05, 0x6B06, 0x6B07, 0x6B08, 0x6B09, 0x6B0A, 0x6B0B, 0x6B0C, 0x6B0D, 0x6B0E, 0x6B0F, 0x6B10, 0x6B11, 0x6B12, 0x6B13, 0x6B14, 0x6B15, 0x6B16, 0x6B17, 0x6B18, 0x6B19, 0x6B1A, 0x6B1B, 0x6B1C, 0x6B1D, 0x6B1E, 0x6B1F, 0x6B25, 0x6B26, 0x6B28, 0x6B29, 0x6B2A, 0x6B2B, 0x6B2C, 0x6B2D, 0x6B2E, // GB 0x9A40..0x9A7E 0x6B2F, 0x6B30, 0x6B31, 0x6B33, 0x6B34, 0x6B35, 0x6B36, 0x6B38, 0x6B3B, 0x6B3C, 0x6B3D, 0x6B3F, 0x6B40, 0x6B41, 0x6B42, 0x6B44, 0x6B45, 0x6B48, 0x6B4A, 0x6B4B, 0x6B4D, 0x6B4E, 0x6B4F, 0x6B50, 0x6B51, 0x6B52, 0x6B53, 0x6B54, 0x6B55, 0x6B56, 0x6B57, 0x6B58, 0x6B5A, 0x6B5B, 0x6B5C, 0x6B5D, 0x6B5E, 0x6B5F, 0x6B60, 0x6B61, 0x6B68, 0x6B69, 0x6B6B, 0x6B6C, 0x6B6D, 0x6B6E, 0x6B6F, 0x6B70, 0x6B71, 0x6B72, 0x6B73, 0x6B74, 0x6B75, 0x6B76, 0x6B77, 0x6B78, 0x6B7A, 0x6B7D, 0x6B7E, 0x6B7F, 0x6B80, 0x6B85, 0x6B88, // GB 0x9A80..0x9AFE 0x6B8C, 0x6B8E, 0x6B8F, 0x6B90, 0x6B91, 0x6B94, 0x6B95, 0x6B97, 0x6B98, 0x6B99, 0x6B9C, 0x6B9D, 0x6B9E, 0x6B9F, 0x6BA0, 0x6BA2, 0x6BA3, 0x6BA4, 0x6BA5, 0x6BA6, 0x6BA7, 0x6BA8, 0x6BA9, 0x6BAB, 0x6BAC, 0x6BAD, 0x6BAE, 0x6BAF, 0x6BB0, 0x6BB1, 0x6BB2, 0x6BB6, 0x6BB8, 0x6BB9, 0x6BBA, 0x6BBB, 0x6BBC, 0x6BBD, 0x6BBE, 0x6BC0, 0x6BC3, 0x6BC4, 0x6BC6, 0x6BC7, 0x6BC8, 0x6BC9, 0x6BCA, 0x6BCC, 0x6BCE, 0x6BD0, 0x6BD1, 0x6BD8, 0x6BDA, 0x6BDC, 0x6BDD, 0x6BDE, 0x6BDF, 0x6BE0, 0x6BE2, 0x6BE3, 0x6BE4, 0x6BE5, 0x6BE6, 0x6BE7, 0x6BE8, 0x6BE9, 0x6BEC, 0x6BED, 0x6BEE, 0x6BF0, 0x6BF1, 0x6BF2, 0x6BF4, 0x6BF6, 0x6BF7, 0x6BF8, 0x6BFA, 0x6BFB, 0x6BFC, 0x6BFE, 0x6BFF, 0x6C00, 0x6C01, 0x6C02, 0x6C03, 0x6C04, 0x6C08, 0x6C09, 0x6C0A, 0x6C0B, 0x6C0C, 0x6C0E, 0x6C12, 0x6C17, 0x6C1C, 0x6C1D, 0x6C1E, 0x6C20, 0x6C23, 0x6C25, 0x6C2B, 0x6C2C, 0x6C2D, 0x6C31, 0x6C33, 0x6C36, 0x6C37, 0x6C39, 0x6C3A, 0x6C3B, 0x6C3C, 0x6C3E, 0x6C3F, 0x6C43, 0x6C44, 0x6C45, 0x6C48, 0x6C4B, 0x6C4C, 0x6C4D, 0x6C4E, 0x6C4F, 0x6C51, 0x6C52, 0x6C53, 0x6C56, 0x6C58, // GB 0x9B40..0x9B7E 0x6C59, 0x6C5A, 0x6C62, 0x6C63, 0x6C65, 0x6C66, 0x6C67, 0x6C6B, 0x6C6C, 0x6C6D, 0x6C6E, 0x6C6F, 0x6C71, 0x6C73, 0x6C75, 0x6C77, 0x6C78, 0x6C7A, 0x6C7B, 0x6C7C, 0x6C7F, 0x6C80, 0x6C84, 0x6C87, 0x6C8A, 0x6C8B, 0x6C8D, 0x6C8E, 0x6C91, 0x6C92, 0x6C95, 0x6C96, 0x6C97, 0x6C98, 0x6C9A, 0x6C9C, 0x6C9D, 0x6C9E, 0x6CA0, 0x6CA2, 0x6CA8, 0x6CAC, 0x6CAF, 0x6CB0, 0x6CB4, 0x6CB5, 0x6CB6, 0x6CB7, 0x6CBA, 0x6CC0, 0x6CC1, 0x6CC2, 0x6CC3, 0x6CC6, 0x6CC7, 0x6CC8, 0x6CCB, 0x6CCD, 0x6CCE, 0x6CCF, 0x6CD1, 0x6CD2, 0x6CD8, // GB 0x9B80..0x9BFE 0x6CD9, 0x6CDA, 0x6CDC, 0x6CDD, 0x6CDF, 0x6CE4, 0x6CE6, 0x6CE7, 0x6CE9, 0x6CEC, 0x6CED, 0x6CF2, 0x6CF4, 0x6CF9, 0x6CFF, 0x6D00, 0x6D02, 0x6D03, 0x6D05, 0x6D06, 0x6D08, 0x6D09, 0x6D0A, 0x6D0D, 0x6D0F, 0x6D10, 0x6D11, 0x6D13, 0x6D14, 0x6D15, 0x6D16, 0x6D18, 0x6D1C, 0x6D1D, 0x6D1F, 0x6D20, 0x6D21, 0x6D22, 0x6D23, 0x6D24, 0x6D26, 0x6D28, 0x6D29, 0x6D2C, 0x6D2D, 0x6D2F, 0x6D30, 0x6D34, 0x6D36, 0x6D37, 0x6D38, 0x6D3A, 0x6D3F, 0x6D40, 0x6D42, 0x6D44, 0x6D49, 0x6D4C, 0x6D50, 0x6D55, 0x6D56, 0x6D57, 0x6D58, 0x6D5B, 0x6D5D, 0x6D5F, 0x6D61, 0x6D62, 0x6D64, 0x6D65, 0x6D67, 0x6D68, 0x6D6B, 0x6D6C, 0x6D6D, 0x6D70, 0x6D71, 0x6D72, 0x6D73, 0x6D75, 0x6D76, 0x6D79, 0x6D7A, 0x6D7B, 0x6D7D, 0x6D7E, 0x6D7F, 0x6D80, 0x6D81, 0x6D83, 0x6D84, 0x6D86, 0x6D87, 0x6D8A, 0x6D8B, 0x6D8D, 0x6D8F, 0x6D90, 0x6D92, 0x6D96, 0x6D97, 0x6D98, 0x6D99, 0x6D9A, 0x6D9C, 0x6DA2, 0x6DA5, 0x6DAC, 0x6DAD, 0x6DB0, 0x6DB1, 0x6DB3, 0x6DB4, 0x6DB6, 0x6DB7, 0x6DB9, 0x6DBA, 0x6DBB, 0x6DBC, 0x6DBD, 0x6DBE, 0x6DC1, 0x6DC2, 0x6DC3, 0x6DC8, 0x6DC9, 0x6DCA, // GB 0x9C40..0x9C7E 0x6DCD, 0x6DCE, 0x6DCF, 0x6DD0, 0x6DD2, 0x6DD3, 0x6DD4, 0x6DD5, 0x6DD7, 0x6DDA, 0x6DDB, 0x6DDC, 0x6DDF, 0x6DE2, 0x6DE3, 0x6DE5, 0x6DE7, 0x6DE8, 0x6DE9, 0x6DEA, 0x6DED, 0x6DEF, 0x6DF0, 0x6DF2, 0x6DF4, 0x6DF5, 0x6DF6, 0x6DF8, 0x6DFA, 0x6DFD, 0x6DFE, 0x6DFF, 0x6E00, 0x6E01, 0x6E02, 0x6E03, 0x6E04, 0x6E06, 0x6E07, 0x6E08, 0x6E09, 0x6E0B, 0x6E0F, 0x6E12, 0x6E13, 0x6E15, 0x6E18, 0x6E19, 0x6E1B, 0x6E1C, 0x6E1E, 0x6E1F, 0x6E22, 0x6E26, 0x6E27, 0x6E28, 0x6E2A, 0x6E2C, 0x6E2E, 0x6E30, 0x6E31, 0x6E33, 0x6E35, // GB 0x9C80..0x9CFE 0x6E36, 0x6E37, 0x6E39, 0x6E3B, 0x6E3C, 0x6E3D, 0x6E3E, 0x6E3F, 0x6E40, 0x6E41, 0x6E42, 0x6E45, 0x6E46, 0x6E47, 0x6E48, 0x6E49, 0x6E4A, 0x6E4B, 0x6E4C, 0x6E4F, 0x6E50, 0x6E51, 0x6E52, 0x6E55, 0x6E57, 0x6E59, 0x6E5A, 0x6E5C, 0x6E5D, 0x6E5E, 0x6E60, 0x6E61, 0x6E62, 0x6E63, 0x6E64, 0x6E65, 0x6E66, 0x6E67, 0x6E68, 0x6E69, 0x6E6A, 0x6E6C, 0x6E6D, 0x6E6F, 0x6E70, 0x6E71, 0x6E72, 0x6E73, 0x6E74, 0x6E75, 0x6E76, 0x6E77, 0x6E78, 0x6E79, 0x6E7A, 0x6E7B, 0x6E7C, 0x6E7D, 0x6E80, 0x6E81, 0x6E82, 0x6E84, 0x6E87, 0x6E88, 0x6E8A, 0x6E8B, 0x6E8C, 0x6E8D, 0x6E8E, 0x6E91, 0x6E92, 0x6E93, 0x6E94, 0x6E95, 0x6E96, 0x6E97, 0x6E99, 0x6E9A, 0x6E9B, 0x6E9D, 0x6E9E, 0x6EA0, 0x6EA1, 0x6EA3, 0x6EA4, 0x6EA6, 0x6EA8, 0x6EA9, 0x6EAB, 0x6EAC, 0x6EAD, 0x6EAE, 0x6EB0, 0x6EB3, 0x6EB5, 0x6EB8, 0x6EB9, 0x6EBC, 0x6EBE, 0x6EBF, 0x6EC0, 0x6EC3, 0x6EC4, 0x6EC5, 0x6EC6, 0x6EC8, 0x6EC9, 0x6ECA, 0x6ECC, 0x6ECD, 0x6ECE, 0x6ED0, 0x6ED2, 0x6ED6, 0x6ED8, 0x6ED9, 0x6EDB, 0x6EDC, 0x6EDD, 0x6EE3, 0x6EE7, 0x6EEA, 0x6EEB, 0x6EEC, 0x6EED, 0x6EEE, 0x6EEF, // GB 0x9D40..0x9D7E 0x6EF0, 0x6EF1, 0x6EF2, 0x6EF3, 0x6EF5, 0x6EF6, 0x6EF7, 0x6EF8, 0x6EFA, 0x6EFB, 0x6EFC, 0x6EFD, 0x6EFE, 0x6EFF, 0x6F00, 0x6F01, 0x6F03, 0x6F04, 0x6F05, 0x6F07, 0x6F08, 0x6F0A, 0x6F0B, 0x6F0C, 0x6F0D, 0x6F0E, 0x6F10, 0x6F11, 0x6F12, 0x6F16, 0x6F17, 0x6F18, 0x6F19, 0x6F1A, 0x6F1B, 0x6F1C, 0x6F1D, 0x6F1E, 0x6F1F, 0x6F21, 0x6F22, 0x6F23, 0x6F25, 0x6F26, 0x6F27, 0x6F28, 0x6F2C, 0x6F2E, 0x6F30, 0x6F32, 0x6F34, 0x6F35, 0x6F37, 0x6F38, 0x6F39, 0x6F3A, 0x6F3B, 0x6F3C, 0x6F3D, 0x6F3F, 0x6F40, 0x6F41, 0x6F42, // GB 0x9D80..0x9DFE 0x6F43, 0x6F44, 0x6F45, 0x6F48, 0x6F49, 0x6F4A, 0x6F4C, 0x6F4E, 0x6F4F, 0x6F50, 0x6F51, 0x6F52, 0x6F53, 0x6F54, 0x6F55, 0x6F56, 0x6F57, 0x6F59, 0x6F5A, 0x6F5B, 0x6F5D, 0x6F5F, 0x6F60, 0x6F61, 0x6F63, 0x6F64, 0x6F65, 0x6F67, 0x6F68, 0x6F69, 0x6F6A, 0x6F6B, 0x6F6C, 0x6F6F, 0x6F70, 0x6F71, 0x6F73, 0x6F75, 0x6F76, 0x6F77, 0x6F79, 0x6F7B, 0x6F7D, 0x6F7E, 0x6F7F, 0x6F80, 0x6F81, 0x6F82, 0x6F83, 0x6F85, 0x6F86, 0x6F87, 0x6F8A, 0x6F8B, 0x6F8F, 0x6F90, 0x6F91, 0x6F92, 0x6F93, 0x6F94, 0x6F95, 0x6F96, 0x6F97, 0x6F98, 0x6F99, 0x6F9A, 0x6F9B, 0x6F9D, 0x6F9E, 0x6F9F, 0x6FA0, 0x6FA2, 0x6FA3, 0x6FA4, 0x6FA5, 0x6FA6, 0x6FA8, 0x6FA9, 0x6FAA, 0x6FAB, 0x6FAC, 0x6FAD, 0x6FAE, 0x6FAF, 0x6FB0, 0x6FB1, 0x6FB2, 0x6FB4, 0x6FB5, 0x6FB7, 0x6FB8, 0x6FBA, 0x6FBB, 0x6FBC, 0x6FBD, 0x6FBE, 0x6FBF, 0x6FC1, 0x6FC3, 0x6FC4, 0x6FC5, 0x6FC6, 0x6FC7, 0x6FC8, 0x6FCA, 0x6FCB, 0x6FCC, 0x6FCD, 0x6FCE, 0x6FCF, 0x6FD0, 0x6FD3, 0x6FD4, 0x6FD5, 0x6FD6, 0x6FD7, 0x6FD8, 0x6FD9, 0x6FDA, 0x6FDB, 0x6FDC, 0x6FDD, 0x6FDF, 0x6FE2, 0x6FE3, 0x6FE4, 0x6FE5, // GB 0x9E40..0x9E7E 0x6FE6, 0x6FE7, 0x6FE8, 0x6FE9, 0x6FEA, 0x6FEB, 0x6FEC, 0x6FED, 0x6FF0, 0x6FF1, 0x6FF2, 0x6FF3, 0x6FF4, 0x6FF5, 0x6FF6, 0x6FF7, 0x6FF8, 0x6FF9, 0x6FFA, 0x6FFB, 0x6FFC, 0x6FFD, 0x6FFE, 0x6FFF, 0x7000, 0x7001, 0x7002, 0x7003, 0x7004, 0x7005, 0x7006, 0x7007, 0x7008, 0x7009, 0x700A, 0x700B, 0x700C, 0x700D, 0x700E, 0x700F, 0x7010, 0x7012, 0x7013, 0x7014, 0x7015, 0x7016, 0x7017, 0x7018, 0x7019, 0x701C, 0x701D, 0x701E, 0x701F, 0x7020, 0x7021, 0x7022, 0x7024, 0x7025, 0x7026, 0x7027, 0x7028, 0x7029, 0x702A, // GB 0x9E80..0x9EFE 0x702B, 0x702C, 0x702D, 0x702E, 0x702F, 0x7030, 0x7031, 0x7032, 0x7033, 0x7034, 0x7036, 0x7037, 0x7038, 0x703A, 0x703B, 0x703C, 0x703D, 0x703E, 0x703F, 0x7040, 0x7041, 0x7042, 0x7043, 0x7044, 0x7045, 0x7046, 0x7047, 0x7048, 0x7049, 0x704A, 0x704B, 0x704D, 0x704E, 0x7050, 0x7051, 0x7052, 0x7053, 0x7054, 0x7055, 0x7056, 0x7057, 0x7058, 0x7059, 0x705A, 0x705B, 0x705C, 0x705D, 0x705F, 0x7060, 0x7061, 0x7062, 0x7063, 0x7064, 0x7065, 0x7066, 0x7067, 0x7068, 0x7069, 0x706A, 0x706E, 0x7071, 0x7072, 0x7073, 0x7074, 0x7077, 0x7079, 0x707A, 0x707B, 0x707D, 0x7081, 0x7082, 0x7083, 0x7084, 0x7086, 0x7087, 0x7088, 0x708B, 0x708C, 0x708D, 0x708F, 0x7090, 0x7091, 0x7093, 0x7097, 0x7098, 0x709A, 0x709B, 0x709E, 0x709F, 0x70A0, 0x70A1, 0x70A2, 0x70A3, 0x70A4, 0x70A5, 0x70A6, 0x70A7, 0x70A8, 0x70A9, 0x70AA, 0x70B0, 0x70B2, 0x70B4, 0x70B5, 0x70B6, 0x70BA, 0x70BE, 0x70BF, 0x70C4, 0x70C5, 0x70C6, 0x70C7, 0x70C9, 0x70CB, 0x70CC, 0x70CD, 0x70CE, 0x70CF, 0x70D0, 0x70D1, 0x70D2, 0x70D3, 0x70D4, 0x70D5, 0x70D6, 0x70D7, 0x70DA, // GB 0x9F40..0x9F7E 0x70DC, 0x70DD, 0x70DE, 0x70E0, 0x70E1, 0x70E2, 0x70E3, 0x70E5, 0x70EA, 0x70EE, 0x70F0, 0x70F1, 0x70F2, 0x70F3, 0x70F4, 0x70F5, 0x70F6, 0x70F8, 0x70FA, 0x70FB, 0x70FC, 0x70FE, 0x70FF, 0x7100, 0x7101, 0x7102, 0x7103, 0x7104, 0x7105, 0x7106, 0x7107, 0x7108, 0x710B, 0x710C, 0x710D, 0x710E, 0x710F, 0x7111, 0x7112, 0x7114, 0x7117, 0x711B, 0x711C, 0x711D, 0x711E, 0x711F, 0x7120, 0x7121, 0x7122, 0x7123, 0x7124, 0x7125, 0x7127, 0x7128, 0x7129, 0x712A, 0x712B, 0x712C, 0x712D, 0x712E, 0x7132, 0x7133, 0x7134, // GB 0x9F80..0x9FFE 0x7135, 0x7137, 0x7138, 0x7139, 0x713A, 0x713B, 0x713C, 0x713D, 0x713E, 0x713F, 0x7140, 0x7141, 0x7142, 0x7143, 0x7144, 0x7146, 0x7147, 0x7148, 0x7149, 0x714B, 0x714D, 0x714F, 0x7150, 0x7151, 0x7152, 0x7153, 0x7154, 0x7155, 0x7156, 0x7157, 0x7158, 0x7159, 0x715A, 0x715B, 0x715D, 0x715F, 0x7160, 0x7161, 0x7162, 0x7163, 0x7165, 0x7169, 0x716A, 0x716B, 0x716C, 0x716D, 0x716F, 0x7170, 0x7171, 0x7174, 0x7175, 0x7176, 0x7177, 0x7179, 0x717B, 0x717C, 0x717E, 0x717F, 0x7180, 0x7181, 0x7182, 0x7183, 0x7185, 0x7186, 0x7187, 0x7188, 0x7189, 0x718B, 0x718C, 0x718D, 0x718E, 0x7190, 0x7191, 0x7192, 0x7193, 0x7195, 0x7196, 0x7197, 0x719A, 0x719B, 0x719C, 0x719D, 0x719E, 0x71A1, 0x71A2, 0x71A3, 0x71A4, 0x71A5, 0x71A6, 0x71A7, 0x71A9, 0x71AA, 0x71AB, 0x71AD, 0x71AE, 0x71AF, 0x71B0, 0x71B1, 0x71B2, 0x71B4, 0x71B6, 0x71B7, 0x71B8, 0x71BA, 0x71BB, 0x71BC, 0x71BD, 0x71BE, 0x71BF, 0x71C0, 0x71C1, 0x71C2, 0x71C4, 0x71C5, 0x71C6, 0x71C7, 0x71C8, 0x71C9, 0x71CA, 0x71CB, 0x71CC, 0x71CD, 0x71CF, 0x71D0, 0x71D1, 0x71D2, 0x71D3, // GB 0xA040..0xA07E 0x71D6, 0x71D7, 0x71D8, 0x71D9, 0x71DA, 0x71DB, 0x71DC, 0x71DD, 0x71DE, 0x71DF, 0x71E1, 0x71E2, 0x71E3, 0x71E4, 0x71E6, 0x71E8, 0x71E9, 0x71EA, 0x71EB, 0x71EC, 0x71ED, 0x71EF, 0x71F0, 0x71F1, 0x71F2, 0x71F3, 0x71F4, 0x71F5, 0x71F6, 0x71F7, 0x71F8, 0x71FA, 0x71FB, 0x71FC, 0x71FD, 0x71FE, 0x71FF, 0x7200, 0x7201, 0x7202, 0x7203, 0x7204, 0x7205, 0x7207, 0x7208, 0x7209, 0x720A, 0x720B, 0x720C, 0x720D, 0x720E, 0x720F, 0x7210, 0x7211, 0x7212, 0x7213, 0x7214, 0x7215, 0x7216, 0x7217, 0x7218, 0x7219, 0x721A, // GB 0xA080..0xA0FE 0x721B, 0x721C, 0x721E, 0x721F, 0x7220, 0x7221, 0x7222, 0x7223, 0x7224, 0x7225, 0x7226, 0x7227, 0x7229, 0x722B, 0x722D, 0x722E, 0x722F, 0x7232, 0x7233, 0x7234, 0x723A, 0x723C, 0x723E, 0x7240, 0x7241, 0x7242, 0x7243, 0x7244, 0x7245, 0x7246, 0x7249, 0x724A, 0x724B, 0x724E, 0x724F, 0x7250, 0x7251, 0x7253, 0x7254, 0x7255, 0x7257, 0x7258, 0x725A, 0x725C, 0x725E, 0x7260, 0x7263, 0x7264, 0x7265, 0x7268, 0x726A, 0x726B, 0x726C, 0x726D, 0x7270, 0x7271, 0x7273, 0x7274, 0x7276, 0x7277, 0x7278, 0x727B, 0x727C, 0x727D, 0x7282, 0x7283, 0x7285, 0x7286, 0x7287, 0x7288, 0x7289, 0x728C, 0x728E, 0x7290, 0x7291, 0x7293, 0x7294, 0x7295, 0x7296, 0x7297, 0x7298, 0x7299, 0x729A, 0x729B, 0x729C, 0x729D, 0x729E, 0x72A0, 0x72A1, 0x72A2, 0x72A3, 0x72A4, 0x72A5, 0x72A6, 0x72A7, 0x72A8, 0x72A9, 0x72AA, 0x72AB, 0x72AE, 0x72B1, 0x72B2, 0x72B3, 0x72B5, 0x72BA, 0x72BB, 0x72BC, 0x72BD, 0x72BE, 0x72BF, 0x72C0, 0x72C5, 0x72C6, 0x72C7, 0x72C9, 0x72CA, 0x72CB, 0x72CC, 0x72CF, 0x72D1, 0x72D3, 0x72D4, 0x72D5, 0x72D6, 0x72D8, 0x72DA, 0x72DB, // Skip: GB 0xA140..0xA17E, 0xA180..0xA1A0 (UDA 3) // GB 0xA2A1..0xA2FE 0x3000, 0x3001, 0x3002, 0x00B7, 0x02C9, 0x02C7, 0x00A8, 0x3003, 0x3005, 0x2014, 0xFF5E, 0x2016, 0x2026, 0x2018, 0x2019, 0x201C, 0x201D, 0x3014, 0x3015, 0x3008, 0x3009, 0x300A, 0x300B, 0x300C, 0x300D, 0x300E, 0x300F, 0x3016, 0x3017, 0x3010, 0x3011, 0x00B1, 0x00D7, 0x00F7, 0x2236, 0x2227, 0x2228, 0x2211, 0x220F, 0x222A, 0x2229, 0x2208, 0x2237, 0x221A, 0x22A5, 0x2225, 0x2220, 0x2312, 0x2299, 0x222B, 0x222E, 0x2261, 0x224C, 0x2248, 0x223D, 0x221D, 0x2260, 0x226E, 0x226F, 0x2264, 0x2265, 0x221E, 0x2235, 0x2234, 0x2642, 0x2640, 0x00B0, 0x2032, 0x2033, 0x2103, 0xFF04, 0x00A4, 0xFFE0, 0xFFE1, 0x2030, 0x00A7, 0x2116, 0x2606, 0x2605, 0x25CB, 0x25CF, 0x25CE, 0x25C7, 0x25C6, 0x25A1, 0x25A0, 0x25B3, 0x25B2, 0x203B, 0x2192, 0x2190, 0x2191, 0x2193, 0x3013, // Skip: GB 0xA240..0xA27E, 0xA280..0xA2A0 (UDA 3) // GB 0xA3A1..0xA3FE 0x2170, 0x2171, 0x2172, 0x2173, 0x2174, 0x2175, 0x2176, 0x2177, 0x2178, 0x2179, 0xE766, 0xE767, 0xE768, 0xE769, 0xE76A, 0xE76B, 0x2488, 0x2489, 0x248A, 0x248B, 0x248C, 0x248D, 0x248E, 0x248F, 0x2490, 0x2491, 0x2492, 0x2493, 0x2494, 0x2495, 0x2496, 0x2497, 0x2498, 0x2499, 0x249A, 0x249B, 0x2474, 0x2475, 0x2476, 0x2477, 0x2478, 0x2479, 0x247A, 0x247B, 0x247C, 0x247D, 0x247E, 0x247F, 0x2480, 0x2481, 0x2482, 0x2483, 0x2484, 0x2485, 0x2486, 0x2487, 0x2460, 0x2461, 0x2462, 0x2463, 0x2464, 0x2465, 0x2466, 0x2467, 0x2468, 0x2469, 0x20AC, 0xE76D, 0x3220, 0x3221, 0x3222, 0x3223, 0x3224, 0x3225, 0x3226, 0x3227, 0x3228, 0x3229, 0xE76E, 0xE76F, 0x2160, 0x2161, 0x2162, 0x2163, 0x2164, 0x2165, 0x2166, 0x2167, 0x2168, 0x2169, 0x216A, 0x216B, 0xE770, 0xE771, // Skip: GB 0xA340..0xA37E, 0xA380..0xA3A0 (UDA 3) // GB 0xA4A1..0xA4FE 0xFF01, 0xFF02, 0xFF03, 0xFFE5, 0xFF05, 0xFF06, 0xFF07, 0xFF08, 0xFF09, 0xFF0A, 0xFF0B, 0xFF0C, 0xFF0D, 0xFF0E, 0xFF0F, 0xFF10, 0xFF11, 0xFF12, 0xFF13, 0xFF14, 0xFF15, 0xFF16, 0xFF17, 0xFF18, 0xFF19, 0xFF1A, 0xFF1B, 0xFF1C, 0xFF1D, 0xFF1E, 0xFF1F, 0xFF20, 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, 0xFF3B, 0xFF3C, 0xFF3D, 0xFF3E, 0xFF3F, 0xFF40, 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, 0xFF5B, 0xFF5C, 0xFF5D, 0xFFE3, // Skip: GB 0xA440..0xA47E, 0xA480..0xA4A0 (UDA 3) // GB 0xA5A1..0xA5FE 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, 0xE772, 0xE773, 0xE774, 0xE775, 0xE776, 0xE777, 0xE778, 0xE779, 0xE77A, 0xE77B, 0xE77C, // Skip: GB 0xA540..0xA57E, 0xA580..0xA5A0 (UDA 3) // GB 0xA6A1..0xA6FE 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, 0xE77D, 0xE77E, 0xE77F, 0xE780, 0xE781, 0xE782, 0xE783, 0xE784, // Skip: GB 0xA640..0xA67E, 0xA680..0xA6A0 (UDA 3) // GB 0xA7A1..0xA7FE 0x0391, 0x0392, 0x0393, 0x0394, 0x0395, 0x0396, 0x0397, 0x0398, 0x0399, 0x039A, 0x039B, 0x039C, 0x039D, 0x039E, 0x039F, 0x03A0, 0x03A1, 0x03A3, 0x03A4, 0x03A5, 0x03A6, 0x03A7, 0x03A8, 0x03A9, 0xE785, 0xE786, 0xE787, 0xE788, 0xE789, 0xE78A, 0xE78B, 0xE78C, 0x03B1, 0x03B2, 0x03B3, 0x03B4, 0x03B5, 0x03B6, 0x03B7, 0x03B8, 0x03B9, 0x03BA, 0x03BB, 0x03BC, 0x03BD, 0x03BE, 0x03BF, 0x03C0, 0x03C1, 0x03C3, 0x03C4, 0x03C5, 0x03C6, 0x03C7, 0x03C8, 0x03C9, 0xE78D, 0xE78E, 0xE78F, 0xE790, 0xE791, 0xE792, 0xE793, 0xFE35, 0xFE36, 0xFE39, 0xFE3A, 0xFE3F, 0xFE40, 0xFE3D, 0xFE3E, 0xFE41, 0xFE42, 0xFE43, 0xFE44, 0xE794, 0xE795, 0xFE3B, 0xFE3C, 0xFE37, 0xFE38, 0xFE31, 0xE796, 0xFE33, 0xFE34, 0xE797, 0xE798, 0xE799, 0xE79A, 0xE79B, 0xE79C, 0xE79D, 0xE79E, 0xE79F, // Skip: GB 0xA740..0xA77E, 0xA780..0xA7A0 (UDA 3) // GB 0xA8A1..0xA8FE 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, 0xE7A0, 0xE7A1, 0xE7A2, 0xE7A3, 0xE7A4, 0xE7A5, 0xE7A6, 0xE7A7, 0xE7A8, 0xE7A9, 0xE7AA, 0xE7AB, 0xE7AC, 0xE7AD, 0xE7AE, 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, 0xE7AF, 0xE7B0, 0xE7B1, 0xE7B2, 0xE7B3, 0xE7B4, 0xE7B5, 0xE7B6, 0xE7B7, 0xE7B8, 0xE7B9, 0xE7BA, 0xE7BB, // GB 0xA840..0xA87E 0x02CA, 0x02CB, 0x02D9, 0x2013, 0x2015, 0x2025, 0x2035, 0x2105, 0x2109, 0x2196, 0x2197, 0x2198, 0x2199, 0x2215, 0x221F, 0x2223, 0x2252, 0x2266, 0x2267, 0x22BF, 0x2550, 0x2551, 0x2552, 0x2553, 0x2554, 0x2555, 0x2556, 0x2557, 0x2558, 0x2559, 0x255A, 0x255B, 0x255C, 0x255D, 0x255E, 0x255F, 0x2560, 0x2561, 0x2562, 0x2563, 0x2564, 0x2565, 0x2566, 0x2567, 0x2568, 0x2569, 0x256A, 0x256B, 0x256C, 0x256D, 0x256E, 0x256F, 0x2570, 0x2571, 0x2572, 0x2573, 0x2581, 0x2582, 0x2583, 0x2584, 0x2585, 0x2586, 0x2587, // GB 0xA880..0xA8FE 0x2588, 0x2589, 0x258A, 0x258B, 0x258C, 0x258D, 0x258E, 0x258F, 0x2593, 0x2594, 0x2595, 0x25BC, 0x25BD, 0x25E2, 0x25E3, 0x25E4, 0x25E5, 0x2609, 0x2295, 0x3012, 0x301D, 0x301E, 0xE7BC, 0xE7BD, 0xE7BE, 0xE7BF, 0xE7C0, 0xE7C1, 0xE7C2, 0xE7C3, 0xE7C4, 0xE7C5, 0xE7C6, 0x0101, 0x00E1, 0x01CE, 0x00E0, 0x0113, 0x00E9, 0x011B, 0x00E8, 0x012B, 0x00ED, 0x01D0, 0x00EC, 0x014D, 0x00F3, 0x01D2, 0x00F2, 0x016B, 0x00FA, 0x01D4, 0x00F9, 0x01D6, 0x01D8, 0x01DA, 0x01DC, 0x00FC, 0x00EA, 0x0251, 0xE7C7, 0x0144, 0x0148, 0x01F9, 0x0261, 0xE7C9, 0xE7CA, 0xE7CB, 0xE7CC, 0x3105, 0x3106, 0x3107, 0x3108, 0x3109, 0x310A, 0x310B, 0x310C, 0x310D, 0x310E, 0x310F, 0x3110, 0x3111, 0x3112, 0x3113, 0x3114, 0x3115, 0x3116, 0x3117, 0x3118, 0x3119, 0x311A, 0x311B, 0x311C, 0x311D, 0x311E, 0x311F, 0x3120, 0x3121, 0x3122, 0x3123, 0x3124, 0x3125, 0x3126, 0x3127, 0x3128, 0x3129, 0xE7CD, 0xE7CE, 0xE7CF, 0xE7D0, 0xE7D1, 0xE7D2, 0xE7D3, 0xE7D4, 0xE7D5, 0xE7D6, 0xE7D7, 0xE7D8, 0xE7D9, 0xE7DA, 0xE7DB, 0xE7DC, 0xE7DD, 0xE7DE, 0xE7DF, 0xE7E0, 0xE7E1, // GB 0xA940..0xA97E 0x3021, 0x3022, 0x3023, 0x3024, 0x3025, 0x3026, 0x3027, 0x3028, 0x3029, 0x32A3, 0x338E, 0x338F, 0x339C, 0x339D, 0x339E, 0x33A1, 0x33C4, 0x33CE, 0x33D1, 0x33D2, 0x33D5, 0xFE30, 0xFFE2, 0xFFE4, 0xE7E2, 0x2121, 0x3231, 0xE7E3, 0x2010, 0xE7E4, 0xE7E5, 0xE7E6, 0x30FC, 0x309B, 0x309C, 0x30FD, 0x30FE, 0x3006, 0x309D, 0x309E, 0xFE49, 0xFE4A, 0xFE4B, 0xFE4C, 0xFE4D, 0xFE4E, 0xFE4F, 0xFE50, 0xFE51, 0xFE52, 0xFE54, 0xFE55, 0xFE56, 0xFE57, 0xFE59, 0xFE5A, 0xFE5B, 0xFE5C, 0xFE5D, 0xFE5E, 0xFE5F, 0xFE60, 0xFE61, // GB 0xA980..0xA9FE 0xFE62, 0xFE63, 0xFE64, 0xFE65, 0xFE66, 0xFE68, 0xFE69, 0xFE6A, 0xFE6B, 0x303E, 0x2FF0, 0x2FF1, 0x2FF2, 0x2FF3, 0x2FF4, 0x2FF5, 0x2FF6, 0x2FF7, 0x2FF8, 0x2FF9, 0x2FFA, 0x2FFB, 0x3007, 0xE7F4, 0xE7F5, 0xE7F6, 0xE7F7, 0xE7F8, 0xE7F9, 0xE7FA, 0xE7FB, 0xE7FC, 0xE7FD, 0xE7FE, 0xE7FF, 0xE800, 0x2500, 0x2501, 0x2502, 0x2503, 0x2504, 0x2505, 0x2506, 0x2507, 0x2508, 0x2509, 0x250A, 0x250B, 0x250C, 0x250D, 0x250E, 0x250F, 0x2510, 0x2511, 0x2512, 0x2513, 0x2514, 0x2515, 0x2516, 0x2517, 0x2518, 0x2519, 0x251A, 0x251B, 0x251C, 0x251D, 0x251E, 0x251F, 0x2520, 0x2521, 0x2522, 0x2523, 0x2524, 0x2525, 0x2526, 0x2527, 0x2528, 0x2529, 0x252A, 0x252B, 0x252C, 0x252D, 0x252E, 0x252F, 0x2530, 0x2531, 0x2532, 0x2533, 0x2534, 0x2535, 0x2536, 0x2537, 0x2538, 0x2539, 0x253A, 0x253B, 0x253C, 0x253D, 0x253E, 0x253F, 0x2540, 0x2541, 0x2542, 0x2543, 0x2544, 0x2545, 0x2546, 0x2547, 0x2548, 0x2549, 0x254A, 0x254B, 0xE801, 0xE802, 0xE803, 0xE804, 0xE805, 0xE806, 0xE807, 0xE808, 0xE809, 0xE80A, 0xE80B, 0xE80C, 0xE80D, 0xE80E, 0xE80F, // GB 0xAA40..0xAA7E 0x72DC, 0x72DD, 0x72DF, 0x72E2, 0x72E3, 0x72E4, 0x72E5, 0x72E6, 0x72E7, 0x72EA, 0x72EB, 0x72F5, 0x72F6, 0x72F9, 0x72FD, 0x72FE, 0x72FF, 0x7300, 0x7302, 0x7304, 0x7305, 0x7306, 0x7307, 0x7308, 0x7309, 0x730B, 0x730C, 0x730D, 0x730F, 0x7310, 0x7311, 0x7312, 0x7314, 0x7318, 0x7319, 0x731A, 0x731F, 0x7320, 0x7323, 0x7324, 0x7326, 0x7327, 0x7328, 0x732D, 0x732F, 0x7330, 0x7332, 0x7333, 0x7335, 0x7336, 0x733A, 0x733B, 0x733C, 0x733D, 0x7340, 0x7341, 0x7342, 0x7343, 0x7344, 0x7345, 0x7346, 0x7347, 0x7348, // GB 0xAA80..0xAAA0 0x7349, 0x734A, 0x734B, 0x734C, 0x734E, 0x734F, 0x7351, 0x7353, 0x7354, 0x7355, 0x7356, 0x7358, 0x7359, 0x735A, 0x735B, 0x735C, 0x735D, 0x735E, 0x735F, 0x7361, 0x7362, 0x7363, 0x7364, 0x7365, 0x7366, 0x7367, 0x7368, 0x7369, 0x736A, 0x736B, 0x736E, 0x7370, 0x7371, // Skip: GB 0xAAA1..0xAAFE (UDA 1) // GB 0xAB40..0xAB7E 0x7372, 0x7373, 0x7374, 0x7375, 0x7376, 0x7377, 0x7378, 0x7379, 0x737A, 0x737B, 0x737C, 0x737D, 0x737F, 0x7380, 0x7381, 0x7382, 0x7383, 0x7385, 0x7386, 0x7388, 0x738A, 0x738C, 0x738D, 0x738F, 0x7390, 0x7392, 0x7393, 0x7394, 0x7395, 0x7397, 0x7398, 0x7399, 0x739A, 0x739C, 0x739D, 0x739E, 0x73A0, 0x73A1, 0x73A3, 0x73A4, 0x73A5, 0x73A6, 0x73A7, 0x73A8, 0x73AA, 0x73AC, 0x73AD, 0x73B1, 0x73B4, 0x73B5, 0x73B6, 0x73B8, 0x73B9, 0x73BC, 0x73BD, 0x73BE, 0x73BF, 0x73C1, 0x73C3, 0x73C4, 0x73C5, 0x73C6, 0x73C7, // GB 0xAB80..0xABA0 0x73CB, 0x73CC, 0x73CE, 0x73D2, 0x73D3, 0x73D4, 0x73D5, 0x73D6, 0x73D7, 0x73D8, 0x73DA, 0x73DB, 0x73DC, 0x73DD, 0x73DF, 0x73E1, 0x73E2, 0x73E3, 0x73E4, 0x73E6, 0x73E8, 0x73EA, 0x73EB, 0x73EC, 0x73EE, 0x73EF, 0x73F0, 0x73F1, 0x73F3, 0x73F4, 0x73F5, 0x73F6, 0x73F7, // Skip: GB 0xABA1..0xABFE (UDA 1) // GB 0xAC40..0xAC7E 0x73F8, 0x73F9, 0x73FA, 0x73FB, 0x73FC, 0x73FD, 0x73FE, 0x73FF, 0x7400, 0x7401, 0x7402, 0x7404, 0x7407, 0x7408, 0x740B, 0x740C, 0x740D, 0x740E, 0x7411, 0x7412, 0x7413, 0x7414, 0x7415, 0x7416, 0x7417, 0x7418, 0x7419, 0x741C, 0x741D, 0x741E, 0x741F, 0x7420, 0x7421, 0x7423, 0x7424, 0x7427, 0x7429, 0x742B, 0x742D, 0x742F, 0x7431, 0x7432, 0x7437, 0x7438, 0x7439, 0x743A, 0x743B, 0x743D, 0x743E, 0x743F, 0x7440, 0x7442, 0x7443, 0x7444, 0x7445, 0x7446, 0x7447, 0x7448, 0x7449, 0x744A, 0x744B, 0x744C, 0x744D, // GB 0xAC80..0xACA0 0x744E, 0x744F, 0x7450, 0x7451, 0x7452, 0x7453, 0x7454, 0x7456, 0x7458, 0x745D, 0x7460, 0x7461, 0x7462, 0x7463, 0x7464, 0x7465, 0x7466, 0x7467, 0x7468, 0x7469, 0x746A, 0x746B, 0x746C, 0x746E, 0x746F, 0x7471, 0x7472, 0x7473, 0x7474, 0x7475, 0x7478, 0x7479, 0x747A, // Skip: GB 0xACA1..0xACFE (UDA 1) // GB 0xAD40..0xAD7E 0x747B, 0x747C, 0x747D, 0x747F, 0x7482, 0x7484, 0x7485, 0x7486, 0x7488, 0x7489, 0x748A, 0x748C, 0x748D, 0x748F, 0x7491, 0x7492, 0x7493, 0x7494, 0x7495, 0x7496, 0x7497, 0x7498, 0x7499, 0x749A, 0x749B, 0x749D, 0x749F, 0x74A0, 0x74A1, 0x74A2, 0x74A3, 0x74A4, 0x74A5, 0x74A6, 0x74AA, 0x74AB, 0x74AC, 0x74AD, 0x74AE, 0x74AF, 0x74B0, 0x74B1, 0x74B2, 0x74B3, 0x74B4, 0x74B5, 0x74B6, 0x74B7, 0x74B8, 0x74B9, 0x74BB, 0x74BC, 0x74BD, 0x74BE, 0x74BF, 0x74C0, 0x74C1, 0x74C2, 0x74C3, 0x74C4, 0x74C5, 0x74C6, 0x74C7, // GB 0xAD80..0xADA0 0x74C8, 0x74C9, 0x74CA, 0x74CB, 0x74CC, 0x74CD, 0x74CE, 0x74CF, 0x74D0, 0x74D1, 0x74D3, 0x74D4, 0x74D5, 0x74D6, 0x74D7, 0x74D8, 0x74D9, 0x74DA, 0x74DB, 0x74DD, 0x74DF, 0x74E1, 0x74E5, 0x74E7, 0x74E8, 0x74E9, 0x74EA, 0x74EB, 0x74EC, 0x74ED, 0x74F0, 0x74F1, 0x74F2, // Skip: GB 0xADA1..0xADFE (UDA 1) // GB 0xAE40..0xAE7E 0x74F3, 0x74F5, 0x74F8, 0x74F9, 0x74FA, 0x74FB, 0x74FC, 0x74FD, 0x74FE, 0x7500, 0x7501, 0x7502, 0x7503, 0x7505, 0x7506, 0x7507, 0x7508, 0x7509, 0x750A, 0x750B, 0x750C, 0x750E, 0x7510, 0x7512, 0x7514, 0x7515, 0x7516, 0x7517, 0x751B, 0x751D, 0x751E, 0x7520, 0x7521, 0x7522, 0x7523, 0x7524, 0x7526, 0x7527, 0x752A, 0x752E, 0x7534, 0x7536, 0x7539, 0x753C, 0x753D, 0x753F, 0x7541, 0x7542, 0x7543, 0x7544, 0x7546, 0x7547, 0x7549, 0x754A, 0x754D, 0x7550, 0x7551, 0x7552, 0x7553, 0x7555, 0x7556, 0x7557, 0x7558, // GB 0xAE80..0xAEA0 0x755D, 0x755E, 0x755F, 0x7560, 0x7561, 0x7562, 0x7563, 0x7564, 0x7567, 0x7568, 0x7569, 0x756B, 0x756C, 0x756D, 0x756E, 0x756F, 0x7570, 0x7571, 0x7573, 0x7575, 0x7576, 0x7577, 0x757A, 0x757B, 0x757C, 0x757D, 0x757E, 0x7580, 0x7581, 0x7582, 0x7584, 0x7585, 0x7587, // Skip: GB 0xAEA1..0xAEFE (UDA 1) // GB 0xAF40..0xAF7E 0x7588, 0x7589, 0x758A, 0x758C, 0x758D, 0x758E, 0x7590, 0x7593, 0x7595, 0x7598, 0x759B, 0x759C, 0x759E, 0x75A2, 0x75A6, 0x75A7, 0x75A8, 0x75A9, 0x75AA, 0x75AD, 0x75B6, 0x75B7, 0x75BA, 0x75BB, 0x75BF, 0x75C0, 0x75C1, 0x75C6, 0x75CB, 0x75CC, 0x75CE, 0x75CF, 0x75D0, 0x75D1, 0x75D3, 0x75D7, 0x75D9, 0x75DA, 0x75DC, 0x75DD, 0x75DF, 0x75E0, 0x75E1, 0x75E5, 0x75E9, 0x75EC, 0x75ED, 0x75EE, 0x75EF, 0x75F2, 0x75F3, 0x75F5, 0x75F6, 0x75F7, 0x75F8, 0x75FA, 0x75FB, 0x75FD, 0x75FE, 0x7602, 0x7604, 0x7606, 0x7607, // GB 0xAF80..0xAFA0 0x7608, 0x7609, 0x760B, 0x760D, 0x760E, 0x760F, 0x7611, 0x7612, 0x7613, 0x7614, 0x7616, 0x761A, 0x761C, 0x761D, 0x761E, 0x7621, 0x7623, 0x7627, 0x7628, 0x762C, 0x762E, 0x762F, 0x7631, 0x7632, 0x7636, 0x7637, 0x7639, 0x763A, 0x763B, 0x763D, 0x7641, 0x7642, 0x7644, // Skip: GB 0xAFA1..0xAFFE (UDA 1) // GB 0xB040..0xB07E 0x7645, 0x7646, 0x7647, 0x7648, 0x7649, 0x764A, 0x764B, 0x764E, 0x764F, 0x7650, 0x7651, 0x7652, 0x7653, 0x7655, 0x7657, 0x7658, 0x7659, 0x765A, 0x765B, 0x765D, 0x765F, 0x7660, 0x7661, 0x7662, 0x7664, 0x7665, 0x7666, 0x7667, 0x7668, 0x7669, 0x766A, 0x766C, 0x766D, 0x766E, 0x7670, 0x7671, 0x7672, 0x7673, 0x7674, 0x7675, 0x7676, 0x7677, 0x7679, 0x767A, 0x767C, 0x767F, 0x7680, 0x7681, 0x7683, 0x7685, 0x7689, 0x768A, 0x768C, 0x768D, 0x768F, 0x7690, 0x7692, 0x7694, 0x7695, 0x7697, 0x7698, 0x769A, 0x769B, // GB 0xB080..0xB0FE 0x769C, 0x769D, 0x769E, 0x769F, 0x76A0, 0x76A1, 0x76A2, 0x76A3, 0x76A5, 0x76A6, 0x76A7, 0x76A8, 0x76A9, 0x76AA, 0x76AB, 0x76AC, 0x76AD, 0x76AF, 0x76B0, 0x76B3, 0x76B5, 0x76B6, 0x76B7, 0x76B8, 0x76B9, 0x76BA, 0x76BB, 0x76BC, 0x76BD, 0x76BE, 0x76C0, 0x76C1, 0x76C3, 0x554A, 0x963F, 0x57C3, 0x6328, 0x54CE, 0x5509, 0x54C0, 0x7691, 0x764C, 0x853C, 0x77EE, 0x827E, 0x788D, 0x7231, 0x9698, 0x978D, 0x6C28, 0x5B89, 0x4FFA, 0x6309, 0x6697, 0x5CB8, 0x80FA, 0x6848, 0x80AE, 0x6602, 0x76CE, 0x51F9, 0x6556, 0x71AC, 0x7FF1, 0x8884, 0x50B2, 0x5965, 0x61CA, 0x6FB3, 0x82AD, 0x634C, 0x6252, 0x53ED, 0x5427, 0x7B06, 0x516B, 0x75A4, 0x5DF4, 0x62D4, 0x8DCB, 0x9776, 0x628A, 0x8019, 0x575D, 0x9738, 0x7F62, 0x7238, 0x767D, 0x67CF, 0x767E, 0x6446, 0x4F70, 0x8D25, 0x62DC, 0x7A17, 0x6591, 0x73ED, 0x642C, 0x6273, 0x822C, 0x9881, 0x677F, 0x7248, 0x626E, 0x62CC, 0x4F34, 0x74E3, 0x534A, 0x529E, 0x7ECA, 0x90A6, 0x5E2E, 0x6886, 0x699C, 0x8180, 0x7ED1, 0x68D2, 0x78C5, 0x868C, 0x9551, 0x508D, 0x8C24, 0x82DE, 0x80DE, 0x5305, 0x8912, 0x5265, // GB 0xB140..0xB17E 0x76C4, 0x76C7, 0x76C9, 0x76CB, 0x76CC, 0x76D3, 0x76D5, 0x76D9, 0x76DA, 0x76DC, 0x76DD, 0x76DE, 0x76E0, 0x76E1, 0x76E2, 0x76E3, 0x76E4, 0x76E6, 0x76E7, 0x76E8, 0x76E9, 0x76EA, 0x76EB, 0x76EC, 0x76ED, 0x76F0, 0x76F3, 0x76F5, 0x76F6, 0x76F7, 0x76FA, 0x76FB, 0x76FD, 0x76FF, 0x7700, 0x7702, 0x7703, 0x7705, 0x7706, 0x770A, 0x770C, 0x770E, 0x770F, 0x7710, 0x7711, 0x7712, 0x7713, 0x7714, 0x7715, 0x7716, 0x7717, 0x7718, 0x771B, 0x771C, 0x771D, 0x771E, 0x7721, 0x7723, 0x7724, 0x7725, 0x7727, 0x772A, 0x772B, // GB 0xB180..0xB1FE 0x772C, 0x772E, 0x7730, 0x7731, 0x7732, 0x7733, 0x7734, 0x7739, 0x773B, 0x773D, 0x773E, 0x773F, 0x7742, 0x7744, 0x7745, 0x7746, 0x7748, 0x7749, 0x774A, 0x774B, 0x774C, 0x774D, 0x774E, 0x774F, 0x7752, 0x7753, 0x7754, 0x7755, 0x7756, 0x7757, 0x7758, 0x7759, 0x775C, 0x8584, 0x96F9, 0x4FDD, 0x5821, 0x9971, 0x5B9D, 0x62B1, 0x62A5, 0x66B4, 0x8C79, 0x9C8D, 0x7206, 0x676F, 0x7891, 0x60B2, 0x5351, 0x5317, 0x8F88, 0x80CC, 0x8D1D, 0x94A1, 0x500D, 0x72C8, 0x5907, 0x60EB, 0x7119, 0x88AB, 0x5954, 0x82EF, 0x672C, 0x7B28, 0x5D29, 0x7EF7, 0x752D, 0x6CF5, 0x8E66, 0x8FF8, 0x903C, 0x9F3B, 0x6BD4, 0x9119, 0x7B14, 0x5F7C, 0x78A7, 0x84D6, 0x853D, 0x6BD5, 0x6BD9, 0x6BD6, 0x5E01, 0x5E87, 0x75F9, 0x95ED, 0x655D, 0x5F0A, 0x5FC5, 0x8F9F, 0x58C1, 0x81C2, 0x907F, 0x965B, 0x97AD, 0x8FB9, 0x7F16, 0x8D2C, 0x6241, 0x4FBF, 0x53D8, 0x535E, 0x8FA8, 0x8FA9, 0x8FAB, 0x904D, 0x6807, 0x5F6A, 0x8198, 0x8868, 0x9CD6, 0x618B, 0x522B, 0x762A, 0x5F6C, 0x658C, 0x6FD2, 0x6EE8, 0x5BBE, 0x6448, 0x5175, 0x51B0, 0x67C4, 0x4E19, 0x79C9, 0x997C, 0x70B3, // GB 0xB240..0xB27E 0x775D, 0x775E, 0x775F, 0x7760, 0x7764, 0x7767, 0x7769, 0x776A, 0x776D, 0x776E, 0x776F, 0x7770, 0x7771, 0x7772, 0x7773, 0x7774, 0x7775, 0x7776, 0x7777, 0x7778, 0x777A, 0x777B, 0x777C, 0x7781, 0x7782, 0x7783, 0x7786, 0x7787, 0x7788, 0x7789, 0x778A, 0x778B, 0x778F, 0x7790, 0x7793, 0x7794, 0x7795, 0x7796, 0x7797, 0x7798, 0x7799, 0x779A, 0x779B, 0x779C, 0x779D, 0x779E, 0x77A1, 0x77A3, 0x77A4, 0x77A6, 0x77A8, 0x77AB, 0x77AD, 0x77AE, 0x77AF, 0x77B1, 0x77B2, 0x77B4, 0x77B6, 0x77B7, 0x77B8, 0x77B9, 0x77BA, // GB 0xB280..0xB2FE 0x77BC, 0x77BE, 0x77C0, 0x77C1, 0x77C2, 0x77C3, 0x77C4, 0x77C5, 0x77C6, 0x77C7, 0x77C8, 0x77C9, 0x77CA, 0x77CB, 0x77CC, 0x77CE, 0x77CF, 0x77D0, 0x77D1, 0x77D2, 0x77D3, 0x77D4, 0x77D5, 0x77D6, 0x77D8, 0x77D9, 0x77DA, 0x77DD, 0x77DE, 0x77DF, 0x77E0, 0x77E1, 0x77E4, 0x75C5, 0x5E76, 0x73BB, 0x83E0, 0x64AD, 0x62E8, 0x94B5, 0x6CE2, 0x535A, 0x52C3, 0x640F, 0x94C2, 0x7B94, 0x4F2F, 0x5E1B, 0x8236, 0x8116, 0x818A, 0x6E24, 0x6CCA, 0x9A73, 0x6355, 0x535C, 0x54FA, 0x8865, 0x57E0, 0x4E0D, 0x5E03, 0x6B65, 0x7C3F, 0x90E8, 0x6016, 0x64E6, 0x731C, 0x88C1, 0x6750, 0x624D, 0x8D22, 0x776C, 0x8E29, 0x91C7, 0x5F69, 0x83DC, 0x8521, 0x9910, 0x53C2, 0x8695, 0x6B8B, 0x60ED, 0x60E8, 0x707F, 0x82CD, 0x8231, 0x4ED3, 0x6CA7, 0x85CF, 0x64CD, 0x7CD9, 0x69FD, 0x66F9, 0x8349, 0x5395, 0x7B56, 0x4FA7, 0x518C, 0x6D4B, 0x5C42, 0x8E6D, 0x63D2, 0x53C9, 0x832C, 0x8336, 0x67E5, 0x78B4, 0x643D, 0x5BDF, 0x5C94, 0x5DEE, 0x8BE7, 0x62C6, 0x67F4, 0x8C7A, 0x6400, 0x63BA, 0x8749, 0x998B, 0x8C17, 0x7F20, 0x94F2, 0x4EA7, 0x9610, 0x98A4, 0x660C, 0x7316, // GB 0xB340..0xB37E 0x77E6, 0x77E8, 0x77EA, 0x77EF, 0x77F0, 0x77F1, 0x77F2, 0x77F4, 0x77F5, 0x77F7, 0x77F9, 0x77FA, 0x77FB, 0x77FC, 0x7803, 0x7804, 0x7805, 0x7806, 0x7807, 0x7808, 0x780A, 0x780B, 0x780E, 0x780F, 0x7810, 0x7813, 0x7815, 0x7819, 0x781B, 0x781E, 0x7820, 0x7821, 0x7822, 0x7824, 0x7828, 0x782A, 0x782B, 0x782E, 0x782F, 0x7831, 0x7832, 0x7833, 0x7835, 0x7836, 0x783D, 0x783F, 0x7841, 0x7842, 0x7843, 0x7844, 0x7846, 0x7848, 0x7849, 0x784A, 0x784B, 0x784D, 0x784F, 0x7851, 0x7853, 0x7854, 0x7858, 0x7859, 0x785A, // GB 0xB380..0xB3FE 0x785B, 0x785C, 0x785E, 0x785F, 0x7860, 0x7861, 0x7862, 0x7863, 0x7864, 0x7865, 0x7866, 0x7867, 0x7868, 0x7869, 0x786F, 0x7870, 0x7871, 0x7872, 0x7873, 0x7874, 0x7875, 0x7876, 0x7878, 0x7879, 0x787A, 0x787B, 0x787D, 0x787E, 0x787F, 0x7880, 0x7881, 0x7882, 0x7883, 0x573A, 0x5C1D, 0x5E38, 0x957F, 0x507F, 0x80A0, 0x5382, 0x655E, 0x7545, 0x5531, 0x5021, 0x8D85, 0x6284, 0x949E, 0x671D, 0x5632, 0x6F6E, 0x5DE2, 0x5435, 0x7092, 0x8F66, 0x626F, 0x64A4, 0x63A3, 0x5F7B, 0x6F88, 0x90F4, 0x81E3, 0x8FB0, 0x5C18, 0x6668, 0x5FF1, 0x6C89, 0x9648, 0x8D81, 0x886C, 0x6491, 0x79F0, 0x57CE, 0x6A59, 0x6210, 0x5448, 0x4E58, 0x7A0B, 0x60E9, 0x6F84, 0x8BDA, 0x627F, 0x901E, 0x9A8B, 0x79E4, 0x5403, 0x75F4, 0x6301, 0x5319, 0x6C60, 0x8FDF, 0x5F1B, 0x9A70, 0x803B, 0x9F7F, 0x4F88, 0x5C3A, 0x8D64, 0x7FC5, 0x65A5, 0x70BD, 0x5145, 0x51B2, 0x866B, 0x5D07, 0x5BA0, 0x62BD, 0x916C, 0x7574, 0x8E0C, 0x7A20, 0x6101, 0x7B79, 0x4EC7, 0x7EF8, 0x7785, 0x4E11, 0x81ED, 0x521D, 0x51FA, 0x6A71, 0x53A8, 0x8E87, 0x9504, 0x96CF, 0x6EC1, 0x9664, 0x695A, // GB 0xB440..0xB47E 0x7884, 0x7885, 0x7886, 0x7888, 0x788A, 0x788B, 0x788F, 0x7890, 0x7892, 0x7894, 0x7895, 0x7896, 0x7899, 0x789D, 0x789E, 0x78A0, 0x78A2, 0x78A4, 0x78A6, 0x78A8, 0x78A9, 0x78AA, 0x78AB, 0x78AC, 0x78AD, 0x78AE, 0x78AF, 0x78B5, 0x78B6, 0x78B7, 0x78B8, 0x78BA, 0x78BB, 0x78BC, 0x78BD, 0x78BF, 0x78C0, 0x78C2, 0x78C3, 0x78C4, 0x78C6, 0x78C7, 0x78C8, 0x78CC, 0x78CD, 0x78CE, 0x78CF, 0x78D1, 0x78D2, 0x78D3, 0x78D6, 0x78D7, 0x78D8, 0x78DA, 0x78DB, 0x78DC, 0x78DD, 0x78DE, 0x78DF, 0x78E0, 0x78E1, 0x78E2, 0x78E3, // GB 0xB480..0xB4FE 0x78E4, 0x78E5, 0x78E6, 0x78E7, 0x78E9, 0x78EA, 0x78EB, 0x78ED, 0x78EE, 0x78EF, 0x78F0, 0x78F1, 0x78F3, 0x78F5, 0x78F6, 0x78F8, 0x78F9, 0x78FB, 0x78FC, 0x78FD, 0x78FE, 0x78FF, 0x7900, 0x7902, 0x7903, 0x7904, 0x7906, 0x7907, 0x7908, 0x7909, 0x790A, 0x790B, 0x790C, 0x7840, 0x50A8, 0x77D7, 0x6410, 0x89E6, 0x5904, 0x63E3, 0x5DDD, 0x7A7F, 0x693D, 0x4F20, 0x8239, 0x5598, 0x4E32, 0x75AE, 0x7A97, 0x5E62, 0x5E8A, 0x95EF, 0x521B, 0x5439, 0x708A, 0x6376, 0x9524, 0x5782, 0x6625, 0x693F, 0x9187, 0x5507, 0x6DF3, 0x7EAF, 0x8822, 0x6233, 0x7EF0, 0x75B5, 0x8328, 0x78C1, 0x96CC, 0x8F9E, 0x6148, 0x74F7, 0x8BCD, 0x6B64, 0x523A, 0x8D50, 0x6B21, 0x806A, 0x8471, 0x56F1, 0x5306, 0x4ECE, 0x4E1B, 0x51D1, 0x7C97, 0x918B, 0x7C07, 0x4FC3, 0x8E7F, 0x7BE1, 0x7A9C, 0x6467, 0x5D14, 0x50AC, 0x8106, 0x7601, 0x7CB9, 0x6DEC, 0x7FE0, 0x6751, 0x5B58, 0x5BF8, 0x78CB, 0x64AE, 0x6413, 0x63AA, 0x632B, 0x9519, 0x642D, 0x8FBE, 0x7B54, 0x7629, 0x6253, 0x5927, 0x5446, 0x6B79, 0x50A3, 0x6234, 0x5E26, 0x6B86, 0x4EE3, 0x8D37, 0x888B, 0x5F85, 0x902E, // GB 0xB540..0xB57E 0x790D, 0x790E, 0x790F, 0x7910, 0x7911, 0x7912, 0x7914, 0x7915, 0x7916, 0x7917, 0x7918, 0x7919, 0x791A, 0x791B, 0x791C, 0x791D, 0x791F, 0x7920, 0x7921, 0x7922, 0x7923, 0x7925, 0x7926, 0x7927, 0x7928, 0x7929, 0x792A, 0x792B, 0x792C, 0x792D, 0x792E, 0x792F, 0x7930, 0x7931, 0x7932, 0x7933, 0x7935, 0x7936, 0x7937, 0x7938, 0x7939, 0x793D, 0x793F, 0x7942, 0x7943, 0x7944, 0x7945, 0x7947, 0x794A, 0x794B, 0x794C, 0x794D, 0x794E, 0x794F, 0x7950, 0x7951, 0x7952, 0x7954, 0x7955, 0x7958, 0x7959, 0x7961, 0x7963, // GB 0xB580..0xB5FE 0x7964, 0x7966, 0x7969, 0x796A, 0x796B, 0x796C, 0x796E, 0x7970, 0x7971, 0x7972, 0x7973, 0x7974, 0x7975, 0x7976, 0x7979, 0x797B, 0x797C, 0x797D, 0x797E, 0x797F, 0x7982, 0x7983, 0x7986, 0x7987, 0x7988, 0x7989, 0x798B, 0x798C, 0x798D, 0x798E, 0x7990, 0x7991, 0x7992, 0x6020, 0x803D, 0x62C5, 0x4E39, 0x5355, 0x90F8, 0x63B8, 0x80C6, 0x65E6, 0x6C2E, 0x4F46, 0x60EE, 0x6DE1, 0x8BDE, 0x5F39, 0x86CB, 0x5F53, 0x6321, 0x515A, 0x8361, 0x6863, 0x5200, 0x6363, 0x8E48, 0x5012, 0x5C9B, 0x7977, 0x5BFC, 0x5230, 0x7A3B, 0x60BC, 0x9053, 0x76D7, 0x5FB7, 0x5F97, 0x7684, 0x8E6C, 0x706F, 0x767B, 0x7B49, 0x77AA, 0x51F3, 0x9093, 0x5824, 0x4F4E, 0x6EF4, 0x8FEA, 0x654C, 0x7B1B, 0x72C4, 0x6DA4, 0x7FDF, 0x5AE1, 0x62B5, 0x5E95, 0x5730, 0x8482, 0x7B2C, 0x5E1D, 0x5F1F, 0x9012, 0x7F14, 0x98A0, 0x6382, 0x6EC7, 0x7898, 0x70B9, 0x5178, 0x975B, 0x57AB, 0x7535, 0x4F43, 0x7538, 0x5E97, 0x60E6, 0x5960, 0x6DC0, 0x6BBF, 0x7889, 0x53FC, 0x96D5, 0x51CB, 0x5201, 0x6389, 0x540A, 0x9493, 0x8C03, 0x8DCC, 0x7239, 0x789F, 0x8776, 0x8FED, 0x8C0D, 0x53E0, // GB 0xB640..0xB67E 0x7993, 0x7994, 0x7995, 0x7996, 0x7997, 0x7998, 0x7999, 0x799B, 0x799C, 0x799D, 0x799E, 0x799F, 0x79A0, 0x79A1, 0x79A2, 0x79A3, 0x79A4, 0x79A5, 0x79A6, 0x79A8, 0x79A9, 0x79AA, 0x79AB, 0x79AC, 0x79AD, 0x79AE, 0x79AF, 0x79B0, 0x79B1, 0x79B2, 0x79B4, 0x79B5, 0x79B6, 0x79B7, 0x79B8, 0x79BC, 0x79BF, 0x79C2, 0x79C4, 0x79C5, 0x79C7, 0x79C8, 0x79CA, 0x79CC, 0x79CE, 0x79CF, 0x79D0, 0x79D3, 0x79D4, 0x79D6, 0x79D7, 0x79D9, 0x79DA, 0x79DB, 0x79DC, 0x79DD, 0x79DE, 0x79E0, 0x79E1, 0x79E2, 0x79E5, 0x79E8, 0x79EA, // GB 0xB680..0xB6FE 0x79EC, 0x79EE, 0x79F1, 0x79F2, 0x79F3, 0x79F4, 0x79F5, 0x79F6, 0x79F7, 0x79F9, 0x79FA, 0x79FC, 0x79FE, 0x79FF, 0x7A01, 0x7A04, 0x7A05, 0x7A07, 0x7A08, 0x7A09, 0x7A0A, 0x7A0C, 0x7A0F, 0x7A10, 0x7A11, 0x7A12, 0x7A13, 0x7A15, 0x7A16, 0x7A18, 0x7A19, 0x7A1B, 0x7A1C, 0x4E01, 0x76EF, 0x53EE, 0x9489, 0x9876, 0x9F0E, 0x952D, 0x5B9A, 0x8BA2, 0x4E22, 0x4E1C, 0x51AC, 0x8463, 0x61C2, 0x52A8, 0x680B, 0x4F97, 0x606B, 0x51BB, 0x6D1E, 0x515C, 0x6296, 0x6597, 0x9661, 0x8C46, 0x9017, 0x75D8, 0x90FD, 0x7763, 0x6BD2, 0x728A, 0x72EC, 0x8BFB, 0x5835, 0x7779, 0x8D4C, 0x675C, 0x9540, 0x809A, 0x5EA6, 0x6E21, 0x5992, 0x7AEF, 0x77ED, 0x953B, 0x6BB5, 0x65AD, 0x7F0E, 0x5806, 0x5151, 0x961F, 0x5BF9, 0x58A9, 0x5428, 0x8E72, 0x6566, 0x987F, 0x56E4, 0x949D, 0x76FE, 0x9041, 0x6387, 0x54C6, 0x591A, 0x593A, 0x579B, 0x8EB2, 0x6735, 0x8DFA, 0x8235, 0x5241, 0x60F0, 0x5815, 0x86FE, 0x5CE8, 0x9E45, 0x4FC4, 0x989D, 0x8BB9, 0x5A25, 0x6076, 0x5384, 0x627C, 0x904F, 0x9102, 0x997F, 0x6069, 0x800C, 0x513F, 0x8033, 0x5C14, 0x9975, 0x6D31, 0x4E8C, // GB 0xB740..0xB77E 0x7A1D, 0x7A1F, 0x7A21, 0x7A22, 0x7A24, 0x7A25, 0x7A26, 0x7A27, 0x7A28, 0x7A29, 0x7A2A, 0x7A2B, 0x7A2C, 0x7A2D, 0x7A2E, 0x7A2F, 0x7A30, 0x7A31, 0x7A32, 0x7A34, 0x7A35, 0x7A36, 0x7A38, 0x7A3A, 0x7A3E, 0x7A40, 0x7A41, 0x7A42, 0x7A43, 0x7A44, 0x7A45, 0x7A47, 0x7A48, 0x7A49, 0x7A4A, 0x7A4B, 0x7A4C, 0x7A4D, 0x7A4E, 0x7A4F, 0x7A50, 0x7A52, 0x7A53, 0x7A54, 0x7A55, 0x7A56, 0x7A58, 0x7A59, 0x7A5A, 0x7A5B, 0x7A5C, 0x7A5D, 0x7A5E, 0x7A5F, 0x7A60, 0x7A61, 0x7A62, 0x7A63, 0x7A64, 0x7A65, 0x7A66, 0x7A67, 0x7A68, // GB 0xB780..0xB7FE 0x7A69, 0x7A6A, 0x7A6B, 0x7A6C, 0x7A6D, 0x7A6E, 0x7A6F, 0x7A71, 0x7A72, 0x7A73, 0x7A75, 0x7A7B, 0x7A7C, 0x7A7D, 0x7A7E, 0x7A82, 0x7A85, 0x7A87, 0x7A89, 0x7A8A, 0x7A8B, 0x7A8C, 0x7A8E, 0x7A8F, 0x7A90, 0x7A93, 0x7A94, 0x7A99, 0x7A9A, 0x7A9B, 0x7A9E, 0x7AA1, 0x7AA2, 0x8D30, 0x53D1, 0x7F5A, 0x7B4F, 0x4F10, 0x4E4F, 0x9600, 0x6CD5, 0x73D0, 0x85E9, 0x5E06, 0x756A, 0x7FFB, 0x6A0A, 0x77FE, 0x9492, 0x7E41, 0x51E1, 0x70E6, 0x53CD, 0x8FD4, 0x8303, 0x8D29, 0x72AF, 0x996D, 0x6CDB, 0x574A, 0x82B3, 0x65B9, 0x80AA, 0x623F, 0x9632, 0x59A8, 0x4EFF, 0x8BBF, 0x7EBA, 0x653E, 0x83F2, 0x975E, 0x5561, 0x98DE, 0x80A5, 0x532A, 0x8BFD, 0x5420, 0x80BA, 0x5E9F, 0x6CB8, 0x8D39, 0x82AC, 0x915A, 0x5429, 0x6C1B, 0x5206, 0x7EB7, 0x575F, 0x711A, 0x6C7E, 0x7C89, 0x594B, 0x4EFD, 0x5FFF, 0x6124, 0x7CAA, 0x4E30, 0x5C01, 0x67AB, 0x8702, 0x5CF0, 0x950B, 0x98CE, 0x75AF, 0x70FD, 0x9022, 0x51AF, 0x7F1D, 0x8BBD, 0x5949, 0x51E4, 0x4F5B, 0x5426, 0x592B, 0x6577, 0x80A4, 0x5B75, 0x6276, 0x62C2, 0x8F90, 0x5E45, 0x6C1F, 0x7B26, 0x4F0F, 0x4FD8, 0x670D, // GB 0xB840..0xB87E 0x7AA3, 0x7AA4, 0x7AA7, 0x7AA9, 0x7AAA, 0x7AAB, 0x7AAE, 0x7AAF, 0x7AB0, 0x7AB1, 0x7AB2, 0x7AB4, 0x7AB5, 0x7AB6, 0x7AB7, 0x7AB8, 0x7AB9, 0x7ABA, 0x7ABB, 0x7ABC, 0x7ABD, 0x7ABE, 0x7AC0, 0x7AC1, 0x7AC2, 0x7AC3, 0x7AC4, 0x7AC5, 0x7AC6, 0x7AC7, 0x7AC8, 0x7AC9, 0x7ACA, 0x7ACC, 0x7ACD, 0x7ACE, 0x7ACF, 0x7AD0, 0x7AD1, 0x7AD2, 0x7AD3, 0x7AD4, 0x7AD5, 0x7AD7, 0x7AD8, 0x7ADA, 0x7ADB, 0x7ADC, 0x7ADD, 0x7AE1, 0x7AE2, 0x7AE4, 0x7AE7, 0x7AE8, 0x7AE9, 0x7AEA, 0x7AEB, 0x7AEC, 0x7AEE, 0x7AF0, 0x7AF1, 0x7AF2, 0x7AF3, // GB 0xB880..0xB8FE 0x7AF4, 0x7AF5, 0x7AF6, 0x7AF7, 0x7AF8, 0x7AFB, 0x7AFC, 0x7AFE, 0x7B00, 0x7B01, 0x7B02, 0x7B05, 0x7B07, 0x7B09, 0x7B0C, 0x7B0D, 0x7B0E, 0x7B10, 0x7B12, 0x7B13, 0x7B16, 0x7B17, 0x7B18, 0x7B1A, 0x7B1C, 0x7B1D, 0x7B1F, 0x7B21, 0x7B22, 0x7B23, 0x7B27, 0x7B29, 0x7B2D, 0x6D6E, 0x6DAA, 0x798F, 0x88B1, 0x5F17, 0x752B, 0x629A, 0x8F85, 0x4FEF, 0x91DC, 0x65A7, 0x812F, 0x8151, 0x5E9C, 0x8150, 0x8D74, 0x526F, 0x8986, 0x8D4B, 0x590D, 0x5085, 0x4ED8, 0x961C, 0x7236, 0x8179, 0x8D1F, 0x5BCC, 0x8BA3, 0x9644, 0x5987, 0x7F1A, 0x5490, 0x5676, 0x560E, 0x8BE5, 0x6539, 0x6982, 0x9499, 0x76D6, 0x6E89, 0x5E72, 0x7518, 0x6746, 0x67D1, 0x7AFF, 0x809D, 0x8D76, 0x611F, 0x79C6, 0x6562, 0x8D63, 0x5188, 0x521A, 0x94A2, 0x7F38, 0x809B, 0x7EB2, 0x5C97, 0x6E2F, 0x6760, 0x7BD9, 0x768B, 0x9AD8, 0x818F, 0x7F94, 0x7CD5, 0x641E, 0x9550, 0x7A3F, 0x544A, 0x54E5, 0x6B4C, 0x6401, 0x6208, 0x9E3D, 0x80F3, 0x7599, 0x5272, 0x9769, 0x845B, 0x683C, 0x86E4, 0x9601, 0x9694, 0x94EC, 0x4E2A, 0x5404, 0x7ED9, 0x6839, 0x8DDF, 0x8015, 0x66F4, 0x5E9A, 0x7FB9, // GB 0xB940..0xB97E 0x7B2F, 0x7B30, 0x7B32, 0x7B34, 0x7B35, 0x7B36, 0x7B37, 0x7B39, 0x7B3B, 0x7B3D, 0x7B3F, 0x7B40, 0x7B41, 0x7B42, 0x7B43, 0x7B44, 0x7B46, 0x7B48, 0x7B4A, 0x7B4D, 0x7B4E, 0x7B53, 0x7B55, 0x7B57, 0x7B59, 0x7B5C, 0x7B5E, 0x7B5F, 0x7B61, 0x7B63, 0x7B64, 0x7B65, 0x7B66, 0x7B67, 0x7B68, 0x7B69, 0x7B6A, 0x7B6B, 0x7B6C, 0x7B6D, 0x7B6F, 0x7B70, 0x7B73, 0x7B74, 0x7B76, 0x7B78, 0x7B7A, 0x7B7C, 0x7B7D, 0x7B7F, 0x7B81, 0x7B82, 0x7B83, 0x7B84, 0x7B86, 0x7B87, 0x7B88, 0x7B89, 0x7B8A, 0x7B8B, 0x7B8C, 0x7B8E, 0x7B8F, // GB 0xB980..0xB9FE 0x7B91, 0x7B92, 0x7B93, 0x7B96, 0x7B98, 0x7B99, 0x7B9A, 0x7B9B, 0x7B9E, 0x7B9F, 0x7BA0, 0x7BA3, 0x7BA4, 0x7BA5, 0x7BAE, 0x7BAF, 0x7BB0, 0x7BB2, 0x7BB3, 0x7BB5, 0x7BB6, 0x7BB7, 0x7BB9, 0x7BBA, 0x7BBB, 0x7BBC, 0x7BBD, 0x7BBE, 0x7BBF, 0x7BC0, 0x7BC2, 0x7BC3, 0x7BC4, 0x57C2, 0x803F, 0x6897, 0x5DE5, 0x653B, 0x529F, 0x606D, 0x9F9A, 0x4F9B, 0x8EAC, 0x516C, 0x5BAB, 0x5F13, 0x5DE9, 0x6C5E, 0x62F1, 0x8D21, 0x5171, 0x94A9, 0x52FE, 0x6C9F, 0x82DF, 0x72D7, 0x57A2, 0x6784, 0x8D2D, 0x591F, 0x8F9C, 0x83C7, 0x5495, 0x7B8D, 0x4F30, 0x6CBD, 0x5B64, 0x59D1, 0x9F13, 0x53E4, 0x86CA, 0x9AA8, 0x8C37, 0x80A1, 0x6545, 0x987E, 0x56FA, 0x96C7, 0x522E, 0x74DC, 0x5250, 0x5BE1, 0x6302, 0x8902, 0x4E56, 0x62D0, 0x602A, 0x68FA, 0x5173, 0x5B98, 0x51A0, 0x89C2, 0x7BA1, 0x9986, 0x7F50, 0x60EF, 0x704C, 0x8D2F, 0x5149, 0x5E7F, 0x901B, 0x7470, 0x89C4, 0x572D, 0x7845, 0x5F52, 0x9F9F, 0x95FA, 0x8F68, 0x9B3C, 0x8BE1, 0x7678, 0x6842, 0x67DC, 0x8DEA, 0x8D35, 0x523D, 0x8F8A, 0x6EDA, 0x68CD, 0x9505, 0x90ED, 0x56FD, 0x679C, 0x88F9, 0x8FC7, 0x54C8, // GB 0xBA40..0xBA7E 0x7BC5, 0x7BC8, 0x7BC9, 0x7BCA, 0x7BCB, 0x7BCD, 0x7BCE, 0x7BCF, 0x7BD0, 0x7BD2, 0x7BD4, 0x7BD5, 0x7BD6, 0x7BD7, 0x7BD8, 0x7BDB, 0x7BDC, 0x7BDE, 0x7BDF, 0x7BE0, 0x7BE2, 0x7BE3, 0x7BE4, 0x7BE7, 0x7BE8, 0x7BE9, 0x7BEB, 0x7BEC, 0x7BED, 0x7BEF, 0x7BF0, 0x7BF2, 0x7BF3, 0x7BF4, 0x7BF5, 0x7BF6, 0x7BF8, 0x7BF9, 0x7BFA, 0x7BFB, 0x7BFD, 0x7BFF, 0x7C00, 0x7C01, 0x7C02, 0x7C03, 0x7C04, 0x7C05, 0x7C06, 0x7C08, 0x7C09, 0x7C0A, 0x7C0D, 0x7C0E, 0x7C10, 0x7C11, 0x7C12, 0x7C13, 0x7C14, 0x7C15, 0x7C17, 0x7C18, 0x7C19, // GB 0xBA80..0xBAFE 0x7C1A, 0x7C1B, 0x7C1C, 0x7C1D, 0x7C1E, 0x7C20, 0x7C21, 0x7C22, 0x7C23, 0x7C24, 0x7C25, 0x7C28, 0x7C29, 0x7C2B, 0x7C2C, 0x7C2D, 0x7C2E, 0x7C2F, 0x7C30, 0x7C31, 0x7C32, 0x7C33, 0x7C34, 0x7C35, 0x7C36, 0x7C37, 0x7C39, 0x7C3A, 0x7C3B, 0x7C3C, 0x7C3D, 0x7C3E, 0x7C42, 0x9AB8, 0x5B69, 0x6D77, 0x6C26, 0x4EA5, 0x5BB3, 0x9A87, 0x9163, 0x61A8, 0x90AF, 0x97E9, 0x542B, 0x6DB5, 0x5BD2, 0x51FD, 0x558A, 0x7F55, 0x7FF0, 0x64BC, 0x634D, 0x65F1, 0x61BE, 0x608D, 0x710A, 0x6C57, 0x6C49, 0x592F, 0x676D, 0x822A, 0x58D5, 0x568E, 0x8C6A, 0x6BEB, 0x90DD, 0x597D, 0x8017, 0x53F7, 0x6D69, 0x5475, 0x559D, 0x8377, 0x83CF, 0x6838, 0x79BE, 0x548C, 0x4F55, 0x5408, 0x76D2, 0x8C89, 0x9602, 0x6CB3, 0x6DB8, 0x8D6B, 0x8910, 0x9E64, 0x8D3A, 0x563F, 0x9ED1, 0x75D5, 0x5F88, 0x72E0, 0x6068, 0x54FC, 0x4EA8, 0x6A2A, 0x8861, 0x6052, 0x8F70, 0x54C4, 0x70D8, 0x8679, 0x9E3F, 0x6D2A, 0x5B8F, 0x5F18, 0x7EA2, 0x5589, 0x4FAF, 0x7334, 0x543C, 0x539A, 0x5019, 0x540E, 0x547C, 0x4E4E, 0x5FFD, 0x745A, 0x58F6, 0x846B, 0x80E1, 0x8774, 0x72D0, 0x7CCA, 0x6E56, // GB 0xBB40..0xBB7E 0x7C43, 0x7C44, 0x7C45, 0x7C46, 0x7C47, 0x7C48, 0x7C49, 0x7C4A, 0x7C4B, 0x7C4C, 0x7C4E, 0x7C4F, 0x7C50, 0x7C51, 0x7C52, 0x7C53, 0x7C54, 0x7C55, 0x7C56, 0x7C57, 0x7C58, 0x7C59, 0x7C5A, 0x7C5B, 0x7C5C, 0x7C5D, 0x7C5E, 0x7C5F, 0x7C60, 0x7C61, 0x7C62, 0x7C63, 0x7C64, 0x7C65, 0x7C66, 0x7C67, 0x7C68, 0x7C69, 0x7C6A, 0x7C6B, 0x7C6C, 0x7C6D, 0x7C6E, 0x7C6F, 0x7C70, 0x7C71, 0x7C72, 0x7C75, 0x7C76, 0x7C77, 0x7C78, 0x7C79, 0x7C7A, 0x7C7E, 0x7C7F, 0x7C80, 0x7C81, 0x7C82, 0x7C83, 0x7C84, 0x7C85, 0x7C86, 0x7C87, // GB 0xBB80..0xBBFE 0x7C88, 0x7C8A, 0x7C8B, 0x7C8C, 0x7C8D, 0x7C8E, 0x7C8F, 0x7C90, 0x7C93, 0x7C94, 0x7C96, 0x7C99, 0x7C9A, 0x7C9B, 0x7CA0, 0x7CA1, 0x7CA3, 0x7CA6, 0x7CA7, 0x7CA8, 0x7CA9, 0x7CAB, 0x7CAC, 0x7CAD, 0x7CAF, 0x7CB0, 0x7CB4, 0x7CB5, 0x7CB6, 0x7CB7, 0x7CB8, 0x7CBA, 0x7CBB, 0x5F27, 0x864E, 0x552C, 0x62A4, 0x4E92, 0x6CAA, 0x6237, 0x82B1, 0x54D7, 0x534E, 0x733E, 0x6ED1, 0x753B, 0x5212, 0x5316, 0x8BDD, 0x69D0, 0x5F8A, 0x6000, 0x6DEE, 0x574F, 0x6B22, 0x73AF, 0x6853, 0x8FD8, 0x7F13, 0x6362, 0x60A3, 0x5524, 0x75EA, 0x8C62, 0x7115, 0x6DA3, 0x5BA6, 0x5E7B, 0x8352, 0x614C, 0x9EC4, 0x78FA, 0x8757, 0x7C27, 0x7687, 0x51F0, 0x60F6, 0x714C, 0x6643, 0x5E4C, 0x604D, 0x8C0E, 0x7070, 0x6325, 0x8F89, 0x5FBD, 0x6062, 0x86D4, 0x56DE, 0x6BC1, 0x6094, 0x6167, 0x5349, 0x60E0, 0x6666, 0x8D3F, 0x79FD, 0x4F1A, 0x70E9, 0x6C47, 0x8BB3, 0x8BF2, 0x7ED8, 0x8364, 0x660F, 0x5A5A, 0x9B42, 0x6D51, 0x6DF7, 0x8C41, 0x6D3B, 0x4F19, 0x706B, 0x83B7, 0x6216, 0x60D1, 0x970D, 0x8D27, 0x7978, 0x51FB, 0x573E, 0x57FA, 0x673A, 0x7578, 0x7A3D, 0x79EF, 0x7B95, // GB 0xBC40..0xBC7E 0x7CBF, 0x7CC0, 0x7CC2, 0x7CC3, 0x7CC4, 0x7CC6, 0x7CC9, 0x7CCB, 0x7CCE, 0x7CCF, 0x7CD0, 0x7CD1, 0x7CD2, 0x7CD3, 0x7CD4, 0x7CD8, 0x7CDA, 0x7CDB, 0x7CDD, 0x7CDE, 0x7CE1, 0x7CE2, 0x7CE3, 0x7CE4, 0x7CE5, 0x7CE6, 0x7CE7, 0x7CE9, 0x7CEA, 0x7CEB, 0x7CEC, 0x7CED, 0x7CEE, 0x7CF0, 0x7CF1, 0x7CF2, 0x7CF3, 0x7CF4, 0x7CF5, 0x7CF6, 0x7CF7, 0x7CF9, 0x7CFA, 0x7CFC, 0x7CFD, 0x7CFE, 0x7CFF, 0x7D00, 0x7D01, 0x7D02, 0x7D03, 0x7D04, 0x7D05, 0x7D06, 0x7D07, 0x7D08, 0x7D09, 0x7D0B, 0x7D0C, 0x7D0D, 0x7D0E, 0x7D0F, 0x7D10, // GB 0xBC80..0xBCFE 0x7D11, 0x7D12, 0x7D13, 0x7D14, 0x7D15, 0x7D16, 0x7D17, 0x7D18, 0x7D19, 0x7D1A, 0x7D1B, 0x7D1C, 0x7D1D, 0x7D1E, 0x7D1F, 0x7D21, 0x7D23, 0x7D24, 0x7D25, 0x7D26, 0x7D28, 0x7D29, 0x7D2A, 0x7D2C, 0x7D2D, 0x7D2E, 0x7D30, 0x7D31, 0x7D32, 0x7D33, 0x7D34, 0x7D35, 0x7D36, 0x808C, 0x9965, 0x8FF9, 0x6FC0, 0x8BA5, 0x9E21, 0x59EC, 0x7EE9, 0x7F09, 0x5409, 0x6781, 0x68D8, 0x8F91, 0x7C4D, 0x96C6, 0x53CA, 0x6025, 0x75BE, 0x6C72, 0x5373, 0x5AC9, 0x7EA7, 0x6324, 0x51E0, 0x810A, 0x5DF1, 0x84DF, 0x6280, 0x5180, 0x5B63, 0x4F0E, 0x796D, 0x5242, 0x60B8, 0x6D4E, 0x5BC4, 0x5BC2, 0x8BA1, 0x8BB0, 0x65E2, 0x5FCC, 0x9645, 0x5993, 0x7EE7, 0x7EAA, 0x5609, 0x67B7, 0x5939, 0x4F73, 0x5BB6, 0x52A0, 0x835A, 0x988A, 0x8D3E, 0x7532, 0x94BE, 0x5047, 0x7A3C, 0x4EF7, 0x67B6, 0x9A7E, 0x5AC1, 0x6B7C, 0x76D1, 0x575A, 0x5C16, 0x7B3A, 0x95F4, 0x714E, 0x517C, 0x80A9, 0x8270, 0x5978, 0x7F04, 0x8327, 0x68C0, 0x67EC, 0x78B1, 0x7877, 0x62E3, 0x6361, 0x7B80, 0x4FED, 0x526A, 0x51CF, 0x8350, 0x69DB, 0x9274, 0x8DF5, 0x8D31, 0x89C1, 0x952E, 0x7BAD, 0x4EF6, // GB 0xBD40..0xBD7E 0x7D37, 0x7D38, 0x7D39, 0x7D3A, 0x7D3B, 0x7D3C, 0x7D3D, 0x7D3E, 0x7D3F, 0x7D40, 0x7D41, 0x7D42, 0x7D43, 0x7D44, 0x7D45, 0x7D46, 0x7D47, 0x7D48, 0x7D49, 0x7D4A, 0x7D4B, 0x7D4C, 0x7D4D, 0x7D4E, 0x7D4F, 0x7D50, 0x7D51, 0x7D52, 0x7D53, 0x7D54, 0x7D55, 0x7D56, 0x7D57, 0x7D58, 0x7D59, 0x7D5A, 0x7D5B, 0x7D5C, 0x7D5D, 0x7D5E, 0x7D5F, 0x7D60, 0x7D61, 0x7D62, 0x7D63, 0x7D64, 0x7D65, 0x7D66, 0x7D67, 0x7D68, 0x7D69, 0x7D6A, 0x7D6B, 0x7D6C, 0x7D6D, 0x7D6F, 0x7D70, 0x7D71, 0x7D72, 0x7D73, 0x7D74, 0x7D75, 0x7D76, // GB 0xBD80..0xBDFE 0x7D78, 0x7D79, 0x7D7A, 0x7D7B, 0x7D7C, 0x7D7D, 0x7D7E, 0x7D7F, 0x7D80, 0x7D81, 0x7D82, 0x7D83, 0x7D84, 0x7D85, 0x7D86, 0x7D87, 0x7D88, 0x7D89, 0x7D8A, 0x7D8B, 0x7D8C, 0x7D8D, 0x7D8E, 0x7D8F, 0x7D90, 0x7D91, 0x7D92, 0x7D93, 0x7D94, 0x7D95, 0x7D96, 0x7D97, 0x7D98, 0x5065, 0x8230, 0x5251, 0x996F, 0x6E10, 0x6E85, 0x6DA7, 0x5EFA, 0x50F5, 0x59DC, 0x5C06, 0x6D46, 0x6C5F, 0x7586, 0x848B, 0x6868, 0x5956, 0x8BB2, 0x5320, 0x9171, 0x964D, 0x8549, 0x6912, 0x7901, 0x7126, 0x80F6, 0x4EA4, 0x90CA, 0x6D47, 0x9A84, 0x5A07, 0x56BC, 0x6405, 0x94F0, 0x77EB, 0x4FA5, 0x811A, 0x72E1, 0x89D2, 0x997A, 0x7F34, 0x7EDE, 0x527F, 0x6559, 0x9175, 0x8F7F, 0x8F83, 0x53EB, 0x7A96, 0x63ED, 0x63A5, 0x7686, 0x79F8, 0x8857, 0x9636, 0x622A, 0x52AB, 0x8282, 0x6854, 0x6770, 0x6377, 0x776B, 0x7AED, 0x6D01, 0x7ED3, 0x89E3, 0x59D0, 0x6212, 0x85C9, 0x82A5, 0x754C, 0x501F, 0x4ECB, 0x75A5, 0x8BEB, 0x5C4A, 0x5DFE, 0x7B4B, 0x65A4, 0x91D1, 0x4ECA, 0x6D25, 0x895F, 0x7D27, 0x9526, 0x4EC5, 0x8C28, 0x8FDB, 0x9773, 0x664B, 0x7981, 0x8FD1, 0x70EC, 0x6D78, // GB 0xBE40..0xBE7E 0x7D99, 0x7D9A, 0x7D9B, 0x7D9C, 0x7D9D, 0x7D9E, 0x7D9F, 0x7DA0, 0x7DA1, 0x7DA2, 0x7DA3, 0x7DA4, 0x7DA5, 0x7DA7, 0x7DA8, 0x7DA9, 0x7DAA, 0x7DAB, 0x7DAC, 0x7DAD, 0x7DAF, 0x7DB0, 0x7DB1, 0x7DB2, 0x7DB3, 0x7DB4, 0x7DB5, 0x7DB6, 0x7DB7, 0x7DB8, 0x7DB9, 0x7DBA, 0x7DBB, 0x7DBC, 0x7DBD, 0x7DBE, 0x7DBF, 0x7DC0, 0x7DC1, 0x7DC2, 0x7DC3, 0x7DC4, 0x7DC5, 0x7DC6, 0x7DC7, 0x7DC8, 0x7DC9, 0x7DCA, 0x7DCB, 0x7DCC, 0x7DCD, 0x7DCE, 0x7DCF, 0x7DD0, 0x7DD1, 0x7DD2, 0x7DD3, 0x7DD4, 0x7DD5, 0x7DD6, 0x7DD7, 0x7DD8, 0x7DD9, // GB 0xBE80..0xBEFE 0x7DDA, 0x7DDB, 0x7DDC, 0x7DDD, 0x7DDE, 0x7DDF, 0x7DE0, 0x7DE1, 0x7DE2, 0x7DE3, 0x7DE4, 0x7DE5, 0x7DE6, 0x7DE7, 0x7DE8, 0x7DE9, 0x7DEA, 0x7DEB, 0x7DEC, 0x7DED, 0x7DEE, 0x7DEF, 0x7DF0, 0x7DF1, 0x7DF2, 0x7DF3, 0x7DF4, 0x7DF5, 0x7DF6, 0x7DF7, 0x7DF8, 0x7DF9, 0x7DFA, 0x5C3D, 0x52B2, 0x8346, 0x5162, 0x830E, 0x775B, 0x6676, 0x9CB8, 0x4EAC, 0x60CA, 0x7CBE, 0x7CB3, 0x7ECF, 0x4E95, 0x8B66, 0x666F, 0x9888, 0x9759, 0x5883, 0x656C, 0x955C, 0x5F84, 0x75C9, 0x9756, 0x7ADF, 0x7ADE, 0x51C0, 0x70AF, 0x7A98, 0x63EA, 0x7A76, 0x7EA0, 0x7396, 0x97ED, 0x4E45, 0x7078, 0x4E5D, 0x9152, 0x53A9, 0x6551, 0x65E7, 0x81FC, 0x8205, 0x548E, 0x5C31, 0x759A, 0x97A0, 0x62D8, 0x72D9, 0x75BD, 0x5C45, 0x9A79, 0x83CA, 0x5C40, 0x5480, 0x77E9, 0x4E3E, 0x6CAE, 0x805A, 0x62D2, 0x636E, 0x5DE8, 0x5177, 0x8DDD, 0x8E1E, 0x952F, 0x4FF1, 0x53E5, 0x60E7, 0x70AC, 0x5267, 0x6350, 0x9E43, 0x5A1F, 0x5026, 0x7737, 0x5377, 0x7EE2, 0x6485, 0x652B, 0x6289, 0x6398, 0x5014, 0x7235, 0x89C9, 0x51B3, 0x8BC0, 0x7EDD, 0x5747, 0x83CC, 0x94A7, 0x519B, 0x541B, 0x5CFB, // GB 0xBF40..0xBF7E 0x7DFB, 0x7DFC, 0x7DFD, 0x7DFE, 0x7DFF, 0x7E00, 0x7E01, 0x7E02, 0x7E03, 0x7E04, 0x7E05, 0x7E06, 0x7E07, 0x7E08, 0x7E09, 0x7E0A, 0x7E0B, 0x7E0C, 0x7E0D, 0x7E0E, 0x7E0F, 0x7E10, 0x7E11, 0x7E12, 0x7E13, 0x7E14, 0x7E15, 0x7E16, 0x7E17, 0x7E18, 0x7E19, 0x7E1A, 0x7E1B, 0x7E1C, 0x7E1D, 0x7E1E, 0x7E1F, 0x7E20, 0x7E21, 0x7E22, 0x7E23, 0x7E24, 0x7E25, 0x7E26, 0x7E27, 0x7E28, 0x7E29, 0x7E2A, 0x7E2B, 0x7E2C, 0x7E2D, 0x7E2E, 0x7E2F, 0x7E30, 0x7E31, 0x7E32, 0x7E33, 0x7E34, 0x7E35, 0x7E36, 0x7E37, 0x7E38, 0x7E39, // GB 0xBF80..0xBFFE 0x7E3A, 0x7E3C, 0x7E3D, 0x7E3E, 0x7E3F, 0x7E40, 0x7E42, 0x7E43, 0x7E44, 0x7E45, 0x7E46, 0x7E48, 0x7E49, 0x7E4A, 0x7E4B, 0x7E4C, 0x7E4D, 0x7E4E, 0x7E4F, 0x7E50, 0x7E51, 0x7E52, 0x7E53, 0x7E54, 0x7E55, 0x7E56, 0x7E57, 0x7E58, 0x7E59, 0x7E5A, 0x7E5B, 0x7E5C, 0x7E5D, 0x4FCA, 0x7AE3, 0x6D5A, 0x90E1, 0x9A8F, 0x5580, 0x5496, 0x5361, 0x54AF, 0x5F00, 0x63E9, 0x6977, 0x51EF, 0x6168, 0x520A, 0x582A, 0x52D8, 0x574E, 0x780D, 0x770B, 0x5EB7, 0x6177, 0x7CE0, 0x625B, 0x6297, 0x4EA2, 0x7095, 0x8003, 0x62F7, 0x70E4, 0x9760, 0x5777, 0x82DB, 0x67EF, 0x68F5, 0x78D5, 0x9897, 0x79D1, 0x58F3, 0x54B3, 0x53EF, 0x6E34, 0x514B, 0x523B, 0x5BA2, 0x8BFE, 0x80AF, 0x5543, 0x57A6, 0x6073, 0x5751, 0x542D, 0x7A7A, 0x6050, 0x5B54, 0x63A7, 0x62A0, 0x53E3, 0x6263, 0x5BC7, 0x67AF, 0x54ED, 0x7A9F, 0x82E6, 0x9177, 0x5E93, 0x88E4, 0x5938, 0x57AE, 0x630E, 0x8DE8, 0x80EF, 0x5757, 0x7B77, 0x4FA9, 0x5FEB, 0x5BBD, 0x6B3E, 0x5321, 0x7B50, 0x72C2, 0x6846, 0x77FF, 0x7736, 0x65F7, 0x51B5, 0x4E8F, 0x76D4, 0x5CBF, 0x7AA5, 0x8475, 0x594E, 0x9B41, 0x5080, // GB 0xC040..0xC07E 0x7E5E, 0x7E5F, 0x7E60, 0x7E61, 0x7E62, 0x7E63, 0x7E64, 0x7E65, 0x7E66, 0x7E67, 0x7E68, 0x7E69, 0x7E6A, 0x7E6B, 0x7E6C, 0x7E6D, 0x7E6E, 0x7E6F, 0x7E70, 0x7E71, 0x7E72, 0x7E73, 0x7E74, 0x7E75, 0x7E76, 0x7E77, 0x7E78, 0x7E79, 0x7E7A, 0x7E7B, 0x7E7C, 0x7E7D, 0x7E7E, 0x7E7F, 0x7E80, 0x7E81, 0x7E83, 0x7E84, 0x7E85, 0x7E86, 0x7E87, 0x7E88, 0x7E89, 0x7E8A, 0x7E8B, 0x7E8C, 0x7E8D, 0x7E8E, 0x7E8F, 0x7E90, 0x7E91, 0x7E92, 0x7E93, 0x7E94, 0x7E95, 0x7E96, 0x7E97, 0x7E98, 0x7E99, 0x7E9A, 0x7E9C, 0x7E9D, 0x7E9E, // GB 0xC080..0xC0FE 0x7EAE, 0x7EB4, 0x7EBB, 0x7EBC, 0x7ED6, 0x7EE4, 0x7EEC, 0x7EF9, 0x7F0A, 0x7F10, 0x7F1E, 0x7F37, 0x7F39, 0x7F3B, 0x7F3C, 0x7F3D, 0x7F3E, 0x7F3F, 0x7F40, 0x7F41, 0x7F43, 0x7F46, 0x7F47, 0x7F48, 0x7F49, 0x7F4A, 0x7F4B, 0x7F4C, 0x7F4D, 0x7F4E, 0x7F4F, 0x7F52, 0x7F53, 0x9988, 0x6127, 0x6E83, 0x5764, 0x6606, 0x6346, 0x56F0, 0x62EC, 0x6269, 0x5ED3, 0x9614, 0x5783, 0x62C9, 0x5587, 0x8721, 0x814A, 0x8FA3, 0x5566, 0x83B1, 0x6765, 0x8D56, 0x84DD, 0x5A6A, 0x680F, 0x62E6, 0x7BEE, 0x9611, 0x5170, 0x6F9C, 0x8C30, 0x63FD, 0x89C8, 0x61D2, 0x7F06, 0x70C2, 0x6EE5, 0x7405, 0x6994, 0x72FC, 0x5ECA, 0x90CE, 0x6717, 0x6D6A, 0x635E, 0x52B3, 0x7262, 0x8001, 0x4F6C, 0x59E5, 0x916A, 0x70D9, 0x6D9D, 0x52D2, 0x4E50, 0x96F7, 0x956D, 0x857E, 0x78CA, 0x7D2F, 0x5121, 0x5792, 0x64C2, 0x808B, 0x7C7B, 0x6CEA, 0x68F1, 0x695E, 0x51B7, 0x5398, 0x68A8, 0x7281, 0x9ECE, 0x7BF1, 0x72F8, 0x79BB, 0x6F13, 0x7406, 0x674E, 0x91CC, 0x9CA4, 0x793C, 0x8389, 0x8354, 0x540F, 0x6817, 0x4E3D, 0x5389, 0x52B1, 0x783E, 0x5386, 0x5229, 0x5088, 0x4F8B, 0x4FD0, // GB 0xC140..0xC17E 0x7F56, 0x7F59, 0x7F5B, 0x7F5C, 0x7F5D, 0x7F5E, 0x7F60, 0x7F63, 0x7F64, 0x7F65, 0x7F66, 0x7F67, 0x7F6B, 0x7F6C, 0x7F6D, 0x7F6F, 0x7F70, 0x7F73, 0x7F75, 0x7F76, 0x7F77, 0x7F78, 0x7F7A, 0x7F7B, 0x7F7C, 0x7F7D, 0x7F7F, 0x7F80, 0x7F82, 0x7F83, 0x7F84, 0x7F85, 0x7F86, 0x7F87, 0x7F88, 0x7F89, 0x7F8B, 0x7F8D, 0x7F8F, 0x7F90, 0x7F91, 0x7F92, 0x7F93, 0x7F95, 0x7F96, 0x7F97, 0x7F98, 0x7F99, 0x7F9B, 0x7F9C, 0x7FA0, 0x7FA2, 0x7FA3, 0x7FA5, 0x7FA6, 0x7FA8, 0x7FA9, 0x7FAA, 0x7FAB, 0x7FAC, 0x7FAD, 0x7FAE, 0x7FB1, // GB 0xC180..0xC1FE 0x7FB3, 0x7FB4, 0x7FB5, 0x7FB6, 0x7FB7, 0x7FBA, 0x7FBB, 0x7FBE, 0x7FC0, 0x7FC2, 0x7FC3, 0x7FC4, 0x7FC6, 0x7FC7, 0x7FC8, 0x7FC9, 0x7FCB, 0x7FCD, 0x7FCF, 0x7FD0, 0x7FD1, 0x7FD2, 0x7FD3, 0x7FD6, 0x7FD7, 0x7FD9, 0x7FDA, 0x7FDB, 0x7FDC, 0x7FDD, 0x7FDE, 0x7FE2, 0x7FE3, 0x75E2, 0x7ACB, 0x7C92, 0x6CA5, 0x96B6, 0x529B, 0x7483, 0x54E9, 0x4FE9, 0x8054, 0x83B2, 0x8FDE, 0x9570, 0x5EC9, 0x601C, 0x6D9F, 0x5E18, 0x655B, 0x8138, 0x94FE, 0x604B, 0x70BC, 0x7EC3, 0x7CAE, 0x51C9, 0x6881, 0x7CB1, 0x826F, 0x4E24, 0x8F86, 0x91CF, 0x667E, 0x4EAE, 0x8C05, 0x64A9, 0x804A, 0x50DA, 0x7597, 0x71CE, 0x5BE5, 0x8FBD, 0x6F66, 0x4E86, 0x6482, 0x9563, 0x5ED6, 0x6599, 0x5217, 0x88C2, 0x70C8, 0x52A3, 0x730E, 0x7433, 0x6797, 0x78F7, 0x9716, 0x4E34, 0x90BB, 0x9CDE, 0x6DCB, 0x51DB, 0x8D41, 0x541D, 0x62CE, 0x73B2, 0x83F1, 0x96F6, 0x9F84, 0x94C3, 0x4F36, 0x7F9A, 0x51CC, 0x7075, 0x9675, 0x5CAD, 0x9886, 0x53E6, 0x4EE4, 0x6E9C, 0x7409, 0x69B4, 0x786B, 0x998F, 0x7559, 0x5218, 0x7624, 0x6D41, 0x67F3, 0x516D, 0x9F99, 0x804B, 0x5499, 0x7B3C, 0x7ABF, // GB 0xC240..0xC27E 0x7FE4, 0x7FE7, 0x7FE8, 0x7FEA, 0x7FEB, 0x7FEC, 0x7FED, 0x7FEF, 0x7FF2, 0x7FF4, 0x7FF5, 0x7FF6, 0x7FF7, 0x7FF8, 0x7FF9, 0x7FFA, 0x7FFD, 0x7FFE, 0x7FFF, 0x8002, 0x8007, 0x8008, 0x8009, 0x800A, 0x800E, 0x800F, 0x8011, 0x8013, 0x801A, 0x801B, 0x801D, 0x801E, 0x801F, 0x8021, 0x8023, 0x8024, 0x802B, 0x802C, 0x802D, 0x802E, 0x802F, 0x8030, 0x8032, 0x8034, 0x8039, 0x803A, 0x803C, 0x803E, 0x8040, 0x8041, 0x8044, 0x8045, 0x8047, 0x8048, 0x8049, 0x804E, 0x804F, 0x8050, 0x8051, 0x8053, 0x8055, 0x8056, 0x8057, // GB 0xC280..0xC2FE 0x8059, 0x805B, 0x805C, 0x805D, 0x805E, 0x805F, 0x8060, 0x8061, 0x8062, 0x8063, 0x8064, 0x8065, 0x8066, 0x8067, 0x8068, 0x806B, 0x806C, 0x806D, 0x806E, 0x806F, 0x8070, 0x8072, 0x8073, 0x8074, 0x8075, 0x8076, 0x8077, 0x8078, 0x8079, 0x807A, 0x807B, 0x807C, 0x807D, 0x9686, 0x5784, 0x62E2, 0x9647, 0x697C, 0x5A04, 0x6402, 0x7BD3, 0x6F0F, 0x964B, 0x82A6, 0x5362, 0x9885, 0x5E90, 0x7089, 0x63B3, 0x5364, 0x864F, 0x9C81, 0x9E93, 0x788C, 0x9732, 0x8DEF, 0x8D42, 0x9E7F, 0x6F5E, 0x7984, 0x5F55, 0x9646, 0x622E, 0x9A74, 0x5415, 0x94DD, 0x4FA3, 0x65C5, 0x5C65, 0x5C61, 0x7F15, 0x8651, 0x6C2F, 0x5F8B, 0x7387, 0x6EE4, 0x7EFF, 0x5CE6, 0x631B, 0x5B6A, 0x6EE6, 0x5375, 0x4E71, 0x63A0, 0x7565, 0x62A1, 0x8F6E, 0x4F26, 0x4ED1, 0x6CA6, 0x7EB6, 0x8BBA, 0x841D, 0x87BA, 0x7F57, 0x903B, 0x9523, 0x7BA9, 0x9AA1, 0x88F8, 0x843D, 0x6D1B, 0x9A86, 0x7EDC, 0x5988, 0x9EBB, 0x739B, 0x7801, 0x8682, 0x9A6C, 0x9A82, 0x561B, 0x5417, 0x57CB, 0x4E70, 0x9EA6, 0x5356, 0x8FC8, 0x8109, 0x7792, 0x9992, 0x86EE, 0x6EE1, 0x8513, 0x66FC, 0x6162, 0x6F2B, // GB 0xC340..0xC37E 0x807E, 0x8081, 0x8082, 0x8085, 0x8088, 0x808A, 0x808D, 0x808E, 0x808F, 0x8090, 0x8091, 0x8092, 0x8094, 0x8095, 0x8097, 0x8099, 0x809E, 0x80A3, 0x80A6, 0x80A7, 0x80A8, 0x80AC, 0x80B0, 0x80B3, 0x80B5, 0x80B6, 0x80B8, 0x80B9, 0x80BB, 0x80C5, 0x80C7, 0x80C8, 0x80C9, 0x80CA, 0x80CB, 0x80CF, 0x80D0, 0x80D1, 0x80D2, 0x80D3, 0x80D4, 0x80D5, 0x80D8, 0x80DF, 0x80E0, 0x80E2, 0x80E3, 0x80E6, 0x80EE, 0x80F5, 0x80F7, 0x80F9, 0x80FB, 0x80FE, 0x80FF, 0x8100, 0x8101, 0x8103, 0x8104, 0x8105, 0x8107, 0x8108, 0x810B, // GB 0xC380..0xC3FE 0x810C, 0x8115, 0x8117, 0x8119, 0x811B, 0x811C, 0x811D, 0x811F, 0x8120, 0x8121, 0x8122, 0x8123, 0x8124, 0x8125, 0x8126, 0x8127, 0x8128, 0x8129, 0x812A, 0x812B, 0x812D, 0x812E, 0x8130, 0x8133, 0x8134, 0x8135, 0x8137, 0x8139, 0x813A, 0x813B, 0x813C, 0x813D, 0x813F, 0x8C29, 0x8292, 0x832B, 0x76F2, 0x6C13, 0x5FD9, 0x83BD, 0x732B, 0x8305, 0x951A, 0x6BDB, 0x77DB, 0x94C6, 0x536F, 0x8302, 0x5192, 0x5E3D, 0x8C8C, 0x8D38, 0x4E48, 0x73AB, 0x679A, 0x6885, 0x9176, 0x9709, 0x7164, 0x6CA1, 0x7709, 0x5A92, 0x9541, 0x6BCF, 0x7F8E, 0x6627, 0x5BD0, 0x59B9, 0x5A9A, 0x95E8, 0x95F7, 0x4EEC, 0x840C, 0x8499, 0x6AAC, 0x76DF, 0x9530, 0x731B, 0x68A6, 0x5B5F, 0x772F, 0x919A, 0x9761, 0x7CDC, 0x8FF7, 0x8C1C, 0x5F25, 0x7C73, 0x79D8, 0x89C5, 0x6CCC, 0x871C, 0x5BC6, 0x5E42, 0x68C9, 0x7720, 0x7EF5, 0x5195, 0x514D, 0x52C9, 0x5A29, 0x7F05, 0x9762, 0x82D7, 0x63CF, 0x7784, 0x85D0, 0x79D2, 0x6E3A, 0x5E99, 0x5999, 0x8511, 0x706D, 0x6C11, 0x62BF, 0x76BF, 0x654F, 0x60AF, 0x95FD, 0x660E, 0x879F, 0x9E23, 0x94ED, 0x540D, 0x547D, 0x8C2C, 0x6478, // GB 0xC440..0xC47E 0x8140, 0x8141, 0x8142, 0x8143, 0x8144, 0x8145, 0x8147, 0x8149, 0x814D, 0x814E, 0x814F, 0x8152, 0x8156, 0x8157, 0x8158, 0x815B, 0x815C, 0x815D, 0x815E, 0x815F, 0x8161, 0x8162, 0x8163, 0x8164, 0x8166, 0x8168, 0x816A, 0x816B, 0x816C, 0x816F, 0x8172, 0x8173, 0x8175, 0x8176, 0x8177, 0x8178, 0x8181, 0x8183, 0x8184, 0x8185, 0x8186, 0x8187, 0x8189, 0x818B, 0x818C, 0x818D, 0x818E, 0x8190, 0x8192, 0x8193, 0x8194, 0x8195, 0x8196, 0x8197, 0x8199, 0x819A, 0x819E, 0x819F, 0x81A0, 0x81A1, 0x81A2, 0x81A4, 0x81A5, // GB 0xC480..0xC4FE 0x81A7, 0x81A9, 0x81AB, 0x81AC, 0x81AD, 0x81AE, 0x81AF, 0x81B0, 0x81B1, 0x81B2, 0x81B4, 0x81B5, 0x81B6, 0x81B7, 0x81B8, 0x81B9, 0x81BC, 0x81BD, 0x81BE, 0x81BF, 0x81C4, 0x81C5, 0x81C7, 0x81C8, 0x81C9, 0x81CB, 0x81CD, 0x81CE, 0x81CF, 0x81D0, 0x81D1, 0x81D2, 0x81D3, 0x6479, 0x8611, 0x6A21, 0x819C, 0x78E8, 0x6469, 0x9B54, 0x62B9, 0x672B, 0x83AB, 0x58A8, 0x9ED8, 0x6CAB, 0x6F20, 0x5BDE, 0x964C, 0x8C0B, 0x725F, 0x67D0, 0x62C7, 0x7261, 0x4EA9, 0x59C6, 0x6BCD, 0x5893, 0x66AE, 0x5E55, 0x52DF, 0x6155, 0x6728, 0x76EE, 0x7766, 0x7267, 0x7A46, 0x62FF, 0x54EA, 0x5450, 0x94A0, 0x90A3, 0x5A1C, 0x7EB3, 0x6C16, 0x4E43, 0x5976, 0x8010, 0x5948, 0x5357, 0x7537, 0x96BE, 0x56CA, 0x6320, 0x8111, 0x607C, 0x95F9, 0x6DD6, 0x5462, 0x9981, 0x5185, 0x5AE9, 0x80FD, 0x59AE, 0x9713, 0x502A, 0x6CE5, 0x5C3C, 0x62DF, 0x4F60, 0x533F, 0x817B, 0x9006, 0x6EBA, 0x852B, 0x62C8, 0x5E74, 0x78BE, 0x64B5, 0x637B, 0x5FF5, 0x5A18, 0x917F, 0x9E1F, 0x5C3F, 0x634F, 0x8042, 0x5B7D, 0x556E, 0x954A, 0x954D, 0x6D85, 0x60A8, 0x67E0, 0x72DE, 0x51DD, 0x5B81, // GB 0xC540..0xC57E 0x81D4, 0x81D5, 0x81D6, 0x81D7, 0x81D8, 0x81D9, 0x81DA, 0x81DB, 0x81DC, 0x81DD, 0x81DE, 0x81DF, 0x81E0, 0x81E1, 0x81E2, 0x81E4, 0x81E5, 0x81E6, 0x81E8, 0x81E9, 0x81EB, 0x81EE, 0x81EF, 0x81F0, 0x81F1, 0x81F2, 0x81F5, 0x81F6, 0x81F7, 0x81F8, 0x81F9, 0x81FA, 0x81FD, 0x81FF, 0x8203, 0x8207, 0x8208, 0x8209, 0x820A, 0x820B, 0x820E, 0x820F, 0x8211, 0x8213, 0x8215, 0x8216, 0x8217, 0x8218, 0x8219, 0x821A, 0x821D, 0x8220, 0x8224, 0x8225, 0x8226, 0x8227, 0x8229, 0x822E, 0x8232, 0x823A, 0x823C, 0x823D, 0x823F, // GB 0xC580..0xC5FE 0x8240, 0x8241, 0x8242, 0x8243, 0x8245, 0x8246, 0x8248, 0x824A, 0x824C, 0x824D, 0x824E, 0x8250, 0x8251, 0x8252, 0x8253, 0x8254, 0x8255, 0x8256, 0x8257, 0x8259, 0x825B, 0x825C, 0x825D, 0x825E, 0x8260, 0x8261, 0x8262, 0x8263, 0x8264, 0x8265, 0x8266, 0x8267, 0x8269, 0x62E7, 0x6CDE, 0x725B, 0x626D, 0x94AE, 0x7EBD, 0x8113, 0x6D53, 0x519C, 0x5F04, 0x5974, 0x52AA, 0x6012, 0x5973, 0x6696, 0x8650, 0x759F, 0x632A, 0x61E6, 0x7CEF, 0x8BFA, 0x54E6, 0x6B27, 0x9E25, 0x6BB4, 0x85D5, 0x5455, 0x5076, 0x6CA4, 0x556A, 0x8DB4, 0x722C, 0x5E15, 0x6015, 0x7436, 0x62CD, 0x6392, 0x724C, 0x5F98, 0x6E43, 0x6D3E, 0x6500, 0x6F58, 0x76D8, 0x78D0, 0x76FC, 0x7554, 0x5224, 0x53DB, 0x4E53, 0x5E9E, 0x65C1, 0x802A, 0x80D6, 0x629B, 0x5486, 0x5228, 0x70AE, 0x888D, 0x8DD1, 0x6CE1, 0x5478, 0x80DA, 0x57F9, 0x88F4, 0x8D54, 0x966A, 0x914D, 0x4F69, 0x6C9B, 0x55B7, 0x76C6, 0x7830, 0x62A8, 0x70F9, 0x6F8E, 0x5F6D, 0x84EC, 0x68DA, 0x787C, 0x7BF7, 0x81A8, 0x670B, 0x9E4F, 0x6367, 0x78B0, 0x576F, 0x7812, 0x9739, 0x6279, 0x62AB, 0x5288, 0x7435, 0x6BD7, // GB 0xC640..0xC67E 0x826A, 0x826B, 0x826C, 0x826D, 0x8271, 0x8275, 0x8276, 0x8277, 0x8278, 0x827B, 0x827C, 0x8280, 0x8281, 0x8283, 0x8285, 0x8286, 0x8287, 0x8289, 0x828C, 0x8290, 0x8293, 0x8294, 0x8295, 0x8296, 0x829A, 0x829B, 0x829E, 0x82A0, 0x82A2, 0x82A3, 0x82A7, 0x82B2, 0x82B5, 0x82B6, 0x82BA, 0x82BB, 0x82BC, 0x82BF, 0x82C0, 0x82C2, 0x82C3, 0x82C5, 0x82C6, 0x82C9, 0x82D0, 0x82D6, 0x82D9, 0x82DA, 0x82DD, 0x82E2, 0x82E7, 0x82E8, 0x82E9, 0x82EA, 0x82EC, 0x82ED, 0x82EE, 0x82F0, 0x82F2, 0x82F3, 0x82F5, 0x82F6, 0x82F8, // GB 0xC680..0xC6FE 0x82FA, 0x82FC, 0x82FD, 0x82FE, 0x82FF, 0x8300, 0x830A, 0x830B, 0x830D, 0x8310, 0x8312, 0x8313, 0x8316, 0x8318, 0x8319, 0x831D, 0x831E, 0x831F, 0x8320, 0x8321, 0x8322, 0x8323, 0x8324, 0x8325, 0x8326, 0x8329, 0x832A, 0x832E, 0x8330, 0x8332, 0x8337, 0x833B, 0x833D, 0x5564, 0x813E, 0x75B2, 0x76AE, 0x5339, 0x75DE, 0x50FB, 0x5C41, 0x8B6C, 0x7BC7, 0x504F, 0x7247, 0x9A97, 0x98D8, 0x6F02, 0x74E2, 0x7968, 0x6487, 0x77A5, 0x62FC, 0x9891, 0x8D2B, 0x54C1, 0x8058, 0x4E52, 0x576A, 0x82F9, 0x840D, 0x5E73, 0x51ED, 0x74F6, 0x8BC4, 0x5C4F, 0x5761, 0x6CFC, 0x9887, 0x5A46, 0x7834, 0x9B44, 0x8FEB, 0x7C95, 0x5256, 0x6251, 0x94FA, 0x4EC6, 0x8386, 0x8461, 0x83E9, 0x84B2, 0x57D4, 0x6734, 0x5703, 0x666E, 0x6D66, 0x8C31, 0x66DD, 0x7011, 0x671F, 0x6B3A, 0x6816, 0x621A, 0x59BB, 0x4E03, 0x51C4, 0x6F06, 0x67D2, 0x6C8F, 0x5176, 0x68CB, 0x5947, 0x6B67, 0x7566, 0x5D0E, 0x8110, 0x9F50, 0x65D7, 0x7948, 0x7941, 0x9A91, 0x8D77, 0x5C82, 0x4E5E, 0x4F01, 0x542F, 0x5951, 0x780C, 0x5668, 0x6C14, 0x8FC4, 0x5F03, 0x6C7D, 0x6CE3, 0x8BAB, 0x6390, // GB 0xC740..0xC77E 0x833E, 0x833F, 0x8341, 0x8342, 0x8344, 0x8345, 0x8348, 0x834A, 0x834B, 0x834C, 0x834D, 0x834E, 0x8353, 0x8355, 0x8356, 0x8357, 0x8358, 0x8359, 0x835D, 0x8362, 0x8370, 0x8371, 0x8372, 0x8373, 0x8374, 0x8375, 0x8376, 0x8379, 0x837A, 0x837E, 0x837F, 0x8380, 0x8381, 0x8382, 0x8383, 0x8384, 0x8387, 0x8388, 0x838A, 0x838B, 0x838C, 0x838D, 0x838F, 0x8390, 0x8391, 0x8394, 0x8395, 0x8396, 0x8397, 0x8399, 0x839A, 0x839D, 0x839F, 0x83A1, 0x83A2, 0x83A3, 0x83A4, 0x83A5, 0x83A6, 0x83A7, 0x83AC, 0x83AD, 0x83AE, // GB 0xC780..0xC7FE 0x83AF, 0x83B5, 0x83BB, 0x83BE, 0x83BF, 0x83C2, 0x83C3, 0x83C4, 0x83C6, 0x83C8, 0x83C9, 0x83CB, 0x83CD, 0x83CE, 0x83D0, 0x83D1, 0x83D2, 0x83D3, 0x83D5, 0x83D7, 0x83D9, 0x83DA, 0x83DB, 0x83DE, 0x83E2, 0x83E3, 0x83E4, 0x83E6, 0x83E7, 0x83E8, 0x83EB, 0x83EC, 0x83ED, 0x6070, 0x6D3D, 0x7275, 0x6266, 0x948E, 0x94C5, 0x5343, 0x8FC1, 0x7B7E, 0x4EDF, 0x8C26, 0x4E7E, 0x9ED4, 0x94B1, 0x94B3, 0x524D, 0x6F5C, 0x9063, 0x6D45, 0x8C34, 0x5811, 0x5D4C, 0x6B20, 0x6B49, 0x67AA, 0x545B, 0x8154, 0x7F8C, 0x5899, 0x8537, 0x5F3A, 0x62A2, 0x6A47, 0x9539, 0x6572, 0x6084, 0x6865, 0x77A7, 0x4E54, 0x4FA8, 0x5DE7, 0x9798, 0x64AC, 0x7FD8, 0x5CED, 0x4FCF, 0x7A8D, 0x5207, 0x8304, 0x4E14, 0x602F, 0x7A83, 0x94A6, 0x4FB5, 0x4EB2, 0x79E6, 0x7434, 0x52E4, 0x82B9, 0x64D2, 0x79BD, 0x5BDD, 0x6C81, 0x9752, 0x8F7B, 0x6C22, 0x503E, 0x537F, 0x6E05, 0x64CE, 0x6674, 0x6C30, 0x60C5, 0x9877, 0x8BF7, 0x5E86, 0x743C, 0x7A77, 0x79CB, 0x4E18, 0x90B1, 0x7403, 0x6C42, 0x56DA, 0x914B, 0x6CC5, 0x8D8B, 0x533A, 0x86C6, 0x66F2, 0x8EAF, 0x5C48, 0x9A71, 0x6E20, // GB 0xC840..0xC87E 0x83EE, 0x83EF, 0x83F3, 0x83F4, 0x83F5, 0x83F6, 0x83F7, 0x83FA, 0x83FB, 0x83FC, 0x83FE, 0x83FF, 0x8400, 0x8402, 0x8405, 0x8407, 0x8408, 0x8409, 0x840A, 0x8410, 0x8412, 0x8413, 0x8414, 0x8415, 0x8416, 0x8417, 0x8419, 0x841A, 0x841B, 0x841E, 0x841F, 0x8420, 0x8421, 0x8422, 0x8423, 0x8429, 0x842A, 0x842B, 0x842C, 0x842D, 0x842E, 0x842F, 0x8430, 0x8432, 0x8433, 0x8434, 0x8435, 0x8436, 0x8437, 0x8439, 0x843A, 0x843B, 0x843E, 0x843F, 0x8440, 0x8441, 0x8442, 0x8443, 0x8444, 0x8445, 0x8447, 0x8448, 0x8449, // GB 0xC880..0xC8FE 0x844A, 0x844B, 0x844C, 0x844D, 0x844E, 0x844F, 0x8450, 0x8452, 0x8453, 0x8454, 0x8455, 0x8456, 0x8458, 0x845D, 0x845E, 0x845F, 0x8460, 0x8462, 0x8464, 0x8465, 0x8466, 0x8467, 0x8468, 0x846A, 0x846E, 0x846F, 0x8470, 0x8472, 0x8474, 0x8477, 0x8479, 0x847B, 0x847C, 0x53D6, 0x5A36, 0x9F8B, 0x8DA3, 0x53BB, 0x5708, 0x98A7, 0x6743, 0x919B, 0x6CC9, 0x5168, 0x75CA, 0x62F3, 0x72AC, 0x5238, 0x529D, 0x7F3A, 0x7094, 0x7638, 0x5374, 0x9E4A, 0x69B7, 0x786E, 0x96C0, 0x88D9, 0x7FA4, 0x7136, 0x71C3, 0x5189, 0x67D3, 0x74E4, 0x58E4, 0x6518, 0x56B7, 0x8BA9, 0x9976, 0x6270, 0x7ED5, 0x60F9, 0x70ED, 0x58EC, 0x4EC1, 0x4EBA, 0x5FCD, 0x97E7, 0x4EFB, 0x8BA4, 0x5203, 0x598A, 0x7EAB, 0x6254, 0x4ECD, 0x65E5, 0x620E, 0x8338, 0x84C9, 0x8363, 0x878D, 0x7194, 0x6EB6, 0x5BB9, 0x7ED2, 0x5197, 0x63C9, 0x67D4, 0x8089, 0x8339, 0x8815, 0x5112, 0x5B7A, 0x5982, 0x8FB1, 0x4E73, 0x6C5D, 0x5165, 0x8925, 0x8F6F, 0x962E, 0x854A, 0x745E, 0x9510, 0x95F0, 0x6DA6, 0x82E5, 0x5F31, 0x6492, 0x6D12, 0x8428, 0x816E, 0x9CC3, 0x585E, 0x8D5B, 0x4E09, 0x53C1, // GB 0xC940..0xC97E 0x847D, 0x847E, 0x847F, 0x8480, 0x8481, 0x8483, 0x8484, 0x8485, 0x8486, 0x848A, 0x848D, 0x848F, 0x8490, 0x8491, 0x8492, 0x8493, 0x8494, 0x8495, 0x8496, 0x8498, 0x849A, 0x849B, 0x849D, 0x849E, 0x849F, 0x84A0, 0x84A2, 0x84A3, 0x84A4, 0x84A5, 0x84A6, 0x84A7, 0x84A8, 0x84A9, 0x84AA, 0x84AB, 0x84AC, 0x84AD, 0x84AE, 0x84B0, 0x84B1, 0x84B3, 0x84B5, 0x84B6, 0x84B7, 0x84BB, 0x84BC, 0x84BE, 0x84C0, 0x84C2, 0x84C3, 0x84C5, 0x84C6, 0x84C7, 0x84C8, 0x84CB, 0x84CC, 0x84CE, 0x84CF, 0x84D2, 0x84D4, 0x84D5, 0x84D7, // GB 0xC980..0xC9FE 0x84D8, 0x84D9, 0x84DA, 0x84DB, 0x84DC, 0x84DE, 0x84E1, 0x84E2, 0x84E4, 0x84E7, 0x84E8, 0x84E9, 0x84EA, 0x84EB, 0x84ED, 0x84EE, 0x84EF, 0x84F1, 0x84F2, 0x84F3, 0x84F4, 0x84F5, 0x84F6, 0x84F7, 0x84F8, 0x84F9, 0x84FA, 0x84FB, 0x84FD, 0x84FE, 0x8500, 0x8501, 0x8502, 0x4F1E, 0x6563, 0x6851, 0x55D3, 0x4E27, 0x6414, 0x9A9A, 0x626B, 0x5AC2, 0x745F, 0x8272, 0x6DA9, 0x68EE, 0x50E7, 0x838E, 0x7802, 0x6740, 0x5239, 0x6C99, 0x7EB1, 0x50BB, 0x5565, 0x715E, 0x7B5B, 0x6652, 0x73CA, 0x82EB, 0x6749, 0x5C71, 0x5220, 0x717D, 0x886B, 0x95EA, 0x9655, 0x64C5, 0x8D61, 0x81B3, 0x5584, 0x6C55, 0x6247, 0x7F2E, 0x5892, 0x4F24, 0x5546, 0x8D4F, 0x664C, 0x4E0A, 0x5C1A, 0x88F3, 0x68A2, 0x634E, 0x7A0D, 0x70E7, 0x828D, 0x52FA, 0x97F6, 0x5C11, 0x54E8, 0x90B5, 0x7ECD, 0x5962, 0x8D4A, 0x86C7, 0x820C, 0x820D, 0x8D66, 0x6444, 0x5C04, 0x6151, 0x6D89, 0x793E, 0x8BBE, 0x7837, 0x7533, 0x547B, 0x4F38, 0x8EAB, 0x6DF1, 0x5A20, 0x7EC5, 0x795E, 0x6C88, 0x5BA1, 0x5A76, 0x751A, 0x80BE, 0x614E, 0x6E17, 0x58F0, 0x751F, 0x7525, 0x7272, 0x5347, 0x7EF3, // GB 0xCA40..0xCA7E 0x8503, 0x8504, 0x8505, 0x8506, 0x8507, 0x8508, 0x8509, 0x850A, 0x850B, 0x850D, 0x850E, 0x850F, 0x8510, 0x8512, 0x8514, 0x8515, 0x8516, 0x8518, 0x8519, 0x851B, 0x851C, 0x851D, 0x851E, 0x8520, 0x8522, 0x8523, 0x8524, 0x8525, 0x8526, 0x8527, 0x8528, 0x8529, 0x852A, 0x852D, 0x852E, 0x852F, 0x8530, 0x8531, 0x8532, 0x8533, 0x8534, 0x8535, 0x8536, 0x853E, 0x853F, 0x8540, 0x8541, 0x8542, 0x8544, 0x8545, 0x8546, 0x8547, 0x854B, 0x854C, 0x854D, 0x854E, 0x854F, 0x8550, 0x8551, 0x8552, 0x8553, 0x8554, 0x8555, // GB 0xCA80..0xCAFE 0x8557, 0x8558, 0x855A, 0x855B, 0x855C, 0x855D, 0x855F, 0x8560, 0x8561, 0x8562, 0x8563, 0x8565, 0x8566, 0x8567, 0x8569, 0x856A, 0x856B, 0x856C, 0x856D, 0x856E, 0x856F, 0x8570, 0x8571, 0x8573, 0x8575, 0x8576, 0x8577, 0x8578, 0x857C, 0x857D, 0x857F, 0x8580, 0x8581, 0x7701, 0x76DB, 0x5269, 0x80DC, 0x5723, 0x5E08, 0x5931, 0x72EE, 0x65BD, 0x6E7F, 0x8BD7, 0x5C38, 0x8671, 0x5341, 0x77F3, 0x62FE, 0x65F6, 0x4EC0, 0x98DF, 0x8680, 0x5B9E, 0x8BC6, 0x53F2, 0x77E2, 0x4F7F, 0x5C4E, 0x9A76, 0x59CB, 0x5F0F, 0x793A, 0x58EB, 0x4E16, 0x67FF, 0x4E8B, 0x62ED, 0x8A93, 0x901D, 0x52BF, 0x662F, 0x55DC, 0x566C, 0x9002, 0x4ED5, 0x4F8D, 0x91CA, 0x9970, 0x6C0F, 0x5E02, 0x6043, 0x5BA4, 0x89C6, 0x8BD5, 0x6536, 0x624B, 0x9996, 0x5B88, 0x5BFF, 0x6388, 0x552E, 0x53D7, 0x7626, 0x517D, 0x852C, 0x67A2, 0x68B3, 0x6B8A, 0x6292, 0x8F93, 0x53D4, 0x8212, 0x6DD1, 0x758F, 0x4E66, 0x8D4E, 0x5B70, 0x719F, 0x85AF, 0x6691, 0x66D9, 0x7F72, 0x8700, 0x9ECD, 0x9F20, 0x5C5E, 0x672F, 0x8FF0, 0x6811, 0x675F, 0x620D, 0x7AD6, 0x5885, 0x5EB6, 0x6570, 0x6F31, // GB 0xCB40..0xCB7E 0x8582, 0x8583, 0x8586, 0x8588, 0x8589, 0x858A, 0x858B, 0x858C, 0x858D, 0x858E, 0x8590, 0x8591, 0x8592, 0x8593, 0x8594, 0x8595, 0x8596, 0x8597, 0x8598, 0x8599, 0x859A, 0x859D, 0x859E, 0x859F, 0x85A0, 0x85A1, 0x85A2, 0x85A3, 0x85A5, 0x85A6, 0x85A7, 0x85A9, 0x85AB, 0x85AC, 0x85AD, 0x85B1, 0x85B2, 0x85B3, 0x85B4, 0x85B5, 0x85B6, 0x85B8, 0x85BA, 0x85BB, 0x85BC, 0x85BD, 0x85BE, 0x85BF, 0x85C0, 0x85C2, 0x85C3, 0x85C4, 0x85C5, 0x85C6, 0x85C7, 0x85C8, 0x85CA, 0x85CB, 0x85CC, 0x85CD, 0x85CE, 0x85D1, 0x85D2, // GB 0xCB80..0xCBFE 0x85D4, 0x85D6, 0x85D7, 0x85D8, 0x85D9, 0x85DA, 0x85DB, 0x85DD, 0x85DE, 0x85DF, 0x85E0, 0x85E1, 0x85E2, 0x85E3, 0x85E5, 0x85E6, 0x85E7, 0x85E8, 0x85EA, 0x85EB, 0x85EC, 0x85ED, 0x85EE, 0x85EF, 0x85F0, 0x85F1, 0x85F2, 0x85F3, 0x85F4, 0x85F5, 0x85F6, 0x85F7, 0x85F8, 0x6055, 0x5237, 0x800D, 0x6454, 0x8870, 0x7529, 0x5E05, 0x6813, 0x62F4, 0x971C, 0x53CC, 0x723D, 0x8C01, 0x6C34, 0x7761, 0x7A0E, 0x542E, 0x77AC, 0x987A, 0x821C, 0x8BF4, 0x7855, 0x6714, 0x70C1, 0x65AF, 0x6495, 0x5636, 0x601D, 0x79C1, 0x53F8, 0x4E1D, 0x6B7B, 0x8086, 0x5BFA, 0x55E3, 0x56DB, 0x4F3A, 0x4F3C, 0x9972, 0x5DF3, 0x677E, 0x8038, 0x6002, 0x9882, 0x9001, 0x5B8B, 0x8BBC, 0x8BF5, 0x641C, 0x8258, 0x64DE, 0x55FD, 0x82CF, 0x9165, 0x4FD7, 0x7D20, 0x901F, 0x7C9F, 0x50F3, 0x5851, 0x6EAF, 0x5BBF, 0x8BC9, 0x8083, 0x9178, 0x849C, 0x7B97, 0x867D, 0x968B, 0x968F, 0x7EE5, 0x9AD3, 0x788E, 0x5C81, 0x7A57, 0x9042, 0x96A7, 0x795F, 0x5B59, 0x635F, 0x7B0B, 0x84D1, 0x68AD, 0x5506, 0x7F29, 0x7410, 0x7D22, 0x9501, 0x6240, 0x584C, 0x4ED6, 0x5B83, 0x5979, 0x5854, // GB 0xCC40..0xCC7E 0x85F9, 0x85FA, 0x85FC, 0x85FD, 0x85FE, 0x8600, 0x8601, 0x8602, 0x8603, 0x8604, 0x8606, 0x8607, 0x8608, 0x8609, 0x860A, 0x860B, 0x860C, 0x860D, 0x860E, 0x860F, 0x8610, 0x8612, 0x8613, 0x8614, 0x8615, 0x8617, 0x8618, 0x8619, 0x861A, 0x861B, 0x861C, 0x861D, 0x861E, 0x861F, 0x8620, 0x8621, 0x8622, 0x8623, 0x8624, 0x8625, 0x8626, 0x8628, 0x862A, 0x862B, 0x862C, 0x862D, 0x862E, 0x862F, 0x8630, 0x8631, 0x8632, 0x8633, 0x8634, 0x8635, 0x8636, 0x8637, 0x8639, 0x863A, 0x863B, 0x863D, 0x863E, 0x863F, 0x8640, // GB 0xCC80..0xCCFE 0x8641, 0x8642, 0x8643, 0x8644, 0x8645, 0x8646, 0x8647, 0x8648, 0x8649, 0x864A, 0x864B, 0x864C, 0x8652, 0x8653, 0x8655, 0x8656, 0x8657, 0x8658, 0x8659, 0x865B, 0x865C, 0x865D, 0x865F, 0x8660, 0x8661, 0x8663, 0x8664, 0x8665, 0x8666, 0x8667, 0x8668, 0x8669, 0x866A, 0x736D, 0x631E, 0x8E4B, 0x8E0F, 0x80CE, 0x82D4, 0x62AC, 0x53F0, 0x6CF0, 0x915E, 0x592A, 0x6001, 0x6C70, 0x574D, 0x644A, 0x8D2A, 0x762B, 0x6EE9, 0x575B, 0x6A80, 0x75F0, 0x6F6D, 0x8C2D, 0x8C08, 0x5766, 0x6BEF, 0x8892, 0x78B3, 0x63A2, 0x53F9, 0x70AD, 0x6C64, 0x5858, 0x642A, 0x5802, 0x68E0, 0x819B, 0x5510, 0x7CD6, 0x5018, 0x8EBA, 0x6DCC, 0x8D9F, 0x70EB, 0x638F, 0x6D9B, 0x6ED4, 0x7EE6, 0x8404, 0x6843, 0x9003, 0x6DD8, 0x9676, 0x8BA8, 0x5957, 0x7279, 0x85E4, 0x817E, 0x75BC, 0x8A8A, 0x68AF, 0x5254, 0x8E22, 0x9511, 0x63D0, 0x9898, 0x8E44, 0x557C, 0x4F53, 0x66FF, 0x568F, 0x60D5, 0x6D95, 0x5243, 0x5C49, 0x5929, 0x6DFB, 0x586B, 0x7530, 0x751C, 0x606C, 0x8214, 0x8146, 0x6311, 0x6761, 0x8FE2, 0x773A, 0x8DF3, 0x8D34, 0x94C1, 0x5E16, 0x5385, 0x542C, 0x70C3, // GB 0xCD40..0xCD7E 0x866D, 0x866F, 0x8670, 0x8672, 0x8673, 0x8674, 0x8675, 0x8676, 0x8677, 0x8678, 0x8683, 0x8684, 0x8685, 0x8686, 0x8687, 0x8688, 0x8689, 0x868E, 0x868F, 0x8690, 0x8691, 0x8692, 0x8694, 0x8696, 0x8697, 0x8698, 0x8699, 0x869A, 0x869B, 0x869E, 0x869F, 0x86A0, 0x86A1, 0x86A2, 0x86A5, 0x86A6, 0x86AB, 0x86AD, 0x86AE, 0x86B2, 0x86B3, 0x86B7, 0x86B8, 0x86B9, 0x86BB, 0x86BC, 0x86BD, 0x86BE, 0x86BF, 0x86C1, 0x86C2, 0x86C3, 0x86C5, 0x86C8, 0x86CC, 0x86CD, 0x86D2, 0x86D3, 0x86D5, 0x86D6, 0x86D7, 0x86DA, 0x86DC, // GB 0xCD80..0xCDFE 0x86DD, 0x86E0, 0x86E1, 0x86E2, 0x86E3, 0x86E5, 0x86E6, 0x86E7, 0x86E8, 0x86EA, 0x86EB, 0x86EC, 0x86EF, 0x86F5, 0x86F6, 0x86F7, 0x86FA, 0x86FB, 0x86FC, 0x86FD, 0x86FF, 0x8701, 0x8704, 0x8705, 0x8706, 0x870B, 0x870C, 0x870E, 0x870F, 0x8710, 0x8711, 0x8714, 0x8716, 0x6C40, 0x5EF7, 0x505C, 0x4EAD, 0x5EAD, 0x633A, 0x8247, 0x901A, 0x6850, 0x916E, 0x77B3, 0x540C, 0x94DC, 0x5F64, 0x7AE5, 0x6876, 0x6345, 0x7B52, 0x7EDF, 0x75DB, 0x5077, 0x6295, 0x5934, 0x900F, 0x51F8, 0x79C3, 0x7A81, 0x56FE, 0x5F92, 0x9014, 0x6D82, 0x5C60, 0x571F, 0x5410, 0x5154, 0x6E4D, 0x56E2, 0x63A8, 0x9893, 0x817F, 0x8715, 0x892A, 0x9000, 0x541E, 0x5C6F, 0x81C0, 0x62D6, 0x6258, 0x8131, 0x9E35, 0x9640, 0x9A6E, 0x9A7C, 0x692D, 0x59A5, 0x62D3, 0x553E, 0x6316, 0x54C7, 0x86D9, 0x6D3C, 0x5A03, 0x74E6, 0x889C, 0x6B6A, 0x5916, 0x8C4C, 0x5F2F, 0x6E7E, 0x73A9, 0x987D, 0x4E38, 0x70F7, 0x5B8C, 0x7897, 0x633D, 0x665A, 0x7696, 0x60CB, 0x5B9B, 0x5A49, 0x4E07, 0x8155, 0x6C6A, 0x738B, 0x4EA1, 0x6789, 0x7F51, 0x5F80, 0x65FA, 0x671B, 0x5FD8, 0x5984, 0x5A01, // GB 0xCE40..0xCE7E 0x8719, 0x871B, 0x871D, 0x871F, 0x8720, 0x8724, 0x8726, 0x8727, 0x8728, 0x872A, 0x872B, 0x872C, 0x872D, 0x872F, 0x8730, 0x8732, 0x8733, 0x8735, 0x8736, 0x8738, 0x8739, 0x873A, 0x873C, 0x873D, 0x8740, 0x8741, 0x8742, 0x8743, 0x8744, 0x8745, 0x8746, 0x874A, 0x874B, 0x874D, 0x874F, 0x8750, 0x8751, 0x8752, 0x8754, 0x8755, 0x8756, 0x8758, 0x875A, 0x875B, 0x875C, 0x875D, 0x875E, 0x875F, 0x8761, 0x8762, 0x8766, 0x8767, 0x8768, 0x8769, 0x876A, 0x876B, 0x876C, 0x876D, 0x876F, 0x8771, 0x8772, 0x8773, 0x8775, // GB 0xCE80..0xCEFE 0x8777, 0x8778, 0x8779, 0x877A, 0x877F, 0x8780, 0x8781, 0x8784, 0x8786, 0x8787, 0x8789, 0x878A, 0x878C, 0x878E, 0x878F, 0x8790, 0x8791, 0x8792, 0x8794, 0x8795, 0x8796, 0x8798, 0x8799, 0x879A, 0x879B, 0x879C, 0x879D, 0x879E, 0x87A0, 0x87A1, 0x87A2, 0x87A3, 0x87A4, 0x5DCD, 0x5FAE, 0x5371, 0x97E6, 0x8FDD, 0x6845, 0x56F4, 0x552F, 0x60DF, 0x4E3A, 0x6F4D, 0x7EF4, 0x82C7, 0x840E, 0x59D4, 0x4F1F, 0x4F2A, 0x5C3E, 0x7EAC, 0x672A, 0x851A, 0x5473, 0x754F, 0x80C3, 0x5582, 0x9B4F, 0x4F4D, 0x6E2D, 0x8C13, 0x5C09, 0x6170, 0x536B, 0x761F, 0x6E29, 0x868A, 0x6587, 0x95FB, 0x7EB9, 0x543B, 0x7A33, 0x7D0A, 0x95EE, 0x55E1, 0x7FC1, 0x74EE, 0x631D, 0x8717, 0x6DA1, 0x7A9D, 0x6211, 0x65A1, 0x5367, 0x63E1, 0x6C83, 0x5DEB, 0x545C, 0x94A8, 0x4E4C, 0x6C61, 0x8BEC, 0x5C4B, 0x65E0, 0x829C, 0x68A7, 0x543E, 0x5434, 0x6BCB, 0x6B66, 0x4E94, 0x6342, 0x5348, 0x821E, 0x4F0D, 0x4FAE, 0x575E, 0x620A, 0x96FE, 0x6664, 0x7269, 0x52FF, 0x52A1, 0x609F, 0x8BEF, 0x6614, 0x7199, 0x6790, 0x897F, 0x7852, 0x77FD, 0x6670, 0x563B, 0x5438, 0x9521, 0x727A, // GB 0xCF40..0xCF7E 0x87A5, 0x87A6, 0x87A7, 0x87A9, 0x87AA, 0x87AE, 0x87B0, 0x87B1, 0x87B2, 0x87B4, 0x87B6, 0x87B7, 0x87B8, 0x87B9, 0x87BB, 0x87BC, 0x87BE, 0x87BF, 0x87C1, 0x87C2, 0x87C3, 0x87C4, 0x87C5, 0x87C7, 0x87C8, 0x87C9, 0x87CC, 0x87CD, 0x87CE, 0x87CF, 0x87D0, 0x87D4, 0x87D5, 0x87D6, 0x87D7, 0x87D8, 0x87D9, 0x87DA, 0x87DC, 0x87DD, 0x87DE, 0x87DF, 0x87E1, 0x87E2, 0x87E3, 0x87E4, 0x87E6, 0x87E7, 0x87E8, 0x87E9, 0x87EB, 0x87EC, 0x87ED, 0x87EF, 0x87F0, 0x87F1, 0x87F2, 0x87F3, 0x87F4, 0x87F5, 0x87F6, 0x87F7, 0x87F8, // GB 0xCF80..0xCFFE 0x87FA, 0x87FB, 0x87FC, 0x87FD, 0x87FF, 0x8800, 0x8801, 0x8802, 0x8804, 0x8805, 0x8806, 0x8807, 0x8808, 0x8809, 0x880B, 0x880C, 0x880D, 0x880E, 0x880F, 0x8810, 0x8811, 0x8812, 0x8814, 0x8817, 0x8818, 0x8819, 0x881A, 0x881C, 0x881D, 0x881E, 0x881F, 0x8820, 0x8823, 0x7A00, 0x606F, 0x5E0C, 0x6089, 0x819D, 0x5915, 0x60DC, 0x7184, 0x70EF, 0x6EAA, 0x6C50, 0x7280, 0x6A84, 0x88AD, 0x5E2D, 0x4E60, 0x5AB3, 0x559C, 0x94E3, 0x6D17, 0x7CFB, 0x9699, 0x620F, 0x7EC6, 0x778E, 0x867E, 0x5323, 0x971E, 0x8F96, 0x6687, 0x5CE1, 0x4FA0, 0x72ED, 0x4E0B, 0x53A6, 0x590F, 0x5413, 0x6380, 0x9528, 0x5148, 0x4ED9, 0x9C9C, 0x7EA4, 0x54B8, 0x8D24, 0x8854, 0x8237, 0x95F2, 0x6D8E, 0x5F26, 0x5ACC, 0x663E, 0x9669, 0x73B0, 0x732E, 0x53BF, 0x817A, 0x9985, 0x7FA1, 0x5BAA, 0x9677, 0x9650, 0x7EBF, 0x76F8, 0x53A2, 0x9576, 0x9999, 0x7BB1, 0x8944, 0x6E58, 0x4E61, 0x7FD4, 0x7965, 0x8BE6, 0x60F3, 0x54CD, 0x4EAB, 0x9879, 0x5DF7, 0x6A61, 0x50CF, 0x5411, 0x8C61, 0x8427, 0x785D, 0x9704, 0x524A, 0x54EE, 0x56A3, 0x9500, 0x6D88, 0x5BB5, 0x6DC6, 0x6653, // GB 0xD040..0xD07E 0x8824, 0x8825, 0x8826, 0x8827, 0x8828, 0x8829, 0x882A, 0x882B, 0x882C, 0x882D, 0x882E, 0x882F, 0x8830, 0x8831, 0x8833, 0x8834, 0x8835, 0x8836, 0x8837, 0x8838, 0x883A, 0x883B, 0x883D, 0x883E, 0x883F, 0x8841, 0x8842, 0x8843, 0x8846, 0x8847, 0x8848, 0x8849, 0x884A, 0x884B, 0x884E, 0x884F, 0x8850, 0x8851, 0x8852, 0x8853, 0x8855, 0x8856, 0x8858, 0x885A, 0x885B, 0x885C, 0x885D, 0x885E, 0x885F, 0x8860, 0x8866, 0x8867, 0x886A, 0x886D, 0x886F, 0x8871, 0x8873, 0x8874, 0x8875, 0x8876, 0x8878, 0x8879, 0x887A, // GB 0xD080..0xD0FE 0x887B, 0x887C, 0x8880, 0x8883, 0x8886, 0x8887, 0x8889, 0x888A, 0x888C, 0x888E, 0x888F, 0x8890, 0x8891, 0x8893, 0x8894, 0x8895, 0x8897, 0x8898, 0x8899, 0x889A, 0x889B, 0x889D, 0x889E, 0x889F, 0x88A0, 0x88A1, 0x88A3, 0x88A5, 0x88A6, 0x88A7, 0x88A8, 0x88A9, 0x88AA, 0x5C0F, 0x5B5D, 0x6821, 0x8096, 0x5578, 0x7B11, 0x6548, 0x6954, 0x4E9B, 0x6B47, 0x874E, 0x978B, 0x534F, 0x631F, 0x643A, 0x90AA, 0x659C, 0x80C1, 0x8C10, 0x5199, 0x68B0, 0x5378, 0x87F9, 0x61C8, 0x6CC4, 0x6CFB, 0x8C22, 0x5C51, 0x85AA, 0x82AF, 0x950C, 0x6B23, 0x8F9B, 0x65B0, 0x5FFB, 0x5FC3, 0x4FE1, 0x8845, 0x661F, 0x8165, 0x7329, 0x60FA, 0x5174, 0x5211, 0x578B, 0x5F62, 0x90A2, 0x884C, 0x9192, 0x5E78, 0x674F, 0x6027, 0x59D3, 0x5144, 0x51F6, 0x80F8, 0x5308, 0x6C79, 0x96C4, 0x718A, 0x4F11, 0x4FEE, 0x7F9E, 0x673D, 0x55C5, 0x9508, 0x79C0, 0x8896, 0x7EE3, 0x589F, 0x620C, 0x9700, 0x865A, 0x5618, 0x987B, 0x5F90, 0x8BB8, 0x84C4, 0x9157, 0x53D9, 0x65ED, 0x5E8F, 0x755C, 0x6064, 0x7D6E, 0x5A7F, 0x7EEA, 0x7EED, 0x8F69, 0x55A7, 0x5BA3, 0x60AC, 0x65CB, 0x7384, // GB 0xD140..0xD17E 0x88AC, 0x88AE, 0x88AF, 0x88B0, 0x88B2, 0x88B3, 0x88B4, 0x88B5, 0x88B6, 0x88B8, 0x88B9, 0x88BA, 0x88BB, 0x88BD, 0x88BE, 0x88BF, 0x88C0, 0x88C3, 0x88C4, 0x88C7, 0x88C8, 0x88CA, 0x88CB, 0x88CC, 0x88CD, 0x88CF, 0x88D0, 0x88D1, 0x88D3, 0x88D6, 0x88D7, 0x88DA, 0x88DB, 0x88DC, 0x88DD, 0x88DE, 0x88E0, 0x88E1, 0x88E6, 0x88E7, 0x88E9, 0x88EA, 0x88EB, 0x88EC, 0x88ED, 0x88EE, 0x88EF, 0x88F2, 0x88F5, 0x88F6, 0x88F7, 0x88FA, 0x88FB, 0x88FD, 0x88FF, 0x8900, 0x8901, 0x8903, 0x8904, 0x8905, 0x8906, 0x8907, 0x8908, // GB 0xD180..0xD1FE 0x8909, 0x890B, 0x890C, 0x890D, 0x890E, 0x890F, 0x8911, 0x8914, 0x8915, 0x8916, 0x8917, 0x8918, 0x891C, 0x891D, 0x891E, 0x891F, 0x8920, 0x8922, 0x8923, 0x8924, 0x8926, 0x8927, 0x8928, 0x8929, 0x892C, 0x892D, 0x892E, 0x892F, 0x8931, 0x8932, 0x8933, 0x8935, 0x8937, 0x9009, 0x7663, 0x7729, 0x7EDA, 0x9774, 0x859B, 0x5B66, 0x7A74, 0x96EA, 0x8840, 0x52CB, 0x718F, 0x5FAA, 0x65EC, 0x8BE2, 0x5BFB, 0x9A6F, 0x5DE1, 0x6B89, 0x6C5B, 0x8BAD, 0x8BAF, 0x900A, 0x8FC5, 0x538B, 0x62BC, 0x9E26, 0x9E2D, 0x5440, 0x4E2B, 0x82BD, 0x7259, 0x869C, 0x5D16, 0x8859, 0x6DAF, 0x96C5, 0x54D1, 0x4E9A, 0x8BB6, 0x7109, 0x54BD, 0x9609, 0x70DF, 0x6DF9, 0x76D0, 0x4E25, 0x7814, 0x8712, 0x5CA9, 0x5EF6, 0x8A00, 0x989C, 0x960E, 0x708E, 0x6CBF, 0x5944, 0x63A9, 0x773C, 0x884D, 0x6F14, 0x8273, 0x5830, 0x71D5, 0x538C, 0x781A, 0x96C1, 0x5501, 0x5F66, 0x7130, 0x5BB4, 0x8C1A, 0x9A8C, 0x6B83, 0x592E, 0x9E2F, 0x79E7, 0x6768, 0x626C, 0x4F6F, 0x75A1, 0x7F8A, 0x6D0B, 0x9633, 0x6C27, 0x4EF0, 0x75D2, 0x517B, 0x6837, 0x6F3E, 0x9080, 0x8170, 0x5996, 0x7476, // GB 0xD240..0xD27E 0x8938, 0x8939, 0x893A, 0x893B, 0x893C, 0x893D, 0x893E, 0x893F, 0x8940, 0x8942, 0x8943, 0x8945, 0x8946, 0x8947, 0x8948, 0x8949, 0x894A, 0x894B, 0x894C, 0x894D, 0x894E, 0x894F, 0x8950, 0x8951, 0x8952, 0x8953, 0x8954, 0x8955, 0x8956, 0x8957, 0x8958, 0x8959, 0x895A, 0x895B, 0x895C, 0x895D, 0x8960, 0x8961, 0x8962, 0x8963, 0x8964, 0x8965, 0x8967, 0x8968, 0x8969, 0x896A, 0x896B, 0x896C, 0x896D, 0x896E, 0x896F, 0x8970, 0x8971, 0x8972, 0x8973, 0x8974, 0x8975, 0x8976, 0x8977, 0x8978, 0x8979, 0x897A, 0x897C, // GB 0xD280..0xD2FE 0x897D, 0x897E, 0x8980, 0x8982, 0x8984, 0x8985, 0x8987, 0x8988, 0x8989, 0x898A, 0x898B, 0x898C, 0x898D, 0x898E, 0x898F, 0x8990, 0x8991, 0x8992, 0x8993, 0x8994, 0x8995, 0x8996, 0x8997, 0x8998, 0x8999, 0x899A, 0x899B, 0x899C, 0x899D, 0x899E, 0x899F, 0x89A0, 0x89A1, 0x6447, 0x5C27, 0x9065, 0x7A91, 0x8C23, 0x59DA, 0x54AC, 0x8200, 0x836F, 0x8981, 0x8000, 0x6930, 0x564E, 0x8036, 0x7237, 0x91CE, 0x51B6, 0x4E5F, 0x9875, 0x6396, 0x4E1A, 0x53F6, 0x66F3, 0x814B, 0x591C, 0x6DB2, 0x4E00, 0x58F9, 0x533B, 0x63D6, 0x94F1, 0x4F9D, 0x4F0A, 0x8863, 0x9890, 0x5937, 0x9057, 0x79FB, 0x4EEA, 0x80F0, 0x7591, 0x6C82, 0x5B9C, 0x59E8, 0x5F5D, 0x6905, 0x8681, 0x501A, 0x5DF2, 0x4E59, 0x77E3, 0x4EE5, 0x827A, 0x6291, 0x6613, 0x9091, 0x5C79, 0x4EBF, 0x5F79, 0x81C6, 0x9038, 0x8084, 0x75AB, 0x4EA6, 0x88D4, 0x610F, 0x6BC5, 0x5FC6, 0x4E49, 0x76CA, 0x6EA2, 0x8BE3, 0x8BAE, 0x8C0A, 0x8BD1, 0x5F02, 0x7FFC, 0x7FCC, 0x7ECE, 0x8335, 0x836B, 0x56E0, 0x6BB7, 0x97F3, 0x9634, 0x59FB, 0x541F, 0x94F6, 0x6DEB, 0x5BC5, 0x996E, 0x5C39, 0x5F15, 0x9690, // GB 0xD340..0xD37E 0x89A2, 0x89A3, 0x89A4, 0x89A5, 0x89A6, 0x89A7, 0x89A8, 0x89A9, 0x89AA, 0x89AB, 0x89AC, 0x89AD, 0x89AE, 0x89AF, 0x89B0, 0x89B1, 0x89B2, 0x89B3, 0x89B4, 0x89B5, 0x89B6, 0x89B7, 0x89B8, 0x89B9, 0x89BA, 0x89BB, 0x89BC, 0x89BD, 0x89BE, 0x89BF, 0x89C0, 0x89C3, 0x89CD, 0x89D3, 0x89D4, 0x89D5, 0x89D7, 0x89D8, 0x89D9, 0x89DB, 0x89DD, 0x89DF, 0x89E0, 0x89E1, 0x89E2, 0x89E4, 0x89E7, 0x89E8, 0x89E9, 0x89EA, 0x89EC, 0x89ED, 0x89EE, 0x89F0, 0x89F1, 0x89F2, 0x89F4, 0x89F5, 0x89F6, 0x89F7, 0x89F8, 0x89F9, 0x89FA, // GB 0xD380..0xD3FE 0x89FB, 0x89FC, 0x89FD, 0x89FE, 0x89FF, 0x8A01, 0x8A02, 0x8A03, 0x8A04, 0x8A05, 0x8A06, 0x8A08, 0x8A09, 0x8A0A, 0x8A0B, 0x8A0C, 0x8A0D, 0x8A0E, 0x8A0F, 0x8A10, 0x8A11, 0x8A12, 0x8A13, 0x8A14, 0x8A15, 0x8A16, 0x8A17, 0x8A18, 0x8A19, 0x8A1A, 0x8A1B, 0x8A1C, 0x8A1D, 0x5370, 0x82F1, 0x6A31, 0x5A74, 0x9E70, 0x5E94, 0x7F28, 0x83B9, 0x8424, 0x8425, 0x8367, 0x8747, 0x8FCE, 0x8D62, 0x76C8, 0x5F71, 0x9896, 0x786C, 0x6620, 0x54DF, 0x62E5, 0x4F63, 0x81C3, 0x75C8, 0x5EB8, 0x96CD, 0x8E0A, 0x86F9, 0x548F, 0x6CF3, 0x6D8C, 0x6C38, 0x607F, 0x52C7, 0x7528, 0x5E7D, 0x4F18, 0x60A0, 0x5FE7, 0x5C24, 0x7531, 0x90AE, 0x94C0, 0x72B9, 0x6CB9, 0x6E38, 0x9149, 0x6709, 0x53CB, 0x53F3, 0x4F51, 0x91C9, 0x8BF1, 0x53C8, 0x5E7C, 0x8FC2, 0x6DE4, 0x4E8E, 0x76C2, 0x6986, 0x865E, 0x611A, 0x8206, 0x4F59, 0x4FDE, 0x903E, 0x9C7C, 0x6109, 0x6E1D, 0x6E14, 0x9685, 0x4E88, 0x5A31, 0x96E8, 0x4E0E, 0x5C7F, 0x79B9, 0x5B87, 0x8BED, 0x7FBD, 0x7389, 0x57DF, 0x828B, 0x90C1, 0x5401, 0x9047, 0x55BB, 0x5CEA, 0x5FA1, 0x6108, 0x6B32, 0x72F1, 0x80B2, 0x8A89, // GB 0xD440..0xD47E 0x8A1E, 0x8A1F, 0x8A20, 0x8A21, 0x8A22, 0x8A23, 0x8A24, 0x8A25, 0x8A26, 0x8A27, 0x8A28, 0x8A29, 0x8A2A, 0x8A2B, 0x8A2C, 0x8A2D, 0x8A2E, 0x8A2F, 0x8A30, 0x8A31, 0x8A32, 0x8A33, 0x8A34, 0x8A35, 0x8A36, 0x8A37, 0x8A38, 0x8A39, 0x8A3A, 0x8A3B, 0x8A3C, 0x8A3D, 0x8A3F, 0x8A40, 0x8A41, 0x8A42, 0x8A43, 0x8A44, 0x8A45, 0x8A46, 0x8A47, 0x8A49, 0x8A4A, 0x8A4B, 0x8A4C, 0x8A4D, 0x8A4E, 0x8A4F, 0x8A50, 0x8A51, 0x8A52, 0x8A53, 0x8A54, 0x8A55, 0x8A56, 0x8A57, 0x8A58, 0x8A59, 0x8A5A, 0x8A5B, 0x8A5C, 0x8A5D, 0x8A5E, // GB 0xD480..0xD4FE 0x8A5F, 0x8A60, 0x8A61, 0x8A62, 0x8A63, 0x8A64, 0x8A65, 0x8A66, 0x8A67, 0x8A68, 0x8A69, 0x8A6A, 0x8A6B, 0x8A6C, 0x8A6D, 0x8A6E, 0x8A6F, 0x8A70, 0x8A71, 0x8A72, 0x8A73, 0x8A74, 0x8A75, 0x8A76, 0x8A77, 0x8A78, 0x8A7A, 0x8A7B, 0x8A7C, 0x8A7D, 0x8A7E, 0x8A7F, 0x8A80, 0x6D74, 0x5BD3, 0x88D5, 0x9884, 0x8C6B, 0x9A6D, 0x9E33, 0x6E0A, 0x51A4, 0x5143, 0x57A3, 0x8881, 0x539F, 0x63F4, 0x8F95, 0x56ED, 0x5458, 0x5706, 0x733F, 0x6E90, 0x7F18, 0x8FDC, 0x82D1, 0x613F, 0x6028, 0x9662, 0x66F0, 0x7EA6, 0x8D8A, 0x8DC3, 0x94A5, 0x5CB3, 0x7CA4, 0x6708, 0x60A6, 0x9605, 0x8018, 0x4E91, 0x90E7, 0x5300, 0x9668, 0x5141, 0x8FD0, 0x8574, 0x915D, 0x6655, 0x97F5, 0x5B55, 0x531D, 0x7838, 0x6742, 0x683D, 0x54C9, 0x707E, 0x5BB0, 0x8F7D, 0x518D, 0x5728, 0x54B1, 0x6512, 0x6682, 0x8D5E, 0x8D43, 0x810F, 0x846C, 0x906D, 0x7CDF, 0x51FF, 0x85FB, 0x67A3, 0x65E9, 0x6FA1, 0x86A4, 0x8E81, 0x566A, 0x9020, 0x7682, 0x7076, 0x71E5, 0x8D23, 0x62E9, 0x5219, 0x6CFD, 0x8D3C, 0x600E, 0x589E, 0x618E, 0x66FE, 0x8D60, 0x624E, 0x55B3, 0x6E23, 0x672D, 0x8F67, // GB 0xD540..0xD57E 0x8A81, 0x8A82, 0x8A83, 0x8A84, 0x8A85, 0x8A86, 0x8A87, 0x8A88, 0x8A8B, 0x8A8C, 0x8A8D, 0x8A8E, 0x8A8F, 0x8A90, 0x8A91, 0x8A92, 0x8A94, 0x8A95, 0x8A96, 0x8A97, 0x8A98, 0x8A99, 0x8A9A, 0x8A9B, 0x8A9C, 0x8A9D, 0x8A9E, 0x8A9F, 0x8AA0, 0x8AA1, 0x8AA2, 0x8AA3, 0x8AA4, 0x8AA5, 0x8AA6, 0x8AA7, 0x8AA8, 0x8AA9, 0x8AAA, 0x8AAB, 0x8AAC, 0x8AAD, 0x8AAE, 0x8AAF, 0x8AB0, 0x8AB1, 0x8AB2, 0x8AB3, 0x8AB4, 0x8AB5, 0x8AB6, 0x8AB7, 0x8AB8, 0x8AB9, 0x8ABA, 0x8ABB, 0x8ABC, 0x8ABD, 0x8ABE, 0x8ABF, 0x8AC0, 0x8AC1, 0x8AC2, // GB 0xD580..0xD5FE 0x8AC3, 0x8AC4, 0x8AC5, 0x8AC6, 0x8AC7, 0x8AC8, 0x8AC9, 0x8ACA, 0x8ACB, 0x8ACC, 0x8ACD, 0x8ACE, 0x8ACF, 0x8AD0, 0x8AD1, 0x8AD2, 0x8AD3, 0x8AD4, 0x8AD5, 0x8AD6, 0x8AD7, 0x8AD8, 0x8AD9, 0x8ADA, 0x8ADB, 0x8ADC, 0x8ADD, 0x8ADE, 0x8ADF, 0x8AE0, 0x8AE1, 0x8AE2, 0x8AE3, 0x94E1, 0x95F8, 0x7728, 0x6805, 0x69A8, 0x548B, 0x4E4D, 0x70B8, 0x8BC8, 0x6458, 0x658B, 0x5B85, 0x7A84, 0x503A, 0x5BE8, 0x77BB, 0x6BE1, 0x8A79, 0x7C98, 0x6CBE, 0x76CF, 0x65A9, 0x8F97, 0x5D2D, 0x5C55, 0x8638, 0x6808, 0x5360, 0x6218, 0x7AD9, 0x6E5B, 0x7EFD, 0x6A1F, 0x7AE0, 0x5F70, 0x6F33, 0x5F20, 0x638C, 0x6DA8, 0x6756, 0x4E08, 0x5E10, 0x8D26, 0x4ED7, 0x80C0, 0x7634, 0x969C, 0x62DB, 0x662D, 0x627E, 0x6CBC, 0x8D75, 0x7167, 0x7F69, 0x5146, 0x8087, 0x53EC, 0x906E, 0x6298, 0x54F2, 0x86F0, 0x8F99, 0x8005, 0x9517, 0x8517, 0x8FD9, 0x6D59, 0x73CD, 0x659F, 0x771F, 0x7504, 0x7827, 0x81FB, 0x8D1E, 0x9488, 0x4FA6, 0x6795, 0x75B9, 0x8BCA, 0x9707, 0x632F, 0x9547, 0x9635, 0x84B8, 0x6323, 0x7741, 0x5F81, 0x72F0, 0x4E89, 0x6014, 0x6574, 0x62EF, 0x6B63, 0x653F, // GB 0xD640..0xD67E 0x8AE4, 0x8AE5, 0x8AE6, 0x8AE7, 0x8AE8, 0x8AE9, 0x8AEA, 0x8AEB, 0x8AEC, 0x8AED, 0x8AEE, 0x8AEF, 0x8AF0, 0x8AF1, 0x8AF2, 0x8AF3, 0x8AF4, 0x8AF5, 0x8AF6, 0x8AF7, 0x8AF8, 0x8AF9, 0x8AFA, 0x8AFB, 0x8AFC, 0x8AFD, 0x8AFE, 0x8AFF, 0x8B00, 0x8B01, 0x8B02, 0x8B03, 0x8B04, 0x8B05, 0x8B06, 0x8B08, 0x8B09, 0x8B0A, 0x8B0B, 0x8B0C, 0x8B0D, 0x8B0E, 0x8B0F, 0x8B10, 0x8B11, 0x8B12, 0x8B13, 0x8B14, 0x8B15, 0x8B16, 0x8B17, 0x8B18, 0x8B19, 0x8B1A, 0x8B1B, 0x8B1C, 0x8B1D, 0x8B1E, 0x8B1F, 0x8B20, 0x8B21, 0x8B22, 0x8B23, // GB 0xD680..0xD6FE 0x8B24, 0x8B25, 0x8B27, 0x8B28, 0x8B29, 0x8B2A, 0x8B2B, 0x8B2C, 0x8B2D, 0x8B2E, 0x8B2F, 0x8B30, 0x8B31, 0x8B32, 0x8B33, 0x8B34, 0x8B35, 0x8B36, 0x8B37, 0x8B38, 0x8B39, 0x8B3A, 0x8B3B, 0x8B3C, 0x8B3D, 0x8B3E, 0x8B3F, 0x8B40, 0x8B41, 0x8B42, 0x8B43, 0x8B44, 0x8B45, 0x5E27, 0x75C7, 0x90D1, 0x8BC1, 0x829D, 0x679D, 0x652F, 0x5431, 0x8718, 0x77E5, 0x80A2, 0x8102, 0x6C41, 0x4E4B, 0x7EC7, 0x804C, 0x76F4, 0x690D, 0x6B96, 0x6267, 0x503C, 0x4F84, 0x5740, 0x6307, 0x6B62, 0x8DBE, 0x53EA, 0x65E8, 0x7EB8, 0x5FD7, 0x631A, 0x63B7, 0x81F3, 0x81F4, 0x7F6E, 0x5E1C, 0x5CD9, 0x5236, 0x667A, 0x79E9, 0x7A1A, 0x8D28, 0x7099, 0x75D4, 0x6EDE, 0x6CBB, 0x7A92, 0x4E2D, 0x76C5, 0x5FE0, 0x949F, 0x8877, 0x7EC8, 0x79CD, 0x80BF, 0x91CD, 0x4EF2, 0x4F17, 0x821F, 0x5468, 0x5DDE, 0x6D32, 0x8BCC, 0x7CA5, 0x8F74, 0x8098, 0x5E1A, 0x5492, 0x76B1, 0x5B99, 0x663C, 0x9AA4, 0x73E0, 0x682A, 0x86DB, 0x6731, 0x732A, 0x8BF8, 0x8BDB, 0x9010, 0x7AF9, 0x70DB, 0x716E, 0x62C4, 0x77A9, 0x5631, 0x4E3B, 0x8457, 0x67F1, 0x52A9, 0x86C0, 0x8D2E, 0x94F8, 0x7B51, // GB 0xD740..0xD77E 0x8B46, 0x8B47, 0x8B48, 0x8B49, 0x8B4A, 0x8B4B, 0x8B4C, 0x8B4D, 0x8B4E, 0x8B4F, 0x8B50, 0x8B51, 0x8B52, 0x8B53, 0x8B54, 0x8B55, 0x8B56, 0x8B57, 0x8B58, 0x8B59, 0x8B5A, 0x8B5B, 0x8B5C, 0x8B5D, 0x8B5E, 0x8B5F, 0x8B60, 0x8B61, 0x8B62, 0x8B63, 0x8B64, 0x8B65, 0x8B67, 0x8B68, 0x8B69, 0x8B6A, 0x8B6B, 0x8B6D, 0x8B6E, 0x8B6F, 0x8B70, 0x8B71, 0x8B72, 0x8B73, 0x8B74, 0x8B75, 0x8B76, 0x8B77, 0x8B78, 0x8B79, 0x8B7A, 0x8B7B, 0x8B7C, 0x8B7D, 0x8B7E, 0x8B7F, 0x8B80, 0x8B81, 0x8B82, 0x8B83, 0x8B84, 0x8B85, 0x8B86, // GB 0xD780..0xD7FE 0x8B87, 0x8B88, 0x8B89, 0x8B8A, 0x8B8B, 0x8B8C, 0x8B8D, 0x8B8E, 0x8B8F, 0x8B90, 0x8B91, 0x8B92, 0x8B93, 0x8B94, 0x8B95, 0x8B96, 0x8B97, 0x8B98, 0x8B99, 0x8B9A, 0x8B9B, 0x8B9C, 0x8B9D, 0x8B9E, 0x8B9F, 0x8BAC, 0x8BB1, 0x8BBB, 0x8BC7, 0x8BD0, 0x8BEA, 0x8C09, 0x8C1E, 0x4F4F, 0x6CE8, 0x795D, 0x9A7B, 0x6293, 0x722A, 0x62FD, 0x4E13, 0x7816, 0x8F6C, 0x64B0, 0x8D5A, 0x7BC6, 0x6869, 0x5E84, 0x88C5, 0x5986, 0x649E, 0x58EE, 0x72B6, 0x690E, 0x9525, 0x8FFD, 0x8D58, 0x5760, 0x7F00, 0x8C06, 0x51C6, 0x6349, 0x62D9, 0x5353, 0x684C, 0x7422, 0x8301, 0x914C, 0x5544, 0x7740, 0x707C, 0x6D4A, 0x5179, 0x54A8, 0x8D44, 0x59FF, 0x6ECB, 0x6DC4, 0x5B5C, 0x7D2B, 0x4ED4, 0x7C7D, 0x6ED3, 0x5B50, 0x81EA, 0x6E0D, 0x5B57, 0x9B03, 0x68D5, 0x8E2A, 0x5B97, 0x7EFC, 0x603B, 0x7EB5, 0x90B9, 0x8D70, 0x594F, 0x63CD, 0x79DF, 0x8DB3, 0x5352, 0x65CF, 0x7956, 0x8BC5, 0x963B, 0x7EC4, 0x94BB, 0x7E82, 0x5634, 0x9189, 0x6700, 0x7F6A, 0x5C0A, 0x9075, 0x6628, 0x5DE6, 0x4F50, 0x67DE, 0x505A, 0x4F5C, 0x5750, 0x5EA7, 0xE810, 0xE811, 0xE812, 0xE813, 0xE814, // GB 0xD840..0xD87E 0x8C38, 0x8C39, 0x8C3A, 0x8C3B, 0x8C3C, 0x8C3D, 0x8C3E, 0x8C3F, 0x8C40, 0x8C42, 0x8C43, 0x8C44, 0x8C45, 0x8C48, 0x8C4A, 0x8C4B, 0x8C4D, 0x8C4E, 0x8C4F, 0x8C50, 0x8C51, 0x8C52, 0x8C53, 0x8C54, 0x8C56, 0x8C57, 0x8C58, 0x8C59, 0x8C5B, 0x8C5C, 0x8C5D, 0x8C5E, 0x8C5F, 0x8C60, 0x8C63, 0x8C64, 0x8C65, 0x8C66, 0x8C67, 0x8C68, 0x8C69, 0x8C6C, 0x8C6D, 0x8C6E, 0x8C6F, 0x8C70, 0x8C71, 0x8C72, 0x8C74, 0x8C75, 0x8C76, 0x8C77, 0x8C7B, 0x8C7C, 0x8C7D, 0x8C7E, 0x8C7F, 0x8C80, 0x8C81, 0x8C83, 0x8C84, 0x8C86, 0x8C87, // GB 0xD880..0xD8FE 0x8C88, 0x8C8B, 0x8C8D, 0x8C8E, 0x8C8F, 0x8C90, 0x8C91, 0x8C92, 0x8C93, 0x8C95, 0x8C96, 0x8C97, 0x8C99, 0x8C9A, 0x8C9B, 0x8C9C, 0x8C9D, 0x8C9E, 0x8C9F, 0x8CA0, 0x8CA1, 0x8CA2, 0x8CA3, 0x8CA4, 0x8CA5, 0x8CA6, 0x8CA7, 0x8CA8, 0x8CA9, 0x8CAA, 0x8CAB, 0x8CAC, 0x8CAD, 0x4E8D, 0x4E0C, 0x5140, 0x4E10, 0x5EFF, 0x5345, 0x4E15, 0x4E98, 0x4E1E, 0x9B32, 0x5B6C, 0x5669, 0x4E28, 0x79BA, 0x4E3F, 0x5315, 0x4E47, 0x592D, 0x723B, 0x536E, 0x6C10, 0x56DF, 0x80E4, 0x9997, 0x6BD3, 0x777E, 0x9F17, 0x4E36, 0x4E9F, 0x9F10, 0x4E5C, 0x4E69, 0x4E93, 0x8288, 0x5B5B, 0x556C, 0x560F, 0x4EC4, 0x538D, 0x539D, 0x53A3, 0x53A5, 0x53AE, 0x9765, 0x8D5D, 0x531A, 0x53F5, 0x5326, 0x532E, 0x533E, 0x8D5C, 0x5366, 0x5363, 0x5202, 0x5208, 0x520E, 0x522D, 0x5233, 0x523F, 0x5240, 0x524C, 0x525E, 0x5261, 0x525C, 0x84AF, 0x527D, 0x5282, 0x5281, 0x5290, 0x5293, 0x5182, 0x7F54, 0x4EBB, 0x4EC3, 0x4EC9, 0x4EC2, 0x4EE8, 0x4EE1, 0x4EEB, 0x4EDE, 0x4F1B, 0x4EF3, 0x4F22, 0x4F64, 0x4EF5, 0x4F25, 0x4F27, 0x4F09, 0x4F2B, 0x4F5E, 0x4F67, 0x6538, 0x4F5A, 0x4F5D, // GB 0xD940..0xD97E 0x8CAE, 0x8CAF, 0x8CB0, 0x8CB1, 0x8CB2, 0x8CB3, 0x8CB4, 0x8CB5, 0x8CB6, 0x8CB7, 0x8CB8, 0x8CB9, 0x8CBA, 0x8CBB, 0x8CBC, 0x8CBD, 0x8CBE, 0x8CBF, 0x8CC0, 0x8CC1, 0x8CC2, 0x8CC3, 0x8CC4, 0x8CC5, 0x8CC6, 0x8CC7, 0x8CC8, 0x8CC9, 0x8CCA, 0x8CCB, 0x8CCC, 0x8CCD, 0x8CCE, 0x8CCF, 0x8CD0, 0x8CD1, 0x8CD2, 0x8CD3, 0x8CD4, 0x8CD5, 0x8CD6, 0x8CD7, 0x8CD8, 0x8CD9, 0x8CDA, 0x8CDB, 0x8CDC, 0x8CDD, 0x8CDE, 0x8CDF, 0x8CE0, 0x8CE1, 0x8CE2, 0x8CE3, 0x8CE4, 0x8CE5, 0x8CE6, 0x8CE7, 0x8CE8, 0x8CE9, 0x8CEA, 0x8CEB, 0x8CEC, // GB 0xD980..0xD9FE 0x8CED, 0x8CEE, 0x8CEF, 0x8CF0, 0x8CF1, 0x8CF2, 0x8CF3, 0x8CF4, 0x8CF5, 0x8CF6, 0x8CF7, 0x8CF8, 0x8CF9, 0x8CFA, 0x8CFB, 0x8CFC, 0x8CFD, 0x8CFE, 0x8CFF, 0x8D00, 0x8D01, 0x8D02, 0x8D03, 0x8D04, 0x8D05, 0x8D06, 0x8D07, 0x8D08, 0x8D09, 0x8D0A, 0x8D0B, 0x8D0C, 0x8D0D, 0x4F5F, 0x4F57, 0x4F32, 0x4F3D, 0x4F76, 0x4F74, 0x4F91, 0x4F89, 0x4F83, 0x4F8F, 0x4F7E, 0x4F7B, 0x4FAA, 0x4F7C, 0x4FAC, 0x4F94, 0x4FE6, 0x4FE8, 0x4FEA, 0x4FC5, 0x4FDA, 0x4FE3, 0x4FDC, 0x4FD1, 0x4FDF, 0x4FF8, 0x5029, 0x504C, 0x4FF3, 0x502C, 0x500F, 0x502E, 0x502D, 0x4FFE, 0x501C, 0x500C, 0x5025, 0x5028, 0x507E, 0x5043, 0x5055, 0x5048, 0x504E, 0x506C, 0x507B, 0x50A5, 0x50A7, 0x50A9, 0x50BA, 0x50D6, 0x5106, 0x50ED, 0x50EC, 0x50E6, 0x50EE, 0x5107, 0x510B, 0x4EDD, 0x6C3D, 0x4F58, 0x4F65, 0x4FCE, 0x9FA0, 0x6C46, 0x7C74, 0x516E, 0x5DFD, 0x9EC9, 0x9998, 0x5181, 0x5914, 0x52F9, 0x530D, 0x8A07, 0x5310, 0x51EB, 0x5919, 0x5155, 0x4EA0, 0x5156, 0x4EB3, 0x886E, 0x88A4, 0x4EB5, 0x8114, 0x88D2, 0x7980, 0x5B34, 0x8803, 0x7FB8, 0x51AB, 0x51B1, 0x51BD, 0x51BC, // GB 0xDA40..0xDA7E 0x8D0E, 0x8D0F, 0x8D10, 0x8D11, 0x8D12, 0x8D13, 0x8D14, 0x8D15, 0x8D16, 0x8D17, 0x8D18, 0x8D19, 0x8D1A, 0x8D1B, 0x8D1C, 0x8D20, 0x8D51, 0x8D52, 0x8D57, 0x8D5F, 0x8D65, 0x8D68, 0x8D69, 0x8D6A, 0x8D6C, 0x8D6E, 0x8D6F, 0x8D71, 0x8D72, 0x8D78, 0x8D79, 0x8D7A, 0x8D7B, 0x8D7C, 0x8D7D, 0x8D7E, 0x8D7F, 0x8D80, 0x8D82, 0x8D83, 0x8D86, 0x8D87, 0x8D88, 0x8D89, 0x8D8C, 0x8D8D, 0x8D8E, 0x8D8F, 0x8D90, 0x8D92, 0x8D93, 0x8D95, 0x8D96, 0x8D97, 0x8D98, 0x8D99, 0x8D9A, 0x8D9B, 0x8D9C, 0x8D9D, 0x8D9E, 0x8DA0, 0x8DA1, // GB 0xDA80..0xDAFE 0x8DA2, 0x8DA4, 0x8DA5, 0x8DA6, 0x8DA7, 0x8DA8, 0x8DA9, 0x8DAA, 0x8DAB, 0x8DAC, 0x8DAD, 0x8DAE, 0x8DAF, 0x8DB0, 0x8DB2, 0x8DB6, 0x8DB7, 0x8DB9, 0x8DBB, 0x8DBD, 0x8DC0, 0x8DC1, 0x8DC2, 0x8DC5, 0x8DC7, 0x8DC8, 0x8DC9, 0x8DCA, 0x8DCD, 0x8DD0, 0x8DD2, 0x8DD3, 0x8DD4, 0x51C7, 0x5196, 0x51A2, 0x51A5, 0x8BA0, 0x8BA6, 0x8BA7, 0x8BAA, 0x8BB4, 0x8BB5, 0x8BB7, 0x8BC2, 0x8BC3, 0x8BCB, 0x8BCF, 0x8BCE, 0x8BD2, 0x8BD3, 0x8BD4, 0x8BD6, 0x8BD8, 0x8BD9, 0x8BDC, 0x8BDF, 0x8BE0, 0x8BE4, 0x8BE8, 0x8BE9, 0x8BEE, 0x8BF0, 0x8BF3, 0x8BF6, 0x8BF9, 0x8BFC, 0x8BFF, 0x8C00, 0x8C02, 0x8C04, 0x8C07, 0x8C0C, 0x8C0F, 0x8C11, 0x8C12, 0x8C14, 0x8C15, 0x8C16, 0x8C19, 0x8C1B, 0x8C18, 0x8C1D, 0x8C1F, 0x8C20, 0x8C21, 0x8C25, 0x8C27, 0x8C2A, 0x8C2B, 0x8C2E, 0x8C2F, 0x8C32, 0x8C33, 0x8C35, 0x8C36, 0x5369, 0x537A, 0x961D, 0x9622, 0x9621, 0x9631, 0x962A, 0x963D, 0x963C, 0x9642, 0x9649, 0x9654, 0x965F, 0x9667, 0x966C, 0x9672, 0x9674, 0x9688, 0x968D, 0x9697, 0x96B0, 0x9097, 0x909B, 0x909D, 0x9099, 0x90AC, 0x90A1, 0x90B4, 0x90B3, 0x90B6, 0x90BA, // GB 0xDB40..0xDB7E 0x8DD5, 0x8DD8, 0x8DD9, 0x8DDC, 0x8DE0, 0x8DE1, 0x8DE2, 0x8DE5, 0x8DE6, 0x8DE7, 0x8DE9, 0x8DED, 0x8DEE, 0x8DF0, 0x8DF1, 0x8DF2, 0x8DF4, 0x8DF6, 0x8DFC, 0x8DFE, 0x8DFF, 0x8E00, 0x8E01, 0x8E02, 0x8E03, 0x8E04, 0x8E06, 0x8E07, 0x8E08, 0x8E0B, 0x8E0D, 0x8E0E, 0x8E10, 0x8E11, 0x8E12, 0x8E13, 0x8E15, 0x8E16, 0x8E17, 0x8E18, 0x8E19, 0x8E1A, 0x8E1B, 0x8E1C, 0x8E20, 0x8E21, 0x8E24, 0x8E25, 0x8E26, 0x8E27, 0x8E28, 0x8E2B, 0x8E2D, 0x8E30, 0x8E32, 0x8E33, 0x8E34, 0x8E36, 0x8E37, 0x8E38, 0x8E3B, 0x8E3C, 0x8E3E, // GB 0xDB80..0xDBFE 0x8E3F, 0x8E43, 0x8E45, 0x8E46, 0x8E4C, 0x8E4D, 0x8E4E, 0x8E4F, 0x8E50, 0x8E53, 0x8E54, 0x8E55, 0x8E56, 0x8E57, 0x8E58, 0x8E5A, 0x8E5B, 0x8E5C, 0x8E5D, 0x8E5E, 0x8E5F, 0x8E60, 0x8E61, 0x8E62, 0x8E63, 0x8E64, 0x8E65, 0x8E67, 0x8E68, 0x8E6A, 0x8E6B, 0x8E6E, 0x8E71, 0x90B8, 0x90B0, 0x90CF, 0x90C5, 0x90BE, 0x90D0, 0x90C4, 0x90C7, 0x90D3, 0x90E6, 0x90E2, 0x90DC, 0x90D7, 0x90DB, 0x90EB, 0x90EF, 0x90FE, 0x9104, 0x9122, 0x911E, 0x9123, 0x9131, 0x912F, 0x9139, 0x9143, 0x9146, 0x520D, 0x5942, 0x52A2, 0x52AC, 0x52AD, 0x52BE, 0x54FF, 0x52D0, 0x52D6, 0x52F0, 0x53DF, 0x71EE, 0x77CD, 0x5EF4, 0x51F5, 0x51FC, 0x9B2F, 0x53B6, 0x5F01, 0x755A, 0x5DEF, 0x574C, 0x57A9, 0x57A1, 0x587E, 0x58BC, 0x58C5, 0x58D1, 0x5729, 0x572C, 0x572A, 0x5733, 0x5739, 0x572E, 0x572F, 0x575C, 0x573B, 0x5742, 0x5769, 0x5785, 0x576B, 0x5786, 0x577C, 0x577B, 0x5768, 0x576D, 0x5776, 0x5773, 0x57AD, 0x57A4, 0x578C, 0x57B2, 0x57CF, 0x57A7, 0x57B4, 0x5793, 0x57A0, 0x57D5, 0x57D8, 0x57DA, 0x57D9, 0x57D2, 0x57B8, 0x57F4, 0x57EF, 0x57F8, 0x57E4, 0x57DD, // GB 0xDC40..0xDC7E 0x8E73, 0x8E75, 0x8E77, 0x8E78, 0x8E79, 0x8E7A, 0x8E7B, 0x8E7D, 0x8E7E, 0x8E80, 0x8E82, 0x8E83, 0x8E84, 0x8E86, 0x8E88, 0x8E89, 0x8E8A, 0x8E8B, 0x8E8C, 0x8E8D, 0x8E8E, 0x8E91, 0x8E92, 0x8E93, 0x8E95, 0x8E96, 0x8E97, 0x8E98, 0x8E99, 0x8E9A, 0x8E9B, 0x8E9D, 0x8E9F, 0x8EA0, 0x8EA1, 0x8EA2, 0x8EA3, 0x8EA4, 0x8EA5, 0x8EA6, 0x8EA7, 0x8EA8, 0x8EA9, 0x8EAA, 0x8EAD, 0x8EAE, 0x8EB0, 0x8EB1, 0x8EB3, 0x8EB4, 0x8EB5, 0x8EB6, 0x8EB7, 0x8EB8, 0x8EB9, 0x8EBB, 0x8EBC, 0x8EBD, 0x8EBE, 0x8EBF, 0x8EC0, 0x8EC1, 0x8EC2, // GB 0xDC80..0xDCFE 0x8EC3, 0x8EC4, 0x8EC5, 0x8EC6, 0x8EC7, 0x8EC8, 0x8EC9, 0x8ECA, 0x8ECB, 0x8ECC, 0x8ECD, 0x8ECF, 0x8ED0, 0x8ED1, 0x8ED2, 0x8ED3, 0x8ED4, 0x8ED5, 0x8ED6, 0x8ED7, 0x8ED8, 0x8ED9, 0x8EDA, 0x8EDB, 0x8EDC, 0x8EDD, 0x8EDE, 0x8EDF, 0x8EE0, 0x8EE1, 0x8EE2, 0x8EE3, 0x8EE4, 0x580B, 0x580D, 0x57FD, 0x57ED, 0x5800, 0x581E, 0x5819, 0x5844, 0x5820, 0x5865, 0x586C, 0x5881, 0x5889, 0x589A, 0x5880, 0x99A8, 0x9F19, 0x61FF, 0x8279, 0x827D, 0x827F, 0x828F, 0x828A, 0x82A8, 0x8284, 0x828E, 0x8291, 0x8297, 0x8299, 0x82AB, 0x82B8, 0x82BE, 0x82B0, 0x82C8, 0x82CA, 0x82E3, 0x8298, 0x82B7, 0x82AE, 0x82CB, 0x82CC, 0x82C1, 0x82A9, 0x82B4, 0x82A1, 0x82AA, 0x829F, 0x82C4, 0x82CE, 0x82A4, 0x82E1, 0x8309, 0x82F7, 0x82E4, 0x830F, 0x8307, 0x82DC, 0x82F4, 0x82D2, 0x82D8, 0x830C, 0x82FB, 0x82D3, 0x8311, 0x831A, 0x8306, 0x8314, 0x8315, 0x82E0, 0x82D5, 0x831C, 0x8351, 0x835B, 0x835C, 0x8308, 0x8392, 0x833C, 0x8334, 0x8331, 0x839B, 0x835E, 0x832F, 0x834F, 0x8347, 0x8343, 0x835F, 0x8340, 0x8317, 0x8360, 0x832D, 0x833A, 0x8333, 0x8366, 0x8365, // GB 0xDD40..0xDD7E 0x8EE5, 0x8EE6, 0x8EE7, 0x8EE8, 0x8EE9, 0x8EEA, 0x8EEB, 0x8EEC, 0x8EED, 0x8EEE, 0x8EEF, 0x8EF0, 0x8EF1, 0x8EF2, 0x8EF3, 0x8EF4, 0x8EF5, 0x8EF6, 0x8EF7, 0x8EF8, 0x8EF9, 0x8EFA, 0x8EFB, 0x8EFC, 0x8EFD, 0x8EFE, 0x8EFF, 0x8F00, 0x8F01, 0x8F02, 0x8F03, 0x8F04, 0x8F05, 0x8F06, 0x8F07, 0x8F08, 0x8F09, 0x8F0A, 0x8F0B, 0x8F0C, 0x8F0D, 0x8F0E, 0x8F0F, 0x8F10, 0x8F11, 0x8F12, 0x8F13, 0x8F14, 0x8F15, 0x8F16, 0x8F17, 0x8F18, 0x8F19, 0x8F1A, 0x8F1B, 0x8F1C, 0x8F1D, 0x8F1E, 0x8F1F, 0x8F20, 0x8F21, 0x8F22, 0x8F23, // GB 0xDD80..0xDDFE 0x8F24, 0x8F25, 0x8F26, 0x8F27, 0x8F28, 0x8F29, 0x8F2A, 0x8F2B, 0x8F2C, 0x8F2D, 0x8F2E, 0x8F2F, 0x8F30, 0x8F31, 0x8F32, 0x8F33, 0x8F34, 0x8F35, 0x8F36, 0x8F37, 0x8F38, 0x8F39, 0x8F3A, 0x8F3B, 0x8F3C, 0x8F3D, 0x8F3E, 0x8F3F, 0x8F40, 0x8F41, 0x8F42, 0x8F43, 0x8F44, 0x8368, 0x831B, 0x8369, 0x836C, 0x836A, 0x836D, 0x836E, 0x83B0, 0x8378, 0x83B3, 0x83B4, 0x83A0, 0x83AA, 0x8393, 0x839C, 0x8385, 0x837C, 0x83B6, 0x83A9, 0x837D, 0x83B8, 0x837B, 0x8398, 0x839E, 0x83A8, 0x83BA, 0x83BC, 0x83C1, 0x8401, 0x83E5, 0x83D8, 0x5807, 0x8418, 0x840B, 0x83DD, 0x83FD, 0x83D6, 0x841C, 0x8438, 0x8411, 0x8406, 0x83D4, 0x83DF, 0x840F, 0x8403, 0x83F8, 0x83F9, 0x83EA, 0x83C5, 0x83C0, 0x8426, 0x83F0, 0x83E1, 0x845C, 0x8451, 0x845A, 0x8459, 0x8473, 0x8487, 0x8488, 0x847A, 0x8489, 0x8478, 0x843C, 0x8446, 0x8469, 0x8476, 0x848C, 0x848E, 0x8431, 0x846D, 0x84C1, 0x84CD, 0x84D0, 0x84E6, 0x84BD, 0x84D3, 0x84CA, 0x84BF, 0x84BA, 0x84E0, 0x84A1, 0x84B9, 0x84B4, 0x8497, 0x84E5, 0x84E3, 0x850C, 0x750D, 0x8538, 0x84F0, 0x8539, 0x851F, 0x853A, // GB 0xDE40..0xDE7E 0x8F45, 0x8F46, 0x8F47, 0x8F48, 0x8F49, 0x8F4A, 0x8F4B, 0x8F4C, 0x8F4D, 0x8F4E, 0x8F4F, 0x8F50, 0x8F51, 0x8F52, 0x8F53, 0x8F54, 0x8F55, 0x8F56, 0x8F57, 0x8F58, 0x8F59, 0x8F5A, 0x8F5B, 0x8F5C, 0x8F5D, 0x8F5E, 0x8F5F, 0x8F60, 0x8F61, 0x8F62, 0x8F63, 0x8F64, 0x8F65, 0x8F6A, 0x8F80, 0x8F8C, 0x8F92, 0x8F9D, 0x8FA0, 0x8FA1, 0x8FA2, 0x8FA4, 0x8FA5, 0x8FA6, 0x8FA7, 0x8FAA, 0x8FAC, 0x8FAD, 0x8FAE, 0x8FAF, 0x8FB2, 0x8FB3, 0x8FB4, 0x8FB5, 0x8FB7, 0x8FB8, 0x8FBA, 0x8FBB, 0x8FBC, 0x8FBF, 0x8FC0, 0x8FC3, 0x8FC6, // GB 0xDE80..0xDEFE 0x8FC9, 0x8FCA, 0x8FCB, 0x8FCC, 0x8FCD, 0x8FCF, 0x8FD2, 0x8FD6, 0x8FD7, 0x8FDA, 0x8FE0, 0x8FE1, 0x8FE3, 0x8FE7, 0x8FEC, 0x8FEF, 0x8FF1, 0x8FF2, 0x8FF4, 0x8FF5, 0x8FF6, 0x8FFA, 0x8FFB, 0x8FFC, 0x8FFE, 0x8FFF, 0x9007, 0x9008, 0x900C, 0x900E, 0x9013, 0x9015, 0x9018, 0x8556, 0x853B, 0x84FF, 0x84FC, 0x8559, 0x8548, 0x8568, 0x8564, 0x855E, 0x857A, 0x77A2, 0x8543, 0x8572, 0x857B, 0x85A4, 0x85A8, 0x8587, 0x858F, 0x8579, 0x85AE, 0x859C, 0x8585, 0x85B9, 0x85B7, 0x85B0, 0x85D3, 0x85C1, 0x85DC, 0x85FF, 0x8627, 0x8605, 0x8629, 0x8616, 0x863C, 0x5EFE, 0x5F08, 0x593C, 0x5941, 0x8037, 0x5955, 0x595A, 0x5958, 0x530F, 0x5C22, 0x5C25, 0x5C2C, 0x5C34, 0x624C, 0x626A, 0x629F, 0x62BB, 0x62CA, 0x62DA, 0x62D7, 0x62EE, 0x6322, 0x62F6, 0x6339, 0x634B, 0x6343, 0x63AD, 0x63F6, 0x6371, 0x637A, 0x638E, 0x63B4, 0x636D, 0x63AC, 0x638A, 0x6369, 0x63AE, 0x63BC, 0x63F2, 0x63F8, 0x63E0, 0x63FF, 0x63C4, 0x63DE, 0x63CE, 0x6452, 0x63C6, 0x63BE, 0x6445, 0x6441, 0x640B, 0x641B, 0x6420, 0x640C, 0x6426, 0x6421, 0x645E, 0x6484, 0x646D, 0x6496, // GB 0xDF40..0xDF7E 0x9019, 0x901C, 0x9023, 0x9024, 0x9025, 0x9027, 0x9028, 0x9029, 0x902A, 0x902B, 0x902C, 0x9030, 0x9031, 0x9032, 0x9033, 0x9034, 0x9037, 0x9039, 0x903A, 0x903D, 0x903F, 0x9040, 0x9043, 0x9045, 0x9046, 0x9048, 0x9049, 0x904A, 0x904B, 0x904C, 0x904E, 0x9054, 0x9055, 0x9056, 0x9059, 0x905A, 0x905C, 0x905D, 0x905E, 0x905F, 0x9060, 0x9061, 0x9064, 0x9066, 0x9067, 0x9069, 0x906A, 0x906B, 0x906C, 0x906F, 0x9070, 0x9071, 0x9072, 0x9073, 0x9076, 0x9077, 0x9078, 0x9079, 0x907A, 0x907B, 0x907C, 0x907E, 0x9081, // GB 0xDF80..0xDFFE 0x9084, 0x9085, 0x9086, 0x9087, 0x9089, 0x908A, 0x908C, 0x908D, 0x908E, 0x908F, 0x9090, 0x9092, 0x9094, 0x9096, 0x9098, 0x909A, 0x909C, 0x909E, 0x909F, 0x90A0, 0x90A4, 0x90A5, 0x90A7, 0x90A8, 0x90A9, 0x90AB, 0x90AD, 0x90B2, 0x90B7, 0x90BC, 0x90BD, 0x90BF, 0x90C0, 0x647A, 0x64B7, 0x64B8, 0x6499, 0x64BA, 0x64C0, 0x64D0, 0x64D7, 0x64E4, 0x64E2, 0x6509, 0x6525, 0x652E, 0x5F0B, 0x5FD2, 0x7519, 0x5F11, 0x535F, 0x53F1, 0x53FD, 0x53E9, 0x53E8, 0x53FB, 0x5412, 0x5416, 0x5406, 0x544B, 0x5452, 0x5453, 0x5454, 0x5456, 0x5443, 0x5421, 0x5457, 0x5459, 0x5423, 0x5432, 0x5482, 0x5494, 0x5477, 0x5471, 0x5464, 0x549A, 0x549B, 0x5484, 0x5476, 0x5466, 0x549D, 0x54D0, 0x54AD, 0x54C2, 0x54B4, 0x54D2, 0x54A7, 0x54A6, 0x54D3, 0x54D4, 0x5472, 0x54A3, 0x54D5, 0x54BB, 0x54BF, 0x54CC, 0x54D9, 0x54DA, 0x54DC, 0x54A9, 0x54AA, 0x54A4, 0x54DD, 0x54CF, 0x54DE, 0x551B, 0x54E7, 0x5520, 0x54FD, 0x5514, 0x54F3, 0x5522, 0x5523, 0x550F, 0x5511, 0x5527, 0x552A, 0x5567, 0x558F, 0x55B5, 0x5549, 0x556D, 0x5541, 0x5555, 0x553F, 0x5550, 0x553C, // GB 0xE040..0xE07E 0x90C2, 0x90C3, 0x90C6, 0x90C8, 0x90C9, 0x90CB, 0x90CC, 0x90CD, 0x90D2, 0x90D4, 0x90D5, 0x90D6, 0x90D8, 0x90D9, 0x90DA, 0x90DE, 0x90DF, 0x90E0, 0x90E3, 0x90E4, 0x90E5, 0x90E9, 0x90EA, 0x90EC, 0x90EE, 0x90F0, 0x90F1, 0x90F2, 0x90F3, 0x90F5, 0x90F6, 0x90F7, 0x90F9, 0x90FA, 0x90FB, 0x90FC, 0x90FF, 0x9100, 0x9101, 0x9103, 0x9105, 0x9106, 0x9107, 0x9108, 0x9109, 0x910A, 0x910B, 0x910C, 0x910D, 0x910E, 0x910F, 0x9110, 0x9111, 0x9112, 0x9113, 0x9114, 0x9115, 0x9116, 0x9117, 0x9118, 0x911A, 0x911B, 0x911C, // GB 0xE080..0xE0FE 0x911D, 0x911F, 0x9120, 0x9121, 0x9124, 0x9125, 0x9126, 0x9127, 0x9128, 0x9129, 0x912A, 0x912B, 0x912C, 0x912D, 0x912E, 0x9130, 0x9132, 0x9133, 0x9134, 0x9135, 0x9136, 0x9137, 0x9138, 0x913A, 0x913B, 0x913C, 0x913D, 0x913E, 0x913F, 0x9140, 0x9141, 0x9142, 0x9144, 0x5537, 0x5556, 0x5575, 0x5576, 0x5577, 0x5533, 0x5530, 0x555C, 0x558B, 0x55D2, 0x5583, 0x55B1, 0x55B9, 0x5588, 0x5581, 0x559F, 0x557E, 0x55D6, 0x5591, 0x557B, 0x55DF, 0x55BD, 0x55BE, 0x5594, 0x5599, 0x55EA, 0x55F7, 0x55C9, 0x561F, 0x55D1, 0x55EB, 0x55EC, 0x55D4, 0x55E6, 0x55DD, 0x55C4, 0x55EF, 0x55E5, 0x55F2, 0x55F3, 0x55CC, 0x55CD, 0x55E8, 0x55F5, 0x55E4, 0x8F94, 0x561E, 0x5608, 0x560C, 0x5601, 0x5624, 0x5623, 0x55FE, 0x5600, 0x5627, 0x562D, 0x5658, 0x5639, 0x5657, 0x562C, 0x564D, 0x5662, 0x5659, 0x565C, 0x564C, 0x5654, 0x5686, 0x5664, 0x5671, 0x566B, 0x567B, 0x567C, 0x5685, 0x5693, 0x56AF, 0x56D4, 0x56D7, 0x56DD, 0x56E1, 0x56F5, 0x56EB, 0x56F9, 0x56FF, 0x5704, 0x570A, 0x5709, 0x571C, 0x5E0F, 0x5E19, 0x5E14, 0x5E11, 0x5E31, 0x5E3B, 0x5E3C, // GB 0xE140..0xE17E 0x9145, 0x9147, 0x9148, 0x9151, 0x9153, 0x9154, 0x9155, 0x9156, 0x9158, 0x9159, 0x915B, 0x915C, 0x915F, 0x9160, 0x9166, 0x9167, 0x9168, 0x916B, 0x916D, 0x9173, 0x917A, 0x917B, 0x917C, 0x9180, 0x9181, 0x9182, 0x9183, 0x9184, 0x9186, 0x9188, 0x918A, 0x918E, 0x918F, 0x9193, 0x9194, 0x9195, 0x9196, 0x9197, 0x9198, 0x9199, 0x919C, 0x919D, 0x919E, 0x919F, 0x91A0, 0x91A1, 0x91A4, 0x91A5, 0x91A6, 0x91A7, 0x91A8, 0x91A9, 0x91AB, 0x91AC, 0x91B0, 0x91B1, 0x91B2, 0x91B3, 0x91B6, 0x91B7, 0x91B8, 0x91B9, 0x91BB, // GB 0xE180..0xE1FE 0x91BC, 0x91BD, 0x91BE, 0x91BF, 0x91C0, 0x91C1, 0x91C2, 0x91C3, 0x91C4, 0x91C5, 0x91C6, 0x91C8, 0x91CB, 0x91D0, 0x91D2, 0x91D3, 0x91D4, 0x91D5, 0x91D6, 0x91D7, 0x91D8, 0x91D9, 0x91DA, 0x91DB, 0x91DD, 0x91DE, 0x91DF, 0x91E0, 0x91E1, 0x91E2, 0x91E3, 0x91E4, 0x91E5, 0x5E37, 0x5E44, 0x5E54, 0x5E5B, 0x5E5E, 0x5E61, 0x5C8C, 0x5C7A, 0x5C8D, 0x5C90, 0x5C96, 0x5C88, 0x5C98, 0x5C99, 0x5C91, 0x5C9A, 0x5C9C, 0x5CB5, 0x5CA2, 0x5CBD, 0x5CAC, 0x5CAB, 0x5CB1, 0x5CA3, 0x5CC1, 0x5CB7, 0x5CC4, 0x5CD2, 0x5CE4, 0x5CCB, 0x5CE5, 0x5D02, 0x5D03, 0x5D27, 0x5D26, 0x5D2E, 0x5D24, 0x5D1E, 0x5D06, 0x5D1B, 0x5D58, 0x5D3E, 0x5D34, 0x5D3D, 0x5D6C, 0x5D5B, 0x5D6F, 0x5D5D, 0x5D6B, 0x5D4B, 0x5D4A, 0x5D69, 0x5D74, 0x5D82, 0x5D99, 0x5D9D, 0x8C73, 0x5DB7, 0x5DC5, 0x5F73, 0x5F77, 0x5F82, 0x5F87, 0x5F89, 0x5F8C, 0x5F95, 0x5F99, 0x5F9C, 0x5FA8, 0x5FAD, 0x5FB5, 0x5FBC, 0x8862, 0x5F61, 0x72AD, 0x72B0, 0x72B4, 0x72B7, 0x72B8, 0x72C3, 0x72C1, 0x72CE, 0x72CD, 0x72D2, 0x72E8, 0x72EF, 0x72E9, 0x72F2, 0x72F4, 0x72F7, 0x7301, 0x72F3, 0x7303, 0x72FA, // GB 0xE240..0xE27E 0x91E6, 0x91E7, 0x91E8, 0x91E9, 0x91EA, 0x91EB, 0x91EC, 0x91ED, 0x91EE, 0x91EF, 0x91F0, 0x91F1, 0x91F2, 0x91F3, 0x91F4, 0x91F5, 0x91F6, 0x91F7, 0x91F8, 0x91F9, 0x91FA, 0x91FB, 0x91FC, 0x91FD, 0x91FE, 0x91FF, 0x9200, 0x9201, 0x9202, 0x9203, 0x9204, 0x9205, 0x9206, 0x9207, 0x9208, 0x9209, 0x920A, 0x920B, 0x920C, 0x920D, 0x920E, 0x920F, 0x9210, 0x9211, 0x9212, 0x9213, 0x9214, 0x9215, 0x9216, 0x9217, 0x9218, 0x9219, 0x921A, 0x921B, 0x921C, 0x921D, 0x921E, 0x921F, 0x9220, 0x9221, 0x9222, 0x9223, 0x9224, // GB 0xE280..0xE2FE 0x9225, 0x9226, 0x9227, 0x9228, 0x9229, 0x922A, 0x922B, 0x922C, 0x922D, 0x922E, 0x922F, 0x9230, 0x9231, 0x9232, 0x9233, 0x9234, 0x9235, 0x9236, 0x9237, 0x9238, 0x9239, 0x923A, 0x923B, 0x923C, 0x923D, 0x923E, 0x923F, 0x9240, 0x9241, 0x9242, 0x9243, 0x9244, 0x9245, 0x72FB, 0x7317, 0x7313, 0x7321, 0x730A, 0x731E, 0x731D, 0x7315, 0x7322, 0x7339, 0x7325, 0x732C, 0x7338, 0x7331, 0x7350, 0x734D, 0x7357, 0x7360, 0x736C, 0x736F, 0x737E, 0x821B, 0x5925, 0x98E7, 0x5924, 0x5902, 0x9963, 0x9967, 0x9968, 0x9969, 0x996A, 0x996B, 0x996C, 0x9974, 0x9977, 0x997D, 0x9980, 0x9984, 0x9987, 0x998A, 0x998D, 0x9990, 0x9991, 0x9993, 0x9994, 0x9995, 0x5E80, 0x5E91, 0x5E8B, 0x5E96, 0x5EA5, 0x5EA0, 0x5EB9, 0x5EB5, 0x5EBE, 0x5EB3, 0x8D53, 0x5ED2, 0x5ED1, 0x5EDB, 0x5EE8, 0x5EEA, 0x81BA, 0x5FC4, 0x5FC9, 0x5FD6, 0x5FCF, 0x6003, 0x5FEE, 0x6004, 0x5FE1, 0x5FE4, 0x5FFE, 0x6005, 0x6006, 0x5FEA, 0x5FED, 0x5FF8, 0x6019, 0x6035, 0x6026, 0x601B, 0x600F, 0x600D, 0x6029, 0x602B, 0x600A, 0x603F, 0x6021, 0x6078, 0x6079, 0x607B, 0x607A, 0x6042, // GB 0xE340..0xE37E 0x9246, 0x9247, 0x9248, 0x9249, 0x924A, 0x924B, 0x924C, 0x924D, 0x924E, 0x924F, 0x9250, 0x9251, 0x9252, 0x9253, 0x9254, 0x9255, 0x9256, 0x9257, 0x9258, 0x9259, 0x925A, 0x925B, 0x925C, 0x925D, 0x925E, 0x925F, 0x9260, 0x9261, 0x9262, 0x9263, 0x9264, 0x9265, 0x9266, 0x9267, 0x9268, 0x9269, 0x926A, 0x926B, 0x926C, 0x926D, 0x926E, 0x926F, 0x9270, 0x9271, 0x9272, 0x9273, 0x9275, 0x9276, 0x9277, 0x9278, 0x9279, 0x927A, 0x927B, 0x927C, 0x927D, 0x927E, 0x927F, 0x9280, 0x9281, 0x9282, 0x9283, 0x9284, 0x9285, // GB 0xE380..0xE3FE 0x9286, 0x9287, 0x9288, 0x9289, 0x928A, 0x928B, 0x928C, 0x928D, 0x928F, 0x9290, 0x9291, 0x9292, 0x9293, 0x9294, 0x9295, 0x9296, 0x9297, 0x9298, 0x9299, 0x929A, 0x929B, 0x929C, 0x929D, 0x929E, 0x929F, 0x92A0, 0x92A1, 0x92A2, 0x92A3, 0x92A4, 0x92A5, 0x92A6, 0x92A7, 0x606A, 0x607D, 0x6096, 0x609A, 0x60AD, 0x609D, 0x6083, 0x6092, 0x608C, 0x609B, 0x60EC, 0x60BB, 0x60B1, 0x60DD, 0x60D8, 0x60C6, 0x60DA, 0x60B4, 0x6120, 0x6126, 0x6115, 0x6123, 0x60F4, 0x6100, 0x610E, 0x612B, 0x614A, 0x6175, 0x61AC, 0x6194, 0x61A7, 0x61B7, 0x61D4, 0x61F5, 0x5FDD, 0x96B3, 0x95E9, 0x95EB, 0x95F1, 0x95F3, 0x95F5, 0x95F6, 0x95FC, 0x95FE, 0x9603, 0x9604, 0x9606, 0x9608, 0x960A, 0x960B, 0x960C, 0x960D, 0x960F, 0x9612, 0x9615, 0x9616, 0x9617, 0x9619, 0x961A, 0x4E2C, 0x723F, 0x6215, 0x6C35, 0x6C54, 0x6C5C, 0x6C4A, 0x6CA3, 0x6C85, 0x6C90, 0x6C94, 0x6C8C, 0x6C68, 0x6C69, 0x6C74, 0x6C76, 0x6C86, 0x6CA9, 0x6CD0, 0x6CD4, 0x6CAD, 0x6CF7, 0x6CF8, 0x6CF1, 0x6CD7, 0x6CB2, 0x6CE0, 0x6CD6, 0x6CFA, 0x6CEB, 0x6CEE, 0x6CB1, 0x6CD3, 0x6CEF, 0x6CFE, // GB 0xE440..0xE47E 0x92A8, 0x92A9, 0x92AA, 0x92AB, 0x92AC, 0x92AD, 0x92AF, 0x92B0, 0x92B1, 0x92B2, 0x92B3, 0x92B4, 0x92B5, 0x92B6, 0x92B7, 0x92B8, 0x92B9, 0x92BA, 0x92BB, 0x92BC, 0x92BD, 0x92BE, 0x92BF, 0x92C0, 0x92C1, 0x92C2, 0x92C3, 0x92C4, 0x92C5, 0x92C6, 0x92C7, 0x92C9, 0x92CA, 0x92CB, 0x92CC, 0x92CD, 0x92CE, 0x92CF, 0x92D0, 0x92D1, 0x92D2, 0x92D3, 0x92D4, 0x92D5, 0x92D6, 0x92D7, 0x92D8, 0x92D9, 0x92DA, 0x92DB, 0x92DC, 0x92DD, 0x92DE, 0x92DF, 0x92E0, 0x92E1, 0x92E2, 0x92E3, 0x92E4, 0x92E5, 0x92E6, 0x92E7, 0x92E8, // GB 0xE480..0xE4FE 0x92E9, 0x92EA, 0x92EB, 0x92EC, 0x92ED, 0x92EE, 0x92EF, 0x92F0, 0x92F1, 0x92F2, 0x92F3, 0x92F4, 0x92F5, 0x92F6, 0x92F7, 0x92F8, 0x92F9, 0x92FA, 0x92FB, 0x92FC, 0x92FD, 0x92FE, 0x92FF, 0x9300, 0x9301, 0x9302, 0x9303, 0x9304, 0x9305, 0x9306, 0x9307, 0x9308, 0x9309, 0x6D39, 0x6D27, 0x6D0C, 0x6D43, 0x6D48, 0x6D07, 0x6D04, 0x6D19, 0x6D0E, 0x6D2B, 0x6D4D, 0x6D2E, 0x6D35, 0x6D1A, 0x6D4F, 0x6D52, 0x6D54, 0x6D33, 0x6D91, 0x6D6F, 0x6D9E, 0x6DA0, 0x6D5E, 0x6D93, 0x6D94, 0x6D5C, 0x6D60, 0x6D7C, 0x6D63, 0x6E1A, 0x6DC7, 0x6DC5, 0x6DDE, 0x6E0E, 0x6DBF, 0x6DE0, 0x6E11, 0x6DE6, 0x6DDD, 0x6DD9, 0x6E16, 0x6DAB, 0x6E0C, 0x6DAE, 0x6E2B, 0x6E6E, 0x6E4E, 0x6E6B, 0x6EB2, 0x6E5F, 0x6E86, 0x6E53, 0x6E54, 0x6E32, 0x6E25, 0x6E44, 0x6EDF, 0x6EB1, 0x6E98, 0x6EE0, 0x6F2D, 0x6EE2, 0x6EA5, 0x6EA7, 0x6EBD, 0x6EBB, 0x6EB7, 0x6ED7, 0x6EB4, 0x6ECF, 0x6E8F, 0x6EC2, 0x6E9F, 0x6F62, 0x6F46, 0x6F47, 0x6F24, 0x6F15, 0x6EF9, 0x6F2F, 0x6F36, 0x6F4B, 0x6F74, 0x6F2A, 0x6F09, 0x6F29, 0x6F89, 0x6F8D, 0x6F8C, 0x6F78, 0x6F72, 0x6F7C, 0x6F7A, 0x6FD1, // GB 0xE540..0xE57E 0x930A, 0x930B, 0x930C, 0x930D, 0x930E, 0x930F, 0x9310, 0x9311, 0x9312, 0x9313, 0x9314, 0x9315, 0x9316, 0x9317, 0x9318, 0x9319, 0x931A, 0x931B, 0x931C, 0x931D, 0x931E, 0x931F, 0x9320, 0x9321, 0x9322, 0x9323, 0x9324, 0x9325, 0x9326, 0x9327, 0x9328, 0x9329, 0x932A, 0x932B, 0x932C, 0x932D, 0x932E, 0x932F, 0x9330, 0x9331, 0x9332, 0x9333, 0x9334, 0x9335, 0x9336, 0x9337, 0x9338, 0x9339, 0x933A, 0x933B, 0x933C, 0x933D, 0x933F, 0x9340, 0x9341, 0x9342, 0x9343, 0x9344, 0x9345, 0x9346, 0x9347, 0x9348, 0x9349, // GB 0xE580..0xE5FE 0x934A, 0x934B, 0x934C, 0x934D, 0x934E, 0x934F, 0x9350, 0x9351, 0x9352, 0x9353, 0x9354, 0x9355, 0x9356, 0x9357, 0x9358, 0x9359, 0x935A, 0x935B, 0x935C, 0x935D, 0x935E, 0x935F, 0x9360, 0x9361, 0x9362, 0x9363, 0x9364, 0x9365, 0x9366, 0x9367, 0x9368, 0x9369, 0x936B, 0x6FC9, 0x6FA7, 0x6FB9, 0x6FB6, 0x6FC2, 0x6FE1, 0x6FEE, 0x6FDE, 0x6FE0, 0x6FEF, 0x701A, 0x7023, 0x701B, 0x7039, 0x7035, 0x704F, 0x705E, 0x5B80, 0x5B84, 0x5B95, 0x5B93, 0x5BA5, 0x5BB8, 0x752F, 0x9A9E, 0x6434, 0x5BE4, 0x5BEE, 0x8930, 0x5BF0, 0x8E47, 0x8B07, 0x8FB6, 0x8FD3, 0x8FD5, 0x8FE5, 0x8FEE, 0x8FE4, 0x8FE9, 0x8FE6, 0x8FF3, 0x8FE8, 0x9005, 0x9004, 0x900B, 0x9026, 0x9011, 0x900D, 0x9016, 0x9021, 0x9035, 0x9036, 0x902D, 0x902F, 0x9044, 0x9051, 0x9052, 0x9050, 0x9068, 0x9058, 0x9062, 0x905B, 0x66B9, 0x9074, 0x907D, 0x9082, 0x9088, 0x9083, 0x908B, 0x5F50, 0x5F57, 0x5F56, 0x5F58, 0x5C3B, 0x54AB, 0x5C50, 0x5C59, 0x5B71, 0x5C63, 0x5C66, 0x7FBC, 0x5F2A, 0x5F29, 0x5F2D, 0x8274, 0x5F3C, 0x9B3B, 0x5C6E, 0x5981, 0x5983, 0x598D, 0x59A9, 0x59AA, 0x59A3, // GB 0xE640..0xE67E 0x936C, 0x936D, 0x936E, 0x936F, 0x9370, 0x9371, 0x9372, 0x9373, 0x9374, 0x9375, 0x9376, 0x9377, 0x9378, 0x9379, 0x937A, 0x937B, 0x937C, 0x937D, 0x937E, 0x937F, 0x9380, 0x9381, 0x9382, 0x9383, 0x9384, 0x9385, 0x9386, 0x9387, 0x9388, 0x9389, 0x938A, 0x938B, 0x938C, 0x938D, 0x938E, 0x9390, 0x9391, 0x9392, 0x9393, 0x9394, 0x9395, 0x9396, 0x9397, 0x9398, 0x9399, 0x939A, 0x939B, 0x939C, 0x939D, 0x939E, 0x939F, 0x93A0, 0x93A1, 0x93A2, 0x93A3, 0x93A4, 0x93A5, 0x93A6, 0x93A7, 0x93A8, 0x93A9, 0x93AA, 0x93AB, // GB 0xE680..0xE6FE 0x93AC, 0x93AD, 0x93AE, 0x93AF, 0x93B0, 0x93B1, 0x93B2, 0x93B3, 0x93B4, 0x93B5, 0x93B6, 0x93B7, 0x93B8, 0x93B9, 0x93BA, 0x93BB, 0x93BC, 0x93BD, 0x93BE, 0x93BF, 0x93C0, 0x93C1, 0x93C2, 0x93C3, 0x93C4, 0x93C5, 0x93C6, 0x93C7, 0x93C8, 0x93C9, 0x93CB, 0x93CC, 0x93CD, 0x5997, 0x59CA, 0x59AB, 0x599E, 0x59A4, 0x59D2, 0x59B2, 0x59AF, 0x59D7, 0x59BE, 0x5A05, 0x5A06, 0x59DD, 0x5A08, 0x59E3, 0x59D8, 0x59F9, 0x5A0C, 0x5A09, 0x5A32, 0x5A34, 0x5A11, 0x5A23, 0x5A13, 0x5A40, 0x5A67, 0x5A4A, 0x5A55, 0x5A3C, 0x5A62, 0x5A75, 0x80EC, 0x5AAA, 0x5A9B, 0x5A77, 0x5A7A, 0x5ABE, 0x5AEB, 0x5AB2, 0x5AD2, 0x5AD4, 0x5AB8, 0x5AE0, 0x5AE3, 0x5AF1, 0x5AD6, 0x5AE6, 0x5AD8, 0x5ADC, 0x5B09, 0x5B17, 0x5B16, 0x5B32, 0x5B37, 0x5B40, 0x5C15, 0x5C1C, 0x5B5A, 0x5B65, 0x5B73, 0x5B51, 0x5B53, 0x5B62, 0x9A75, 0x9A77, 0x9A78, 0x9A7A, 0x9A7F, 0x9A7D, 0x9A80, 0x9A81, 0x9A85, 0x9A88, 0x9A8A, 0x9A90, 0x9A92, 0x9A93, 0x9A96, 0x9A98, 0x9A9B, 0x9A9C, 0x9A9D, 0x9A9F, 0x9AA0, 0x9AA2, 0x9AA3, 0x9AA5, 0x9AA7, 0x7E9F, 0x7EA1, 0x7EA3, 0x7EA5, 0x7EA8, 0x7EA9, // GB 0xE740..0xE77E 0x93CE, 0x93CF, 0x93D0, 0x93D1, 0x93D2, 0x93D3, 0x93D4, 0x93D5, 0x93D7, 0x93D8, 0x93D9, 0x93DA, 0x93DB, 0x93DC, 0x93DD, 0x93DE, 0x93DF, 0x93E0, 0x93E1, 0x93E2, 0x93E3, 0x93E4, 0x93E5, 0x93E6, 0x93E7, 0x93E8, 0x93E9, 0x93EA, 0x93EB, 0x93EC, 0x93ED, 0x93EE, 0x93EF, 0x93F0, 0x93F1, 0x93F2, 0x93F3, 0x93F4, 0x93F5, 0x93F6, 0x93F7, 0x93F8, 0x93F9, 0x93FA, 0x93FB, 0x93FC, 0x93FD, 0x93FE, 0x93FF, 0x9400, 0x9401, 0x9402, 0x9403, 0x9404, 0x9405, 0x9406, 0x9407, 0x9408, 0x9409, 0x940A, 0x940B, 0x940C, 0x940D, // GB 0xE780..0xE7FE 0x940E, 0x940F, 0x9410, 0x9411, 0x9412, 0x9413, 0x9414, 0x9415, 0x9416, 0x9417, 0x9418, 0x9419, 0x941A, 0x941B, 0x941C, 0x941D, 0x941E, 0x941F, 0x9420, 0x9421, 0x9422, 0x9423, 0x9424, 0x9425, 0x9426, 0x9427, 0x9428, 0x9429, 0x942A, 0x942B, 0x942C, 0x942D, 0x942E, 0x7EAD, 0x7EB0, 0x7EBE, 0x7EC0, 0x7EC1, 0x7EC2, 0x7EC9, 0x7ECB, 0x7ECC, 0x7ED0, 0x7ED4, 0x7ED7, 0x7EDB, 0x7EE0, 0x7EE1, 0x7EE8, 0x7EEB, 0x7EEE, 0x7EEF, 0x7EF1, 0x7EF2, 0x7F0D, 0x7EF6, 0x7EFA, 0x7EFB, 0x7EFE, 0x7F01, 0x7F02, 0x7F03, 0x7F07, 0x7F08, 0x7F0B, 0x7F0C, 0x7F0F, 0x7F11, 0x7F12, 0x7F17, 0x7F19, 0x7F1C, 0x7F1B, 0x7F1F, 0x7F21, 0x7F22, 0x7F23, 0x7F24, 0x7F25, 0x7F26, 0x7F27, 0x7F2A, 0x7F2B, 0x7F2C, 0x7F2D, 0x7F2F, 0x7F30, 0x7F31, 0x7F32, 0x7F33, 0x7F35, 0x5E7A, 0x757F, 0x5DDB, 0x753E, 0x9095, 0x738E, 0x7391, 0x73AE, 0x73A2, 0x739F, 0x73CF, 0x73C2, 0x73D1, 0x73B7, 0x73B3, 0x73C0, 0x73C9, 0x73C8, 0x73E5, 0x73D9, 0x987C, 0x740A, 0x73E9, 0x73E7, 0x73DE, 0x73BA, 0x73F2, 0x740F, 0x742A, 0x745B, 0x7426, 0x7425, 0x7428, 0x7430, 0x742E, 0x742C, // GB 0xE840..0xE87E 0x942F, 0x9430, 0x9431, 0x9432, 0x9433, 0x9434, 0x9435, 0x9436, 0x9437, 0x9438, 0x9439, 0x943A, 0x943B, 0x943C, 0x943D, 0x943F, 0x9440, 0x9441, 0x9442, 0x9443, 0x9444, 0x9445, 0x9446, 0x9447, 0x9448, 0x9449, 0x944A, 0x944B, 0x944C, 0x944D, 0x944E, 0x944F, 0x9450, 0x9451, 0x9452, 0x9453, 0x9454, 0x9455, 0x9456, 0x9457, 0x9458, 0x9459, 0x945A, 0x945B, 0x945C, 0x945D, 0x945E, 0x945F, 0x9460, 0x9461, 0x9462, 0x9463, 0x9464, 0x9465, 0x9466, 0x9467, 0x9468, 0x9469, 0x946A, 0x946C, 0x946D, 0x946E, 0x946F, // GB 0xE880..0xE8FE 0x9470, 0x9471, 0x9472, 0x9473, 0x9474, 0x9475, 0x9476, 0x9477, 0x9478, 0x9479, 0x947A, 0x947B, 0x947C, 0x947D, 0x947E, 0x947F, 0x9480, 0x9481, 0x9482, 0x9483, 0x9484, 0x9491, 0x9496, 0x9498, 0x94C7, 0x94CF, 0x94D3, 0x94D4, 0x94DA, 0x94E6, 0x94FB, 0x951C, 0x9520, 0x741B, 0x741A, 0x7441, 0x745C, 0x7457, 0x7455, 0x7459, 0x7477, 0x746D, 0x747E, 0x749C, 0x748E, 0x7480, 0x7481, 0x7487, 0x748B, 0x749E, 0x74A8, 0x74A9, 0x7490, 0x74A7, 0x74D2, 0x74BA, 0x97EA, 0x97EB, 0x97EC, 0x674C, 0x6753, 0x675E, 0x6748, 0x6769, 0x67A5, 0x6787, 0x676A, 0x6773, 0x6798, 0x67A7, 0x6775, 0x67A8, 0x679E, 0x67AD, 0x678B, 0x6777, 0x677C, 0x67F0, 0x6809, 0x67D8, 0x680A, 0x67E9, 0x67B0, 0x680C, 0x67D9, 0x67B5, 0x67DA, 0x67B3, 0x67DD, 0x6800, 0x67C3, 0x67B8, 0x67E2, 0x680E, 0x67C1, 0x67FD, 0x6832, 0x6833, 0x6860, 0x6861, 0x684E, 0x6862, 0x6844, 0x6864, 0x6883, 0x681D, 0x6855, 0x6866, 0x6841, 0x6867, 0x6840, 0x683E, 0x684A, 0x6849, 0x6829, 0x68B5, 0x688F, 0x6874, 0x6877, 0x6893, 0x686B, 0x68C2, 0x696E, 0x68FC, 0x691F, 0x6920, 0x68F9, // GB 0xE940..0xE97E 0x9527, 0x9533, 0x953D, 0x9543, 0x9548, 0x954B, 0x9555, 0x955A, 0x9560, 0x956E, 0x9574, 0x9575, 0x9577, 0x9578, 0x9579, 0x957A, 0x957B, 0x957C, 0x957D, 0x957E, 0x9580, 0x9581, 0x9582, 0x9583, 0x9584, 0x9585, 0x9586, 0x9587, 0x9588, 0x9589, 0x958A, 0x958B, 0x958C, 0x958D, 0x958E, 0x958F, 0x9590, 0x9591, 0x9592, 0x9593, 0x9594, 0x9595, 0x9596, 0x9597, 0x9598, 0x9599, 0x959A, 0x959B, 0x959C, 0x959D, 0x959E, 0x959F, 0x95A0, 0x95A1, 0x95A2, 0x95A3, 0x95A4, 0x95A5, 0x95A6, 0x95A7, 0x95A8, 0x95A9, 0x95AA, // GB 0xE980..0xE9FE 0x95AB, 0x95AC, 0x95AD, 0x95AE, 0x95AF, 0x95B0, 0x95B1, 0x95B2, 0x95B3, 0x95B4, 0x95B5, 0x95B6, 0x95B7, 0x95B8, 0x95B9, 0x95BA, 0x95BB, 0x95BC, 0x95BD, 0x95BE, 0x95BF, 0x95C0, 0x95C1, 0x95C2, 0x95C3, 0x95C4, 0x95C5, 0x95C6, 0x95C7, 0x95C8, 0x95C9, 0x95CA, 0x95CB, 0x6924, 0x68F0, 0x690B, 0x6901, 0x6957, 0x68E3, 0x6910, 0x6971, 0x6939, 0x6960, 0x6942, 0x695D, 0x6984, 0x696B, 0x6980, 0x6998, 0x6978, 0x6934, 0x69CC, 0x6987, 0x6988, 0x69CE, 0x6989, 0x6966, 0x6963, 0x6979, 0x699B, 0x69A7, 0x69BB, 0x69AB, 0x69AD, 0x69D4, 0x69B1, 0x69C1, 0x69CA, 0x69DF, 0x6995, 0x69E0, 0x698D, 0x69FF, 0x6A2F, 0x69ED, 0x6A17, 0x6A18, 0x6A65, 0x69F2, 0x6A44, 0x6A3E, 0x6AA0, 0x6A50, 0x6A5B, 0x6A35, 0x6A8E, 0x6A79, 0x6A3D, 0x6A28, 0x6A58, 0x6A7C, 0x6A91, 0x6A90, 0x6AA9, 0x6A97, 0x6AAB, 0x7337, 0x7352, 0x6B81, 0x6B82, 0x6B87, 0x6B84, 0x6B92, 0x6B93, 0x6B8D, 0x6B9A, 0x6B9B, 0x6BA1, 0x6BAA, 0x8F6B, 0x8F6D, 0x8F71, 0x8F72, 0x8F73, 0x8F75, 0x8F76, 0x8F78, 0x8F77, 0x8F79, 0x8F7A, 0x8F7C, 0x8F7E, 0x8F81, 0x8F82, 0x8F84, 0x8F87, 0x8F8B, // GB 0xEA40..0xEA7E 0x95CC, 0x95CD, 0x95CE, 0x95CF, 0x95D0, 0x95D1, 0x95D2, 0x95D3, 0x95D4, 0x95D5, 0x95D6, 0x95D7, 0x95D8, 0x95D9, 0x95DA, 0x95DB, 0x95DC, 0x95DD, 0x95DE, 0x95DF, 0x95E0, 0x95E1, 0x95E2, 0x95E3, 0x95E4, 0x95E5, 0x95E6, 0x95E7, 0x95EC, 0x95FF, 0x9607, 0x9613, 0x9618, 0x961B, 0x961E, 0x9620, 0x9623, 0x9624, 0x9625, 0x9626, 0x9627, 0x9628, 0x9629, 0x962B, 0x962C, 0x962D, 0x962F, 0x9630, 0x9637, 0x9638, 0x9639, 0x963A, 0x963E, 0x9641, 0x9643, 0x964A, 0x964E, 0x964F, 0x9651, 0x9652, 0x9653, 0x9656, 0x9657, // GB 0xEA80..0xEAFE 0x9658, 0x9659, 0x965A, 0x965C, 0x965D, 0x965E, 0x9660, 0x9663, 0x9665, 0x9666, 0x966B, 0x966D, 0x966E, 0x966F, 0x9670, 0x9671, 0x9673, 0x9678, 0x9679, 0x967A, 0x967B, 0x967C, 0x967D, 0x967E, 0x967F, 0x9680, 0x9681, 0x9682, 0x9683, 0x9684, 0x9687, 0x9689, 0x968A, 0x8F8D, 0x8F8E, 0x8F8F, 0x8F98, 0x8F9A, 0x8ECE, 0x620B, 0x6217, 0x621B, 0x621F, 0x6222, 0x6221, 0x6225, 0x6224, 0x622C, 0x81E7, 0x74EF, 0x74F4, 0x74FF, 0x750F, 0x7511, 0x7513, 0x6534, 0x65EE, 0x65EF, 0x65F0, 0x660A, 0x6619, 0x6772, 0x6603, 0x6615, 0x6600, 0x7085, 0x66F7, 0x661D, 0x6634, 0x6631, 0x6636, 0x6635, 0x8006, 0x665F, 0x6654, 0x6641, 0x664F, 0x6656, 0x6661, 0x6657, 0x6677, 0x6684, 0x668C, 0x66A7, 0x669D, 0x66BE, 0x66DB, 0x66DC, 0x66E6, 0x66E9, 0x8D32, 0x8D33, 0x8D36, 0x8D3B, 0x8D3D, 0x8D40, 0x8D45, 0x8D46, 0x8D48, 0x8D49, 0x8D47, 0x8D4D, 0x8D55, 0x8D59, 0x89C7, 0x89CA, 0x89CB, 0x89CC, 0x89CE, 0x89CF, 0x89D0, 0x89D1, 0x726E, 0x729F, 0x725D, 0x7266, 0x726F, 0x727E, 0x727F, 0x7284, 0x728B, 0x728D, 0x728F, 0x7292, 0x6308, 0x6332, 0x63B0, // GB 0xEB40..0xEB7E 0x968C, 0x968E, 0x9691, 0x9692, 0x9693, 0x9695, 0x9696, 0x969A, 0x969B, 0x969D, 0x969E, 0x969F, 0x96A0, 0x96A1, 0x96A2, 0x96A3, 0x96A4, 0x96A5, 0x96A6, 0x96A8, 0x96A9, 0x96AA, 0x96AB, 0x96AC, 0x96AD, 0x96AE, 0x96AF, 0x96B1, 0x96B2, 0x96B4, 0x96B5, 0x96B7, 0x96B8, 0x96BA, 0x96BB, 0x96BF, 0x96C2, 0x96C3, 0x96C8, 0x96CA, 0x96CB, 0x96D0, 0x96D1, 0x96D3, 0x96D4, 0x96D6, 0x96D7, 0x96D8, 0x96D9, 0x96DA, 0x96DB, 0x96DC, 0x96DD, 0x96DE, 0x96DF, 0x96E1, 0x96E2, 0x96E3, 0x96E4, 0x96E5, 0x96E6, 0x96E7, 0x96EB, // GB 0xEB80..0xEBFE 0x96EC, 0x96ED, 0x96EE, 0x96F0, 0x96F1, 0x96F2, 0x96F4, 0x96F5, 0x96F8, 0x96FA, 0x96FB, 0x96FC, 0x96FD, 0x96FF, 0x9702, 0x9703, 0x9705, 0x970A, 0x970B, 0x970C, 0x9710, 0x9711, 0x9712, 0x9714, 0x9715, 0x9717, 0x9718, 0x9719, 0x971A, 0x971B, 0x971D, 0x971F, 0x9720, 0x643F, 0x64D8, 0x8004, 0x6BEA, 0x6BF3, 0x6BFD, 0x6BF5, 0x6BF9, 0x6C05, 0x6C07, 0x6C06, 0x6C0D, 0x6C15, 0x6C18, 0x6C19, 0x6C1A, 0x6C21, 0x6C29, 0x6C24, 0x6C2A, 0x6C32, 0x6535, 0x6555, 0x656B, 0x724D, 0x7252, 0x7256, 0x7230, 0x8662, 0x5216, 0x809F, 0x809C, 0x8093, 0x80BC, 0x670A, 0x80BD, 0x80B1, 0x80AB, 0x80AD, 0x80B4, 0x80B7, 0x80E7, 0x80E8, 0x80E9, 0x80EA, 0x80DB, 0x80C2, 0x80C4, 0x80D9, 0x80CD, 0x80D7, 0x6710, 0x80DD, 0x80EB, 0x80F1, 0x80F4, 0x80ED, 0x810D, 0x810E, 0x80F2, 0x80FC, 0x6715, 0x8112, 0x8C5A, 0x8136, 0x811E, 0x812C, 0x8118, 0x8132, 0x8148, 0x814C, 0x8153, 0x8174, 0x8159, 0x815A, 0x8171, 0x8160, 0x8169, 0x817C, 0x817D, 0x816D, 0x8167, 0x584D, 0x5AB5, 0x8188, 0x8182, 0x8191, 0x6ED5, 0x81A3, 0x81AA, 0x81CC, 0x6726, 0x81CA, 0x81BB, // GB 0xEC40..0xEC7E 0x9721, 0x9722, 0x9723, 0x9724, 0x9725, 0x9726, 0x9727, 0x9728, 0x9729, 0x972B, 0x972C, 0x972E, 0x972F, 0x9731, 0x9733, 0x9734, 0x9735, 0x9736, 0x9737, 0x973A, 0x973B, 0x973C, 0x973D, 0x973F, 0x9740, 0x9741, 0x9742, 0x9743, 0x9744, 0x9745, 0x9746, 0x9747, 0x9748, 0x9749, 0x974A, 0x974B, 0x974C, 0x974D, 0x974E, 0x974F, 0x9750, 0x9751, 0x9754, 0x9755, 0x9757, 0x9758, 0x975A, 0x975C, 0x975D, 0x975F, 0x9763, 0x9764, 0x9766, 0x9767, 0x9768, 0x976A, 0x976B, 0x976C, 0x976D, 0x976E, 0x976F, 0x9770, 0x9771, // GB 0xEC80..0xECFE 0x9772, 0x9775, 0x9777, 0x9778, 0x9779, 0x977A, 0x977B, 0x977D, 0x977E, 0x977F, 0x9780, 0x9781, 0x9782, 0x9783, 0x9784, 0x9786, 0x9787, 0x9788, 0x9789, 0x978A, 0x978C, 0x978E, 0x978F, 0x9790, 0x9793, 0x9795, 0x9796, 0x9797, 0x9799, 0x979A, 0x979B, 0x979C, 0x979D, 0x81C1, 0x81A6, 0x6B24, 0x6B37, 0x6B39, 0x6B43, 0x6B46, 0x6B59, 0x98D1, 0x98D2, 0x98D3, 0x98D5, 0x98D9, 0x98DA, 0x6BB3, 0x5F40, 0x6BC2, 0x89F3, 0x6590, 0x9F51, 0x6593, 0x65BC, 0x65C6, 0x65C4, 0x65C3, 0x65CC, 0x65CE, 0x65D2, 0x65D6, 0x7080, 0x709C, 0x7096, 0x709D, 0x70BB, 0x70C0, 0x70B7, 0x70AB, 0x70B1, 0x70E8, 0x70CA, 0x7110, 0x7113, 0x7116, 0x712F, 0x7131, 0x7173, 0x715C, 0x7168, 0x7145, 0x7172, 0x714A, 0x7178, 0x717A, 0x7198, 0x71B3, 0x71B5, 0x71A8, 0x71A0, 0x71E0, 0x71D4, 0x71E7, 0x71F9, 0x721D, 0x7228, 0x706C, 0x7118, 0x7166, 0x71B9, 0x623E, 0x623D, 0x6243, 0x6248, 0x6249, 0x793B, 0x7940, 0x7946, 0x7949, 0x795B, 0x795C, 0x7953, 0x795A, 0x7962, 0x7957, 0x7960, 0x796F, 0x7967, 0x797A, 0x7985, 0x798A, 0x799A, 0x79A7, 0x79B3, 0x5FD1, 0x5FD0, // GB 0xED40..0xED7E 0x979E, 0x979F, 0x97A1, 0x97A2, 0x97A4, 0x97A5, 0x97A6, 0x97A7, 0x97A8, 0x97A9, 0x97AA, 0x97AC, 0x97AE, 0x97B0, 0x97B1, 0x97B3, 0x97B5, 0x97B6, 0x97B7, 0x97B8, 0x97B9, 0x97BA, 0x97BB, 0x97BC, 0x97BD, 0x97BE, 0x97BF, 0x97C0, 0x97C1, 0x97C2, 0x97C3, 0x97C4, 0x97C5, 0x97C6, 0x97C7, 0x97C8, 0x97C9, 0x97CA, 0x97CB, 0x97CC, 0x97CD, 0x97CE, 0x97CF, 0x97D0, 0x97D1, 0x97D2, 0x97D3, 0x97D4, 0x97D5, 0x97D6, 0x97D7, 0x97D8, 0x97D9, 0x97DA, 0x97DB, 0x97DC, 0x97DD, 0x97DE, 0x97DF, 0x97E0, 0x97E1, 0x97E2, 0x97E3, // GB 0xED80..0xEDFE 0x97E4, 0x97E5, 0x97E8, 0x97EE, 0x97EF, 0x97F0, 0x97F1, 0x97F2, 0x97F4, 0x97F7, 0x97F8, 0x97F9, 0x97FA, 0x97FB, 0x97FC, 0x97FD, 0x97FE, 0x97FF, 0x9800, 0x9801, 0x9802, 0x9803, 0x9804, 0x9805, 0x9806, 0x9807, 0x9808, 0x9809, 0x980A, 0x980B, 0x980C, 0x980D, 0x980E, 0x603C, 0x605D, 0x605A, 0x6067, 0x6041, 0x6059, 0x6063, 0x60AB, 0x6106, 0x610D, 0x615D, 0x61A9, 0x619D, 0x61CB, 0x61D1, 0x6206, 0x8080, 0x807F, 0x6C93, 0x6CF6, 0x6DFC, 0x77F6, 0x77F8, 0x7800, 0x7809, 0x7817, 0x7818, 0x7811, 0x65AB, 0x782D, 0x781C, 0x781D, 0x7839, 0x783A, 0x783B, 0x781F, 0x783C, 0x7825, 0x782C, 0x7823, 0x7829, 0x784E, 0x786D, 0x7856, 0x7857, 0x7826, 0x7850, 0x7847, 0x784C, 0x786A, 0x789B, 0x7893, 0x789A, 0x7887, 0x789C, 0x78A1, 0x78A3, 0x78B2, 0x78B9, 0x78A5, 0x78D4, 0x78D9, 0x78C9, 0x78EC, 0x78F2, 0x7905, 0x78F4, 0x7913, 0x7924, 0x791E, 0x7934, 0x9F9B, 0x9EF9, 0x9EFB, 0x9EFC, 0x76F1, 0x7704, 0x770D, 0x76F9, 0x7707, 0x7708, 0x771A, 0x7722, 0x7719, 0x772D, 0x7726, 0x7735, 0x7738, 0x7750, 0x7751, 0x7747, 0x7743, 0x775A, 0x7768, // GB 0xEE40..0xEE7E 0x980F, 0x9810, 0x9811, 0x9812, 0x9813, 0x9814, 0x9815, 0x9816, 0x9817, 0x9818, 0x9819, 0x981A, 0x981B, 0x981C, 0x981D, 0x981E, 0x981F, 0x9820, 0x9821, 0x9822, 0x9823, 0x9824, 0x9825, 0x9826, 0x9827, 0x9828, 0x9829, 0x982A, 0x982B, 0x982C, 0x982D, 0x982E, 0x982F, 0x9830, 0x9831, 0x9832, 0x9833, 0x9834, 0x9835, 0x9836, 0x9837, 0x9838, 0x9839, 0x983A, 0x983B, 0x983C, 0x983D, 0x983E, 0x983F, 0x9840, 0x9841, 0x9842, 0x9843, 0x9844, 0x9845, 0x9846, 0x9847, 0x9848, 0x9849, 0x984A, 0x984B, 0x984C, 0x984D, // GB 0xEE80..0xEEFE 0x984E, 0x984F, 0x9850, 0x9851, 0x9852, 0x9853, 0x9854, 0x9855, 0x9856, 0x9857, 0x9858, 0x9859, 0x985A, 0x985B, 0x985C, 0x985D, 0x985E, 0x985F, 0x9860, 0x9861, 0x9862, 0x9863, 0x9864, 0x9865, 0x9866, 0x9867, 0x9868, 0x9869, 0x986A, 0x986B, 0x986C, 0x986D, 0x986E, 0x7762, 0x7765, 0x777F, 0x778D, 0x777D, 0x7780, 0x778C, 0x7791, 0x779F, 0x77A0, 0x77B0, 0x77B5, 0x77BD, 0x753A, 0x7540, 0x754E, 0x754B, 0x7548, 0x755B, 0x7572, 0x7579, 0x7583, 0x7F58, 0x7F61, 0x7F5F, 0x8A48, 0x7F68, 0x7F74, 0x7F71, 0x7F79, 0x7F81, 0x7F7E, 0x76CD, 0x76E5, 0x8832, 0x9485, 0x9486, 0x9487, 0x948B, 0x948A, 0x948C, 0x948D, 0x948F, 0x9490, 0x9494, 0x9497, 0x9495, 0x949A, 0x949B, 0x949C, 0x94A3, 0x94A4, 0x94AB, 0x94AA, 0x94AD, 0x94AC, 0x94AF, 0x94B0, 0x94B2, 0x94B4, 0x94B6, 0x94B7, 0x94B8, 0x94B9, 0x94BA, 0x94BC, 0x94BD, 0x94BF, 0x94C4, 0x94C8, 0x94C9, 0x94CA, 0x94CB, 0x94CC, 0x94CD, 0x94CE, 0x94D0, 0x94D1, 0x94D2, 0x94D5, 0x94D6, 0x94D7, 0x94D9, 0x94D8, 0x94DB, 0x94DE, 0x94DF, 0x94E0, 0x94E2, 0x94E4, 0x94E5, 0x94E7, 0x94E8, 0x94EA, // GB 0xEF40..0xEF7E 0x986F, 0x9870, 0x9871, 0x9872, 0x9873, 0x9874, 0x988B, 0x988E, 0x9892, 0x9895, 0x9899, 0x98A3, 0x98A8, 0x98A9, 0x98AA, 0x98AB, 0x98AC, 0x98AD, 0x98AE, 0x98AF, 0x98B0, 0x98B1, 0x98B2, 0x98B3, 0x98B4, 0x98B5, 0x98B6, 0x98B7, 0x98B8, 0x98B9, 0x98BA, 0x98BB, 0x98BC, 0x98BD, 0x98BE, 0x98BF, 0x98C0, 0x98C1, 0x98C2, 0x98C3, 0x98C4, 0x98C5, 0x98C6, 0x98C7, 0x98C8, 0x98C9, 0x98CA, 0x98CB, 0x98CC, 0x98CD, 0x98CF, 0x98D0, 0x98D4, 0x98D6, 0x98D7, 0x98DB, 0x98DC, 0x98DD, 0x98E0, 0x98E1, 0x98E2, 0x98E3, 0x98E4, // GB 0xEF80..0xEFFE 0x98E5, 0x98E6, 0x98E9, 0x98EA, 0x98EB, 0x98EC, 0x98ED, 0x98EE, 0x98EF, 0x98F0, 0x98F1, 0x98F2, 0x98F3, 0x98F4, 0x98F5, 0x98F6, 0x98F7, 0x98F8, 0x98F9, 0x98FA, 0x98FB, 0x98FC, 0x98FD, 0x98FE, 0x98FF, 0x9900, 0x9901, 0x9902, 0x9903, 0x9904, 0x9905, 0x9906, 0x9907, 0x94E9, 0x94EB, 0x94EE, 0x94EF, 0x94F3, 0x94F4, 0x94F5, 0x94F7, 0x94F9, 0x94FC, 0x94FD, 0x94FF, 0x9503, 0x9502, 0x9506, 0x9507, 0x9509, 0x950A, 0x950D, 0x950E, 0x950F, 0x9512, 0x9513, 0x9514, 0x9515, 0x9516, 0x9518, 0x951B, 0x951D, 0x951E, 0x951F, 0x9522, 0x952A, 0x952B, 0x9529, 0x952C, 0x9531, 0x9532, 0x9534, 0x9536, 0x9537, 0x9538, 0x953C, 0x953E, 0x953F, 0x9542, 0x9535, 0x9544, 0x9545, 0x9546, 0x9549, 0x954C, 0x954E, 0x954F, 0x9552, 0x9553, 0x9554, 0x9556, 0x9557, 0x9558, 0x9559, 0x955B, 0x955E, 0x955F, 0x955D, 0x9561, 0x9562, 0x9564, 0x9565, 0x9566, 0x9567, 0x9568, 0x9569, 0x956A, 0x956B, 0x956C, 0x956F, 0x9571, 0x9572, 0x9573, 0x953A, 0x77E7, 0x77EC, 0x96C9, 0x79D5, 0x79ED, 0x79E3, 0x79EB, 0x7A06, 0x5D47, 0x7A03, 0x7A02, 0x7A1E, 0x7A14, // GB 0xF040..0xF07E 0x9908, 0x9909, 0x990A, 0x990B, 0x990C, 0x990E, 0x990F, 0x9911, 0x9912, 0x9913, 0x9914, 0x9915, 0x9916, 0x9917, 0x9918, 0x9919, 0x991A, 0x991B, 0x991C, 0x991D, 0x991E, 0x991F, 0x9920, 0x9921, 0x9922, 0x9923, 0x9924, 0x9925, 0x9926, 0x9927, 0x9928, 0x9929, 0x992A, 0x992B, 0x992C, 0x992D, 0x992F, 0x9930, 0x9931, 0x9932, 0x9933, 0x9934, 0x9935, 0x9936, 0x9937, 0x9938, 0x9939, 0x993A, 0x993B, 0x993C, 0x993D, 0x993E, 0x993F, 0x9940, 0x9941, 0x9942, 0x9943, 0x9944, 0x9945, 0x9946, 0x9947, 0x9948, 0x9949, // GB 0xF080..0xF0FE 0x994A, 0x994B, 0x994C, 0x994D, 0x994E, 0x994F, 0x9950, 0x9951, 0x9952, 0x9953, 0x9956, 0x9957, 0x9958, 0x9959, 0x995A, 0x995B, 0x995C, 0x995D, 0x995E, 0x995F, 0x9960, 0x9961, 0x9962, 0x9964, 0x9966, 0x9973, 0x9978, 0x9979, 0x997B, 0x997E, 0x9982, 0x9983, 0x9989, 0x7A39, 0x7A37, 0x7A51, 0x9ECF, 0x99A5, 0x7A70, 0x7688, 0x768E, 0x7693, 0x7699, 0x76A4, 0x74DE, 0x74E0, 0x752C, 0x9E20, 0x9E22, 0x9E28, 0x9E29, 0x9E2A, 0x9E2B, 0x9E2C, 0x9E32, 0x9E31, 0x9E36, 0x9E38, 0x9E37, 0x9E39, 0x9E3A, 0x9E3E, 0x9E41, 0x9E42, 0x9E44, 0x9E46, 0x9E47, 0x9E48, 0x9E49, 0x9E4B, 0x9E4C, 0x9E4E, 0x9E51, 0x9E55, 0x9E57, 0x9E5A, 0x9E5B, 0x9E5C, 0x9E5E, 0x9E63, 0x9E66, 0x9E67, 0x9E68, 0x9E69, 0x9E6A, 0x9E6B, 0x9E6C, 0x9E71, 0x9E6D, 0x9E73, 0x7592, 0x7594, 0x7596, 0x75A0, 0x759D, 0x75AC, 0x75A3, 0x75B3, 0x75B4, 0x75B8, 0x75C4, 0x75B1, 0x75B0, 0x75C3, 0x75C2, 0x75D6, 0x75CD, 0x75E3, 0x75E8, 0x75E6, 0x75E4, 0x75EB, 0x75E7, 0x7603, 0x75F1, 0x75FC, 0x75FF, 0x7610, 0x7600, 0x7605, 0x760C, 0x7617, 0x760A, 0x7625, 0x7618, 0x7615, 0x7619, // GB 0xF140..0xF17E 0x998C, 0x998E, 0x999A, 0x999B, 0x999C, 0x999D, 0x999E, 0x999F, 0x99A0, 0x99A1, 0x99A2, 0x99A3, 0x99A4, 0x99A6, 0x99A7, 0x99A9, 0x99AA, 0x99AB, 0x99AC, 0x99AD, 0x99AE, 0x99AF, 0x99B0, 0x99B1, 0x99B2, 0x99B3, 0x99B4, 0x99B5, 0x99B6, 0x99B7, 0x99B8, 0x99B9, 0x99BA, 0x99BB, 0x99BC, 0x99BD, 0x99BE, 0x99BF, 0x99C0, 0x99C1, 0x99C2, 0x99C3, 0x99C4, 0x99C5, 0x99C6, 0x99C7, 0x99C8, 0x99C9, 0x99CA, 0x99CB, 0x99CC, 0x99CD, 0x99CE, 0x99CF, 0x99D0, 0x99D1, 0x99D2, 0x99D3, 0x99D4, 0x99D5, 0x99D6, 0x99D7, 0x99D8, // GB 0xF180..0xF1FE 0x99D9, 0x99DA, 0x99DB, 0x99DC, 0x99DD, 0x99DE, 0x99DF, 0x99E0, 0x99E1, 0x99E2, 0x99E3, 0x99E4, 0x99E5, 0x99E6, 0x99E7, 0x99E8, 0x99E9, 0x99EA, 0x99EB, 0x99EC, 0x99ED, 0x99EE, 0x99EF, 0x99F0, 0x99F1, 0x99F2, 0x99F3, 0x99F4, 0x99F5, 0x99F6, 0x99F7, 0x99F8, 0x99F9, 0x761B, 0x763C, 0x7622, 0x7620, 0x7640, 0x762D, 0x7630, 0x763F, 0x7635, 0x7643, 0x763E, 0x7633, 0x764D, 0x765E, 0x7654, 0x765C, 0x7656, 0x766B, 0x766F, 0x7FCA, 0x7AE6, 0x7A78, 0x7A79, 0x7A80, 0x7A86, 0x7A88, 0x7A95, 0x7AA6, 0x7AA0, 0x7AAC, 0x7AA8, 0x7AAD, 0x7AB3, 0x8864, 0x8869, 0x8872, 0x887D, 0x887F, 0x8882, 0x88A2, 0x88C6, 0x88B7, 0x88BC, 0x88C9, 0x88E2, 0x88CE, 0x88E3, 0x88E5, 0x88F1, 0x891A, 0x88FC, 0x88E8, 0x88FE, 0x88F0, 0x8921, 0x8919, 0x8913, 0x891B, 0x890A, 0x8934, 0x892B, 0x8936, 0x8941, 0x8966, 0x897B, 0x758B, 0x80E5, 0x76B2, 0x76B4, 0x77DC, 0x8012, 0x8014, 0x8016, 0x801C, 0x8020, 0x8022, 0x8025, 0x8026, 0x8027, 0x8029, 0x8028, 0x8031, 0x800B, 0x8035, 0x8043, 0x8046, 0x804D, 0x8052, 0x8069, 0x8071, 0x8983, 0x9878, 0x9880, 0x9883, // GB 0xF240..0xF27E 0x99FA, 0x99FB, 0x99FC, 0x99FD, 0x99FE, 0x99FF, 0x9A00, 0x9A01, 0x9A02, 0x9A03, 0x9A04, 0x9A05, 0x9A06, 0x9A07, 0x9A08, 0x9A09, 0x9A0A, 0x9A0B, 0x9A0C, 0x9A0D, 0x9A0E, 0x9A0F, 0x9A10, 0x9A11, 0x9A12, 0x9A13, 0x9A14, 0x9A15, 0x9A16, 0x9A17, 0x9A18, 0x9A19, 0x9A1A, 0x9A1B, 0x9A1C, 0x9A1D, 0x9A1E, 0x9A1F, 0x9A20, 0x9A21, 0x9A22, 0x9A23, 0x9A24, 0x9A25, 0x9A26, 0x9A27, 0x9A28, 0x9A29, 0x9A2A, 0x9A2B, 0x9A2C, 0x9A2D, 0x9A2E, 0x9A2F, 0x9A30, 0x9A31, 0x9A32, 0x9A33, 0x9A34, 0x9A35, 0x9A36, 0x9A37, 0x9A38, // GB 0xF280..0xF2FE 0x9A39, 0x9A3A, 0x9A3B, 0x9A3C, 0x9A3D, 0x9A3E, 0x9A3F, 0x9A40, 0x9A41, 0x9A42, 0x9A43, 0x9A44, 0x9A45, 0x9A46, 0x9A47, 0x9A48, 0x9A49, 0x9A4A, 0x9A4B, 0x9A4C, 0x9A4D, 0x9A4E, 0x9A4F, 0x9A50, 0x9A51, 0x9A52, 0x9A53, 0x9A54, 0x9A55, 0x9A56, 0x9A57, 0x9A58, 0x9A59, 0x9889, 0x988C, 0x988D, 0x988F, 0x9894, 0x989A, 0x989B, 0x989E, 0x989F, 0x98A1, 0x98A2, 0x98A5, 0x98A6, 0x864D, 0x8654, 0x866C, 0x866E, 0x867F, 0x867A, 0x867C, 0x867B, 0x86A8, 0x868D, 0x868B, 0x86AC, 0x869D, 0x86A7, 0x86A3, 0x86AA, 0x8693, 0x86A9, 0x86B6, 0x86C4, 0x86B5, 0x86CE, 0x86B0, 0x86BA, 0x86B1, 0x86AF, 0x86C9, 0x86CF, 0x86B4, 0x86E9, 0x86F1, 0x86F2, 0x86ED, 0x86F3, 0x86D0, 0x8713, 0x86DE, 0x86F4, 0x86DF, 0x86D8, 0x86D1, 0x8703, 0x8707, 0x86F8, 0x8708, 0x870A, 0x870D, 0x8709, 0x8723, 0x873B, 0x871E, 0x8725, 0x872E, 0x871A, 0x873E, 0x8748, 0x8734, 0x8731, 0x8729, 0x8737, 0x873F, 0x8782, 0x8722, 0x877D, 0x877E, 0x877B, 0x8760, 0x8770, 0x874C, 0x876E, 0x878B, 0x8753, 0x8763, 0x877C, 0x8764, 0x8759, 0x8765, 0x8793, 0x87AF, 0x87A8, 0x87D2, // GB 0xF340..0xF37E 0x9A5A, 0x9A5B, 0x9A5C, 0x9A5D, 0x9A5E, 0x9A5F, 0x9A60, 0x9A61, 0x9A62, 0x9A63, 0x9A64, 0x9A65, 0x9A66, 0x9A67, 0x9A68, 0x9A69, 0x9A6A, 0x9A6B, 0x9A72, 0x9A83, 0x9A89, 0x9A8D, 0x9A8E, 0x9A94, 0x9A95, 0x9A99, 0x9AA6, 0x9AA9, 0x9AAA, 0x9AAB, 0x9AAC, 0x9AAD, 0x9AAE, 0x9AAF, 0x9AB2, 0x9AB3, 0x9AB4, 0x9AB5, 0x9AB9, 0x9ABB, 0x9ABD, 0x9ABE, 0x9ABF, 0x9AC3, 0x9AC4, 0x9AC6, 0x9AC7, 0x9AC8, 0x9AC9, 0x9ACA, 0x9ACD, 0x9ACE, 0x9ACF, 0x9AD0, 0x9AD2, 0x9AD4, 0x9AD5, 0x9AD6, 0x9AD7, 0x9AD9, 0x9ADA, 0x9ADB, 0x9ADC, // GB 0xF380..0xF3FE 0x9ADD, 0x9ADE, 0x9AE0, 0x9AE2, 0x9AE3, 0x9AE4, 0x9AE5, 0x9AE7, 0x9AE8, 0x9AE9, 0x9AEA, 0x9AEC, 0x9AEE, 0x9AF0, 0x9AF1, 0x9AF2, 0x9AF3, 0x9AF4, 0x9AF5, 0x9AF6, 0x9AF7, 0x9AF8, 0x9AFA, 0x9AFC, 0x9AFD, 0x9AFE, 0x9AFF, 0x9B00, 0x9B01, 0x9B02, 0x9B04, 0x9B05, 0x9B06, 0x87C6, 0x8788, 0x8785, 0x87AD, 0x8797, 0x8783, 0x87AB, 0x87E5, 0x87AC, 0x87B5, 0x87B3, 0x87CB, 0x87D3, 0x87BD, 0x87D1, 0x87C0, 0x87CA, 0x87DB, 0x87EA, 0x87E0, 0x87EE, 0x8816, 0x8813, 0x87FE, 0x880A, 0x881B, 0x8821, 0x8839, 0x883C, 0x7F36, 0x7F42, 0x7F44, 0x7F45, 0x8210, 0x7AFA, 0x7AFD, 0x7B08, 0x7B03, 0x7B04, 0x7B15, 0x7B0A, 0x7B2B, 0x7B0F, 0x7B47, 0x7B38, 0x7B2A, 0x7B19, 0x7B2E, 0x7B31, 0x7B20, 0x7B25, 0x7B24, 0x7B33, 0x7B3E, 0x7B1E, 0x7B58, 0x7B5A, 0x7B45, 0x7B75, 0x7B4C, 0x7B5D, 0x7B60, 0x7B6E, 0x7B7B, 0x7B62, 0x7B72, 0x7B71, 0x7B90, 0x7BA6, 0x7BA7, 0x7BB8, 0x7BAC, 0x7B9D, 0x7BA8, 0x7B85, 0x7BAA, 0x7B9C, 0x7BA2, 0x7BAB, 0x7BB4, 0x7BD1, 0x7BC1, 0x7BCC, 0x7BDD, 0x7BDA, 0x7BE5, 0x7BE6, 0x7BEA, 0x7C0C, 0x7BFE, 0x7BFC, 0x7C0F, 0x7C16, 0x7C0B, // GB 0xF440..0xF47E 0x9B07, 0x9B09, 0x9B0A, 0x9B0B, 0x9B0C, 0x9B0D, 0x9B0E, 0x9B10, 0x9B11, 0x9B12, 0x9B14, 0x9B15, 0x9B16, 0x9B17, 0x9B18, 0x9B19, 0x9B1A, 0x9B1B, 0x9B1C, 0x9B1D, 0x9B1E, 0x9B20, 0x9B21, 0x9B22, 0x9B24, 0x9B25, 0x9B26, 0x9B27, 0x9B28, 0x9B29, 0x9B2A, 0x9B2B, 0x9B2C, 0x9B2D, 0x9B2E, 0x9B30, 0x9B31, 0x9B33, 0x9B34, 0x9B35, 0x9B36, 0x9B37, 0x9B38, 0x9B39, 0x9B3A, 0x9B3D, 0x9B3E, 0x9B3F, 0x9B40, 0x9B46, 0x9B4A, 0x9B4B, 0x9B4C, 0x9B4E, 0x9B50, 0x9B52, 0x9B53, 0x9B55, 0x9B56, 0x9B57, 0x9B58, 0x9B59, 0x9B5A, // GB 0xF480..0xF4FE 0x9B5B, 0x9B5C, 0x9B5D, 0x9B5E, 0x9B5F, 0x9B60, 0x9B61, 0x9B62, 0x9B63, 0x9B64, 0x9B65, 0x9B66, 0x9B67, 0x9B68, 0x9B69, 0x9B6A, 0x9B6B, 0x9B6C, 0x9B6D, 0x9B6E, 0x9B6F, 0x9B70, 0x9B71, 0x9B72, 0x9B73, 0x9B74, 0x9B75, 0x9B76, 0x9B77, 0x9B78, 0x9B79, 0x9B7A, 0x9B7B, 0x7C1F, 0x7C2A, 0x7C26, 0x7C38, 0x7C41, 0x7C40, 0x81FE, 0x8201, 0x8202, 0x8204, 0x81EC, 0x8844, 0x8221, 0x8222, 0x8223, 0x822D, 0x822F, 0x8228, 0x822B, 0x8238, 0x823B, 0x8233, 0x8234, 0x823E, 0x8244, 0x8249, 0x824B, 0x824F, 0x825A, 0x825F, 0x8268, 0x887E, 0x8885, 0x8888, 0x88D8, 0x88DF, 0x895E, 0x7F9D, 0x7F9F, 0x7FA7, 0x7FAF, 0x7FB0, 0x7FB2, 0x7C7C, 0x6549, 0x7C91, 0x7C9D, 0x7C9C, 0x7C9E, 0x7CA2, 0x7CB2, 0x7CBC, 0x7CBD, 0x7CC1, 0x7CC7, 0x7CCC, 0x7CCD, 0x7CC8, 0x7CC5, 0x7CD7, 0x7CE8, 0x826E, 0x66A8, 0x7FBF, 0x7FCE, 0x7FD5, 0x7FE5, 0x7FE1, 0x7FE6, 0x7FE9, 0x7FEE, 0x7FF3, 0x7CF8, 0x7D77, 0x7DA6, 0x7DAE, 0x7E47, 0x7E9B, 0x9EB8, 0x9EB4, 0x8D73, 0x8D84, 0x8D94, 0x8D91, 0x8DB1, 0x8D67, 0x8D6D, 0x8C47, 0x8C49, 0x914A, 0x9150, 0x914E, 0x914F, 0x9164, // GB 0xF540..0xF57E 0x9B7C, 0x9B7D, 0x9B7E, 0x9B7F, 0x9B80, 0x9B81, 0x9B82, 0x9B83, 0x9B84, 0x9B85, 0x9B86, 0x9B87, 0x9B88, 0x9B89, 0x9B8A, 0x9B8B, 0x9B8C, 0x9B8D, 0x9B8E, 0x9B8F, 0x9B90, 0x9B91, 0x9B92, 0x9B93, 0x9B94, 0x9B95, 0x9B96, 0x9B97, 0x9B98, 0x9B99, 0x9B9A, 0x9B9B, 0x9B9C, 0x9B9D, 0x9B9E, 0x9B9F, 0x9BA0, 0x9BA1, 0x9BA2, 0x9BA3, 0x9BA4, 0x9BA5, 0x9BA6, 0x9BA7, 0x9BA8, 0x9BA9, 0x9BAA, 0x9BAB, 0x9BAC, 0x9BAD, 0x9BAE, 0x9BAF, 0x9BB0, 0x9BB1, 0x9BB2, 0x9BB3, 0x9BB4, 0x9BB5, 0x9BB6, 0x9BB7, 0x9BB8, 0x9BB9, 0x9BBA, // GB 0xF580..0xF5FE 0x9BBB, 0x9BBC, 0x9BBD, 0x9BBE, 0x9BBF, 0x9BC0, 0x9BC1, 0x9BC2, 0x9BC3, 0x9BC4, 0x9BC5, 0x9BC6, 0x9BC7, 0x9BC8, 0x9BC9, 0x9BCA, 0x9BCB, 0x9BCC, 0x9BCD, 0x9BCE, 0x9BCF, 0x9BD0, 0x9BD1, 0x9BD2, 0x9BD3, 0x9BD4, 0x9BD5, 0x9BD6, 0x9BD7, 0x9BD8, 0x9BD9, 0x9BDA, 0x9BDB, 0x9162, 0x9161, 0x9170, 0x9169, 0x916F, 0x917D, 0x917E, 0x9172, 0x9174, 0x9179, 0x918C, 0x9185, 0x9190, 0x918D, 0x9191, 0x91A2, 0x91A3, 0x91AA, 0x91AD, 0x91AE, 0x91AF, 0x91B5, 0x91B4, 0x91BA, 0x8C55, 0x9E7E, 0x8DB8, 0x8DEB, 0x8E05, 0x8E59, 0x8E69, 0x8DB5, 0x8DBF, 0x8DBC, 0x8DBA, 0x8DC4, 0x8DD6, 0x8DD7, 0x8DDA, 0x8DDE, 0x8DCE, 0x8DCF, 0x8DDB, 0x8DC6, 0x8DEC, 0x8DF7, 0x8DF8, 0x8DE3, 0x8DF9, 0x8DFB, 0x8DE4, 0x8E09, 0x8DFD, 0x8E14, 0x8E1D, 0x8E1F, 0x8E2C, 0x8E2E, 0x8E23, 0x8E2F, 0x8E3A, 0x8E40, 0x8E39, 0x8E35, 0x8E3D, 0x8E31, 0x8E49, 0x8E41, 0x8E42, 0x8E51, 0x8E52, 0x8E4A, 0x8E70, 0x8E76, 0x8E7C, 0x8E6F, 0x8E74, 0x8E85, 0x8E8F, 0x8E94, 0x8E90, 0x8E9C, 0x8E9E, 0x8C78, 0x8C82, 0x8C8A, 0x8C85, 0x8C98, 0x8C94, 0x659B, 0x89D6, 0x89DE, 0x89DA, 0x89DC, // GB 0xF640..0xF67E 0x9BDC, 0x9BDD, 0x9BDE, 0x9BDF, 0x9BE0, 0x9BE1, 0x9BE2, 0x9BE3, 0x9BE4, 0x9BE5, 0x9BE6, 0x9BE7, 0x9BE8, 0x9BE9, 0x9BEA, 0x9BEB, 0x9BEC, 0x9BED, 0x9BEE, 0x9BEF, 0x9BF0, 0x9BF1, 0x9BF2, 0x9BF3, 0x9BF4, 0x9BF5, 0x9BF6, 0x9BF7, 0x9BF8, 0x9BF9, 0x9BFA, 0x9BFB, 0x9BFC, 0x9BFD, 0x9BFE, 0x9BFF, 0x9C00, 0x9C01, 0x9C02, 0x9C03, 0x9C04, 0x9C05, 0x9C06, 0x9C07, 0x9C08, 0x9C09, 0x9C0A, 0x9C0B, 0x9C0C, 0x9C0D, 0x9C0E, 0x9C0F, 0x9C10, 0x9C11, 0x9C12, 0x9C13, 0x9C14, 0x9C15, 0x9C16, 0x9C17, 0x9C18, 0x9C19, 0x9C1A, // GB 0xF680..0xF6FE 0x9C1B, 0x9C1C, 0x9C1D, 0x9C1E, 0x9C1F, 0x9C20, 0x9C21, 0x9C22, 0x9C23, 0x9C24, 0x9C25, 0x9C26, 0x9C27, 0x9C28, 0x9C29, 0x9C2A, 0x9C2B, 0x9C2C, 0x9C2D, 0x9C2E, 0x9C2F, 0x9C30, 0x9C31, 0x9C32, 0x9C33, 0x9C34, 0x9C35, 0x9C36, 0x9C37, 0x9C38, 0x9C39, 0x9C3A, 0x9C3B, 0x89E5, 0x89EB, 0x89EF, 0x8A3E, 0x8B26, 0x9753, 0x96E9, 0x96F3, 0x96EF, 0x9706, 0x9701, 0x9708, 0x970F, 0x970E, 0x972A, 0x972D, 0x9730, 0x973E, 0x9F80, 0x9F83, 0x9F85, 0x9F86, 0x9F87, 0x9F88, 0x9F89, 0x9F8A, 0x9F8C, 0x9EFE, 0x9F0B, 0x9F0D, 0x96B9, 0x96BC, 0x96BD, 0x96CE, 0x96D2, 0x77BF, 0x96E0, 0x928E, 0x92AE, 0x92C8, 0x933E, 0x936A, 0x93CA, 0x938F, 0x943E, 0x946B, 0x9C7F, 0x9C82, 0x9C85, 0x9C86, 0x9C87, 0x9C88, 0x7A23, 0x9C8B, 0x9C8E, 0x9C90, 0x9C91, 0x9C92, 0x9C94, 0x9C95, 0x9C9A, 0x9C9B, 0x9C9E, 0x9C9F, 0x9CA0, 0x9CA1, 0x9CA2, 0x9CA3, 0x9CA5, 0x9CA6, 0x9CA7, 0x9CA8, 0x9CA9, 0x9CAB, 0x9CAD, 0x9CAE, 0x9CB0, 0x9CB1, 0x9CB2, 0x9CB3, 0x9CB4, 0x9CB5, 0x9CB6, 0x9CB7, 0x9CBA, 0x9CBB, 0x9CBC, 0x9CBD, 0x9CC4, 0x9CC5, 0x9CC6, 0x9CC7, 0x9CCA, 0x9CCB, // GB 0xF740..0xF77E 0x9C3C, 0x9C3D, 0x9C3E, 0x9C3F, 0x9C40, 0x9C41, 0x9C42, 0x9C43, 0x9C44, 0x9C45, 0x9C46, 0x9C47, 0x9C48, 0x9C49, 0x9C4A, 0x9C4B, 0x9C4C, 0x9C4D, 0x9C4E, 0x9C4F, 0x9C50, 0x9C51, 0x9C52, 0x9C53, 0x9C54, 0x9C55, 0x9C56, 0x9C57, 0x9C58, 0x9C59, 0x9C5A, 0x9C5B, 0x9C5C, 0x9C5D, 0x9C5E, 0x9C5F, 0x9C60, 0x9C61, 0x9C62, 0x9C63, 0x9C64, 0x9C65, 0x9C66, 0x9C67, 0x9C68, 0x9C69, 0x9C6A, 0x9C6B, 0x9C6C, 0x9C6D, 0x9C6E, 0x9C6F, 0x9C70, 0x9C71, 0x9C72, 0x9C73, 0x9C74, 0x9C75, 0x9C76, 0x9C77, 0x9C78, 0x9C79, 0x9C7A, // GB 0xF780..0xF7FE 0x9C7B, 0x9C7D, 0x9C7E, 0x9C80, 0x9C83, 0x9C84, 0x9C89, 0x9C8A, 0x9C8C, 0x9C8F, 0x9C93, 0x9C96, 0x9C97, 0x9C98, 0x9C99, 0x9C9D, 0x9CAA, 0x9CAC, 0x9CAF, 0x9CB9, 0x9CBE, 0x9CBF, 0x9CC0, 0x9CC1, 0x9CC2, 0x9CC8, 0x9CC9, 0x9CD1, 0x9CD2, 0x9CDA, 0x9CDB, 0x9CE0, 0x9CE1, 0x9CCC, 0x9CCD, 0x9CCE, 0x9CCF, 0x9CD0, 0x9CD3, 0x9CD4, 0x9CD5, 0x9CD7, 0x9CD8, 0x9CD9, 0x9CDC, 0x9CDD, 0x9CDF, 0x9CE2, 0x977C, 0x9785, 0x9791, 0x9792, 0x9794, 0x97AF, 0x97AB, 0x97A3, 0x97B2, 0x97B4, 0x9AB1, 0x9AB0, 0x9AB7, 0x9E58, 0x9AB6, 0x9ABA, 0x9ABC, 0x9AC1, 0x9AC0, 0x9AC5, 0x9AC2, 0x9ACB, 0x9ACC, 0x9AD1, 0x9B45, 0x9B43, 0x9B47, 0x9B49, 0x9B48, 0x9B4D, 0x9B51, 0x98E8, 0x990D, 0x992E, 0x9955, 0x9954, 0x9ADF, 0x9AE1, 0x9AE6, 0x9AEF, 0x9AEB, 0x9AFB, 0x9AED, 0x9AF9, 0x9B08, 0x9B0F, 0x9B13, 0x9B1F, 0x9B23, 0x9EBD, 0x9EBE, 0x7E3B, 0x9E82, 0x9E87, 0x9E88, 0x9E8B, 0x9E92, 0x93D6, 0x9E9D, 0x9E9F, 0x9EDB, 0x9EDC, 0x9EDD, 0x9EE0, 0x9EDF, 0x9EE2, 0x9EE9, 0x9EE7, 0x9EE5, 0x9EEA, 0x9EEF, 0x9F22, 0x9F2C, 0x9F2F, 0x9F39, 0x9F37, 0x9F3D, 0x9F3E, 0x9F44, // GB 0xF840..0xF87E 0x9CE3, 0x9CE4, 0x9CE5, 0x9CE6, 0x9CE7, 0x9CE8, 0x9CE9, 0x9CEA, 0x9CEB, 0x9CEC, 0x9CED, 0x9CEE, 0x9CEF, 0x9CF0, 0x9CF1, 0x9CF2, 0x9CF3, 0x9CF4, 0x9CF5, 0x9CF6, 0x9CF7, 0x9CF8, 0x9CF9, 0x9CFA, 0x9CFB, 0x9CFC, 0x9CFD, 0x9CFE, 0x9CFF, 0x9D00, 0x9D01, 0x9D02, 0x9D03, 0x9D04, 0x9D05, 0x9D06, 0x9D07, 0x9D08, 0x9D09, 0x9D0A, 0x9D0B, 0x9D0C, 0x9D0D, 0x9D0E, 0x9D0F, 0x9D10, 0x9D11, 0x9D12, 0x9D13, 0x9D14, 0x9D15, 0x9D16, 0x9D17, 0x9D18, 0x9D19, 0x9D1A, 0x9D1B, 0x9D1C, 0x9D1D, 0x9D1E, 0x9D1F, 0x9D20, 0x9D21, // GB 0xF880..0xF8A0 0x9D22, 0x9D23, 0x9D24, 0x9D25, 0x9D26, 0x9D27, 0x9D28, 0x9D29, 0x9D2A, 0x9D2B, 0x9D2C, 0x9D2D, 0x9D2E, 0x9D2F, 0x9D30, 0x9D31, 0x9D32, 0x9D33, 0x9D34, 0x9D35, 0x9D36, 0x9D37, 0x9D38, 0x9D39, 0x9D3A, 0x9D3B, 0x9D3C, 0x9D3D, 0x9D3E, 0x9D3F, 0x9D40, 0x9D41, 0x9D42, // Skip: GB 0xF8A1..0xF8FE (UDA 2) // GB 0xF940..0xF97E 0x9D43, 0x9D44, 0x9D45, 0x9D46, 0x9D47, 0x9D48, 0x9D49, 0x9D4A, 0x9D4B, 0x9D4C, 0x9D4D, 0x9D4E, 0x9D4F, 0x9D50, 0x9D51, 0x9D52, 0x9D53, 0x9D54, 0x9D55, 0x9D56, 0x9D57, 0x9D58, 0x9D59, 0x9D5A, 0x9D5B, 0x9D5C, 0x9D5D, 0x9D5E, 0x9D5F, 0x9D60, 0x9D61, 0x9D62, 0x9D63, 0x9D64, 0x9D65, 0x9D66, 0x9D67, 0x9D68, 0x9D69, 0x9D6A, 0x9D6B, 0x9D6C, 0x9D6D, 0x9D6E, 0x9D6F, 0x9D70, 0x9D71, 0x9D72, 0x9D73, 0x9D74, 0x9D75, 0x9D76, 0x9D77, 0x9D78, 0x9D79, 0x9D7A, 0x9D7B, 0x9D7C, 0x9D7D, 0x9D7E, 0x9D7F, 0x9D80, 0x9D81, // GB 0xF980..0xF9A0 0x9D82, 0x9D83, 0x9D84, 0x9D85, 0x9D86, 0x9D87, 0x9D88, 0x9D89, 0x9D8A, 0x9D8B, 0x9D8C, 0x9D8D, 0x9D8E, 0x9D8F, 0x9D90, 0x9D91, 0x9D92, 0x9D93, 0x9D94, 0x9D95, 0x9D96, 0x9D97, 0x9D98, 0x9D99, 0x9D9A, 0x9D9B, 0x9D9C, 0x9D9D, 0x9D9E, 0x9D9F, 0x9DA0, 0x9DA1, 0x9DA2, // Skip: GB 0xF9A1..0xF9FE (UDA 2) // GB 0xFA40..0xFA7E 0x9DA3, 0x9DA4, 0x9DA5, 0x9DA6, 0x9DA7, 0x9DA8, 0x9DA9, 0x9DAA, 0x9DAB, 0x9DAC, 0x9DAD, 0x9DAE, 0x9DAF, 0x9DB0, 0x9DB1, 0x9DB2, 0x9DB3, 0x9DB4, 0x9DB5, 0x9DB6, 0x9DB7, 0x9DB8, 0x9DB9, 0x9DBA, 0x9DBB, 0x9DBC, 0x9DBD, 0x9DBE, 0x9DBF, 0x9DC0, 0x9DC1, 0x9DC2, 0x9DC3, 0x9DC4, 0x9DC5, 0x9DC6, 0x9DC7, 0x9DC8, 0x9DC9, 0x9DCA, 0x9DCB, 0x9DCC, 0x9DCD, 0x9DCE, 0x9DCF, 0x9DD0, 0x9DD1, 0x9DD2, 0x9DD3, 0x9DD4, 0x9DD5, 0x9DD6, 0x9DD7, 0x9DD8, 0x9DD9, 0x9DDA, 0x9DDB, 0x9DDC, 0x9DDD, 0x9DDE, 0x9DDF, 0x9DE0, 0x9DE1, // GB 0xFA80..0xFAA0 0x9DE2, 0x9DE3, 0x9DE4, 0x9DE5, 0x9DE6, 0x9DE7, 0x9DE8, 0x9DE9, 0x9DEA, 0x9DEB, 0x9DEC, 0x9DED, 0x9DEE, 0x9DEF, 0x9DF0, 0x9DF1, 0x9DF2, 0x9DF3, 0x9DF4, 0x9DF5, 0x9DF6, 0x9DF7, 0x9DF8, 0x9DF9, 0x9DFA, 0x9DFB, 0x9DFC, 0x9DFD, 0x9DFE, 0x9DFF, 0x9E00, 0x9E01, 0x9E02, // Skip: GB 0xFAA1..0xFAFE (UDA 2) // GB 0xFB40..0xFB7E 0x9E03, 0x9E04, 0x9E05, 0x9E06, 0x9E07, 0x9E08, 0x9E09, 0x9E0A, 0x9E0B, 0x9E0C, 0x9E0D, 0x9E0E, 0x9E0F, 0x9E10, 0x9E11, 0x9E12, 0x9E13, 0x9E14, 0x9E15, 0x9E16, 0x9E17, 0x9E18, 0x9E19, 0x9E1A, 0x9E1B, 0x9E1C, 0x9E1D, 0x9E1E, 0x9E24, 0x9E27, 0x9E2E, 0x9E30, 0x9E34, 0x9E3B, 0x9E3C, 0x9E40, 0x9E4D, 0x9E50, 0x9E52, 0x9E53, 0x9E54, 0x9E56, 0x9E59, 0x9E5D, 0x9E5F, 0x9E60, 0x9E61, 0x9E62, 0x9E65, 0x9E6E, 0x9E6F, 0x9E72, 0x9E74, 0x9E75, 0x9E76, 0x9E77, 0x9E78, 0x9E79, 0x9E7A, 0x9E7B, 0x9E7C, 0x9E7D, 0x9E80, // GB 0xFB80..0xFBA0 0x9E81, 0x9E83, 0x9E84, 0x9E85, 0x9E86, 0x9E89, 0x9E8A, 0x9E8C, 0x9E8D, 0x9E8E, 0x9E8F, 0x9E90, 0x9E91, 0x9E94, 0x9E95, 0x9E96, 0x9E97, 0x9E98, 0x9E99, 0x9E9A, 0x9E9B, 0x9E9C, 0x9E9E, 0x9EA0, 0x9EA1, 0x9EA2, 0x9EA3, 0x9EA4, 0x9EA5, 0x9EA7, 0x9EA8, 0x9EA9, 0x9EAA, // Skip: GB 0xFBA1..0xFBFE (UDA 2) // GB 0xFC40..0xFC7E 0x9EAB, 0x9EAC, 0x9EAD, 0x9EAE, 0x9EAF, 0x9EB0, 0x9EB1, 0x9EB2, 0x9EB3, 0x9EB5, 0x9EB6, 0x9EB7, 0x9EB9, 0x9EBA, 0x9EBC, 0x9EBF, 0x9EC0, 0x9EC1, 0x9EC2, 0x9EC3, 0x9EC5, 0x9EC6, 0x9EC7, 0x9EC8, 0x9ECA, 0x9ECB, 0x9ECC, 0x9ED0, 0x9ED2, 0x9ED3, 0x9ED5, 0x9ED6, 0x9ED7, 0x9ED9, 0x9EDA, 0x9EDE, 0x9EE1, 0x9EE3, 0x9EE4, 0x9EE6, 0x9EE8, 0x9EEB, 0x9EEC, 0x9EED, 0x9EEE, 0x9EF0, 0x9EF1, 0x9EF2, 0x9EF3, 0x9EF4, 0x9EF5, 0x9EF6, 0x9EF7, 0x9EF8, 0x9EFA, 0x9EFD, 0x9EFF, 0x9F00, 0x9F01, 0x9F02, 0x9F03, 0x9F04, 0x9F05, // GB 0xFC80..0xFCA0 0x9F06, 0x9F07, 0x9F08, 0x9F09, 0x9F0A, 0x9F0C, 0x9F0F, 0x9F11, 0x9F12, 0x9F14, 0x9F15, 0x9F16, 0x9F18, 0x9F1A, 0x9F1B, 0x9F1C, 0x9F1D, 0x9F1E, 0x9F1F, 0x9F21, 0x9F23, 0x9F24, 0x9F25, 0x9F26, 0x9F27, 0x9F28, 0x9F29, 0x9F2A, 0x9F2B, 0x9F2D, 0x9F2E, 0x9F30, 0x9F31, // Skip: GB 0xFCA1..0xFCFE (UDA 2) // GB 0xFD40..0xFD7E 0x9F32, 0x9F33, 0x9F34, 0x9F35, 0x9F36, 0x9F38, 0x9F3A, 0x9F3C, 0x9F3F, 0x9F40, 0x9F41, 0x9F42, 0x9F43, 0x9F45, 0x9F46, 0x9F47, 0x9F48, 0x9F49, 0x9F4A, 0x9F4B, 0x9F4C, 0x9F4D, 0x9F4E, 0x9F4F, 0x9F52, 0x9F53, 0x9F54, 0x9F55, 0x9F56, 0x9F57, 0x9F58, 0x9F59, 0x9F5A, 0x9F5B, 0x9F5C, 0x9F5D, 0x9F5E, 0x9F5F, 0x9F60, 0x9F61, 0x9F62, 0x9F63, 0x9F64, 0x9F65, 0x9F66, 0x9F67, 0x9F68, 0x9F69, 0x9F6A, 0x9F6B, 0x9F6C, 0x9F6D, 0x9F6E, 0x9F6F, 0x9F70, 0x9F71, 0x9F72, 0x9F73, 0x9F74, 0x9F75, 0x9F76, 0x9F77, 0x9F78, // GB 0xFD80..0xFDA0 0x9F79, 0x9F7A, 0x9F7B, 0x9F7C, 0x9F7D, 0x9F7E, 0x9F81, 0x9F82, 0x9F8D, 0x9F8E, 0x9F8F, 0x9F90, 0x9F91, 0x9F92, 0x9F93, 0x9F94, 0x9F95, 0x9F96, 0x9F97, 0x9F98, 0x9F9C, 0x9F9D, 0x9F9E, 0x9FA1, 0x9FA2, 0x9FA3, 0x9FA4, 0x9FA5, 0xF92C, 0xF979, 0xF995, 0xF9E7, 0xF9F1, // Skip: GB 0xFDA1..0xFDFE (UDA 2) // GB 0xFE40..0xFE7E 0xFA0C, 0xFA0D, 0xFA0E, 0xFA0F, 0xFA11, 0xFA13, 0xFA14, 0xFA18, 0xFA1F, 0xFA20, 0xFA21, 0xFA23, 0xFA24, 0xFA27, 0xFA28, 0xFA29, 0x2E81, 0xE816, 0xE817, 0xE818, 0x2E84, 0x3473, 0x3447, 0x2E88, 0x2E8B, 0xE81E, 0x359E, 0x361A, 0x360E, 0x2E8C, 0x2E97, 0x396E, 0x3918, 0xE826, 0x39CF, 0x39DF, 0x3A73, 0x39D0, 0xE82B, 0xE82C, 0x3B4E, 0x3C6E, 0x3CE0, 0x2EA7, 0xE831, 0xE832, 0x2EAA, 0x4056, 0x415F, 0x2EAE, 0x4337, 0x2EB3, 0x2EB6, 0x2EB7, 0xE83B, 0x43B1, 0x43AC, 0x2EBB, 0x43DD, 0x44D6, 0x4661, 0x464C, 0xE843, // GB 0xFE80..0xFEA0 0x4723, 0x4729, 0x477C, 0x478D, 0x2ECA, 0x4947, 0x497A, 0x497D, 0x4982, 0x4983, 0x4985, 0x4986, 0x499F, 0x499B, 0x49B7, 0x49B6, 0xE854, 0xE855, 0x4CA3, 0x4C9F, 0x4CA0, 0x4CA1, 0x4C77, 0x4CA2, 0x4D13, 0x4D14, 0x4D15, 0x4D16, 0x4D17, 0x4D18, 0x4D19, 0x4DAE, 0xE864, // Skip: GB 0xFEA1..0xFEFE (UDA 2) }; static const uint16_t gb18030_4byte_to_ucs[6793] = { /* Contiguous area: GB+81 30 81 30 .. GB+81 30 D2 39 */ /* GB+81 30 81 30 */ 0x0080, 0x0081, 0x0082, 0x0083, 0x0084, /* GB+81 30 81 35 */ 0x0085, 0x0086, 0x0087, 0x0088, 0x0089, /* GB+81 30 82 30 */ 0x008A, 0x008B, 0x008C, 0x008D, 0x008E, /* GB+81 30 82 35 */ 0x008F, 0x0090, 0x0091, 0x0092, 0x0093, /* GB+81 30 83 30 */ 0x0094, 0x0095, 0x0096, 0x0097, 0x0098, /* GB+81 30 83 35 */ 0x0099, 0x009A, 0x009B, 0x009C, 0x009D, /* GB+81 30 84 30 */ 0x009E, 0x009F, 0x00A0, 0x00A1, 0x00A2, /* GB+81 30 84 35 */ 0x00A3, 0x00A5, 0x00A6, 0x00A9, 0x00AA, /* GB+81 30 85 30 */ 0x00AB, 0x00AC, 0x00AD, 0x00AE, 0x00AF, /* GB+81 30 85 35 */ 0x00B2, 0x00B3, 0x00B4, 0x00B5, 0x00B6, /* GB+81 30 86 30 */ 0x00B8, 0x00B9, 0x00BA, 0x00BB, 0x00BC, /* GB+81 30 86 35 */ 0x00BD, 0x00BE, 0x00BF, 0x00C0, 0x00C1, /* GB+81 30 87 30 */ 0x00C2, 0x00C3, 0x00C4, 0x00C5, 0x00C6, /* GB+81 30 87 35 */ 0x00C7, 0x00C8, 0x00C9, 0x00CA, 0x00CB, /* GB+81 30 88 30 */ 0x00CC, 0x00CD, 0x00CE, 0x00CF, 0x00D0, /* GB+81 30 88 35 */ 0x00D1, 0x00D2, 0x00D3, 0x00D4, 0x00D5, /* GB+81 30 89 30 */ 0x00D6, 0x00D8, 0x00D9, 0x00DA, 0x00DB, /* GB+81 30 89 35 */ 0x00DC, 0x00DD, 0x00DE, 0x00DF, 0x00E2, /* GB+81 30 8A 30 */ 0x00E3, 0x00E4, 0x00E5, 0x00E6, 0x00E7, /* GB+81 30 8A 35 */ 0x00EB, 0x00EE, 0x00EF, 0x00F0, 0x00F1, /* GB+81 30 8B 30 */ 0x00F4, 0x00F5, 0x00F6, 0x00F8, 0x00FB, /* GB+81 30 8B 35 */ 0x00FD, 0x00FE, 0x00FF, 0x0100, 0x0102, /* GB+81 30 8C 30 */ 0x0103, 0x0104, 0x0105, 0x0106, 0x0107, /* GB+81 30 8C 35 */ 0x0108, 0x0109, 0x010A, 0x010B, 0x010C, /* GB+81 30 8D 30 */ 0x010D, 0x010E, 0x010F, 0x0110, 0x0111, /* GB+81 30 8D 35 */ 0x0112, 0x0114, 0x0115, 0x0116, 0x0117, /* GB+81 30 8E 30 */ 0x0118, 0x0119, 0x011A, 0x011C, 0x011D, /* GB+81 30 8E 35 */ 0x011E, 0x011F, 0x0120, 0x0121, 0x0122, /* GB+81 30 8F 30 */ 0x0123, 0x0124, 0x0125, 0x0126, 0x0127, /* GB+81 30 8F 35 */ 0x0128, 0x0129, 0x012A, 0x012C, 0x012D, /* GB+81 30 90 30 */ 0x012E, 0x012F, 0x0130, 0x0131, 0x0132, /* GB+81 30 90 35 */ 0x0133, 0x0134, 0x0135, 0x0136, 0x0137, /* GB+81 30 91 30 */ 0x0138, 0x0139, 0x013A, 0x013B, 0x013C, /* GB+81 30 91 35 */ 0x013D, 0x013E, 0x013F, 0x0140, 0x0141, /* GB+81 30 92 30 */ 0x0142, 0x0143, 0x0145, 0x0146, 0x0147, /* GB+81 30 92 35 */ 0x0149, 0x014A, 0x014B, 0x014C, 0x014E, /* GB+81 30 93 30 */ 0x014F, 0x0150, 0x0151, 0x0152, 0x0153, /* GB+81 30 93 35 */ 0x0154, 0x0155, 0x0156, 0x0157, 0x0158, /* GB+81 30 94 30 */ 0x0159, 0x015A, 0x015B, 0x015C, 0x015D, /* GB+81 30 94 35 */ 0x015E, 0x015F, 0x0160, 0x0161, 0x0162, /* GB+81 30 95 30 */ 0x0163, 0x0164, 0x0165, 0x0166, 0x0167, /* GB+81 30 95 35 */ 0x0168, 0x0169, 0x016A, 0x016C, 0x016D, /* GB+81 30 96 30 */ 0x016E, 0x016F, 0x0170, 0x0171, 0x0172, /* GB+81 30 96 35 */ 0x0173, 0x0174, 0x0175, 0x0176, 0x0177, /* GB+81 30 97 30 */ 0x0178, 0x0179, 0x017A, 0x017B, 0x017C, /* GB+81 30 97 35 */ 0x017D, 0x017E, 0x017F, 0x0180, 0x0181, /* GB+81 30 98 30 */ 0x0182, 0x0183, 0x0184, 0x0185, 0x0186, /* GB+81 30 98 35 */ 0x0187, 0x0188, 0x0189, 0x018A, 0x018B, /* GB+81 30 99 30 */ 0x018C, 0x018D, 0x018E, 0x018F, 0x0190, /* GB+81 30 99 35 */ 0x0191, 0x0192, 0x0193, 0x0194, 0x0195, /* GB+81 30 9A 30 */ 0x0196, 0x0197, 0x0198, 0x0199, 0x019A, /* GB+81 30 9A 35 */ 0x019B, 0x019C, 0x019D, 0x019E, 0x019F, /* GB+81 30 9B 30 */ 0x01A0, 0x01A1, 0x01A2, 0x01A3, 0x01A4, /* GB+81 30 9B 35 */ 0x01A5, 0x01A6, 0x01A7, 0x01A8, 0x01A9, /* GB+81 30 9C 30 */ 0x01AA, 0x01AB, 0x01AC, 0x01AD, 0x01AE, /* GB+81 30 9C 35 */ 0x01AF, 0x01B0, 0x01B1, 0x01B2, 0x01B3, /* GB+81 30 9D 30 */ 0x01B4, 0x01B5, 0x01B6, 0x01B7, 0x01B8, /* GB+81 30 9D 35 */ 0x01B9, 0x01BA, 0x01BB, 0x01BC, 0x01BD, /* GB+81 30 9E 30 */ 0x01BE, 0x01BF, 0x01C0, 0x01C1, 0x01C2, /* GB+81 30 9E 35 */ 0x01C3, 0x01C4, 0x01C5, 0x01C6, 0x01C7, /* GB+81 30 9F 30 */ 0x01C8, 0x01C9, 0x01CA, 0x01CB, 0x01CC, /* GB+81 30 9F 35 */ 0x01CD, 0x01CF, 0x01D1, 0x01D3, 0x01D5, /* GB+81 30 A0 30 */ 0x01D7, 0x01D9, 0x01DB, 0x01DD, 0x01DE, /* GB+81 30 A0 35 */ 0x01DF, 0x01E0, 0x01E1, 0x01E2, 0x01E3, /* GB+81 30 A1 30 */ 0x01E4, 0x01E5, 0x01E6, 0x01E7, 0x01E8, /* GB+81 30 A1 35 */ 0x01E9, 0x01EA, 0x01EB, 0x01EC, 0x01ED, /* GB+81 30 A2 30 */ 0x01EE, 0x01EF, 0x01F0, 0x01F1, 0x01F2, /* GB+81 30 A2 35 */ 0x01F3, 0x01F4, 0x01F5, 0x01F6, 0x01F7, /* GB+81 30 A3 30 */ 0x01F8, 0x01FA, 0x01FB, 0x01FC, 0x01FD, /* GB+81 30 A3 35 */ 0x01FE, 0x01FF, 0x0200, 0x0201, 0x0202, /* GB+81 30 A4 30 */ 0x0203, 0x0204, 0x0205, 0x0206, 0x0207, /* GB+81 30 A4 35 */ 0x0208, 0x0209, 0x020A, 0x020B, 0x020C, /* GB+81 30 A5 30 */ 0x020D, 0x020E, 0x020F, 0x0210, 0x0211, /* GB+81 30 A5 35 */ 0x0212, 0x0213, 0x0214, 0x0215, 0x0216, /* GB+81 30 A6 30 */ 0x0217, 0x0218, 0x0219, 0x021A, 0x021B, /* GB+81 30 A6 35 */ 0x021C, 0x021D, 0x021E, 0x021F, 0x0220, /* GB+81 30 A7 30 */ 0x0221, 0x0222, 0x0223, 0x0224, 0x0225, /* GB+81 30 A7 35 */ 0x0226, 0x0227, 0x0228, 0x0229, 0x022A, /* GB+81 30 A8 30 */ 0x022B, 0x022C, 0x022D, 0x022E, 0x022F, /* GB+81 30 A8 35 */ 0x0230, 0x0231, 0x0232, 0x0233, 0x0234, /* GB+81 30 A9 30 */ 0x0235, 0x0236, 0x0237, 0x0238, 0x0239, /* GB+81 30 A9 35 */ 0x023A, 0x023B, 0x023C, 0x023D, 0x023E, /* GB+81 30 AA 30 */ 0x023F, 0x0240, 0x0241, 0x0242, 0x0243, /* GB+81 30 AA 35 */ 0x0244, 0x0245, 0x0246, 0x0247, 0x0248, /* GB+81 30 AB 30 */ 0x0249, 0x024A, 0x024B, 0x024C, 0x024D, /* GB+81 30 AB 35 */ 0x024E, 0x024F, 0x0250, 0x0252, 0x0253, /* GB+81 30 AC 30 */ 0x0254, 0x0255, 0x0256, 0x0257, 0x0258, /* GB+81 30 AC 35 */ 0x0259, 0x025A, 0x025B, 0x025C, 0x025D, /* GB+81 30 AD 30 */ 0x025E, 0x025F, 0x0260, 0x0262, 0x0263, /* GB+81 30 AD 35 */ 0x0264, 0x0265, 0x0266, 0x0267, 0x0268, /* GB+81 30 AE 30 */ 0x0269, 0x026A, 0x026B, 0x026C, 0x026D, /* GB+81 30 AE 35 */ 0x026E, 0x026F, 0x0270, 0x0271, 0x0272, /* GB+81 30 AF 30 */ 0x0273, 0x0274, 0x0275, 0x0276, 0x0277, /* GB+81 30 AF 35 */ 0x0278, 0x0279, 0x027A, 0x027B, 0x027C, /* GB+81 30 B0 30 */ 0x027D, 0x027E, 0x027F, 0x0280, 0x0281, /* GB+81 30 B0 35 */ 0x0282, 0x0283, 0x0284, 0x0285, 0x0286, /* GB+81 30 B1 30 */ 0x0287, 0x0288, 0x0289, 0x028A, 0x028B, /* GB+81 30 B1 35 */ 0x028C, 0x028D, 0x028E, 0x028F, 0x0290, /* GB+81 30 B2 30 */ 0x0291, 0x0292, 0x0293, 0x0294, 0x0295, /* GB+81 30 B2 35 */ 0x0296, 0x0297, 0x0298, 0x0299, 0x029A, /* GB+81 30 B3 30 */ 0x029B, 0x029C, 0x029D, 0x029E, 0x029F, /* GB+81 30 B3 35 */ 0x02A0, 0x02A1, 0x02A2, 0x02A3, 0x02A4, /* GB+81 30 B4 30 */ 0x02A5, 0x02A6, 0x02A7, 0x02A8, 0x02A9, /* GB+81 30 B4 35 */ 0x02AA, 0x02AB, 0x02AC, 0x02AD, 0x02AE, /* GB+81 30 B5 30 */ 0x02AF, 0x02B0, 0x02B1, 0x02B2, 0x02B3, /* GB+81 30 B5 35 */ 0x02B4, 0x02B5, 0x02B6, 0x02B7, 0x02B8, /* GB+81 30 B6 30 */ 0x02B9, 0x02BA, 0x02BB, 0x02BC, 0x02BD, /* GB+81 30 B6 35 */ 0x02BE, 0x02BF, 0x02C0, 0x02C1, 0x02C2, /* GB+81 30 B7 30 */ 0x02C3, 0x02C4, 0x02C5, 0x02C6, 0x02C8, /* GB+81 30 B7 35 */ 0x02CC, 0x02CD, 0x02CE, 0x02CF, 0x02D0, /* GB+81 30 B8 30 */ 0x02D1, 0x02D2, 0x02D3, 0x02D4, 0x02D5, /* GB+81 30 B8 35 */ 0x02D6, 0x02D7, 0x02D8, 0x02DA, 0x02DB, /* GB+81 30 B9 30 */ 0x02DC, 0x02DD, 0x02DE, 0x02DF, 0x02E0, /* GB+81 30 B9 35 */ 0x02E1, 0x02E2, 0x02E3, 0x02E4, 0x02E5, /* GB+81 30 BA 30 */ 0x02E6, 0x02E7, 0x02E8, 0x02E9, 0x02EA, /* GB+81 30 BA 35 */ 0x02EB, 0x02EC, 0x02ED, 0x02EE, 0x02EF, /* GB+81 30 BB 30 */ 0x02F0, 0x02F1, 0x02F2, 0x02F3, 0x02F4, /* GB+81 30 BB 35 */ 0x02F5, 0x02F6, 0x02F7, 0x02F8, 0x02F9, /* GB+81 30 BC 30 */ 0x02FA, 0x02FB, 0x02FC, 0x02FD, 0x02FE, /* GB+81 30 BC 35 */ 0x02FF, 0x0300, 0x0301, 0x0302, 0x0303, /* GB+81 30 BD 30 */ 0x0304, 0x0305, 0x0306, 0x0307, 0x0308, /* GB+81 30 BD 35 */ 0x0309, 0x030A, 0x030B, 0x030C, 0x030D, /* GB+81 30 BE 30 */ 0x030E, 0x030F, 0x0310, 0x0311, 0x0312, /* GB+81 30 BE 35 */ 0x0313, 0x0314, 0x0315, 0x0316, 0x0317, /* GB+81 30 BF 30 */ 0x0318, 0x0319, 0x031A, 0x031B, 0x031C, /* GB+81 30 BF 35 */ 0x031D, 0x031E, 0x031F, 0x0320, 0x0321, /* GB+81 30 C0 30 */ 0x0322, 0x0323, 0x0324, 0x0325, 0x0326, /* GB+81 30 C0 35 */ 0x0327, 0x0328, 0x0329, 0x032A, 0x032B, /* GB+81 30 C1 30 */ 0x032C, 0x032D, 0x032E, 0x032F, 0x0330, /* GB+81 30 C1 35 */ 0x0331, 0x0332, 0x0333, 0x0334, 0x0335, /* GB+81 30 C2 30 */ 0x0336, 0x0337, 0x0338, 0x0339, 0x033A, /* GB+81 30 C2 35 */ 0x033B, 0x033C, 0x033D, 0x033E, 0x033F, /* GB+81 30 C3 30 */ 0x0340, 0x0341, 0x0342, 0x0343, 0x0344, /* GB+81 30 C3 35 */ 0x0345, 0x0346, 0x0347, 0x0348, 0x0349, /* GB+81 30 C4 30 */ 0x034A, 0x034B, 0x034C, 0x034D, 0x034E, /* GB+81 30 C4 35 */ 0x034F, 0x0350, 0x0351, 0x0352, 0x0353, /* GB+81 30 C5 30 */ 0x0354, 0x0355, 0x0356, 0x0357, 0x0358, /* GB+81 30 C5 35 */ 0x0359, 0x035A, 0x035B, 0x035C, 0x035D, /* GB+81 30 C6 30 */ 0x035E, 0x035F, 0x0360, 0x0361, 0x0362, /* GB+81 30 C6 35 */ 0x0363, 0x0364, 0x0365, 0x0366, 0x0367, /* GB+81 30 C7 30 */ 0x0368, 0x0369, 0x036A, 0x036B, 0x036C, /* GB+81 30 C7 35 */ 0x036D, 0x036E, 0x036F, 0x0370, 0x0371, /* GB+81 30 C8 30 */ 0x0372, 0x0373, 0x0374, 0x0375, 0x0376, /* GB+81 30 C8 35 */ 0x0377, 0x0378, 0x0379, 0x037A, 0x037B, /* GB+81 30 C9 30 */ 0x037C, 0x037D, 0x037E, 0x037F, 0x0380, /* GB+81 30 C9 35 */ 0x0381, 0x0382, 0x0383, 0x0384, 0x0385, /* GB+81 30 CA 30 */ 0x0386, 0x0387, 0x0388, 0x0389, 0x038A, /* GB+81 30 CA 35 */ 0x038B, 0x038C, 0x038D, 0x038E, 0x038F, /* GB+81 30 CB 30 */ 0x0390, 0x03A2, 0x03AA, 0x03AB, 0x03AC, /* GB+81 30 CB 35 */ 0x03AD, 0x03AE, 0x03AF, 0x03B0, 0x03C2, /* GB+81 30 CC 30 */ 0x03CA, 0x03CB, 0x03CC, 0x03CD, 0x03CE, /* GB+81 30 CC 35 */ 0x03CF, 0x03D0, 0x03D1, 0x03D2, 0x03D3, /* GB+81 30 CD 30 */ 0x03D4, 0x03D5, 0x03D6, 0x03D7, 0x03D8, /* GB+81 30 CD 35 */ 0x03D9, 0x03DA, 0x03DB, 0x03DC, 0x03DD, /* GB+81 30 CE 30 */ 0x03DE, 0x03DF, 0x03E0, 0x03E1, 0x03E2, /* GB+81 30 CE 35 */ 0x03E3, 0x03E4, 0x03E5, 0x03E6, 0x03E7, /* GB+81 30 CF 30 */ 0x03E8, 0x03E9, 0x03EA, 0x03EB, 0x03EC, /* GB+81 30 CF 35 */ 0x03ED, 0x03EE, 0x03EF, 0x03F0, 0x03F1, /* GB+81 30 D0 30 */ 0x03F2, 0x03F3, 0x03F4, 0x03F5, 0x03F6, /* GB+81 30 D0 35 */ 0x03F7, 0x03F8, 0x03F9, 0x03FA, 0x03FB, /* GB+81 30 D1 30 */ 0x03FC, 0x03FD, 0x03FE, 0x03FF, 0x0400, /* GB+81 30 D1 35 */ 0x0402, 0x0403, 0x0404, 0x0405, 0x0406, /* GB+81 30 D2 30 */ 0x0407, 0x0408, 0x0409, 0x040A, 0x040B, /* GB+81 30 D2 35 */ 0x040C, 0x040D, 0x040E, 0x040F, 0x0450, /* Contiguous area: GB+81 36 A5 32 .. GB+81 37 A8 38 */ /* GB+81 36 A5 32 */ 0x2011, 0x2012, 0x2017, /* GB+81 36 A5 35 */ 0x201A, 0x201B, 0x201E, 0x201F, 0x2020, /* GB+81 36 A6 30 */ 0x2021, 0x2022, 0x2023, 0x2024, 0x2027, /* GB+81 36 A6 35 */ 0x2028, 0x2029, 0x202A, 0x202B, 0x202C, /* GB+81 36 A7 30 */ 0x202D, 0x202E, 0x202F, 0x2031, 0x2034, /* GB+81 36 A7 35 */ 0x2036, 0x2037, 0x2038, 0x2039, 0x203A, /* GB+81 36 A8 30 */ 0x203C, 0x203D, 0x203E, 0x203F, 0x2040, /* GB+81 36 A8 35 */ 0x2041, 0x2042, 0x2043, 0x2044, 0x2045, /* GB+81 36 A9 30 */ 0x2046, 0x2047, 0x2048, 0x2049, 0x204A, /* GB+81 36 A9 35 */ 0x204B, 0x204C, 0x204D, 0x204E, 0x204F, /* GB+81 36 AA 30 */ 0x2050, 0x2051, 0x2052, 0x2053, 0x2054, /* GB+81 36 AA 35 */ 0x2055, 0x2056, 0x2057, 0x2058, 0x2059, /* GB+81 36 AB 30 */ 0x205A, 0x205B, 0x205C, 0x205D, 0x205E, /* GB+81 36 AB 35 */ 0x205F, 0x2060, 0x2061, 0x2062, 0x2063, /* GB+81 36 AC 30 */ 0x2064, 0x2065, 0x2066, 0x2067, 0x2068, /* GB+81 36 AC 35 */ 0x2069, 0x206A, 0x206B, 0x206C, 0x206D, /* GB+81 36 AD 30 */ 0x206E, 0x206F, 0x2070, 0x2071, 0x2072, /* GB+81 36 AD 35 */ 0x2073, 0x2074, 0x2075, 0x2076, 0x2077, /* GB+81 36 AE 30 */ 0x2078, 0x2079, 0x207A, 0x207B, 0x207C, /* GB+81 36 AE 35 */ 0x207D, 0x207E, 0x207F, 0x2080, 0x2081, /* GB+81 36 AF 30 */ 0x2082, 0x2083, 0x2084, 0x2085, 0x2086, /* GB+81 36 AF 35 */ 0x2087, 0x2088, 0x2089, 0x208A, 0x208B, /* GB+81 36 B0 30 */ 0x208C, 0x208D, 0x208E, 0x208F, 0x2090, /* GB+81 36 B0 35 */ 0x2091, 0x2092, 0x2093, 0x2094, 0x2095, /* GB+81 36 B1 30 */ 0x2096, 0x2097, 0x2098, 0x2099, 0x209A, /* GB+81 36 B1 35 */ 0x209B, 0x209C, 0x209D, 0x209E, 0x209F, /* GB+81 36 B2 30 */ 0x20A0, 0x20A1, 0x20A2, 0x20A3, 0x20A4, /* GB+81 36 B2 35 */ 0x20A5, 0x20A6, 0x20A7, 0x20A8, 0x20A9, /* GB+81 36 B3 30 */ 0x20AA, 0x20AB, 0x20AD, 0x20AE, 0x20AF, /* GB+81 36 B3 35 */ 0x20B0, 0x20B1, 0x20B2, 0x20B3, 0x20B4, /* GB+81 36 B4 30 */ 0x20B5, 0x20B6, 0x20B7, 0x20B8, 0x20B9, /* GB+81 36 B4 35 */ 0x20BA, 0x20BB, 0x20BC, 0x20BD, 0x20BE, /* GB+81 36 B5 30 */ 0x20BF, 0x20C0, 0x20C1, 0x20C2, 0x20C3, /* GB+81 36 B5 35 */ 0x20C4, 0x20C5, 0x20C6, 0x20C7, 0x20C8, /* GB+81 36 B6 30 */ 0x20C9, 0x20CA, 0x20CB, 0x20CC, 0x20CD, /* GB+81 36 B6 35 */ 0x20CE, 0x20CF, 0x20D0, 0x20D1, 0x20D2, /* GB+81 36 B7 30 */ 0x20D3, 0x20D4, 0x20D5, 0x20D6, 0x20D7, /* GB+81 36 B7 35 */ 0x20D8, 0x20D9, 0x20DA, 0x20DB, 0x20DC, /* GB+81 36 B8 30 */ 0x20DD, 0x20DE, 0x20DF, 0x20E0, 0x20E1, /* GB+81 36 B8 35 */ 0x20E2, 0x20E3, 0x20E4, 0x20E5, 0x20E6, /* GB+81 36 B9 30 */ 0x20E7, 0x20E8, 0x20E9, 0x20EA, 0x20EB, /* GB+81 36 B9 35 */ 0x20EC, 0x20ED, 0x20EE, 0x20EF, 0x20F0, /* GB+81 36 BA 30 */ 0x20F1, 0x20F2, 0x20F3, 0x20F4, 0x20F5, /* GB+81 36 BA 35 */ 0x20F6, 0x20F7, 0x20F8, 0x20F9, 0x20FA, /* GB+81 36 BB 30 */ 0x20FB, 0x20FC, 0x20FD, 0x20FE, 0x20FF, /* GB+81 36 BB 35 */ 0x2100, 0x2101, 0x2102, 0x2104, 0x2106, /* GB+81 36 BC 30 */ 0x2107, 0x2108, 0x210A, 0x210B, 0x210C, /* GB+81 36 BC 35 */ 0x210D, 0x210E, 0x210F, 0x2110, 0x2111, /* GB+81 36 BD 30 */ 0x2112, 0x2113, 0x2114, 0x2115, 0x2117, /* GB+81 36 BD 35 */ 0x2118, 0x2119, 0x211A, 0x211B, 0x211C, /* GB+81 36 BE 30 */ 0x211D, 0x211E, 0x211F, 0x2120, 0x2122, /* GB+81 36 BE 35 */ 0x2123, 0x2124, 0x2125, 0x2126, 0x2127, /* GB+81 36 BF 30 */ 0x2128, 0x2129, 0x212A, 0x212B, 0x212C, /* GB+81 36 BF 35 */ 0x212D, 0x212E, 0x212F, 0x2130, 0x2131, /* GB+81 36 C0 30 */ 0x2132, 0x2133, 0x2134, 0x2135, 0x2136, /* GB+81 36 C0 35 */ 0x2137, 0x2138, 0x2139, 0x213A, 0x213B, /* GB+81 36 C1 30 */ 0x213C, 0x213D, 0x213E, 0x213F, 0x2140, /* GB+81 36 C1 35 */ 0x2141, 0x2142, 0x2143, 0x2144, 0x2145, /* GB+81 36 C2 30 */ 0x2146, 0x2147, 0x2148, 0x2149, 0x214A, /* GB+81 36 C2 35 */ 0x214B, 0x214C, 0x214D, 0x214E, 0x214F, /* GB+81 36 C3 30 */ 0x2150, 0x2151, 0x2152, 0x2153, 0x2154, /* GB+81 36 C3 35 */ 0x2155, 0x2156, 0x2157, 0x2158, 0x2159, /* GB+81 36 C4 30 */ 0x215A, 0x215B, 0x215C, 0x215D, 0x215E, /* GB+81 36 C4 35 */ 0x215F, 0x216C, 0x216D, 0x216E, 0x216F, /* GB+81 36 C5 30 */ 0x217A, 0x217B, 0x217C, 0x217D, 0x217E, /* GB+81 36 C5 35 */ 0x217F, 0x2180, 0x2181, 0x2182, 0x2183, /* GB+81 36 C6 30 */ 0x2184, 0x2185, 0x2186, 0x2187, 0x2188, /* GB+81 36 C6 35 */ 0x2189, 0x218A, 0x218B, 0x218C, 0x218D, /* GB+81 36 C7 30 */ 0x218E, 0x218F, 0x2194, 0x2195, 0x219A, /* GB+81 36 C7 35 */ 0x219B, 0x219C, 0x219D, 0x219E, 0x219F, /* GB+81 36 C8 30 */ 0x21A0, 0x21A1, 0x21A2, 0x21A3, 0x21A4, /* GB+81 36 C8 35 */ 0x21A5, 0x21A6, 0x21A7, 0x21A8, 0x21A9, /* GB+81 36 C9 30 */ 0x21AA, 0x21AB, 0x21AC, 0x21AD, 0x21AE, /* GB+81 36 C9 35 */ 0x21AF, 0x21B0, 0x21B1, 0x21B2, 0x21B3, /* GB+81 36 CA 30 */ 0x21B4, 0x21B5, 0x21B6, 0x21B7, 0x21B8, /* GB+81 36 CA 35 */ 0x21B9, 0x21BA, 0x21BB, 0x21BC, 0x21BD, /* GB+81 36 CB 30 */ 0x21BE, 0x21BF, 0x21C0, 0x21C1, 0x21C2, /* GB+81 36 CB 35 */ 0x21C3, 0x21C4, 0x21C5, 0x21C6, 0x21C7, /* GB+81 36 CC 30 */ 0x21C8, 0x21C9, 0x21CA, 0x21CB, 0x21CC, /* GB+81 36 CC 35 */ 0x21CD, 0x21CE, 0x21CF, 0x21D0, 0x21D1, /* GB+81 36 CD 30 */ 0x21D2, 0x21D3, 0x21D4, 0x21D5, 0x21D6, /* GB+81 36 CD 35 */ 0x21D7, 0x21D8, 0x21D9, 0x21DA, 0x21DB, /* GB+81 36 CE 30 */ 0x21DC, 0x21DD, 0x21DE, 0x21DF, 0x21E0, /* GB+81 36 CE 35 */ 0x21E1, 0x21E2, 0x21E3, 0x21E4, 0x21E5, /* GB+81 36 CF 30 */ 0x21E6, 0x21E7, 0x21E8, 0x21E9, 0x21EA, /* GB+81 36 CF 35 */ 0x21EB, 0x21EC, 0x21ED, 0x21EE, 0x21EF, /* GB+81 36 D0 30 */ 0x21F0, 0x21F1, 0x21F2, 0x21F3, 0x21F4, /* GB+81 36 D0 35 */ 0x21F5, 0x21F6, 0x21F7, 0x21F8, 0x21F9, /* GB+81 36 D1 30 */ 0x21FA, 0x21FB, 0x21FC, 0x21FD, 0x21FE, /* GB+81 36 D1 35 */ 0x21FF, 0x2200, 0x2201, 0x2202, 0x2203, /* GB+81 36 D2 30 */ 0x2204, 0x2205, 0x2206, 0x2207, 0x2209, /* GB+81 36 D2 35 */ 0x220A, 0x220B, 0x220C, 0x220D, 0x220E, /* GB+81 36 D3 30 */ 0x2210, 0x2212, 0x2213, 0x2214, 0x2216, /* GB+81 36 D3 35 */ 0x2217, 0x2218, 0x2219, 0x221B, 0x221C, /* GB+81 36 D4 30 */ 0x2221, 0x2222, 0x2224, 0x2226, 0x222C, /* GB+81 36 D4 35 */ 0x222D, 0x222F, 0x2230, 0x2231, 0x2232, /* GB+81 36 D5 30 */ 0x2233, 0x2238, 0x2239, 0x223A, 0x223B, /* GB+81 36 D5 35 */ 0x223C, 0x223E, 0x223F, 0x2240, 0x2241, /* GB+81 36 D6 30 */ 0x2242, 0x2243, 0x2244, 0x2245, 0x2246, /* GB+81 36 D6 35 */ 0x2247, 0x2249, 0x224A, 0x224B, 0x224D, /* GB+81 36 D7 30 */ 0x224E, 0x224F, 0x2250, 0x2251, 0x2253, /* GB+81 36 D7 35 */ 0x2254, 0x2255, 0x2256, 0x2257, 0x2258, /* GB+81 36 D8 30 */ 0x2259, 0x225A, 0x225B, 0x225C, 0x225D, /* GB+81 36 D8 35 */ 0x225E, 0x225F, 0x2262, 0x2263, 0x2268, /* GB+81 36 D9 30 */ 0x2269, 0x226A, 0x226B, 0x226C, 0x226D, /* GB+81 36 D9 35 */ 0x2270, 0x2271, 0x2272, 0x2273, 0x2274, /* GB+81 36 DA 30 */ 0x2275, 0x2276, 0x2277, 0x2278, 0x2279, /* GB+81 36 DA 35 */ 0x227A, 0x227B, 0x227C, 0x227D, 0x227E, /* GB+81 36 DB 30 */ 0x227F, 0x2280, 0x2281, 0x2282, 0x2283, /* GB+81 36 DB 35 */ 0x2284, 0x2285, 0x2286, 0x2287, 0x2288, /* GB+81 36 DC 30 */ 0x2289, 0x228A, 0x228B, 0x228C, 0x228D, /* GB+81 36 DC 35 */ 0x228E, 0x228F, 0x2290, 0x2291, 0x2292, /* GB+81 36 DD 30 */ 0x2293, 0x2294, 0x2296, 0x2297, 0x2298, /* GB+81 36 DD 35 */ 0x229A, 0x229B, 0x229C, 0x229D, 0x229E, /* GB+81 36 DE 30 */ 0x229F, 0x22A0, 0x22A1, 0x22A2, 0x22A3, /* GB+81 36 DE 35 */ 0x22A4, 0x22A6, 0x22A7, 0x22A8, 0x22A9, /* GB+81 36 DF 30 */ 0x22AA, 0x22AB, 0x22AC, 0x22AD, 0x22AE, /* GB+81 36 DF 35 */ 0x22AF, 0x22B0, 0x22B1, 0x22B2, 0x22B3, /* GB+81 36 E0 30 */ 0x22B4, 0x22B5, 0x22B6, 0x22B7, 0x22B8, /* GB+81 36 E0 35 */ 0x22B9, 0x22BA, 0x22BB, 0x22BC, 0x22BD, /* GB+81 36 E1 30 */ 0x22BE, 0x22C0, 0x22C1, 0x22C2, 0x22C3, /* GB+81 36 E1 35 */ 0x22C4, 0x22C5, 0x22C6, 0x22C7, 0x22C8, /* GB+81 36 E2 30 */ 0x22C9, 0x22CA, 0x22CB, 0x22CC, 0x22CD, /* GB+81 36 E2 35 */ 0x22CE, 0x22CF, 0x22D0, 0x22D1, 0x22D2, /* GB+81 36 E3 30 */ 0x22D3, 0x22D4, 0x22D5, 0x22D6, 0x22D7, /* GB+81 36 E3 35 */ 0x22D8, 0x22D9, 0x22DA, 0x22DB, 0x22DC, /* GB+81 36 E4 30 */ 0x22DD, 0x22DE, 0x22DF, 0x22E0, 0x22E1, /* GB+81 36 E4 35 */ 0x22E2, 0x22E3, 0x22E4, 0x22E5, 0x22E6, /* GB+81 36 E5 30 */ 0x22E7, 0x22E8, 0x22E9, 0x22EA, 0x22EB, /* GB+81 36 E5 35 */ 0x22EC, 0x22ED, 0x22EE, 0x22EF, 0x22F0, /* GB+81 36 E6 30 */ 0x22F1, 0x22F2, 0x22F3, 0x22F4, 0x22F5, /* GB+81 36 E6 35 */ 0x22F6, 0x22F7, 0x22F8, 0x22F9, 0x22FA, /* GB+81 36 E7 30 */ 0x22FB, 0x22FC, 0x22FD, 0x22FE, 0x22FF, /* GB+81 36 E7 35 */ 0x2300, 0x2301, 0x2302, 0x2303, 0x2304, /* GB+81 36 E8 30 */ 0x2305, 0x2306, 0x2307, 0x2308, 0x2309, /* GB+81 36 E8 35 */ 0x230A, 0x230B, 0x230C, 0x230D, 0x230E, /* GB+81 36 E9 30 */ 0x230F, 0x2310, 0x2311, 0x2313, 0x2314, /* GB+81 36 E9 35 */ 0x2315, 0x2316, 0x2317, 0x2318, 0x2319, /* GB+81 36 EA 30 */ 0x231A, 0x231B, 0x231C, 0x231D, 0x231E, /* GB+81 36 EA 35 */ 0x231F, 0x2320, 0x2321, 0x2322, 0x2323, /* GB+81 36 EB 30 */ 0x2324, 0x2325, 0x2326, 0x2327, 0x2328, /* GB+81 36 EB 35 */ 0x2329, 0x232A, 0x232B, 0x232C, 0x232D, /* GB+81 36 EC 30 */ 0x232E, 0x232F, 0x2330, 0x2331, 0x2332, /* GB+81 36 EC 35 */ 0x2333, 0x2334, 0x2335, 0x2336, 0x2337, /* GB+81 36 ED 30 */ 0x2338, 0x2339, 0x233A, 0x233B, 0x233C, /* GB+81 36 ED 35 */ 0x233D, 0x233E, 0x233F, 0x2340, 0x2341, /* GB+81 36 EE 30 */ 0x2342, 0x2343, 0x2344, 0x2345, 0x2346, /* GB+81 36 EE 35 */ 0x2347, 0x2348, 0x2349, 0x234A, 0x234B, /* GB+81 36 EF 30 */ 0x234C, 0x234D, 0x234E, 0x234F, 0x2350, /* GB+81 36 EF 35 */ 0x2351, 0x2352, 0x2353, 0x2354, 0x2355, /* GB+81 36 F0 30 */ 0x2356, 0x2357, 0x2358, 0x2359, 0x235A, /* GB+81 36 F0 35 */ 0x235B, 0x235C, 0x235D, 0x235E, 0x235F, /* GB+81 36 F1 30 */ 0x2360, 0x2361, 0x2362, 0x2363, 0x2364, /* GB+81 36 F1 35 */ 0x2365, 0x2366, 0x2367, 0x2368, 0x2369, /* GB+81 36 F2 30 */ 0x236A, 0x236B, 0x236C, 0x236D, 0x236E, /* GB+81 36 F2 35 */ 0x236F, 0x2370, 0x2371, 0x2372, 0x2373, /* GB+81 36 F3 30 */ 0x2374, 0x2375, 0x2376, 0x2377, 0x2378, /* GB+81 36 F3 35 */ 0x2379, 0x237A, 0x237B, 0x237C, 0x237D, /* GB+81 36 F4 30 */ 0x237E, 0x237F, 0x2380, 0x2381, 0x2382, /* GB+81 36 F4 35 */ 0x2383, 0x2384, 0x2385, 0x2386, 0x2387, /* GB+81 36 F5 30 */ 0x2388, 0x2389, 0x238A, 0x238B, 0x238C, /* GB+81 36 F5 35 */ 0x238D, 0x238E, 0x238F, 0x2390, 0x2391, /* GB+81 36 F6 30 */ 0x2392, 0x2393, 0x2394, 0x2395, 0x2396, /* GB+81 36 F6 35 */ 0x2397, 0x2398, 0x2399, 0x239A, 0x239B, /* GB+81 36 F7 30 */ 0x239C, 0x239D, 0x239E, 0x239F, 0x23A0, /* GB+81 36 F7 35 */ 0x23A1, 0x23A2, 0x23A3, 0x23A4, 0x23A5, /* GB+81 36 F8 30 */ 0x23A6, 0x23A7, 0x23A8, 0x23A9, 0x23AA, /* GB+81 36 F8 35 */ 0x23AB, 0x23AC, 0x23AD, 0x23AE, 0x23AF, /* GB+81 36 F9 30 */ 0x23B0, 0x23B1, 0x23B2, 0x23B3, 0x23B4, /* GB+81 36 F9 35 */ 0x23B5, 0x23B6, 0x23B7, 0x23B8, 0x23B9, /* GB+81 36 FA 30 */ 0x23BA, 0x23BB, 0x23BC, 0x23BD, 0x23BE, /* GB+81 36 FA 35 */ 0x23BF, 0x23C0, 0x23C1, 0x23C2, 0x23C3, /* GB+81 36 FB 30 */ 0x23C4, 0x23C5, 0x23C6, 0x23C7, 0x23C8, /* GB+81 36 FB 35 */ 0x23C9, 0x23CA, 0x23CB, 0x23CC, 0x23CD, /* GB+81 36 FC 30 */ 0x23CE, 0x23CF, 0x23D0, 0x23D1, 0x23D2, /* GB+81 36 FC 35 */ 0x23D3, 0x23D4, 0x23D5, 0x23D6, 0x23D7, /* GB+81 36 FD 30 */ 0x23D8, 0x23D9, 0x23DA, 0x23DB, 0x23DC, /* GB+81 36 FD 35 */ 0x23DD, 0x23DE, 0x23DF, 0x23E0, 0x23E1, /* GB+81 36 FE 30 */ 0x23E2, 0x23E3, 0x23E4, 0x23E5, 0x23E6, /* GB+81 36 FE 35 */ 0x23E7, 0x23E8, 0x23E9, 0x23EA, 0x23EB, /* GB+81 37 81 30 */ 0x23EC, 0x23ED, 0x23EE, 0x23EF, 0x23F0, /* GB+81 37 81 35 */ 0x23F1, 0x23F2, 0x23F3, 0x23F4, 0x23F5, /* GB+81 37 82 30 */ 0x23F6, 0x23F7, 0x23F8, 0x23F9, 0x23FA, /* GB+81 37 82 35 */ 0x23FB, 0x23FC, 0x23FD, 0x23FE, 0x23FF, /* GB+81 37 83 30 */ 0x2400, 0x2401, 0x2402, 0x2403, 0x2404, /* GB+81 37 83 35 */ 0x2405, 0x2406, 0x2407, 0x2408, 0x2409, /* GB+81 37 84 30 */ 0x240A, 0x240B, 0x240C, 0x240D, 0x240E, /* GB+81 37 84 35 */ 0x240F, 0x2410, 0x2411, 0x2412, 0x2413, /* GB+81 37 85 30 */ 0x2414, 0x2415, 0x2416, 0x2417, 0x2418, /* GB+81 37 85 35 */ 0x2419, 0x241A, 0x241B, 0x241C, 0x241D, /* GB+81 37 86 30 */ 0x241E, 0x241F, 0x2420, 0x2421, 0x2422, /* GB+81 37 86 35 */ 0x2423, 0x2424, 0x2425, 0x2426, 0x2427, /* GB+81 37 87 30 */ 0x2428, 0x2429, 0x242A, 0x242B, 0x242C, /* GB+81 37 87 35 */ 0x242D, 0x242E, 0x242F, 0x2430, 0x2431, /* GB+81 37 88 30 */ 0x2432, 0x2433, 0x2434, 0x2435, 0x2436, /* GB+81 37 88 35 */ 0x2437, 0x2438, 0x2439, 0x243A, 0x243B, /* GB+81 37 89 30 */ 0x243C, 0x243D, 0x243E, 0x243F, 0x2440, /* GB+81 37 89 35 */ 0x2441, 0x2442, 0x2443, 0x2444, 0x2445, /* GB+81 37 8A 30 */ 0x2446, 0x2447, 0x2448, 0x2449, 0x244A, /* GB+81 37 8A 35 */ 0x244B, 0x244C, 0x244D, 0x244E, 0x244F, /* GB+81 37 8B 30 */ 0x2450, 0x2451, 0x2452, 0x2453, 0x2454, /* GB+81 37 8B 35 */ 0x2455, 0x2456, 0x2457, 0x2458, 0x2459, /* GB+81 37 8C 30 */ 0x245A, 0x245B, 0x245C, 0x245D, 0x245E, /* GB+81 37 8C 35 */ 0x245F, 0x246A, 0x246B, 0x246C, 0x246D, /* GB+81 37 8D 30 */ 0x246E, 0x246F, 0x2470, 0x2471, 0x2472, /* GB+81 37 8D 35 */ 0x2473, 0x249C, 0x249D, 0x249E, 0x249F, /* GB+81 37 8E 30 */ 0x24A0, 0x24A1, 0x24A2, 0x24A3, 0x24A4, /* GB+81 37 8E 35 */ 0x24A5, 0x24A6, 0x24A7, 0x24A8, 0x24A9, /* GB+81 37 8F 30 */ 0x24AA, 0x24AB, 0x24AC, 0x24AD, 0x24AE, /* GB+81 37 8F 35 */ 0x24AF, 0x24B0, 0x24B1, 0x24B2, 0x24B3, /* GB+81 37 90 30 */ 0x24B4, 0x24B5, 0x24B6, 0x24B7, 0x24B8, /* GB+81 37 90 35 */ 0x24B9, 0x24BA, 0x24BB, 0x24BC, 0x24BD, /* GB+81 37 91 30 */ 0x24BE, 0x24BF, 0x24C0, 0x24C1, 0x24C2, /* GB+81 37 91 35 */ 0x24C3, 0x24C4, 0x24C5, 0x24C6, 0x24C7, /* GB+81 37 92 30 */ 0x24C8, 0x24C9, 0x24CA, 0x24CB, 0x24CC, /* GB+81 37 92 35 */ 0x24CD, 0x24CE, 0x24CF, 0x24D0, 0x24D1, /* GB+81 37 93 30 */ 0x24D2, 0x24D3, 0x24D4, 0x24D5, 0x24D6, /* GB+81 37 93 35 */ 0x24D7, 0x24D8, 0x24D9, 0x24DA, 0x24DB, /* GB+81 37 94 30 */ 0x24DC, 0x24DD, 0x24DE, 0x24DF, 0x24E0, /* GB+81 37 94 35 */ 0x24E1, 0x24E2, 0x24E3, 0x24E4, 0x24E5, /* GB+81 37 95 30 */ 0x24E6, 0x24E7, 0x24E8, 0x24E9, 0x24EA, /* GB+81 37 95 35 */ 0x24EB, 0x24EC, 0x24ED, 0x24EE, 0x24EF, /* GB+81 37 96 30 */ 0x24F0, 0x24F1, 0x24F2, 0x24F3, 0x24F4, /* GB+81 37 96 35 */ 0x24F5, 0x24F6, 0x24F7, 0x24F8, 0x24F9, /* GB+81 37 97 30 */ 0x24FA, 0x24FB, 0x24FC, 0x24FD, 0x24FE, /* GB+81 37 97 35 */ 0x24FF, 0x254C, 0x254D, 0x254E, 0x254F, /* GB+81 37 98 30 */ 0x2574, 0x2575, 0x2576, 0x2577, 0x2578, /* GB+81 37 98 35 */ 0x2579, 0x257A, 0x257B, 0x257C, 0x257D, /* GB+81 37 99 30 */ 0x257E, 0x257F, 0x2580, 0x2590, 0x2591, /* GB+81 37 99 35 */ 0x2592, 0x2596, 0x2597, 0x2598, 0x2599, /* GB+81 37 9A 30 */ 0x259A, 0x259B, 0x259C, 0x259D, 0x259E, /* GB+81 37 9A 35 */ 0x259F, 0x25A2, 0x25A3, 0x25A4, 0x25A5, /* GB+81 37 9B 30 */ 0x25A6, 0x25A7, 0x25A8, 0x25A9, 0x25AA, /* GB+81 37 9B 35 */ 0x25AB, 0x25AC, 0x25AD, 0x25AE, 0x25AF, /* GB+81 37 9C 30 */ 0x25B0, 0x25B1, 0x25B4, 0x25B5, 0x25B6, /* GB+81 37 9C 35 */ 0x25B7, 0x25B8, 0x25B9, 0x25BA, 0x25BB, /* GB+81 37 9D 30 */ 0x25BE, 0x25BF, 0x25C0, 0x25C1, 0x25C2, /* GB+81 37 9D 35 */ 0x25C3, 0x25C4, 0x25C5, 0x25C8, 0x25C9, /* GB+81 37 9E 30 */ 0x25CA, 0x25CC, 0x25CD, 0x25D0, 0x25D1, /* GB+81 37 9E 35 */ 0x25D2, 0x25D3, 0x25D4, 0x25D5, 0x25D6, /* GB+81 37 9F 30 */ 0x25D7, 0x25D8, 0x25D9, 0x25DA, 0x25DB, /* GB+81 37 9F 35 */ 0x25DC, 0x25DD, 0x25DE, 0x25DF, 0x25E0, /* GB+81 37 A0 30 */ 0x25E1, 0x25E6, 0x25E7, 0x25E8, 0x25E9, /* GB+81 37 A0 35 */ 0x25EA, 0x25EB, 0x25EC, 0x25ED, 0x25EE, /* GB+81 37 A1 30 */ 0x25EF, 0x25F0, 0x25F1, 0x25F2, 0x25F3, /* GB+81 37 A1 35 */ 0x25F4, 0x25F5, 0x25F6, 0x25F7, 0x25F8, /* GB+81 37 A2 30 */ 0x25F9, 0x25FA, 0x25FB, 0x25FC, 0x25FD, /* GB+81 37 A2 35 */ 0x25FE, 0x25FF, 0x2600, 0x2601, 0x2602, /* GB+81 37 A3 30 */ 0x2603, 0x2604, 0x2607, 0x2608, 0x260A, /* GB+81 37 A3 35 */ 0x260B, 0x260C, 0x260D, 0x260E, 0x260F, /* GB+81 37 A4 30 */ 0x2610, 0x2611, 0x2612, 0x2613, 0x2614, /* GB+81 37 A4 35 */ 0x2615, 0x2616, 0x2617, 0x2618, 0x2619, /* GB+81 37 A5 30 */ 0x261A, 0x261B, 0x261C, 0x261D, 0x261E, /* GB+81 37 A5 35 */ 0x261F, 0x2620, 0x2621, 0x2622, 0x2623, /* GB+81 37 A6 30 */ 0x2624, 0x2625, 0x2626, 0x2627, 0x2628, /* GB+81 37 A6 35 */ 0x2629, 0x262A, 0x262B, 0x262C, 0x262D, /* GB+81 37 A7 30 */ 0x262E, 0x262F, 0x2630, 0x2631, 0x2632, /* GB+81 37 A7 35 */ 0x2633, 0x2634, 0x2635, 0x2636, 0x2637, /* GB+81 37 A8 30 */ 0x2638, 0x2639, 0x263A, 0x263B, 0x263C, /* GB+81 37 A8 35 */ 0x263D, 0x263E, 0x263F, 0x2641, /* Contiguous area: GB+81 38 FD 39 .. GB+82 30 A6 32 */ /* GB+81 38 FD 39 */ 0x2E82, /* GB+81 38 FE 30 */ 0x2E83, 0x2E85, 0x2E86, 0x2E87, 0x2E89, /* GB+81 38 FE 35 */ 0x2E8A, 0x2E8D, 0x2E8E, 0x2E8F, 0x2E90, /* GB+81 39 81 30 */ 0x2E91, 0x2E92, 0x2E93, 0x2E94, 0x2E95, /* GB+81 39 81 35 */ 0x2E96, 0x2E98, 0x2E99, 0x2E9A, 0x2E9B, /* GB+81 39 82 30 */ 0x2E9C, 0x2E9D, 0x2E9E, 0x2E9F, 0x2EA0, /* GB+81 39 82 35 */ 0x2EA1, 0x2EA2, 0x2EA3, 0x2EA4, 0x2EA5, /* GB+81 39 83 30 */ 0x2EA6, 0x2EA8, 0x2EA9, 0x2EAB, 0x2EAC, /* GB+81 39 83 35 */ 0x2EAD, 0x2EAF, 0x2EB0, 0x2EB1, 0x2EB2, /* GB+81 39 84 30 */ 0x2EB4, 0x2EB5, 0x2EB8, 0x2EB9, 0x2EBA, /* GB+81 39 84 35 */ 0x2EBC, 0x2EBD, 0x2EBE, 0x2EBF, 0x2EC0, /* GB+81 39 85 30 */ 0x2EC1, 0x2EC2, 0x2EC3, 0x2EC4, 0x2EC5, /* GB+81 39 85 35 */ 0x2EC6, 0x2EC7, 0x2EC8, 0x2EC9, 0x2ECB, /* GB+81 39 86 30 */ 0x2ECC, 0x2ECD, 0x2ECE, 0x2ECF, 0x2ED0, /* GB+81 39 86 35 */ 0x2ED1, 0x2ED2, 0x2ED3, 0x2ED4, 0x2ED5, /* GB+81 39 87 30 */ 0x2ED6, 0x2ED7, 0x2ED8, 0x2ED9, 0x2EDA, /* GB+81 39 87 35 */ 0x2EDB, 0x2EDC, 0x2EDD, 0x2EDE, 0x2EDF, /* GB+81 39 88 30 */ 0x2EE0, 0x2EE1, 0x2EE2, 0x2EE3, 0x2EE4, /* GB+81 39 88 35 */ 0x2EE5, 0x2EE6, 0x2EE7, 0x2EE8, 0x2EE9, /* GB+81 39 89 30 */ 0x2EEA, 0x2EEB, 0x2EEC, 0x2EED, 0x2EEE, /* GB+81 39 89 35 */ 0x2EEF, 0x2EF0, 0x2EF1, 0x2EF2, 0x2EF3, /* GB+81 39 8A 30 */ 0x2EF4, 0x2EF5, 0x2EF6, 0x2EF7, 0x2EF8, /* GB+81 39 8A 35 */ 0x2EF9, 0x2EFA, 0x2EFB, 0x2EFC, 0x2EFD, /* GB+81 39 8B 30 */ 0x2EFE, 0x2EFF, 0x2F00, 0x2F01, 0x2F02, /* GB+81 39 8B 35 */ 0x2F03, 0x2F04, 0x2F05, 0x2F06, 0x2F07, /* GB+81 39 8C 30 */ 0x2F08, 0x2F09, 0x2F0A, 0x2F0B, 0x2F0C, /* GB+81 39 8C 35 */ 0x2F0D, 0x2F0E, 0x2F0F, 0x2F10, 0x2F11, /* GB+81 39 8D 30 */ 0x2F12, 0x2F13, 0x2F14, 0x2F15, 0x2F16, /* GB+81 39 8D 35 */ 0x2F17, 0x2F18, 0x2F19, 0x2F1A, 0x2F1B, /* GB+81 39 8E 30 */ 0x2F1C, 0x2F1D, 0x2F1E, 0x2F1F, 0x2F20, /* GB+81 39 8E 35 */ 0x2F21, 0x2F22, 0x2F23, 0x2F24, 0x2F25, /* GB+81 39 8F 30 */ 0x2F26, 0x2F27, 0x2F28, 0x2F29, 0x2F2A, /* GB+81 39 8F 35 */ 0x2F2B, 0x2F2C, 0x2F2D, 0x2F2E, 0x2F2F, /* GB+81 39 90 30 */ 0x2F30, 0x2F31, 0x2F32, 0x2F33, 0x2F34, /* GB+81 39 90 35 */ 0x2F35, 0x2F36, 0x2F37, 0x2F38, 0x2F39, /* GB+81 39 91 30 */ 0x2F3A, 0x2F3B, 0x2F3C, 0x2F3D, 0x2F3E, /* GB+81 39 91 35 */ 0x2F3F, 0x2F40, 0x2F41, 0x2F42, 0x2F43, /* GB+81 39 92 30 */ 0x2F44, 0x2F45, 0x2F46, 0x2F47, 0x2F48, /* GB+81 39 92 35 */ 0x2F49, 0x2F4A, 0x2F4B, 0x2F4C, 0x2F4D, /* GB+81 39 93 30 */ 0x2F4E, 0x2F4F, 0x2F50, 0x2F51, 0x2F52, /* GB+81 39 93 35 */ 0x2F53, 0x2F54, 0x2F55, 0x2F56, 0x2F57, /* GB+81 39 94 30 */ 0x2F58, 0x2F59, 0x2F5A, 0x2F5B, 0x2F5C, /* GB+81 39 94 35 */ 0x2F5D, 0x2F5E, 0x2F5F, 0x2F60, 0x2F61, /* GB+81 39 95 30 */ 0x2F62, 0x2F63, 0x2F64, 0x2F65, 0x2F66, /* GB+81 39 95 35 */ 0x2F67, 0x2F68, 0x2F69, 0x2F6A, 0x2F6B, /* GB+81 39 96 30 */ 0x2F6C, 0x2F6D, 0x2F6E, 0x2F6F, 0x2F70, /* GB+81 39 96 35 */ 0x2F71, 0x2F72, 0x2F73, 0x2F74, 0x2F75, /* GB+81 39 97 30 */ 0x2F76, 0x2F77, 0x2F78, 0x2F79, 0x2F7A, /* GB+81 39 97 35 */ 0x2F7B, 0x2F7C, 0x2F7D, 0x2F7E, 0x2F7F, /* GB+81 39 98 30 */ 0x2F80, 0x2F81, 0x2F82, 0x2F83, 0x2F84, /* GB+81 39 98 35 */ 0x2F85, 0x2F86, 0x2F87, 0x2F88, 0x2F89, /* GB+81 39 99 30 */ 0x2F8A, 0x2F8B, 0x2F8C, 0x2F8D, 0x2F8E, /* GB+81 39 99 35 */ 0x2F8F, 0x2F90, 0x2F91, 0x2F92, 0x2F93, /* GB+81 39 9A 30 */ 0x2F94, 0x2F95, 0x2F96, 0x2F97, 0x2F98, /* GB+81 39 9A 35 */ 0x2F99, 0x2F9A, 0x2F9B, 0x2F9C, 0x2F9D, /* GB+81 39 9B 30 */ 0x2F9E, 0x2F9F, 0x2FA0, 0x2FA1, 0x2FA2, /* GB+81 39 9B 35 */ 0x2FA3, 0x2FA4, 0x2FA5, 0x2FA6, 0x2FA7, /* GB+81 39 9C 30 */ 0x2FA8, 0x2FA9, 0x2FAA, 0x2FAB, 0x2FAC, /* GB+81 39 9C 35 */ 0x2FAD, 0x2FAE, 0x2FAF, 0x2FB0, 0x2FB1, /* GB+81 39 9D 30 */ 0x2FB2, 0x2FB3, 0x2FB4, 0x2FB5, 0x2FB6, /* GB+81 39 9D 35 */ 0x2FB7, 0x2FB8, 0x2FB9, 0x2FBA, 0x2FBB, /* GB+81 39 9E 30 */ 0x2FBC, 0x2FBD, 0x2FBE, 0x2FBF, 0x2FC0, /* GB+81 39 9E 35 */ 0x2FC1, 0x2FC2, 0x2FC3, 0x2FC4, 0x2FC5, /* GB+81 39 9F 30 */ 0x2FC6, 0x2FC7, 0x2FC8, 0x2FC9, 0x2FCA, /* GB+81 39 9F 35 */ 0x2FCB, 0x2FCC, 0x2FCD, 0x2FCE, 0x2FCF, /* GB+81 39 A0 30 */ 0x2FD0, 0x2FD1, 0x2FD2, 0x2FD3, 0x2FD4, /* GB+81 39 A0 35 */ 0x2FD5, 0x2FD6, 0x2FD7, 0x2FD8, 0x2FD9, /* GB+81 39 A1 30 */ 0x2FDA, 0x2FDB, 0x2FDC, 0x2FDD, 0x2FDE, /* GB+81 39 A1 35 */ 0x2FDF, 0x2FE0, 0x2FE1, 0x2FE2, 0x2FE3, /* GB+81 39 A2 30 */ 0x2FE4, 0x2FE5, 0x2FE6, 0x2FE7, 0x2FE8, /* GB+81 39 A2 35 */ 0x2FE9, 0x2FEA, 0x2FEB, 0x2FEC, 0x2FED, /* GB+81 39 A3 30 */ 0x2FEE, 0x2FEF, 0x2FFC, 0x2FFD, 0x2FFE, /* GB+81 39 A3 35 */ 0x2FFF, 0x3004, 0x3018, 0x3019, 0x301A, /* GB+81 39 A4 30 */ 0x301B, 0x301C, 0x301F, 0x3020, 0x302A, /* GB+81 39 A4 35 */ 0x302B, 0x302C, 0x302D, 0x302E, 0x302F, /* GB+81 39 A5 30 */ 0x3030, 0x3031, 0x3032, 0x3033, 0x3034, /* GB+81 39 A5 35 */ 0x3035, 0x3036, 0x3037, 0x3038, 0x3039, /* GB+81 39 A6 30 */ 0x303A, 0x303B, 0x303C, 0x303D, 0x303F, /* GB+81 39 A6 35 */ 0x3040, 0x3094, 0x3095, 0x3096, 0x3097, /* GB+81 39 A7 30 */ 0x3098, 0x3099, 0x309A, 0x309F, 0x30A0, /* GB+81 39 A7 35 */ 0x30F7, 0x30F8, 0x30F9, 0x30FA, 0x30FB, /* GB+81 39 A8 30 */ 0x30FF, 0x3100, 0x3101, 0x3102, 0x3103, /* GB+81 39 A8 35 */ 0x3104, 0x312A, 0x312B, 0x312C, 0x312D, /* GB+81 39 A9 30 */ 0x312E, 0x312F, 0x3130, 0x3131, 0x3132, /* GB+81 39 A9 35 */ 0x3133, 0x3134, 0x3135, 0x3136, 0x3137, /* GB+81 39 AA 30 */ 0x3138, 0x3139, 0x313A, 0x313B, 0x313C, /* GB+81 39 AA 35 */ 0x313D, 0x313E, 0x313F, 0x3140, 0x3141, /* GB+81 39 AB 30 */ 0x3142, 0x3143, 0x3144, 0x3145, 0x3146, /* GB+81 39 AB 35 */ 0x3147, 0x3148, 0x3149, 0x314A, 0x314B, /* GB+81 39 AC 30 */ 0x314C, 0x314D, 0x314E, 0x314F, 0x3150, /* GB+81 39 AC 35 */ 0x3151, 0x3152, 0x3153, 0x3154, 0x3155, /* GB+81 39 AD 30 */ 0x3156, 0x3157, 0x3158, 0x3159, 0x315A, /* GB+81 39 AD 35 */ 0x315B, 0x315C, 0x315D, 0x315E, 0x315F, /* GB+81 39 AE 30 */ 0x3160, 0x3161, 0x3162, 0x3163, 0x3164, /* GB+81 39 AE 35 */ 0x3165, 0x3166, 0x3167, 0x3168, 0x3169, /* GB+81 39 AF 30 */ 0x316A, 0x316B, 0x316C, 0x316D, 0x316E, /* GB+81 39 AF 35 */ 0x316F, 0x3170, 0x3171, 0x3172, 0x3173, /* GB+81 39 B0 30 */ 0x3174, 0x3175, 0x3176, 0x3177, 0x3178, /* GB+81 39 B0 35 */ 0x3179, 0x317A, 0x317B, 0x317C, 0x317D, /* GB+81 39 B1 30 */ 0x317E, 0x317F, 0x3180, 0x3181, 0x3182, /* GB+81 39 B1 35 */ 0x3183, 0x3184, 0x3185, 0x3186, 0x3187, /* GB+81 39 B2 30 */ 0x3188, 0x3189, 0x318A, 0x318B, 0x318C, /* GB+81 39 B2 35 */ 0x318D, 0x318E, 0x318F, 0x3190, 0x3191, /* GB+81 39 B3 30 */ 0x3192, 0x3193, 0x3194, 0x3195, 0x3196, /* GB+81 39 B3 35 */ 0x3197, 0x3198, 0x3199, 0x319A, 0x319B, /* GB+81 39 B4 30 */ 0x319C, 0x319D, 0x319E, 0x319F, 0x31A0, /* GB+81 39 B4 35 */ 0x31A1, 0x31A2, 0x31A3, 0x31A4, 0x31A5, /* GB+81 39 B5 30 */ 0x31A6, 0x31A7, 0x31A8, 0x31A9, 0x31AA, /* GB+81 39 B5 35 */ 0x31AB, 0x31AC, 0x31AD, 0x31AE, 0x31AF, /* GB+81 39 B6 30 */ 0x31B0, 0x31B1, 0x31B2, 0x31B3, 0x31B4, /* GB+81 39 B6 35 */ 0x31B5, 0x31B6, 0x31B7, 0x31B8, 0x31B9, /* GB+81 39 B7 30 */ 0x31BA, 0x31BB, 0x31BC, 0x31BD, 0x31BE, /* GB+81 39 B7 35 */ 0x31BF, 0x31C0, 0x31C1, 0x31C2, 0x31C3, /* GB+81 39 B8 30 */ 0x31C4, 0x31C5, 0x31C6, 0x31C7, 0x31C8, /* GB+81 39 B8 35 */ 0x31C9, 0x31CA, 0x31CB, 0x31CC, 0x31CD, /* GB+81 39 B9 30 */ 0x31CE, 0x31CF, 0x31D0, 0x31D1, 0x31D2, /* GB+81 39 B9 35 */ 0x31D3, 0x31D4, 0x31D5, 0x31D6, 0x31D7, /* GB+81 39 BA 30 */ 0x31D8, 0x31D9, 0x31DA, 0x31DB, 0x31DC, /* GB+81 39 BA 35 */ 0x31DD, 0x31DE, 0x31DF, 0x31E0, 0x31E1, /* GB+81 39 BB 30 */ 0x31E2, 0x31E3, 0x31E4, 0x31E5, 0x31E6, /* GB+81 39 BB 35 */ 0x31E7, 0x31E8, 0x31E9, 0x31EA, 0x31EB, /* GB+81 39 BC 30 */ 0x31EC, 0x31ED, 0x31EE, 0x31EF, 0x31F0, /* GB+81 39 BC 35 */ 0x31F1, 0x31F2, 0x31F3, 0x31F4, 0x31F5, /* GB+81 39 BD 30 */ 0x31F6, 0x31F7, 0x31F8, 0x31F9, 0x31FA, /* GB+81 39 BD 35 */ 0x31FB, 0x31FC, 0x31FD, 0x31FE, 0x31FF, /* GB+81 39 BE 30 */ 0x3200, 0x3201, 0x3202, 0x3203, 0x3204, /* GB+81 39 BE 35 */ 0x3205, 0x3206, 0x3207, 0x3208, 0x3209, /* GB+81 39 BF 30 */ 0x320A, 0x320B, 0x320C, 0x320D, 0x320E, /* GB+81 39 BF 35 */ 0x320F, 0x3210, 0x3211, 0x3212, 0x3213, /* GB+81 39 C0 30 */ 0x3214, 0x3215, 0x3216, 0x3217, 0x3218, /* GB+81 39 C0 35 */ 0x3219, 0x321A, 0x321B, 0x321C, 0x321D, /* GB+81 39 C1 30 */ 0x321E, 0x321F, 0x322A, 0x322B, 0x322C, /* GB+81 39 C1 35 */ 0x322D, 0x322E, 0x322F, 0x3230, 0x3232, /* GB+81 39 C2 30 */ 0x3233, 0x3234, 0x3235, 0x3236, 0x3237, /* GB+81 39 C2 35 */ 0x3238, 0x3239, 0x323A, 0x323B, 0x323C, /* GB+81 39 C3 30 */ 0x323D, 0x323E, 0x323F, 0x3240, 0x3241, /* GB+81 39 C3 35 */ 0x3242, 0x3243, 0x3244, 0x3245, 0x3246, /* GB+81 39 C4 30 */ 0x3247, 0x3248, 0x3249, 0x324A, 0x324B, /* GB+81 39 C4 35 */ 0x324C, 0x324D, 0x324E, 0x324F, 0x3250, /* GB+81 39 C5 30 */ 0x3251, 0x3252, 0x3253, 0x3254, 0x3255, /* GB+81 39 C5 35 */ 0x3256, 0x3257, 0x3258, 0x3259, 0x325A, /* GB+81 39 C6 30 */ 0x325B, 0x325C, 0x325D, 0x325E, 0x325F, /* GB+81 39 C6 35 */ 0x3260, 0x3261, 0x3262, 0x3263, 0x3264, /* GB+81 39 C7 30 */ 0x3265, 0x3266, 0x3267, 0x3268, 0x3269, /* GB+81 39 C7 35 */ 0x326A, 0x326B, 0x326C, 0x326D, 0x326E, /* GB+81 39 C8 30 */ 0x326F, 0x3270, 0x3271, 0x3272, 0x3273, /* GB+81 39 C8 35 */ 0x3274, 0x3275, 0x3276, 0x3277, 0x3278, /* GB+81 39 C9 30 */ 0x3279, 0x327A, 0x327B, 0x327C, 0x327D, /* GB+81 39 C9 35 */ 0x327E, 0x327F, 0x3280, 0x3281, 0x3282, /* GB+81 39 CA 30 */ 0x3283, 0x3284, 0x3285, 0x3286, 0x3287, /* GB+81 39 CA 35 */ 0x3288, 0x3289, 0x328A, 0x328B, 0x328C, /* GB+81 39 CB 30 */ 0x328D, 0x328E, 0x328F, 0x3290, 0x3291, /* GB+81 39 CB 35 */ 0x3292, 0x3293, 0x3294, 0x3295, 0x3296, /* GB+81 39 CC 30 */ 0x3297, 0x3298, 0x3299, 0x329A, 0x329B, /* GB+81 39 CC 35 */ 0x329C, 0x329D, 0x329E, 0x329F, 0x32A0, /* GB+81 39 CD 30 */ 0x32A1, 0x32A2, 0x32A4, 0x32A5, 0x32A6, /* GB+81 39 CD 35 */ 0x32A7, 0x32A8, 0x32A9, 0x32AA, 0x32AB, /* GB+81 39 CE 30 */ 0x32AC, 0x32AD, 0x32AE, 0x32AF, 0x32B0, /* GB+81 39 CE 35 */ 0x32B1, 0x32B2, 0x32B3, 0x32B4, 0x32B5, /* GB+81 39 CF 30 */ 0x32B6, 0x32B7, 0x32B8, 0x32B9, 0x32BA, /* GB+81 39 CF 35 */ 0x32BB, 0x32BC, 0x32BD, 0x32BE, 0x32BF, /* GB+81 39 D0 30 */ 0x32C0, 0x32C1, 0x32C2, 0x32C3, 0x32C4, /* GB+81 39 D0 35 */ 0x32C5, 0x32C6, 0x32C7, 0x32C8, 0x32C9, /* GB+81 39 D1 30 */ 0x32CA, 0x32CB, 0x32CC, 0x32CD, 0x32CE, /* GB+81 39 D1 35 */ 0x32CF, 0x32D0, 0x32D1, 0x32D2, 0x32D3, /* GB+81 39 D2 30 */ 0x32D4, 0x32D5, 0x32D6, 0x32D7, 0x32D8, /* GB+81 39 D2 35 */ 0x32D9, 0x32DA, 0x32DB, 0x32DC, 0x32DD, /* GB+81 39 D3 30 */ 0x32DE, 0x32DF, 0x32E0, 0x32E1, 0x32E2, /* GB+81 39 D3 35 */ 0x32E3, 0x32E4, 0x32E5, 0x32E6, 0x32E7, /* GB+81 39 D4 30 */ 0x32E8, 0x32E9, 0x32EA, 0x32EB, 0x32EC, /* GB+81 39 D4 35 */ 0x32ED, 0x32EE, 0x32EF, 0x32F0, 0x32F1, /* GB+81 39 D5 30 */ 0x32F2, 0x32F3, 0x32F4, 0x32F5, 0x32F6, /* GB+81 39 D5 35 */ 0x32F7, 0x32F8, 0x32F9, 0x32FA, 0x32FB, /* GB+81 39 D6 30 */ 0x32FC, 0x32FD, 0x32FE, 0x32FF, 0x3300, /* GB+81 39 D6 35 */ 0x3301, 0x3302, 0x3303, 0x3304, 0x3305, /* GB+81 39 D7 30 */ 0x3306, 0x3307, 0x3308, 0x3309, 0x330A, /* GB+81 39 D7 35 */ 0x330B, 0x330C, 0x330D, 0x330E, 0x330F, /* GB+81 39 D8 30 */ 0x3310, 0x3311, 0x3312, 0x3313, 0x3314, /* GB+81 39 D8 35 */ 0x3315, 0x3316, 0x3317, 0x3318, 0x3319, /* GB+81 39 D9 30 */ 0x331A, 0x331B, 0x331C, 0x331D, 0x331E, /* GB+81 39 D9 35 */ 0x331F, 0x3320, 0x3321, 0x3322, 0x3323, /* GB+81 39 DA 30 */ 0x3324, 0x3325, 0x3326, 0x3327, 0x3328, /* GB+81 39 DA 35 */ 0x3329, 0x332A, 0x332B, 0x332C, 0x332D, /* GB+81 39 DB 30 */ 0x332E, 0x332F, 0x3330, 0x3331, 0x3332, /* GB+81 39 DB 35 */ 0x3333, 0x3334, 0x3335, 0x3336, 0x3337, /* GB+81 39 DC 30 */ 0x3338, 0x3339, 0x333A, 0x333B, 0x333C, /* GB+81 39 DC 35 */ 0x333D, 0x333E, 0x333F, 0x3340, 0x3341, /* GB+81 39 DD 30 */ 0x3342, 0x3343, 0x3344, 0x3345, 0x3346, /* GB+81 39 DD 35 */ 0x3347, 0x3348, 0x3349, 0x334A, 0x334B, /* GB+81 39 DE 30 */ 0x334C, 0x334D, 0x334E, 0x334F, 0x3350, /* GB+81 39 DE 35 */ 0x3351, 0x3352, 0x3353, 0x3354, 0x3355, /* GB+81 39 DF 30 */ 0x3356, 0x3357, 0x3358, 0x3359, 0x335A, /* GB+81 39 DF 35 */ 0x335B, 0x335C, 0x335D, 0x335E, 0x335F, /* GB+81 39 E0 30 */ 0x3360, 0x3361, 0x3362, 0x3363, 0x3364, /* GB+81 39 E0 35 */ 0x3365, 0x3366, 0x3367, 0x3368, 0x3369, /* GB+81 39 E1 30 */ 0x336A, 0x336B, 0x336C, 0x336D, 0x336E, /* GB+81 39 E1 35 */ 0x336F, 0x3370, 0x3371, 0x3372, 0x3373, /* GB+81 39 E2 30 */ 0x3374, 0x3375, 0x3376, 0x3377, 0x3378, /* GB+81 39 E2 35 */ 0x3379, 0x337A, 0x337B, 0x337C, 0x337D, /* GB+81 39 E3 30 */ 0x337E, 0x337F, 0x3380, 0x3381, 0x3382, /* GB+81 39 E3 35 */ 0x3383, 0x3384, 0x3385, 0x3386, 0x3387, /* GB+81 39 E4 30 */ 0x3388, 0x3389, 0x338A, 0x338B, 0x338C, /* GB+81 39 E4 35 */ 0x338D, 0x3390, 0x3391, 0x3392, 0x3393, /* GB+81 39 E5 30 */ 0x3394, 0x3395, 0x3396, 0x3397, 0x3398, /* GB+81 39 E5 35 */ 0x3399, 0x339A, 0x339B, 0x339F, 0x33A0, /* GB+81 39 E6 30 */ 0x33A2, 0x33A3, 0x33A4, 0x33A5, 0x33A6, /* GB+81 39 E6 35 */ 0x33A7, 0x33A8, 0x33A9, 0x33AA, 0x33AB, /* GB+81 39 E7 30 */ 0x33AC, 0x33AD, 0x33AE, 0x33AF, 0x33B0, /* GB+81 39 E7 35 */ 0x33B1, 0x33B2, 0x33B3, 0x33B4, 0x33B5, /* GB+81 39 E8 30 */ 0x33B6, 0x33B7, 0x33B8, 0x33B9, 0x33BA, /* GB+81 39 E8 35 */ 0x33BB, 0x33BC, 0x33BD, 0x33BE, 0x33BF, /* GB+81 39 E9 30 */ 0x33C0, 0x33C1, 0x33C2, 0x33C3, 0x33C5, /* GB+81 39 E9 35 */ 0x33C6, 0x33C7, 0x33C8, 0x33C9, 0x33CA, /* GB+81 39 EA 30 */ 0x33CB, 0x33CC, 0x33CD, 0x33CF, 0x33D0, /* GB+81 39 EA 35 */ 0x33D3, 0x33D4, 0x33D6, 0x33D7, 0x33D8, /* GB+81 39 EB 30 */ 0x33D9, 0x33DA, 0x33DB, 0x33DC, 0x33DD, /* GB+81 39 EB 35 */ 0x33DE, 0x33DF, 0x33E0, 0x33E1, 0x33E2, /* GB+81 39 EC 30 */ 0x33E3, 0x33E4, 0x33E5, 0x33E6, 0x33E7, /* GB+81 39 EC 35 */ 0x33E8, 0x33E9, 0x33EA, 0x33EB, 0x33EC, /* GB+81 39 ED 30 */ 0x33ED, 0x33EE, 0x33EF, 0x33F0, 0x33F1, /* GB+81 39 ED 35 */ 0x33F2, 0x33F3, 0x33F4, 0x33F5, 0x33F6, /* GB+81 39 EE 30 */ 0x33F7, 0x33F8, 0x33F9, 0x33FA, 0x33FB, /* GB+81 39 EE 35 */ 0x33FC, 0x33FD, 0x33FE, 0x33FF, 0x3400, /* GB+81 39 EF 30 */ 0x3401, 0x3402, 0x3403, 0x3404, 0x3405, /* GB+81 39 EF 35 */ 0x3406, 0x3407, 0x3408, 0x3409, 0x340A, /* GB+81 39 F0 30 */ 0x340B, 0x340C, 0x340D, 0x340E, 0x340F, /* GB+81 39 F0 35 */ 0x3410, 0x3411, 0x3412, 0x3413, 0x3414, /* GB+81 39 F1 30 */ 0x3415, 0x3416, 0x3417, 0x3418, 0x3419, /* GB+81 39 F1 35 */ 0x341A, 0x341B, 0x341C, 0x341D, 0x341E, /* GB+81 39 F2 30 */ 0x341F, 0x3420, 0x3421, 0x3422, 0x3423, /* GB+81 39 F2 35 */ 0x3424, 0x3425, 0x3426, 0x3427, 0x3428, /* GB+81 39 F3 30 */ 0x3429, 0x342A, 0x342B, 0x342C, 0x342D, /* GB+81 39 F3 35 */ 0x342E, 0x342F, 0x3430, 0x3431, 0x3432, /* GB+81 39 F4 30 */ 0x3433, 0x3434, 0x3435, 0x3436, 0x3437, /* GB+81 39 F4 35 */ 0x3438, 0x3439, 0x343A, 0x343B, 0x343C, /* GB+81 39 F5 30 */ 0x343D, 0x343E, 0x343F, 0x3440, 0x3441, /* GB+81 39 F5 35 */ 0x3442, 0x3443, 0x3444, 0x3445, 0x3446, /* GB+81 39 F6 30 */ 0x3448, 0x3449, 0x344A, 0x344B, 0x344C, /* GB+81 39 F6 35 */ 0x344D, 0x344E, 0x344F, 0x3450, 0x3451, /* GB+81 39 F7 30 */ 0x3452, 0x3453, 0x3454, 0x3455, 0x3456, /* GB+81 39 F7 35 */ 0x3457, 0x3458, 0x3459, 0x345A, 0x345B, /* GB+81 39 F8 30 */ 0x345C, 0x345D, 0x345E, 0x345F, 0x3460, /* GB+81 39 F8 35 */ 0x3461, 0x3462, 0x3463, 0x3464, 0x3465, /* GB+81 39 F9 30 */ 0x3466, 0x3467, 0x3468, 0x3469, 0x346A, /* GB+81 39 F9 35 */ 0x346B, 0x346C, 0x346D, 0x346E, 0x346F, /* GB+81 39 FA 30 */ 0x3470, 0x3471, 0x3472, 0x3474, 0x3475, /* GB+81 39 FA 35 */ 0x3476, 0x3477, 0x3478, 0x3479, 0x347A, /* GB+81 39 FB 30 */ 0x347B, 0x347C, 0x347D, 0x347E, 0x347F, /* GB+81 39 FB 35 */ 0x3480, 0x3481, 0x3482, 0x3483, 0x3484, /* GB+81 39 FC 30 */ 0x3485, 0x3486, 0x3487, 0x3488, 0x3489, /* GB+81 39 FC 35 */ 0x348A, 0x348B, 0x348C, 0x348D, 0x348E, /* GB+81 39 FD 30 */ 0x348F, 0x3490, 0x3491, 0x3492, 0x3493, /* GB+81 39 FD 35 */ 0x3494, 0x3495, 0x3496, 0x3497, 0x3498, /* GB+81 39 FE 30 */ 0x3499, 0x349A, 0x349B, 0x349C, 0x349D, /* GB+81 39 FE 35 */ 0x349E, 0x349F, 0x34A0, 0x34A1, 0x34A2, /* GB+82 30 81 30 */ 0x34A3, 0x34A4, 0x34A5, 0x34A6, 0x34A7, /* GB+82 30 81 35 */ 0x34A8, 0x34A9, 0x34AA, 0x34AB, 0x34AC, /* GB+82 30 82 30 */ 0x34AD, 0x34AE, 0x34AF, 0x34B0, 0x34B1, /* GB+82 30 82 35 */ 0x34B2, 0x34B3, 0x34B4, 0x34B5, 0x34B6, /* GB+82 30 83 30 */ 0x34B7, 0x34B8, 0x34B9, 0x34BA, 0x34BB, /* GB+82 30 83 35 */ 0x34BC, 0x34BD, 0x34BE, 0x34BF, 0x34C0, /* GB+82 30 84 30 */ 0x34C1, 0x34C2, 0x34C3, 0x34C4, 0x34C5, /* GB+82 30 84 35 */ 0x34C6, 0x34C7, 0x34C8, 0x34C9, 0x34CA, /* GB+82 30 85 30 */ 0x34CB, 0x34CC, 0x34CD, 0x34CE, 0x34CF, /* GB+82 30 85 35 */ 0x34D0, 0x34D1, 0x34D2, 0x34D3, 0x34D4, /* GB+82 30 86 30 */ 0x34D5, 0x34D6, 0x34D7, 0x34D8, 0x34D9, /* GB+82 30 86 35 */ 0x34DA, 0x34DB, 0x34DC, 0x34DD, 0x34DE, /* GB+82 30 87 30 */ 0x34DF, 0x34E0, 0x34E1, 0x34E2, 0x34E3, /* GB+82 30 87 35 */ 0x34E4, 0x34E5, 0x34E6, 0x34E7, 0x34E8, /* GB+82 30 88 30 */ 0x34E9, 0x34EA, 0x34EB, 0x34EC, 0x34ED, /* GB+82 30 88 35 */ 0x34EE, 0x34EF, 0x34F0, 0x34F1, 0x34F2, /* GB+82 30 89 30 */ 0x34F3, 0x34F4, 0x34F5, 0x34F6, 0x34F7, /* GB+82 30 89 35 */ 0x34F8, 0x34F9, 0x34FA, 0x34FB, 0x34FC, /* GB+82 30 8A 30 */ 0x34FD, 0x34FE, 0x34FF, 0x3500, 0x3501, /* GB+82 30 8A 35 */ 0x3502, 0x3503, 0x3504, 0x3505, 0x3506, /* GB+82 30 8B 30 */ 0x3507, 0x3508, 0x3509, 0x350A, 0x350B, /* GB+82 30 8B 35 */ 0x350C, 0x350D, 0x350E, 0x350F, 0x3510, /* GB+82 30 8C 30 */ 0x3511, 0x3512, 0x3513, 0x3514, 0x3515, /* GB+82 30 8C 35 */ 0x3516, 0x3517, 0x3518, 0x3519, 0x351A, /* GB+82 30 8D 30 */ 0x351B, 0x351C, 0x351D, 0x351E, 0x351F, /* GB+82 30 8D 35 */ 0x3520, 0x3521, 0x3522, 0x3523, 0x3524, /* GB+82 30 8E 30 */ 0x3525, 0x3526, 0x3527, 0x3528, 0x3529, /* GB+82 30 8E 35 */ 0x352A, 0x352B, 0x352C, 0x352D, 0x352E, /* GB+82 30 8F 30 */ 0x352F, 0x3530, 0x3531, 0x3532, 0x3533, /* GB+82 30 8F 35 */ 0x3534, 0x3535, 0x3536, 0x3537, 0x3538, /* GB+82 30 90 30 */ 0x3539, 0x353A, 0x353B, 0x353C, 0x353D, /* GB+82 30 90 35 */ 0x353E, 0x353F, 0x3540, 0x3541, 0x3542, /* GB+82 30 91 30 */ 0x3543, 0x3544, 0x3545, 0x3546, 0x3547, /* GB+82 30 91 35 */ 0x3548, 0x3549, 0x354A, 0x354B, 0x354C, /* GB+82 30 92 30 */ 0x354D, 0x354E, 0x354F, 0x3550, 0x3551, /* GB+82 30 92 35 */ 0x3552, 0x3553, 0x3554, 0x3555, 0x3556, /* GB+82 30 93 30 */ 0x3557, 0x3558, 0x3559, 0x355A, 0x355B, /* GB+82 30 93 35 */ 0x355C, 0x355D, 0x355E, 0x355F, 0x3560, /* GB+82 30 94 30 */ 0x3561, 0x3562, 0x3563, 0x3564, 0x3565, /* GB+82 30 94 35 */ 0x3566, 0x3567, 0x3568, 0x3569, 0x356A, /* GB+82 30 95 30 */ 0x356B, 0x356C, 0x356D, 0x356E, 0x356F, /* GB+82 30 95 35 */ 0x3570, 0x3571, 0x3572, 0x3573, 0x3574, /* GB+82 30 96 30 */ 0x3575, 0x3576, 0x3577, 0x3578, 0x3579, /* GB+82 30 96 35 */ 0x357A, 0x357B, 0x357C, 0x357D, 0x357E, /* GB+82 30 97 30 */ 0x357F, 0x3580, 0x3581, 0x3582, 0x3583, /* GB+82 30 97 35 */ 0x3584, 0x3585, 0x3586, 0x3587, 0x3588, /* GB+82 30 98 30 */ 0x3589, 0x358A, 0x358B, 0x358C, 0x358D, /* GB+82 30 98 35 */ 0x358E, 0x358F, 0x3590, 0x3591, 0x3592, /* GB+82 30 99 30 */ 0x3593, 0x3594, 0x3595, 0x3596, 0x3597, /* GB+82 30 99 35 */ 0x3598, 0x3599, 0x359A, 0x359B, 0x359C, /* GB+82 30 9A 30 */ 0x359D, 0x359F, 0x35A0, 0x35A1, 0x35A2, /* GB+82 30 9A 35 */ 0x35A3, 0x35A4, 0x35A5, 0x35A6, 0x35A7, /* GB+82 30 9B 30 */ 0x35A8, 0x35A9, 0x35AA, 0x35AB, 0x35AC, /* GB+82 30 9B 35 */ 0x35AD, 0x35AE, 0x35AF, 0x35B0, 0x35B1, /* GB+82 30 9C 30 */ 0x35B2, 0x35B3, 0x35B4, 0x35B5, 0x35B6, /* GB+82 30 9C 35 */ 0x35B7, 0x35B8, 0x35B9, 0x35BA, 0x35BB, /* GB+82 30 9D 30 */ 0x35BC, 0x35BD, 0x35BE, 0x35BF, 0x35C0, /* GB+82 30 9D 35 */ 0x35C1, 0x35C2, 0x35C3, 0x35C4, 0x35C5, /* GB+82 30 9E 30 */ 0x35C6, 0x35C7, 0x35C8, 0x35C9, 0x35CA, /* GB+82 30 9E 35 */ 0x35CB, 0x35CC, 0x35CD, 0x35CE, 0x35CF, /* GB+82 30 9F 30 */ 0x35D0, 0x35D1, 0x35D2, 0x35D3, 0x35D4, /* GB+82 30 9F 35 */ 0x35D5, 0x35D6, 0x35D7, 0x35D8, 0x35D9, /* GB+82 30 A0 30 */ 0x35DA, 0x35DB, 0x35DC, 0x35DD, 0x35DE, /* GB+82 30 A0 35 */ 0x35DF, 0x35E0, 0x35E1, 0x35E2, 0x35E3, /* GB+82 30 A1 30 */ 0x35E4, 0x35E5, 0x35E6, 0x35E7, 0x35E8, /* GB+82 30 A1 35 */ 0x35E9, 0x35EA, 0x35EB, 0x35EC, 0x35ED, /* GB+82 30 A2 30 */ 0x35EE, 0x35EF, 0x35F0, 0x35F1, 0x35F2, /* GB+82 30 A2 35 */ 0x35F3, 0x35F4, 0x35F5, 0x35F6, 0x35F7, /* GB+82 30 A3 30 */ 0x35F8, 0x35F9, 0x35FA, 0x35FB, 0x35FC, /* GB+82 30 A3 35 */ 0x35FD, 0x35FE, 0x35FF, 0x3600, 0x3601, /* GB+82 30 A4 30 */ 0x3602, 0x3603, 0x3604, 0x3605, 0x3606, /* GB+82 30 A4 35 */ 0x3607, 0x3608, 0x3609, 0x360A, 0x360B, /* GB+82 30 A5 30 */ 0x360C, 0x360D, 0x360F, 0x3610, 0x3611, /* GB+82 30 A5 35 */ 0x3612, 0x3613, 0x3614, 0x3615, 0x3616, /* GB+82 30 A6 30 */ 0x3617, 0x3618, 0x3619, /* Contiguous area: GB+82 30 F2 38 .. GB+82 31 D4 37 */ /* GB+82 30 F2 38 */ 0x3919, 0x391A, /* GB+82 30 F3 30 */ 0x391B, 0x391C, 0x391D, 0x391E, 0x391F, /* GB+82 30 F3 35 */ 0x3920, 0x3921, 0x3922, 0x3923, 0x3924, /* GB+82 30 F4 30 */ 0x3925, 0x3926, 0x3927, 0x3928, 0x3929, /* GB+82 30 F4 35 */ 0x392A, 0x392B, 0x392C, 0x392D, 0x392E, /* GB+82 30 F5 30 */ 0x392F, 0x3930, 0x3931, 0x3932, 0x3933, /* GB+82 30 F5 35 */ 0x3934, 0x3935, 0x3936, 0x3937, 0x3938, /* GB+82 30 F6 30 */ 0x3939, 0x393A, 0x393B, 0x393C, 0x393D, /* GB+82 30 F6 35 */ 0x393E, 0x393F, 0x3940, 0x3941, 0x3942, /* GB+82 30 F7 30 */ 0x3943, 0x3944, 0x3945, 0x3946, 0x3947, /* GB+82 30 F7 35 */ 0x3948, 0x3949, 0x394A, 0x394B, 0x394C, /* GB+82 30 F8 30 */ 0x394D, 0x394E, 0x394F, 0x3950, 0x3951, /* GB+82 30 F8 35 */ 0x3952, 0x3953, 0x3954, 0x3955, 0x3956, /* GB+82 30 F9 30 */ 0x3957, 0x3958, 0x3959, 0x395A, 0x395B, /* GB+82 30 F9 35 */ 0x395C, 0x395D, 0x395E, 0x395F, 0x3960, /* GB+82 30 FA 30 */ 0x3961, 0x3962, 0x3963, 0x3964, 0x3965, /* GB+82 30 FA 35 */ 0x3966, 0x3967, 0x3968, 0x3969, 0x396A, /* GB+82 30 FB 30 */ 0x396B, 0x396C, 0x396D, 0x396F, 0x3970, /* GB+82 30 FB 35 */ 0x3971, 0x3972, 0x3973, 0x3974, 0x3975, /* GB+82 30 FC 30 */ 0x3976, 0x3977, 0x3978, 0x3979, 0x397A, /* GB+82 30 FC 35 */ 0x397B, 0x397C, 0x397D, 0x397E, 0x397F, /* GB+82 30 FD 30 */ 0x3980, 0x3981, 0x3982, 0x3983, 0x3984, /* GB+82 30 FD 35 */ 0x3985, 0x3986, 0x3987, 0x3988, 0x3989, /* GB+82 30 FE 30 */ 0x398A, 0x398B, 0x398C, 0x398D, 0x398E, /* GB+82 30 FE 35 */ 0x398F, 0x3990, 0x3991, 0x3992, 0x3993, /* GB+82 31 81 30 */ 0x3994, 0x3995, 0x3996, 0x3997, 0x3998, /* GB+82 31 81 35 */ 0x3999, 0x399A, 0x399B, 0x399C, 0x399D, /* GB+82 31 82 30 */ 0x399E, 0x399F, 0x39A0, 0x39A1, 0x39A2, /* GB+82 31 82 35 */ 0x39A3, 0x39A4, 0x39A5, 0x39A6, 0x39A7, /* GB+82 31 83 30 */ 0x39A8, 0x39A9, 0x39AA, 0x39AB, 0x39AC, /* GB+82 31 83 35 */ 0x39AD, 0x39AE, 0x39AF, 0x39B0, 0x39B1, /* GB+82 31 84 30 */ 0x39B2, 0x39B3, 0x39B4, 0x39B5, 0x39B6, /* GB+82 31 84 35 */ 0x39B7, 0x39B8, 0x39B9, 0x39BA, 0x39BB, /* GB+82 31 85 30 */ 0x39BC, 0x39BD, 0x39BE, 0x39BF, 0x39C0, /* GB+82 31 85 35 */ 0x39C1, 0x39C2, 0x39C3, 0x39C4, 0x39C5, /* GB+82 31 86 30 */ 0x39C6, 0x39C7, 0x39C8, 0x39C9, 0x39CA, /* GB+82 31 86 35 */ 0x39CB, 0x39CC, 0x39CD, 0x39CE, 0x39D1, /* GB+82 31 87 30 */ 0x39D2, 0x39D3, 0x39D4, 0x39D5, 0x39D6, /* GB+82 31 87 35 */ 0x39D7, 0x39D8, 0x39D9, 0x39DA, 0x39DB, /* GB+82 31 88 30 */ 0x39DC, 0x39DD, 0x39DE, 0x39E0, 0x39E1, /* GB+82 31 88 35 */ 0x39E2, 0x39E3, 0x39E4, 0x39E5, 0x39E6, /* GB+82 31 89 30 */ 0x39E7, 0x39E8, 0x39E9, 0x39EA, 0x39EB, /* GB+82 31 89 35 */ 0x39EC, 0x39ED, 0x39EE, 0x39EF, 0x39F0, /* GB+82 31 8A 30 */ 0x39F1, 0x39F2, 0x39F3, 0x39F4, 0x39F5, /* GB+82 31 8A 35 */ 0x39F6, 0x39F7, 0x39F8, 0x39F9, 0x39FA, /* GB+82 31 8B 30 */ 0x39FB, 0x39FC, 0x39FD, 0x39FE, 0x39FF, /* GB+82 31 8B 35 */ 0x3A00, 0x3A01, 0x3A02, 0x3A03, 0x3A04, /* GB+82 31 8C 30 */ 0x3A05, 0x3A06, 0x3A07, 0x3A08, 0x3A09, /* GB+82 31 8C 35 */ 0x3A0A, 0x3A0B, 0x3A0C, 0x3A0D, 0x3A0E, /* GB+82 31 8D 30 */ 0x3A0F, 0x3A10, 0x3A11, 0x3A12, 0x3A13, /* GB+82 31 8D 35 */ 0x3A14, 0x3A15, 0x3A16, 0x3A17, 0x3A18, /* GB+82 31 8E 30 */ 0x3A19, 0x3A1A, 0x3A1B, 0x3A1C, 0x3A1D, /* GB+82 31 8E 35 */ 0x3A1E, 0x3A1F, 0x3A20, 0x3A21, 0x3A22, /* GB+82 31 8F 30 */ 0x3A23, 0x3A24, 0x3A25, 0x3A26, 0x3A27, /* GB+82 31 8F 35 */ 0x3A28, 0x3A29, 0x3A2A, 0x3A2B, 0x3A2C, /* GB+82 31 90 30 */ 0x3A2D, 0x3A2E, 0x3A2F, 0x3A30, 0x3A31, /* GB+82 31 90 35 */ 0x3A32, 0x3A33, 0x3A34, 0x3A35, 0x3A36, /* GB+82 31 91 30 */ 0x3A37, 0x3A38, 0x3A39, 0x3A3A, 0x3A3B, /* GB+82 31 91 35 */ 0x3A3C, 0x3A3D, 0x3A3E, 0x3A3F, 0x3A40, /* GB+82 31 92 30 */ 0x3A41, 0x3A42, 0x3A43, 0x3A44, 0x3A45, /* GB+82 31 92 35 */ 0x3A46, 0x3A47, 0x3A48, 0x3A49, 0x3A4A, /* GB+82 31 93 30 */ 0x3A4B, 0x3A4C, 0x3A4D, 0x3A4E, 0x3A4F, /* GB+82 31 93 35 */ 0x3A50, 0x3A51, 0x3A52, 0x3A53, 0x3A54, /* GB+82 31 94 30 */ 0x3A55, 0x3A56, 0x3A57, 0x3A58, 0x3A59, /* GB+82 31 94 35 */ 0x3A5A, 0x3A5B, 0x3A5C, 0x3A5D, 0x3A5E, /* GB+82 31 95 30 */ 0x3A5F, 0x3A60, 0x3A61, 0x3A62, 0x3A63, /* GB+82 31 95 35 */ 0x3A64, 0x3A65, 0x3A66, 0x3A67, 0x3A68, /* GB+82 31 96 30 */ 0x3A69, 0x3A6A, 0x3A6B, 0x3A6C, 0x3A6D, /* GB+82 31 96 35 */ 0x3A6E, 0x3A6F, 0x3A70, 0x3A71, 0x3A72, /* GB+82 31 97 30 */ 0x3A74, 0x3A75, 0x3A76, 0x3A77, 0x3A78, /* GB+82 31 97 35 */ 0x3A79, 0x3A7A, 0x3A7B, 0x3A7C, 0x3A7D, /* GB+82 31 98 30 */ 0x3A7E, 0x3A7F, 0x3A80, 0x3A81, 0x3A82, /* GB+82 31 98 35 */ 0x3A83, 0x3A84, 0x3A85, 0x3A86, 0x3A87, /* GB+82 31 99 30 */ 0x3A88, 0x3A89, 0x3A8A, 0x3A8B, 0x3A8C, /* GB+82 31 99 35 */ 0x3A8D, 0x3A8E, 0x3A8F, 0x3A90, 0x3A91, /* GB+82 31 9A 30 */ 0x3A92, 0x3A93, 0x3A94, 0x3A95, 0x3A96, /* GB+82 31 9A 35 */ 0x3A97, 0x3A98, 0x3A99, 0x3A9A, 0x3A9B, /* GB+82 31 9B 30 */ 0x3A9C, 0x3A9D, 0x3A9E, 0x3A9F, 0x3AA0, /* GB+82 31 9B 35 */ 0x3AA1, 0x3AA2, 0x3AA3, 0x3AA4, 0x3AA5, /* GB+82 31 9C 30 */ 0x3AA6, 0x3AA7, 0x3AA8, 0x3AA9, 0x3AAA, /* GB+82 31 9C 35 */ 0x3AAB, 0x3AAC, 0x3AAD, 0x3AAE, 0x3AAF, /* GB+82 31 9D 30 */ 0x3AB0, 0x3AB1, 0x3AB2, 0x3AB3, 0x3AB4, /* GB+82 31 9D 35 */ 0x3AB5, 0x3AB6, 0x3AB7, 0x3AB8, 0x3AB9, /* GB+82 31 9E 30 */ 0x3ABA, 0x3ABB, 0x3ABC, 0x3ABD, 0x3ABE, /* GB+82 31 9E 35 */ 0x3ABF, 0x3AC0, 0x3AC1, 0x3AC2, 0x3AC3, /* GB+82 31 9F 30 */ 0x3AC4, 0x3AC5, 0x3AC6, 0x3AC7, 0x3AC8, /* GB+82 31 9F 35 */ 0x3AC9, 0x3ACA, 0x3ACB, 0x3ACC, 0x3ACD, /* GB+82 31 A0 30 */ 0x3ACE, 0x3ACF, 0x3AD0, 0x3AD1, 0x3AD2, /* GB+82 31 A0 35 */ 0x3AD3, 0x3AD4, 0x3AD5, 0x3AD6, 0x3AD7, /* GB+82 31 A1 30 */ 0x3AD8, 0x3AD9, 0x3ADA, 0x3ADB, 0x3ADC, /* GB+82 31 A1 35 */ 0x3ADD, 0x3ADE, 0x3ADF, 0x3AE0, 0x3AE1, /* GB+82 31 A2 30 */ 0x3AE2, 0x3AE3, 0x3AE4, 0x3AE5, 0x3AE6, /* GB+82 31 A2 35 */ 0x3AE7, 0x3AE8, 0x3AE9, 0x3AEA, 0x3AEB, /* GB+82 31 A3 30 */ 0x3AEC, 0x3AED, 0x3AEE, 0x3AEF, 0x3AF0, /* GB+82 31 A3 35 */ 0x3AF1, 0x3AF2, 0x3AF3, 0x3AF4, 0x3AF5, /* GB+82 31 A4 30 */ 0x3AF6, 0x3AF7, 0x3AF8, 0x3AF9, 0x3AFA, /* GB+82 31 A4 35 */ 0x3AFB, 0x3AFC, 0x3AFD, 0x3AFE, 0x3AFF, /* GB+82 31 A5 30 */ 0x3B00, 0x3B01, 0x3B02, 0x3B03, 0x3B04, /* GB+82 31 A5 35 */ 0x3B05, 0x3B06, 0x3B07, 0x3B08, 0x3B09, /* GB+82 31 A6 30 */ 0x3B0A, 0x3B0B, 0x3B0C, 0x3B0D, 0x3B0E, /* GB+82 31 A6 35 */ 0x3B0F, 0x3B10, 0x3B11, 0x3B12, 0x3B13, /* GB+82 31 A7 30 */ 0x3B14, 0x3B15, 0x3B16, 0x3B17, 0x3B18, /* GB+82 31 A7 35 */ 0x3B19, 0x3B1A, 0x3B1B, 0x3B1C, 0x3B1D, /* GB+82 31 A8 30 */ 0x3B1E, 0x3B1F, 0x3B20, 0x3B21, 0x3B22, /* GB+82 31 A8 35 */ 0x3B23, 0x3B24, 0x3B25, 0x3B26, 0x3B27, /* GB+82 31 A9 30 */ 0x3B28, 0x3B29, 0x3B2A, 0x3B2B, 0x3B2C, /* GB+82 31 A9 35 */ 0x3B2D, 0x3B2E, 0x3B2F, 0x3B30, 0x3B31, /* GB+82 31 AA 30 */ 0x3B32, 0x3B33, 0x3B34, 0x3B35, 0x3B36, /* GB+82 31 AA 35 */ 0x3B37, 0x3B38, 0x3B39, 0x3B3A, 0x3B3B, /* GB+82 31 AB 30 */ 0x3B3C, 0x3B3D, 0x3B3E, 0x3B3F, 0x3B40, /* GB+82 31 AB 35 */ 0x3B41, 0x3B42, 0x3B43, 0x3B44, 0x3B45, /* GB+82 31 AC 30 */ 0x3B46, 0x3B47, 0x3B48, 0x3B49, 0x3B4A, /* GB+82 31 AC 35 */ 0x3B4B, 0x3B4C, 0x3B4D, 0x3B4F, 0x3B50, /* GB+82 31 AD 30 */ 0x3B51, 0x3B52, 0x3B53, 0x3B54, 0x3B55, /* GB+82 31 AD 35 */ 0x3B56, 0x3B57, 0x3B58, 0x3B59, 0x3B5A, /* GB+82 31 AE 30 */ 0x3B5B, 0x3B5C, 0x3B5D, 0x3B5E, 0x3B5F, /* GB+82 31 AE 35 */ 0x3B60, 0x3B61, 0x3B62, 0x3B63, 0x3B64, /* GB+82 31 AF 30 */ 0x3B65, 0x3B66, 0x3B67, 0x3B68, 0x3B69, /* GB+82 31 AF 35 */ 0x3B6A, 0x3B6B, 0x3B6C, 0x3B6D, 0x3B6E, /* GB+82 31 B0 30 */ 0x3B6F, 0x3B70, 0x3B71, 0x3B72, 0x3B73, /* GB+82 31 B0 35 */ 0x3B74, 0x3B75, 0x3B76, 0x3B77, 0x3B78, /* GB+82 31 B1 30 */ 0x3B79, 0x3B7A, 0x3B7B, 0x3B7C, 0x3B7D, /* GB+82 31 B1 35 */ 0x3B7E, 0x3B7F, 0x3B80, 0x3B81, 0x3B82, /* GB+82 31 B2 30 */ 0x3B83, 0x3B84, 0x3B85, 0x3B86, 0x3B87, /* GB+82 31 B2 35 */ 0x3B88, 0x3B89, 0x3B8A, 0x3B8B, 0x3B8C, /* GB+82 31 B3 30 */ 0x3B8D, 0x3B8E, 0x3B8F, 0x3B90, 0x3B91, /* GB+82 31 B3 35 */ 0x3B92, 0x3B93, 0x3B94, 0x3B95, 0x3B96, /* GB+82 31 B4 30 */ 0x3B97, 0x3B98, 0x3B99, 0x3B9A, 0x3B9B, /* GB+82 31 B4 35 */ 0x3B9C, 0x3B9D, 0x3B9E, 0x3B9F, 0x3BA0, /* GB+82 31 B5 30 */ 0x3BA1, 0x3BA2, 0x3BA3, 0x3BA4, 0x3BA5, /* GB+82 31 B5 35 */ 0x3BA6, 0x3BA7, 0x3BA8, 0x3BA9, 0x3BAA, /* GB+82 31 B6 30 */ 0x3BAB, 0x3BAC, 0x3BAD, 0x3BAE, 0x3BAF, /* GB+82 31 B6 35 */ 0x3BB0, 0x3BB1, 0x3BB2, 0x3BB3, 0x3BB4, /* GB+82 31 B7 30 */ 0x3BB5, 0x3BB6, 0x3BB7, 0x3BB8, 0x3BB9, /* GB+82 31 B7 35 */ 0x3BBA, 0x3BBB, 0x3BBC, 0x3BBD, 0x3BBE, /* GB+82 31 B8 30 */ 0x3BBF, 0x3BC0, 0x3BC1, 0x3BC2, 0x3BC3, /* GB+82 31 B8 35 */ 0x3BC4, 0x3BC5, 0x3BC6, 0x3BC7, 0x3BC8, /* GB+82 31 B9 30 */ 0x3BC9, 0x3BCA, 0x3BCB, 0x3BCC, 0x3BCD, /* GB+82 31 B9 35 */ 0x3BCE, 0x3BCF, 0x3BD0, 0x3BD1, 0x3BD2, /* GB+82 31 BA 30 */ 0x3BD3, 0x3BD4, 0x3BD5, 0x3BD6, 0x3BD7, /* GB+82 31 BA 35 */ 0x3BD8, 0x3BD9, 0x3BDA, 0x3BDB, 0x3BDC, /* GB+82 31 BB 30 */ 0x3BDD, 0x3BDE, 0x3BDF, 0x3BE0, 0x3BE1, /* GB+82 31 BB 35 */ 0x3BE2, 0x3BE3, 0x3BE4, 0x3BE5, 0x3BE6, /* GB+82 31 BC 30 */ 0x3BE7, 0x3BE8, 0x3BE9, 0x3BEA, 0x3BEB, /* GB+82 31 BC 35 */ 0x3BEC, 0x3BED, 0x3BEE, 0x3BEF, 0x3BF0, /* GB+82 31 BD 30 */ 0x3BF1, 0x3BF2, 0x3BF3, 0x3BF4, 0x3BF5, /* GB+82 31 BD 35 */ 0x3BF6, 0x3BF7, 0x3BF8, 0x3BF9, 0x3BFA, /* GB+82 31 BE 30 */ 0x3BFB, 0x3BFC, 0x3BFD, 0x3BFE, 0x3BFF, /* GB+82 31 BE 35 */ 0x3C00, 0x3C01, 0x3C02, 0x3C03, 0x3C04, /* GB+82 31 BF 30 */ 0x3C05, 0x3C06, 0x3C07, 0x3C08, 0x3C09, /* GB+82 31 BF 35 */ 0x3C0A, 0x3C0B, 0x3C0C, 0x3C0D, 0x3C0E, /* GB+82 31 C0 30 */ 0x3C0F, 0x3C10, 0x3C11, 0x3C12, 0x3C13, /* GB+82 31 C0 35 */ 0x3C14, 0x3C15, 0x3C16, 0x3C17, 0x3C18, /* GB+82 31 C1 30 */ 0x3C19, 0x3C1A, 0x3C1B, 0x3C1C, 0x3C1D, /* GB+82 31 C1 35 */ 0x3C1E, 0x3C1F, 0x3C20, 0x3C21, 0x3C22, /* GB+82 31 C2 30 */ 0x3C23, 0x3C24, 0x3C25, 0x3C26, 0x3C27, /* GB+82 31 C2 35 */ 0x3C28, 0x3C29, 0x3C2A, 0x3C2B, 0x3C2C, /* GB+82 31 C3 30 */ 0x3C2D, 0x3C2E, 0x3C2F, 0x3C30, 0x3C31, /* GB+82 31 C3 35 */ 0x3C32, 0x3C33, 0x3C34, 0x3C35, 0x3C36, /* GB+82 31 C4 30 */ 0x3C37, 0x3C38, 0x3C39, 0x3C3A, 0x3C3B, /* GB+82 31 C4 35 */ 0x3C3C, 0x3C3D, 0x3C3E, 0x3C3F, 0x3C40, /* GB+82 31 C5 30 */ 0x3C41, 0x3C42, 0x3C43, 0x3C44, 0x3C45, /* GB+82 31 C5 35 */ 0x3C46, 0x3C47, 0x3C48, 0x3C49, 0x3C4A, /* GB+82 31 C6 30 */ 0x3C4B, 0x3C4C, 0x3C4D, 0x3C4E, 0x3C4F, /* GB+82 31 C6 35 */ 0x3C50, 0x3C51, 0x3C52, 0x3C53, 0x3C54, /* GB+82 31 C7 30 */ 0x3C55, 0x3C56, 0x3C57, 0x3C58, 0x3C59, /* GB+82 31 C7 35 */ 0x3C5A, 0x3C5B, 0x3C5C, 0x3C5D, 0x3C5E, /* GB+82 31 C8 30 */ 0x3C5F, 0x3C60, 0x3C61, 0x3C62, 0x3C63, /* GB+82 31 C8 35 */ 0x3C64, 0x3C65, 0x3C66, 0x3C67, 0x3C68, /* GB+82 31 C9 30 */ 0x3C69, 0x3C6A, 0x3C6B, 0x3C6C, 0x3C6D, /* GB+82 31 C9 35 */ 0x3C6F, 0x3C70, 0x3C71, 0x3C72, 0x3C73, /* GB+82 31 CA 30 */ 0x3C74, 0x3C75, 0x3C76, 0x3C77, 0x3C78, /* GB+82 31 CA 35 */ 0x3C79, 0x3C7A, 0x3C7B, 0x3C7C, 0x3C7D, /* GB+82 31 CB 30 */ 0x3C7E, 0x3C7F, 0x3C80, 0x3C81, 0x3C82, /* GB+82 31 CB 35 */ 0x3C83, 0x3C84, 0x3C85, 0x3C86, 0x3C87, /* GB+82 31 CC 30 */ 0x3C88, 0x3C89, 0x3C8A, 0x3C8B, 0x3C8C, /* GB+82 31 CC 35 */ 0x3C8D, 0x3C8E, 0x3C8F, 0x3C90, 0x3C91, /* GB+82 31 CD 30 */ 0x3C92, 0x3C93, 0x3C94, 0x3C95, 0x3C96, /* GB+82 31 CD 35 */ 0x3C97, 0x3C98, 0x3C99, 0x3C9A, 0x3C9B, /* GB+82 31 CE 30 */ 0x3C9C, 0x3C9D, 0x3C9E, 0x3C9F, 0x3CA0, /* GB+82 31 CE 35 */ 0x3CA1, 0x3CA2, 0x3CA3, 0x3CA4, 0x3CA5, /* GB+82 31 CF 30 */ 0x3CA6, 0x3CA7, 0x3CA8, 0x3CA9, 0x3CAA, /* GB+82 31 CF 35 */ 0x3CAB, 0x3CAC, 0x3CAD, 0x3CAE, 0x3CAF, /* GB+82 31 D0 30 */ 0x3CB0, 0x3CB1, 0x3CB2, 0x3CB3, 0x3CB4, /* GB+82 31 D0 35 */ 0x3CB5, 0x3CB6, 0x3CB7, 0x3CB8, 0x3CB9, /* GB+82 31 D1 30 */ 0x3CBA, 0x3CBB, 0x3CBC, 0x3CBD, 0x3CBE, /* GB+82 31 D1 35 */ 0x3CBF, 0x3CC0, 0x3CC1, 0x3CC2, 0x3CC3, /* GB+82 31 D2 30 */ 0x3CC4, 0x3CC5, 0x3CC6, 0x3CC7, 0x3CC8, /* GB+82 31 D2 35 */ 0x3CC9, 0x3CCA, 0x3CCB, 0x3CCC, 0x3CCD, /* GB+82 31 D3 30 */ 0x3CCE, 0x3CCF, 0x3CD0, 0x3CD1, 0x3CD2, /* GB+82 31 D3 35 */ 0x3CD3, 0x3CD4, 0x3CD5, 0x3CD6, 0x3CD7, /* GB+82 31 D4 30 */ 0x3CD8, 0x3CD9, 0x3CDA, 0x3CDB, 0x3CDC, /* GB+82 31 D4 35 */ 0x3CDD, 0x3CDE, 0x3CDF, /* Contiguous area: GB+82 32 AF 33 .. GB+82 32 C9 36 */ /* GB+82 32 AF 33 */ 0x4057, 0x4058, /* GB+82 32 AF 35 */ 0x4059, 0x405A, 0x405B, 0x405C, 0x405D, /* GB+82 32 B0 30 */ 0x405E, 0x405F, 0x4060, 0x4061, 0x4062, /* GB+82 32 B0 35 */ 0x4063, 0x4064, 0x4065, 0x4066, 0x4067, /* GB+82 32 B1 30 */ 0x4068, 0x4069, 0x406A, 0x406B, 0x406C, /* GB+82 32 B1 35 */ 0x406D, 0x406E, 0x406F, 0x4070, 0x4071, /* GB+82 32 B2 30 */ 0x4072, 0x4073, 0x4074, 0x4075, 0x4076, /* GB+82 32 B2 35 */ 0x4077, 0x4078, 0x4079, 0x407A, 0x407B, /* GB+82 32 B3 30 */ 0x407C, 0x407D, 0x407E, 0x407F, 0x4080, /* GB+82 32 B3 35 */ 0x4081, 0x4082, 0x4083, 0x4084, 0x4085, /* GB+82 32 B4 30 */ 0x4086, 0x4087, 0x4088, 0x4089, 0x408A, /* GB+82 32 B4 35 */ 0x408B, 0x408C, 0x408D, 0x408E, 0x408F, /* GB+82 32 B5 30 */ 0x4090, 0x4091, 0x4092, 0x4093, 0x4094, /* GB+82 32 B5 35 */ 0x4095, 0x4096, 0x4097, 0x4098, 0x4099, /* GB+82 32 B6 30 */ 0x409A, 0x409B, 0x409C, 0x409D, 0x409E, /* GB+82 32 B6 35 */ 0x409F, 0x40A0, 0x40A1, 0x40A2, 0x40A3, /* GB+82 32 B7 30 */ 0x40A4, 0x40A5, 0x40A6, 0x40A7, 0x40A8, /* GB+82 32 B7 35 */ 0x40A9, 0x40AA, 0x40AB, 0x40AC, 0x40AD, /* GB+82 32 B8 30 */ 0x40AE, 0x40AF, 0x40B0, 0x40B1, 0x40B2, /* GB+82 32 B8 35 */ 0x40B3, 0x40B4, 0x40B5, 0x40B6, 0x40B7, /* GB+82 32 B9 30 */ 0x40B8, 0x40B9, 0x40BA, 0x40BB, 0x40BC, /* GB+82 32 B9 35 */ 0x40BD, 0x40BE, 0x40BF, 0x40C0, 0x40C1, /* GB+82 32 BA 30 */ 0x40C2, 0x40C3, 0x40C4, 0x40C5, 0x40C6, /* GB+82 32 BA 35 */ 0x40C7, 0x40C8, 0x40C9, 0x40CA, 0x40CB, /* GB+82 32 BB 30 */ 0x40CC, 0x40CD, 0x40CE, 0x40CF, 0x40D0, /* GB+82 32 BB 35 */ 0x40D1, 0x40D2, 0x40D3, 0x40D4, 0x40D5, /* GB+82 32 BC 30 */ 0x40D6, 0x40D7, 0x40D8, 0x40D9, 0x40DA, /* GB+82 32 BC 35 */ 0x40DB, 0x40DC, 0x40DD, 0x40DE, 0x40DF, /* GB+82 32 BD 30 */ 0x40E0, 0x40E1, 0x40E2, 0x40E3, 0x40E4, /* GB+82 32 BD 35 */ 0x40E5, 0x40E6, 0x40E7, 0x40E8, 0x40E9, /* GB+82 32 BE 30 */ 0x40EA, 0x40EB, 0x40EC, 0x40ED, 0x40EE, /* GB+82 32 BE 35 */ 0x40EF, 0x40F0, 0x40F1, 0x40F2, 0x40F3, /* GB+82 32 BF 30 */ 0x40F4, 0x40F5, 0x40F6, 0x40F7, 0x40F8, /* GB+82 32 BF 35 */ 0x40F9, 0x40FA, 0x40FB, 0x40FC, 0x40FD, /* GB+82 32 C0 30 */ 0x40FE, 0x40FF, 0x4100, 0x4101, 0x4102, /* GB+82 32 C0 35 */ 0x4103, 0x4104, 0x4105, 0x4106, 0x4107, /* GB+82 32 C1 30 */ 0x4108, 0x4109, 0x410A, 0x410B, 0x410C, /* GB+82 32 C1 35 */ 0x410D, 0x410E, 0x410F, 0x4110, 0x4111, /* GB+82 32 C2 30 */ 0x4112, 0x4113, 0x4114, 0x4115, 0x4116, /* GB+82 32 C2 35 */ 0x4117, 0x4118, 0x4119, 0x411A, 0x411B, /* GB+82 32 C3 30 */ 0x411C, 0x411D, 0x411E, 0x411F, 0x4120, /* GB+82 32 C3 35 */ 0x4121, 0x4122, 0x4123, 0x4124, 0x4125, /* GB+82 32 C4 30 */ 0x4126, 0x4127, 0x4128, 0x4129, 0x412A, /* GB+82 32 C4 35 */ 0x412B, 0x412C, 0x412D, 0x412E, 0x412F, /* GB+82 32 C5 30 */ 0x4130, 0x4131, 0x4132, 0x4133, 0x4134, /* GB+82 32 C5 35 */ 0x4135, 0x4136, 0x4137, 0x4138, 0x4139, /* GB+82 32 C6 30 */ 0x413A, 0x413B, 0x413C, 0x413D, 0x413E, /* GB+82 32 C6 35 */ 0x413F, 0x4140, 0x4141, 0x4142, 0x4143, /* GB+82 32 C7 30 */ 0x4144, 0x4145, 0x4146, 0x4147, 0x4148, /* GB+82 32 C7 35 */ 0x4149, 0x414A, 0x414B, 0x414C, 0x414D, /* GB+82 32 C8 30 */ 0x414E, 0x414F, 0x4150, 0x4151, 0x4152, /* GB+82 32 C8 35 */ 0x4153, 0x4154, 0x4155, 0x4156, 0x4157, /* GB+82 32 C9 30 */ 0x4158, 0x4159, 0x415A, 0x415B, 0x415C, /* GB+82 32 C9 35 */ 0x415D, 0x415E, /* Contiguous area: GB+82 32 F8 38 .. GB+82 33 A3 38 */ /* GB+82 32 F8 38 */ 0x4338, 0x4339, /* GB+82 32 F9 30 */ 0x433A, 0x433B, 0x433C, 0x433D, 0x433E, /* GB+82 32 F9 35 */ 0x433F, 0x4340, 0x4341, 0x4342, 0x4343, /* GB+82 32 FA 30 */ 0x4344, 0x4345, 0x4346, 0x4347, 0x4348, /* GB+82 32 FA 35 */ 0x4349, 0x434A, 0x434B, 0x434C, 0x434D, /* GB+82 32 FB 30 */ 0x434E, 0x434F, 0x4350, 0x4351, 0x4352, /* GB+82 32 FB 35 */ 0x4353, 0x4354, 0x4355, 0x4356, 0x4357, /* GB+82 32 FC 30 */ 0x4358, 0x4359, 0x435A, 0x435B, 0x435C, /* GB+82 32 FC 35 */ 0x435D, 0x435E, 0x435F, 0x4360, 0x4361, /* GB+82 32 FD 30 */ 0x4362, 0x4363, 0x4364, 0x4365, 0x4366, /* GB+82 32 FD 35 */ 0x4367, 0x4368, 0x4369, 0x436A, 0x436B, /* GB+82 32 FE 30 */ 0x436C, 0x436D, 0x436E, 0x436F, 0x4370, /* GB+82 32 FE 35 */ 0x4371, 0x4372, 0x4373, 0x4374, 0x4375, /* GB+82 33 81 30 */ 0x4376, 0x4377, 0x4378, 0x4379, 0x437A, /* GB+82 33 81 35 */ 0x437B, 0x437C, 0x437D, 0x437E, 0x437F, /* GB+82 33 82 30 */ 0x4380, 0x4381, 0x4382, 0x4383, 0x4384, /* GB+82 33 82 35 */ 0x4385, 0x4386, 0x4387, 0x4388, 0x4389, /* GB+82 33 83 30 */ 0x438A, 0x438B, 0x438C, 0x438D, 0x438E, /* GB+82 33 83 35 */ 0x438F, 0x4390, 0x4391, 0x4392, 0x4393, /* GB+82 33 84 30 */ 0x4394, 0x4395, 0x4396, 0x4397, 0x4398, /* GB+82 33 84 35 */ 0x4399, 0x439A, 0x439B, 0x439C, 0x439D, /* GB+82 33 85 30 */ 0x439E, 0x439F, 0x43A0, 0x43A1, 0x43A2, /* GB+82 33 85 35 */ 0x43A3, 0x43A4, 0x43A5, 0x43A6, 0x43A7, /* GB+82 33 86 30 */ 0x43A8, 0x43A9, 0x43AA, 0x43AB, 0x43AD, /* GB+82 33 86 35 */ 0x43AE, 0x43AF, 0x43B0, 0x43B2, 0x43B3, /* GB+82 33 87 30 */ 0x43B4, 0x43B5, 0x43B6, 0x43B7, 0x43B8, /* GB+82 33 87 35 */ 0x43B9, 0x43BA, 0x43BB, 0x43BC, 0x43BD, /* GB+82 33 88 30 */ 0x43BE, 0x43BF, 0x43C0, 0x43C1, 0x43C2, /* GB+82 33 88 35 */ 0x43C3, 0x43C4, 0x43C5, 0x43C6, 0x43C7, /* GB+82 33 89 30 */ 0x43C8, 0x43C9, 0x43CA, 0x43CB, 0x43CC, /* GB+82 33 89 35 */ 0x43CD, 0x43CE, 0x43CF, 0x43D0, 0x43D1, /* GB+82 33 8A 30 */ 0x43D2, 0x43D3, 0x43D4, 0x43D5, 0x43D6, /* GB+82 33 8A 35 */ 0x43D7, 0x43D8, 0x43D9, 0x43DA, 0x43DB, /* GB+82 33 8B 30 */ 0x43DC, 0x43DE, 0x43DF, 0x43E0, 0x43E1, /* GB+82 33 8B 35 */ 0x43E2, 0x43E3, 0x43E4, 0x43E5, 0x43E6, /* GB+82 33 8C 30 */ 0x43E7, 0x43E8, 0x43E9, 0x43EA, 0x43EB, /* GB+82 33 8C 35 */ 0x43EC, 0x43ED, 0x43EE, 0x43EF, 0x43F0, /* GB+82 33 8D 30 */ 0x43F1, 0x43F2, 0x43F3, 0x43F4, 0x43F5, /* GB+82 33 8D 35 */ 0x43F6, 0x43F7, 0x43F8, 0x43F9, 0x43FA, /* GB+82 33 8E 30 */ 0x43FB, 0x43FC, 0x43FD, 0x43FE, 0x43FF, /* GB+82 33 8E 35 */ 0x4400, 0x4401, 0x4402, 0x4403, 0x4404, /* GB+82 33 8F 30 */ 0x4405, 0x4406, 0x4407, 0x4408, 0x4409, /* GB+82 33 8F 35 */ 0x440A, 0x440B, 0x440C, 0x440D, 0x440E, /* GB+82 33 90 30 */ 0x440F, 0x4410, 0x4411, 0x4412, 0x4413, /* GB+82 33 90 35 */ 0x4414, 0x4415, 0x4416, 0x4417, 0x4418, /* GB+82 33 91 30 */ 0x4419, 0x441A, 0x441B, 0x441C, 0x441D, /* GB+82 33 91 35 */ 0x441E, 0x441F, 0x4420, 0x4421, 0x4422, /* GB+82 33 92 30 */ 0x4423, 0x4424, 0x4425, 0x4426, 0x4427, /* GB+82 33 92 35 */ 0x4428, 0x4429, 0x442A, 0x442B, 0x442C, /* GB+82 33 93 30 */ 0x442D, 0x442E, 0x442F, 0x4430, 0x4431, /* GB+82 33 93 35 */ 0x4432, 0x4433, 0x4434, 0x4435, 0x4436, /* GB+82 33 94 30 */ 0x4437, 0x4438, 0x4439, 0x443A, 0x443B, /* GB+82 33 94 35 */ 0x443C, 0x443D, 0x443E, 0x443F, 0x4440, /* GB+82 33 95 30 */ 0x4441, 0x4442, 0x4443, 0x4444, 0x4445, /* GB+82 33 95 35 */ 0x4446, 0x4447, 0x4448, 0x4449, 0x444A, /* GB+82 33 96 30 */ 0x444B, 0x444C, 0x444D, 0x444E, 0x444F, /* GB+82 33 96 35 */ 0x4450, 0x4451, 0x4452, 0x4453, 0x4454, /* GB+82 33 97 30 */ 0x4455, 0x4456, 0x4457, 0x4458, 0x4459, /* GB+82 33 97 35 */ 0x445A, 0x445B, 0x445C, 0x445D, 0x445E, /* GB+82 33 98 30 */ 0x445F, 0x4460, 0x4461, 0x4462, 0x4463, /* GB+82 33 98 35 */ 0x4464, 0x4465, 0x4466, 0x4467, 0x4468, /* GB+82 33 99 30 */ 0x4469, 0x446A, 0x446B, 0x446C, 0x446D, /* GB+82 33 99 35 */ 0x446E, 0x446F, 0x4470, 0x4471, 0x4472, /* GB+82 33 9A 30 */ 0x4473, 0x4474, 0x4475, 0x4476, 0x4477, /* GB+82 33 9A 35 */ 0x4478, 0x4479, 0x447A, 0x447B, 0x447C, /* GB+82 33 9B 30 */ 0x447D, 0x447E, 0x447F, 0x4480, 0x4481, /* GB+82 33 9B 35 */ 0x4482, 0x4483, 0x4484, 0x4485, 0x4486, /* GB+82 33 9C 30 */ 0x4487, 0x4488, 0x4489, 0x448A, 0x448B, /* GB+82 33 9C 35 */ 0x448C, 0x448D, 0x448E, 0x448F, 0x4490, /* GB+82 33 9D 30 */ 0x4491, 0x4492, 0x4493, 0x4494, 0x4495, /* GB+82 33 9D 35 */ 0x4496, 0x4497, 0x4498, 0x4499, 0x449A, /* GB+82 33 9E 30 */ 0x449B, 0x449C, 0x449D, 0x449E, 0x449F, /* GB+82 33 9E 35 */ 0x44A0, 0x44A1, 0x44A2, 0x44A3, 0x44A4, /* GB+82 33 9F 30 */ 0x44A5, 0x44A6, 0x44A7, 0x44A8, 0x44A9, /* GB+82 33 9F 35 */ 0x44AA, 0x44AB, 0x44AC, 0x44AD, 0x44AE, /* GB+82 33 A0 30 */ 0x44AF, 0x44B0, 0x44B1, 0x44B2, 0x44B3, /* GB+82 33 A0 35 */ 0x44B4, 0x44B5, 0x44B6, 0x44B7, 0x44B8, /* GB+82 33 A1 30 */ 0x44B9, 0x44BA, 0x44BB, 0x44BC, 0x44BD, /* GB+82 33 A1 35 */ 0x44BE, 0x44BF, 0x44C0, 0x44C1, 0x44C2, /* GB+82 33 A2 30 */ 0x44C3, 0x44C4, 0x44C5, 0x44C6, 0x44C7, /* GB+82 33 A2 35 */ 0x44C8, 0x44C9, 0x44CA, 0x44CB, 0x44CC, /* GB+82 33 A3 30 */ 0x44CD, 0x44CE, 0x44CF, 0x44D0, 0x44D1, /* GB+82 33 A3 35 */ 0x44D2, 0x44D3, 0x44D4, 0x44D5, /* Contiguous area: GB+82 33 C9 32 .. GB+82 33 E8 37 */ /* GB+82 33 C9 32 */ 0x464D, 0x464E, 0x464F, /* GB+82 33 C9 35 */ 0x4650, 0x4651, 0x4652, 0x4653, 0x4654, /* GB+82 33 CA 30 */ 0x4655, 0x4656, 0x4657, 0x4658, 0x4659, /* GB+82 33 CA 35 */ 0x465A, 0x465B, 0x465C, 0x465D, 0x465E, /* GB+82 33 CB 30 */ 0x465F, 0x4660, 0x4662, 0x4663, 0x4664, /* GB+82 33 CB 35 */ 0x4665, 0x4666, 0x4667, 0x4668, 0x4669, /* GB+82 33 CC 30 */ 0x466A, 0x466B, 0x466C, 0x466D, 0x466E, /* GB+82 33 CC 35 */ 0x466F, 0x4670, 0x4671, 0x4672, 0x4673, /* GB+82 33 CD 30 */ 0x4674, 0x4675, 0x4676, 0x4677, 0x4678, /* GB+82 33 CD 35 */ 0x4679, 0x467A, 0x467B, 0x467C, 0x467D, /* GB+82 33 CE 30 */ 0x467E, 0x467F, 0x4680, 0x4681, 0x4682, /* GB+82 33 CE 35 */ 0x4683, 0x4684, 0x4685, 0x4686, 0x4687, /* GB+82 33 CF 30 */ 0x4688, 0x4689, 0x468A, 0x468B, 0x468C, /* GB+82 33 CF 35 */ 0x468D, 0x468E, 0x468F, 0x4690, 0x4691, /* GB+82 33 D0 30 */ 0x4692, 0x4693, 0x4694, 0x4695, 0x4696, /* GB+82 33 D0 35 */ 0x4697, 0x4698, 0x4699, 0x469A, 0x469B, /* GB+82 33 D1 30 */ 0x469C, 0x469D, 0x469E, 0x469F, 0x46A0, /* GB+82 33 D1 35 */ 0x46A1, 0x46A2, 0x46A3, 0x46A4, 0x46A5, /* GB+82 33 D2 30 */ 0x46A6, 0x46A7, 0x46A8, 0x46A9, 0x46AA, /* GB+82 33 D2 35 */ 0x46AB, 0x46AC, 0x46AD, 0x46AE, 0x46AF, /* GB+82 33 D3 30 */ 0x46B0, 0x46B1, 0x46B2, 0x46B3, 0x46B4, /* GB+82 33 D3 35 */ 0x46B5, 0x46B6, 0x46B7, 0x46B8, 0x46B9, /* GB+82 33 D4 30 */ 0x46BA, 0x46BB, 0x46BC, 0x46BD, 0x46BE, /* GB+82 33 D4 35 */ 0x46BF, 0x46C0, 0x46C1, 0x46C2, 0x46C3, /* GB+82 33 D5 30 */ 0x46C4, 0x46C5, 0x46C6, 0x46C7, 0x46C8, /* GB+82 33 D5 35 */ 0x46C9, 0x46CA, 0x46CB, 0x46CC, 0x46CD, /* GB+82 33 D6 30 */ 0x46CE, 0x46CF, 0x46D0, 0x46D1, 0x46D2, /* GB+82 33 D6 35 */ 0x46D3, 0x46D4, 0x46D5, 0x46D6, 0x46D7, /* GB+82 33 D7 30 */ 0x46D8, 0x46D9, 0x46DA, 0x46DB, 0x46DC, /* GB+82 33 D7 35 */ 0x46DD, 0x46DE, 0x46DF, 0x46E0, 0x46E1, /* GB+82 33 D8 30 */ 0x46E2, 0x46E3, 0x46E4, 0x46E5, 0x46E6, /* GB+82 33 D8 35 */ 0x46E7, 0x46E8, 0x46E9, 0x46EA, 0x46EB, /* GB+82 33 D9 30 */ 0x46EC, 0x46ED, 0x46EE, 0x46EF, 0x46F0, /* GB+82 33 D9 35 */ 0x46F1, 0x46F2, 0x46F3, 0x46F4, 0x46F5, /* GB+82 33 DA 30 */ 0x46F6, 0x46F7, 0x46F8, 0x46F9, 0x46FA, /* GB+82 33 DA 35 */ 0x46FB, 0x46FC, 0x46FD, 0x46FE, 0x46FF, /* GB+82 33 DB 30 */ 0x4700, 0x4701, 0x4702, 0x4703, 0x4704, /* GB+82 33 DB 35 */ 0x4705, 0x4706, 0x4707, 0x4708, 0x4709, /* GB+82 33 DC 30 */ 0x470A, 0x470B, 0x470C, 0x470D, 0x470E, /* GB+82 33 DC 35 */ 0x470F, 0x4710, 0x4711, 0x4712, 0x4713, /* GB+82 33 DD 30 */ 0x4714, 0x4715, 0x4716, 0x4717, 0x4718, /* GB+82 33 DD 35 */ 0x4719, 0x471A, 0x471B, 0x471C, 0x471D, /* GB+82 33 DE 30 */ 0x471E, 0x471F, 0x4720, 0x4721, 0x4722, /* GB+82 33 DE 35 */ 0x4724, 0x4725, 0x4726, 0x4727, 0x4728, /* GB+82 33 DF 30 */ 0x472A, 0x472B, 0x472C, 0x472D, 0x472E, /* GB+82 33 DF 35 */ 0x472F, 0x4730, 0x4731, 0x4732, 0x4733, /* GB+82 33 E0 30 */ 0x4734, 0x4735, 0x4736, 0x4737, 0x4738, /* GB+82 33 E0 35 */ 0x4739, 0x473A, 0x473B, 0x473C, 0x473D, /* GB+82 33 E1 30 */ 0x473E, 0x473F, 0x4740, 0x4741, 0x4742, /* GB+82 33 E1 35 */ 0x4743, 0x4744, 0x4745, 0x4746, 0x4747, /* GB+82 33 E2 30 */ 0x4748, 0x4749, 0x474A, 0x474B, 0x474C, /* GB+82 33 E2 35 */ 0x474D, 0x474E, 0x474F, 0x4750, 0x4751, /* GB+82 33 E3 30 */ 0x4752, 0x4753, 0x4754, 0x4755, 0x4756, /* GB+82 33 E3 35 */ 0x4757, 0x4758, 0x4759, 0x475A, 0x475B, /* GB+82 33 E4 30 */ 0x475C, 0x475D, 0x475E, 0x475F, 0x4760, /* GB+82 33 E4 35 */ 0x4761, 0x4762, 0x4763, 0x4764, 0x4765, /* GB+82 33 E5 30 */ 0x4766, 0x4767, 0x4768, 0x4769, 0x476A, /* GB+82 33 E5 35 */ 0x476B, 0x476C, 0x476D, 0x476E, 0x476F, /* GB+82 33 E6 30 */ 0x4770, 0x4771, 0x4772, 0x4773, 0x4774, /* GB+82 33 E6 35 */ 0x4775, 0x4776, 0x4777, 0x4778, 0x4779, /* GB+82 33 E7 30 */ 0x477A, 0x477B, 0x477D, 0x477E, 0x477F, /* GB+82 33 E7 35 */ 0x4780, 0x4781, 0x4782, 0x4783, 0x4784, /* GB+82 33 E8 30 */ 0x4785, 0x4786, 0x4787, 0x4788, 0x4789, /* GB+82 33 E8 35 */ 0x478A, 0x478B, 0x478C, /* Contiguous area: GB+82 34 96 39 .. GB+82 34 A1 30 */ /* GB+82 34 96 39 */ 0x4948, /* GB+82 34 97 30 */ 0x4949, 0x494A, 0x494B, 0x494C, 0x494D, /* GB+82 34 97 35 */ 0x494E, 0x494F, 0x4950, 0x4951, 0x4952, /* GB+82 34 98 30 */ 0x4953, 0x4954, 0x4955, 0x4956, 0x4957, /* GB+82 34 98 35 */ 0x4958, 0x4959, 0x495A, 0x495B, 0x495C, /* GB+82 34 99 30 */ 0x495D, 0x495E, 0x495F, 0x4960, 0x4961, /* GB+82 34 99 35 */ 0x4962, 0x4963, 0x4964, 0x4965, 0x4966, /* GB+82 34 9A 30 */ 0x4967, 0x4968, 0x4969, 0x496A, 0x496B, /* GB+82 34 9A 35 */ 0x496C, 0x496D, 0x496E, 0x496F, 0x4970, /* GB+82 34 9B 30 */ 0x4971, 0x4972, 0x4973, 0x4974, 0x4975, /* GB+82 34 9B 35 */ 0x4976, 0x4977, 0x4978, 0x4979, 0x497B, /* GB+82 34 9C 30 */ 0x497C, 0x497E, 0x497F, 0x4980, 0x4981, /* GB+82 34 9C 35 */ 0x4984, 0x4987, 0x4988, 0x4989, 0x498A, /* GB+82 34 9D 30 */ 0x498B, 0x498C, 0x498D, 0x498E, 0x498F, /* GB+82 34 9D 35 */ 0x4990, 0x4991, 0x4992, 0x4993, 0x4994, /* GB+82 34 9E 30 */ 0x4995, 0x4996, 0x4997, 0x4998, 0x4999, /* GB+82 34 9E 35 */ 0x499A, 0x499C, 0x499D, 0x499E, 0x49A0, /* GB+82 34 9F 30 */ 0x49A1, 0x49A2, 0x49A3, 0x49A4, 0x49A5, /* GB+82 34 9F 35 */ 0x49A6, 0x49A7, 0x49A8, 0x49A9, 0x49AA, /* GB+82 34 A0 30 */ 0x49AB, 0x49AC, 0x49AD, 0x49AE, 0x49AF, /* GB+82 34 A0 35 */ 0x49B0, 0x49B1, 0x49B2, 0x49B3, 0x49B4, /* GB+82 34 A1 30 */ 0x49B5, /* Contiguous area: GB+82 34 E7 34 .. GB+82 35 8F 32 */ /* GB+82 34 E7 34 */ 0x4C78, /* GB+82 34 E7 35 */ 0x4C79, 0x4C7A, 0x4C7B, 0x4C7C, 0x4C7D, /* GB+82 34 E8 30 */ 0x4C7E, 0x4C7F, 0x4C80, 0x4C81, 0x4C82, /* GB+82 34 E8 35 */ 0x4C83, 0x4C84, 0x4C85, 0x4C86, 0x4C87, /* GB+82 34 E9 30 */ 0x4C88, 0x4C89, 0x4C8A, 0x4C8B, 0x4C8C, /* GB+82 34 E9 35 */ 0x4C8D, 0x4C8E, 0x4C8F, 0x4C90, 0x4C91, /* GB+82 34 EA 30 */ 0x4C92, 0x4C93, 0x4C94, 0x4C95, 0x4C96, /* GB+82 34 EA 35 */ 0x4C97, 0x4C98, 0x4C99, 0x4C9A, 0x4C9B, /* GB+82 34 EB 30 */ 0x4C9C, 0x4C9D, 0x4C9E, 0x4CA4, 0x4CA5, /* GB+82 34 EB 35 */ 0x4CA6, 0x4CA7, 0x4CA8, 0x4CA9, 0x4CAA, /* GB+82 34 EC 30 */ 0x4CAB, 0x4CAC, 0x4CAD, 0x4CAE, 0x4CAF, /* GB+82 34 EC 35 */ 0x4CB0, 0x4CB1, 0x4CB2, 0x4CB3, 0x4CB4, /* GB+82 34 ED 30 */ 0x4CB5, 0x4CB6, 0x4CB7, 0x4CB8, 0x4CB9, /* GB+82 34 ED 35 */ 0x4CBA, 0x4CBB, 0x4CBC, 0x4CBD, 0x4CBE, /* GB+82 34 EE 30 */ 0x4CBF, 0x4CC0, 0x4CC1, 0x4CC2, 0x4CC3, /* GB+82 34 EE 35 */ 0x4CC4, 0x4CC5, 0x4CC6, 0x4CC7, 0x4CC8, /* GB+82 34 EF 30 */ 0x4CC9, 0x4CCA, 0x4CCB, 0x4CCC, 0x4CCD, /* GB+82 34 EF 35 */ 0x4CCE, 0x4CCF, 0x4CD0, 0x4CD1, 0x4CD2, /* GB+82 34 F0 30 */ 0x4CD3, 0x4CD4, 0x4CD5, 0x4CD6, 0x4CD7, /* GB+82 34 F0 35 */ 0x4CD8, 0x4CD9, 0x4CDA, 0x4CDB, 0x4CDC, /* GB+82 34 F1 30 */ 0x4CDD, 0x4CDE, 0x4CDF, 0x4CE0, 0x4CE1, /* GB+82 34 F1 35 */ 0x4CE2, 0x4CE3, 0x4CE4, 0x4CE5, 0x4CE6, /* GB+82 34 F2 30 */ 0x4CE7, 0x4CE8, 0x4CE9, 0x4CEA, 0x4CEB, /* GB+82 34 F2 35 */ 0x4CEC, 0x4CED, 0x4CEE, 0x4CEF, 0x4CF0, /* GB+82 34 F3 30 */ 0x4CF1, 0x4CF2, 0x4CF3, 0x4CF4, 0x4CF5, /* GB+82 34 F3 35 */ 0x4CF6, 0x4CF7, 0x4CF8, 0x4CF9, 0x4CFA, /* GB+82 34 F4 30 */ 0x4CFB, 0x4CFC, 0x4CFD, 0x4CFE, 0x4CFF, /* GB+82 34 F4 35 */ 0x4D00, 0x4D01, 0x4D02, 0x4D03, 0x4D04, /* GB+82 34 F5 30 */ 0x4D05, 0x4D06, 0x4D07, 0x4D08, 0x4D09, /* GB+82 34 F5 35 */ 0x4D0A, 0x4D0B, 0x4D0C, 0x4D0D, 0x4D0E, /* GB+82 34 F6 30 */ 0x4D0F, 0x4D10, 0x4D11, 0x4D12, 0x4D1A, /* GB+82 34 F6 35 */ 0x4D1B, 0x4D1C, 0x4D1D, 0x4D1E, 0x4D1F, /* GB+82 34 F7 30 */ 0x4D20, 0x4D21, 0x4D22, 0x4D23, 0x4D24, /* GB+82 34 F7 35 */ 0x4D25, 0x4D26, 0x4D27, 0x4D28, 0x4D29, /* GB+82 34 F8 30 */ 0x4D2A, 0x4D2B, 0x4D2C, 0x4D2D, 0x4D2E, /* GB+82 34 F8 35 */ 0x4D2F, 0x4D30, 0x4D31, 0x4D32, 0x4D33, /* GB+82 34 F9 30 */ 0x4D34, 0x4D35, 0x4D36, 0x4D37, 0x4D38, /* GB+82 34 F9 35 */ 0x4D39, 0x4D3A, 0x4D3B, 0x4D3C, 0x4D3D, /* GB+82 34 FA 30 */ 0x4D3E, 0x4D3F, 0x4D40, 0x4D41, 0x4D42, /* GB+82 34 FA 35 */ 0x4D43, 0x4D44, 0x4D45, 0x4D46, 0x4D47, /* GB+82 34 FB 30 */ 0x4D48, 0x4D49, 0x4D4A, 0x4D4B, 0x4D4C, /* GB+82 34 FB 35 */ 0x4D4D, 0x4D4E, 0x4D4F, 0x4D50, 0x4D51, /* GB+82 34 FC 30 */ 0x4D52, 0x4D53, 0x4D54, 0x4D55, 0x4D56, /* GB+82 34 FC 35 */ 0x4D57, 0x4D58, 0x4D59, 0x4D5A, 0x4D5B, /* GB+82 34 FD 30 */ 0x4D5C, 0x4D5D, 0x4D5E, 0x4D5F, 0x4D60, /* GB+82 34 FD 35 */ 0x4D61, 0x4D62, 0x4D63, 0x4D64, 0x4D65, /* GB+82 34 FE 30 */ 0x4D66, 0x4D67, 0x4D68, 0x4D69, 0x4D6A, /* GB+82 34 FE 35 */ 0x4D6B, 0x4D6C, 0x4D6D, 0x4D6E, 0x4D6F, /* GB+82 35 81 30 */ 0x4D70, 0x4D71, 0x4D72, 0x4D73, 0x4D74, /* GB+82 35 81 35 */ 0x4D75, 0x4D76, 0x4D77, 0x4D78, 0x4D79, /* GB+82 35 82 30 */ 0x4D7A, 0x4D7B, 0x4D7C, 0x4D7D, 0x4D7E, /* GB+82 35 82 35 */ 0x4D7F, 0x4D80, 0x4D81, 0x4D82, 0x4D83, /* GB+82 35 83 30 */ 0x4D84, 0x4D85, 0x4D86, 0x4D87, 0x4D88, /* GB+82 35 83 35 */ 0x4D89, 0x4D8A, 0x4D8B, 0x4D8C, 0x4D8D, /* GB+82 35 84 30 */ 0x4D8E, 0x4D8F, 0x4D90, 0x4D91, 0x4D92, /* GB+82 35 84 35 */ 0x4D93, 0x4D94, 0x4D95, 0x4D96, 0x4D97, /* GB+82 35 85 30 */ 0x4D98, 0x4D99, 0x4D9A, 0x4D9B, 0x4D9C, /* GB+82 35 85 35 */ 0x4D9D, 0x4D9E, 0x4D9F, 0x4DA0, 0x4DA1, /* GB+82 35 86 30 */ 0x4DA2, 0x4DA3, 0x4DA4, 0x4DA5, 0x4DA6, /* GB+82 35 86 35 */ 0x4DA7, 0x4DA8, 0x4DA9, 0x4DAA, 0x4DAB, /* GB+82 35 87 30 */ 0x4DAC, 0x4DAD, 0x4DAF, 0x4DB0, 0x4DB1, /* GB+82 35 87 35 */ 0x4DB2, 0x4DB3, 0x4DB4, 0x4DB5, 0x4DB6, /* GB+82 35 88 30 */ 0x4DB7, 0x4DB8, 0x4DB9, 0x4DBA, 0x4DBB, /* GB+82 35 88 35 */ 0x4DBC, 0x4DBD, 0x4DBE, 0x4DBF, 0x4DC0, /* GB+82 35 89 30 */ 0x4DC1, 0x4DC2, 0x4DC3, 0x4DC4, 0x4DC5, /* GB+82 35 89 35 */ 0x4DC6, 0x4DC7, 0x4DC8, 0x4DC9, 0x4DCA, /* GB+82 35 8A 30 */ 0x4DCB, 0x4DCC, 0x4DCD, 0x4DCE, 0x4DCF, /* GB+82 35 8A 35 */ 0x4DD0, 0x4DD1, 0x4DD2, 0x4DD3, 0x4DD4, /* GB+82 35 8B 30 */ 0x4DD5, 0x4DD6, 0x4DD7, 0x4DD8, 0x4DD9, /* GB+82 35 8B 35 */ 0x4DDA, 0x4DDB, 0x4DDC, 0x4DDD, 0x4DDE, /* GB+82 35 8C 30 */ 0x4DDF, 0x4DE0, 0x4DE1, 0x4DE2, 0x4DE3, /* GB+82 35 8C 35 */ 0x4DE4, 0x4DE5, 0x4DE6, 0x4DE7, 0x4DE8, /* GB+82 35 8D 30 */ 0x4DE9, 0x4DEA, 0x4DEB, 0x4DEC, 0x4DED, /* GB+82 35 8D 35 */ 0x4DEE, 0x4DEF, 0x4DF0, 0x4DF1, 0x4DF2, /* GB+82 35 8E 30 */ 0x4DF3, 0x4DF4, 0x4DF5, 0x4DF6, 0x4DF7, /* GB+82 35 8E 35 */ 0x4DF8, 0x4DF9, 0x4DFA, 0x4DFB, 0x4DFC, /* GB+82 35 8F 30 */ 0x4DFD, 0x4DFE, 0x4DFF, /* Contiguous area: GB+83 36 C7 39 .. GB+83 36 CF 39 */ /* GB+83 36 C7 39 */ 0xE76C, /* GB+83 36 C8 30 */ 0xE7C8, 0xE7E7, 0xE7E8, 0xE7E9, 0xE7EA, /* GB+83 36 C8 35 */ 0xE7EB, 0xE7EC, 0xE7ED, 0xE7EE, 0xE7EF, /* GB+83 36 C9 30 */ 0xE7F0, 0xE7F1, 0xE7F2, 0xE7F3, 0xE815, /* GB+83 36 C9 35 */ 0xE819, 0xE81A, 0xE81B, 0xE81C, 0xE81D, /* GB+83 36 CA 30 */ 0xE81F, 0xE820, 0xE821, 0xE822, 0xE823, /* GB+83 36 CA 35 */ 0xE824, 0xE825, 0xE827, 0xE828, 0xE829, /* GB+83 36 CB 30 */ 0xE82A, 0xE82D, 0xE82E, 0xE82F, 0xE830, /* GB+83 36 CB 35 */ 0xE833, 0xE834, 0xE835, 0xE836, 0xE837, /* GB+83 36 CC 30 */ 0xE838, 0xE839, 0xE83A, 0xE83C, 0xE83D, /* GB+83 36 CC 35 */ 0xE83E, 0xE83F, 0xE840, 0xE841, 0xE842, /* GB+83 36 CD 30 */ 0xE844, 0xE845, 0xE846, 0xE847, 0xE848, /* GB+83 36 CD 35 */ 0xE849, 0xE84A, 0xE84B, 0xE84C, 0xE84D, /* GB+83 36 CE 30 */ 0xE84E, 0xE84F, 0xE850, 0xE851, 0xE852, /* GB+83 36 CE 35 */ 0xE853, 0xE856, 0xE857, 0xE858, 0xE859, /* GB+83 36 CF 30 */ 0xE85A, 0xE85B, 0xE85C, 0xE85D, 0xE85E, /* GB+83 36 CF 35 */ 0xE85F, 0xE860, 0xE861, 0xE862, 0xE863, /* Contiguous area: GB+84 30 85 35 .. GB+84 30 9C 37 */ /* GB+84 30 85 35 */ 0xF92D, 0xF92E, 0xF92F, 0xF930, 0xF931, /* GB+84 30 86 30 */ 0xF932, 0xF933, 0xF934, 0xF935, 0xF936, /* GB+84 30 86 35 */ 0xF937, 0xF938, 0xF939, 0xF93A, 0xF93B, /* GB+84 30 87 30 */ 0xF93C, 0xF93D, 0xF93E, 0xF93F, 0xF940, /* GB+84 30 87 35 */ 0xF941, 0xF942, 0xF943, 0xF944, 0xF945, /* GB+84 30 88 30 */ 0xF946, 0xF947, 0xF948, 0xF949, 0xF94A, /* GB+84 30 88 35 */ 0xF94B, 0xF94C, 0xF94D, 0xF94E, 0xF94F, /* GB+84 30 89 30 */ 0xF950, 0xF951, 0xF952, 0xF953, 0xF954, /* GB+84 30 89 35 */ 0xF955, 0xF956, 0xF957, 0xF958, 0xF959, /* GB+84 30 8A 30 */ 0xF95A, 0xF95B, 0xF95C, 0xF95D, 0xF95E, /* GB+84 30 8A 35 */ 0xF95F, 0xF960, 0xF961, 0xF962, 0xF963, /* GB+84 30 8B 30 */ 0xF964, 0xF965, 0xF966, 0xF967, 0xF968, /* GB+84 30 8B 35 */ 0xF969, 0xF96A, 0xF96B, 0xF96C, 0xF96D, /* GB+84 30 8C 30 */ 0xF96E, 0xF96F, 0xF970, 0xF971, 0xF972, /* GB+84 30 8C 35 */ 0xF973, 0xF974, 0xF975, 0xF976, 0xF977, /* GB+84 30 8D 30 */ 0xF978, 0xF97A, 0xF97B, 0xF97C, 0xF97D, /* GB+84 30 8D 35 */ 0xF97E, 0xF97F, 0xF980, 0xF981, 0xF982, /* GB+84 30 8E 30 */ 0xF983, 0xF984, 0xF985, 0xF986, 0xF987, /* GB+84 30 8E 35 */ 0xF988, 0xF989, 0xF98A, 0xF98B, 0xF98C, /* GB+84 30 8F 30 */ 0xF98D, 0xF98E, 0xF98F, 0xF990, 0xF991, /* GB+84 30 8F 35 */ 0xF992, 0xF993, 0xF994, 0xF996, 0xF997, /* GB+84 30 90 30 */ 0xF998, 0xF999, 0xF99A, 0xF99B, 0xF99C, /* GB+84 30 90 35 */ 0xF99D, 0xF99E, 0xF99F, 0xF9A0, 0xF9A1, /* GB+84 30 91 30 */ 0xF9A2, 0xF9A3, 0xF9A4, 0xF9A5, 0xF9A6, /* GB+84 30 91 35 */ 0xF9A7, 0xF9A8, 0xF9A9, 0xF9AA, 0xF9AB, /* GB+84 30 92 30 */ 0xF9AC, 0xF9AD, 0xF9AE, 0xF9AF, 0xF9B0, /* GB+84 30 92 35 */ 0xF9B1, 0xF9B2, 0xF9B3, 0xF9B4, 0xF9B5, /* GB+84 30 93 30 */ 0xF9B6, 0xF9B7, 0xF9B8, 0xF9B9, 0xF9BA, /* GB+84 30 93 35 */ 0xF9BB, 0xF9BC, 0xF9BD, 0xF9BE, 0xF9BF, /* GB+84 30 94 30 */ 0xF9C0, 0xF9C1, 0xF9C2, 0xF9C3, 0xF9C4, /* GB+84 30 94 35 */ 0xF9C5, 0xF9C6, 0xF9C7, 0xF9C8, 0xF9C9, /* GB+84 30 95 30 */ 0xF9CA, 0xF9CB, 0xF9CC, 0xF9CD, 0xF9CE, /* GB+84 30 95 35 */ 0xF9CF, 0xF9D0, 0xF9D1, 0xF9D2, 0xF9D3, /* GB+84 30 96 30 */ 0xF9D4, 0xF9D5, 0xF9D6, 0xF9D7, 0xF9D8, /* GB+84 30 96 35 */ 0xF9D9, 0xF9DA, 0xF9DB, 0xF9DC, 0xF9DD, /* GB+84 30 97 30 */ 0xF9DE, 0xF9DF, 0xF9E0, 0xF9E1, 0xF9E2, /* GB+84 30 97 35 */ 0xF9E3, 0xF9E4, 0xF9E5, 0xF9E6, 0xF9E8, /* GB+84 30 98 30 */ 0xF9E9, 0xF9EA, 0xF9EB, 0xF9EC, 0xF9ED, /* GB+84 30 98 35 */ 0xF9EE, 0xF9EF, 0xF9F0, 0xF9F2, 0xF9F3, /* GB+84 30 99 30 */ 0xF9F4, 0xF9F5, 0xF9F6, 0xF9F7, 0xF9F8, /* GB+84 30 99 35 */ 0xF9F9, 0xF9FA, 0xF9FB, 0xF9FC, 0xF9FD, /* GB+84 30 9A 30 */ 0xF9FE, 0xF9FF, 0xFA00, 0xFA01, 0xFA02, /* GB+84 30 9A 35 */ 0xFA03, 0xFA04, 0xFA05, 0xFA06, 0xFA07, /* GB+84 30 9B 30 */ 0xFA08, 0xFA09, 0xFA0A, 0xFA0B, 0xFA10, /* GB+84 30 9B 35 */ 0xFA12, 0xFA15, 0xFA16, 0xFA17, 0xFA19, /* GB+84 30 9C 30 */ 0xFA1A, 0xFA1B, 0xFA1C, 0xFA1D, 0xFA1E, /* GB+84 30 9C 35 */ 0xFA22, 0xFA25, 0xFA26, /* Contiguous area: GB+84 31 85 38 .. GB+84 31 A2 33 */ /* GB+84 31 85 38 */ 0xFE32, 0xFE45, /* GB+84 31 86 30 */ 0xFE46, 0xFE47, 0xFE48, 0xFE53, 0xFE58, /* GB+84 31 86 35 */ 0xFE67, 0xFE6C, 0xFE6D, 0xFE6E, 0xFE6F, /* GB+84 31 87 30 */ 0xFE70, 0xFE71, 0xFE72, 0xFE73, 0xFE74, /* GB+84 31 87 35 */ 0xFE75, 0xFE76, 0xFE77, 0xFE78, 0xFE79, /* GB+84 31 88 30 */ 0xFE7A, 0xFE7B, 0xFE7C, 0xFE7D, 0xFE7E, /* GB+84 31 88 35 */ 0xFE7F, 0xFE80, 0xFE81, 0xFE82, 0xFE83, /* GB+84 31 89 30 */ 0xFE84, 0xFE85, 0xFE86, 0xFE87, 0xFE88, /* GB+84 31 89 35 */ 0xFE89, 0xFE8A, 0xFE8B, 0xFE8C, 0xFE8D, /* GB+84 31 8A 30 */ 0xFE8E, 0xFE8F, 0xFE90, 0xFE91, 0xFE92, /* GB+84 31 8A 35 */ 0xFE93, 0xFE94, 0xFE95, 0xFE96, 0xFE97, /* GB+84 31 8B 30 */ 0xFE98, 0xFE99, 0xFE9A, 0xFE9B, 0xFE9C, /* GB+84 31 8B 35 */ 0xFE9D, 0xFE9E, 0xFE9F, 0xFEA0, 0xFEA1, /* GB+84 31 8C 30 */ 0xFEA2, 0xFEA3, 0xFEA4, 0xFEA5, 0xFEA6, /* GB+84 31 8C 35 */ 0xFEA7, 0xFEA8, 0xFEA9, 0xFEAA, 0xFEAB, /* GB+84 31 8D 30 */ 0xFEAC, 0xFEAD, 0xFEAE, 0xFEAF, 0xFEB0, /* GB+84 31 8D 35 */ 0xFEB1, 0xFEB2, 0xFEB3, 0xFEB4, 0xFEB5, /* GB+84 31 8E 30 */ 0xFEB6, 0xFEB7, 0xFEB8, 0xFEB9, 0xFEBA, /* GB+84 31 8E 35 */ 0xFEBB, 0xFEBC, 0xFEBD, 0xFEBE, 0xFEBF, /* GB+84 31 8F 30 */ 0xFEC0, 0xFEC1, 0xFEC2, 0xFEC3, 0xFEC4, /* GB+84 31 8F 35 */ 0xFEC5, 0xFEC6, 0xFEC7, 0xFEC8, 0xFEC9, /* GB+84 31 90 30 */ 0xFECA, 0xFECB, 0xFECC, 0xFECD, 0xFECE, /* GB+84 31 90 35 */ 0xFECF, 0xFED0, 0xFED1, 0xFED2, 0xFED3, /* GB+84 31 91 30 */ 0xFED4, 0xFED5, 0xFED6, 0xFED7, 0xFED8, /* GB+84 31 91 35 */ 0xFED9, 0xFEDA, 0xFEDB, 0xFEDC, 0xFEDD, /* GB+84 31 92 30 */ 0xFEDE, 0xFEDF, 0xFEE0, 0xFEE1, 0xFEE2, /* GB+84 31 92 35 */ 0xFEE3, 0xFEE4, 0xFEE5, 0xFEE6, 0xFEE7, /* GB+84 31 93 30 */ 0xFEE8, 0xFEE9, 0xFEEA, 0xFEEB, 0xFEEC, /* GB+84 31 93 35 */ 0xFEED, 0xFEEE, 0xFEEF, 0xFEF0, 0xFEF1, /* GB+84 31 94 30 */ 0xFEF2, 0xFEF3, 0xFEF4, 0xFEF5, 0xFEF6, /* GB+84 31 94 35 */ 0xFEF7, 0xFEF8, 0xFEF9, 0xFEFA, 0xFEFB, /* GB+84 31 95 30 */ 0xFEFC, 0xFEFD, 0xFEFE, 0xFEFF, 0xFF00, /* GB+84 31 95 35 */ 0xFF5F, 0xFF60, 0xFF61, 0xFF62, 0xFF63, /* GB+84 31 96 30 */ 0xFF64, 0xFF65, 0xFF66, 0xFF67, 0xFF68, /* GB+84 31 96 35 */ 0xFF69, 0xFF6A, 0xFF6B, 0xFF6C, 0xFF6D, /* GB+84 31 97 30 */ 0xFF6E, 0xFF6F, 0xFF70, 0xFF71, 0xFF72, /* GB+84 31 97 35 */ 0xFF73, 0xFF74, 0xFF75, 0xFF76, 0xFF77, /* GB+84 31 98 30 */ 0xFF78, 0xFF79, 0xFF7A, 0xFF7B, 0xFF7C, /* GB+84 31 98 35 */ 0xFF7D, 0xFF7E, 0xFF7F, 0xFF80, 0xFF81, /* GB+84 31 99 30 */ 0xFF82, 0xFF83, 0xFF84, 0xFF85, 0xFF86, /* GB+84 31 99 35 */ 0xFF87, 0xFF88, 0xFF89, 0xFF8A, 0xFF8B, /* GB+84 31 9A 30 */ 0xFF8C, 0xFF8D, 0xFF8E, 0xFF8F, 0xFF90, /* GB+84 31 9A 35 */ 0xFF91, 0xFF92, 0xFF93, 0xFF94, 0xFF95, /* GB+84 31 9B 30 */ 0xFF96, 0xFF97, 0xFF98, 0xFF99, 0xFF9A, /* GB+84 31 9B 35 */ 0xFF9B, 0xFF9C, 0xFF9D, 0xFF9E, 0xFF9F, /* GB+84 31 9C 30 */ 0xFFA0, 0xFFA1, 0xFFA2, 0xFFA3, 0xFFA4, /* GB+84 31 9C 35 */ 0xFFA5, 0xFFA6, 0xFFA7, 0xFFA8, 0xFFA9, /* GB+84 31 9D 30 */ 0xFFAA, 0xFFAB, 0xFFAC, 0xFFAD, 0xFFAE, /* GB+84 31 9D 35 */ 0xFFAF, 0xFFB0, 0xFFB1, 0xFFB2, 0xFFB3, /* GB+84 31 9E 30 */ 0xFFB4, 0xFFB5, 0xFFB6, 0xFFB7, 0xFFB8, /* GB+84 31 9E 35 */ 0xFFB9, 0xFFBA, 0xFFBB, 0xFFBC, 0xFFBD, /* GB+84 31 9F 30 */ 0xFFBE, 0xFFBF, 0xFFC0, 0xFFC1, 0xFFC2, /* GB+84 31 9F 35 */ 0xFFC3, 0xFFC4, 0xFFC5, 0xFFC6, 0xFFC7, /* GB+84 31 A0 30 */ 0xFFC8, 0xFFC9, 0xFFCA, 0xFFCB, 0xFFCC, /* GB+84 31 A0 35 */ 0xFFCD, 0xFFCE, 0xFFCF, 0xFFD0, 0xFFD1, /* GB+84 31 A1 30 */ 0xFFD2, 0xFFD3, 0xFFD4, 0xFFD5, 0xFFD6, /* GB+84 31 A1 35 */ 0xFFD7, 0xFFD8, 0xFFD9, 0xFFDA, 0xFFDB, /* GB+84 31 A2 30 */ 0xFFDC, 0xFFDD, 0xFFDE, 0xFFDF, }; static const uint16_t REPLACEMENT = 0xfffd; static inline bool Is1stByte(unsigned c) { return c >= 0x81 && c <= 0xFE; } static inline bool Is2ndByteIn2Bytes(unsigned c) { return c >= 0x40 && c <= 0xFE && c != 0x7F; } static inline bool Is2ndByteIn4Bytes(unsigned c) { return c >= 0x30 && c <= 0x39; } static inline bool Is3rdByte(unsigned c) { return c >= 0x81 && c <= 0xFE; } static inline bool Is4thByte(unsigned c) { return c >= 0x30 && c <= 0x39; } static inline bool IsUDA1(unsigned a, unsigned b) { return a >= 0xAA && a <= 0xAF && b >= 0xA1 && b <= 0xFE; } static inline bool IsUDA2(unsigned a, unsigned b) { return a >= 0xF8 && a <= 0xFE && b >= 0xA1 && b <= 0xFE; } static inline bool IsUDA3(unsigned a, unsigned b) { return a >= 0xA1 && a <= 0xA7 && b >= 0x40 && b <= 0xA0 && b != 0x7F; } static inline uint16_t ValidChar(unsigned u) { return u != 0 ? static_cast(u) : REPLACEMENT; } static unsigned qt_Gb18030ToUnicode(const uint8_t *gbstr, int& len) { /* Returns Unicode. */ unsigned uni; uint8_t first = *gbstr; if (first < 128) { len = 1; uni = first; } else if (Is1stByte(first) && len >= 2) { uint8_t second = gbstr[1]; if (Is2ndByteIn2Bytes(second)) { len = 2; if (IsUDA1(first, second)) uni = 0xE000 + (first - 0xAA) * 94 + (second - 0xA1); else if (IsUDA2(first, second)) uni = 0xE234 + (first - 0xF8) * 94 + (second - 0xA1); else if (IsUDA3(first, second)) uni = 0xE4C6 + (first - 0xA1) * 96 + (second - 0x40) - ((second >= 0x80) ? 1 : 0); else { // Use the mapping table unsigned i; i = (first - 0x81) * 190 + (second - 0x40) - ((second >= 0x80) ? 1 : 0); if (first >= 0xA1 && first <= 0xA7) i -= (first - 0xA0) * 96; if (first > 0xA7) i -= 672; if (first >= 0xAA && first <= 0xAF) i -= (first - 0xAA) * 94; if (first > 0xAF) i -= 564; if (first >= 0xF8) i -= (first - 0xF8) * 94; uni = (unsigned)gb18030_2byte_to_ucs[i]; } } else if (Is2ndByteIn4Bytes(second) && len >= 4) { uint8_t third = gbstr[2], fourth = gbstr[3]; if (Is3rdByte(third) && Is4thByte(fourth)) { // Valid 4-byte GB18030, whether defined or not unsigned gb4lin; indexTbl_t g2u; gb4lin = (first - 0x81) * 12600 + (second - 0x30) * 1260 + (third - 0x81) * 10 + (fourth - 0x30); len = 4; if (gb4lin <= 0x99FB) { /* GB+81308130 - GB+8431A439 */ g2u = gb18030_to_ucs_index[gb4lin >> 8]; if ((gb4lin & 0xFF) >= g2u.tblBegin && (gb4lin & 0xFF) <= g2u.tblEnd) { uni = (unsigned)gb18030_4byte_to_ucs[gb4lin - g2u.tblOffset]; } else { uni = g2u.algOffset + (gb4lin & 0xFF); } } else if (gb4lin >= 0x2E248 && gb4lin <= 0x12E247) { /* GB+90308130 - GB+E3329A35 */ uni = gb4lin - 0xE248; } else { /* undefined or reserved area */ len = 1; uni = REPLACEMENT; } } else { len = 1; uni = REPLACEMENT; } } else { len = 1; uni = REPLACEMENT; } } else { len = 1; uni = REPLACEMENT; } return uni; } void GBTextDecoder::AppendGB18030(std::vector& result, const uint8_t* bytes, size_t length) { uint8_t buf[4]; int nbuf = 0; int invalid = 0; result.resize(length); int unicodeLen = 0; for (size_t i = 0; i < length; i++) { uint8_t ch = bytes[i]; switch (nbuf) { case 0: if (ch < 128) { // ASCII result[unicodeLen++] = ch; } else if (Is1stByte(ch)) { // GB18030? buf[0] = ch; nbuf = 1; } else { // Invalid result[unicodeLen++] = REPLACEMENT; ++invalid; } break; case 1: // GB18030 2 bytes if (Is2ndByteIn2Bytes(ch)) { buf[1] = ch; int clen = 2; unsigned u = qt_Gb18030ToUnicode(buf, clen); if (clen == 2) { result[unicodeLen++] = ValidChar(u); } else { result[unicodeLen++] = REPLACEMENT; ++invalid; } nbuf = 0; } else if (Is2ndByteIn4Bytes(ch)) { buf[1] = ch; nbuf = 2; } else { // Error result[unicodeLen++] = REPLACEMENT; ++invalid; nbuf = 0; } break; case 2: // GB18030 3 bytes if (Is3rdByte(ch)) { buf[2] = ch; nbuf = 3; } else { result[unicodeLen++] = REPLACEMENT; ++invalid; nbuf = 0; } break; case 3: // GB18030 4 bytes if (Is4thByte(ch)) { buf[3] = ch; int clen = 4; unsigned u = qt_Gb18030ToUnicode(buf, clen); if (clen == 4) { result[unicodeLen++] = ValidChar(u); } else { result[unicodeLen++] = REPLACEMENT; ++invalid; } } else { result[unicodeLen++] = REPLACEMENT; ++invalid; } nbuf = 0; break; } } result.resize(unicodeLen); } void GBTextDecoder::AppendGB2312(std::vector& result, const uint8_t* bytes, size_t length) { uint8_t buf[2]; int nbuf = 0; int invalid = 0; result.resize(length); int unicodeLen = 0; for (size_t i = 0; i= 0xA1 && ch <= 0xFE) { // GB2312 1st byte? buf[0] = ch; nbuf = 1; } else { // Invalid result[unicodeLen++] = REPLACEMENT; ++invalid; } break; case 1: // GB2312 2nd byte if (ch >= 0xA1 && ch <= 0xFE) { buf[1] = ch; int clen = 2; unsigned u = qt_Gb18030ToUnicode(buf, clen); if (clen == 2) { result[unicodeLen++] = ValidChar(u); } else { result[unicodeLen++] = REPLACEMENT; ++invalid; } nbuf = 0; } else { // Error result[unicodeLen++] = REPLACEMENT; ++invalid; nbuf = 0; } break; } } result.resize(unicodeLen); } zxing-cpp-1.0.8+ds2/core/src/textcodec/GBTextDecoder.h000066400000000000000000000035211361167020700224240ustar00rootroot00000000000000#pragma once /**************************************************************************** ** ** Copyright (C) 2015 The Qt Company Ltd. ** Contact: http://www.qt.io/licensing/ ** ** This file is part of the QtCore module of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:LGPL21$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and The Qt Company. For licensing terms ** and conditions see http://www.qt.io/terms-conditions. For further ** information use the contact form at http://www.qt.io/contact-us. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 or version 3 as published by the Free ** Software Foundation and appearing in the file LICENSE.LGPLv21 and ** LICENSE.LGPLv3 included in the packaging of this file. Please review the ** following information to ensure the GNU Lesser General Public License ** requirements will be met: https://www.gnu.org/licenses/lgpl.html and ** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** As a special exception, The Qt Company gives you certain additional ** rights. These rights are described in The Qt Company LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** $QT_END_LICENSE$ ** ****************************************************************************/ #include #include #include class GBTextDecoder { public: static void AppendGB18030(std::vector& utf16, const uint8_t* bytes, size_t length); static void AppendGB2312(std::vector& utf16, const uint8_t* bytes, size_t length); }; zxing-cpp-1.0.8+ds2/core/src/textcodec/GBTextEncoder.cpp000066400000000000000000017272501361167020700230060ustar00rootroot00000000000000/**************************************************************************** ** ** Copyright (C) 2015 The Qt Company Ltd. ** Contact: http://www.qt.io/licensing/ ** ** This file is part of the QtCore module of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:LGPL21$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and The Qt Company. For licensing terms ** and conditions see http://www.qt.io/terms-conditions. For further ** information use the contact form at http://www.qt.io/contact-us. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 or version 3 as published by the Free ** Software Foundation and appearing in the file LICENSE.LGPLv21 and ** LICENSE.LGPLv3 included in the packaging of this file. Please review the ** following information to ensure the GNU Lesser General Public License ** requirements will be met: https://www.gnu.org/licenses/lgpl.html and ** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** As a special exception, The Qt Company gives you certain additional ** rights. These rights are described in The Qt Company LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** $QT_END_LICENSE$ ** ****************************************************************************/ #include "GBTextEncoder.h" #include "TextUtfEncoding.h" struct indexTbl_t { uint8_t tblBegin; uint8_t tblEnd; uint16_t tblOffset; uint16_t algOffset; }; static const indexTbl_t ucs_to_gb18030_index[256] = { /* 0x00__ */ {0x80, 0xFF, 0x0080, 0x0000}, {0x00, 0xFF, 0x0080, 0x0000}, /* 0x02__ */ {0x00, 0xFF, 0x0080, 0x0000}, {0x00, 0xFF, 0x0080, 0x0000}, /* 0x04__ */ {0x00, 0x51, 0x0080, 0x02E2}, {0xFF, 0x00, 0x1C3E, 0x03E2}, /* 0x06__ */ {0xFF, 0x00, 0x1C3E, 0x04E2}, {0xFF, 0x00, 0x1C3E, 0x05E2}, /* 0x08__ */ {0xFF, 0x00, 0x1C3E, 0x06E2}, {0xFF, 0x00, 0x1C3E, 0x07E2}, /* 0x0A__ */ {0xFF, 0x00, 0x1C3E, 0x08E2}, {0xFF, 0x00, 0x1C3E, 0x09E2}, /* 0x0C__ */ {0xFF, 0x00, 0x1C3E, 0x0AE2}, {0xFF, 0x00, 0x1C3E, 0x0BE2}, /* 0x0E__ */ {0xFF, 0x00, 0x1C3E, 0x0CE2}, {0xFF, 0x00, 0x1C3E, 0x0DE2}, /* 0x10__ */ {0xFF, 0x00, 0x1C3E, 0x0EE2}, {0xFF, 0x00, 0x1C3E, 0x0FE2}, /* 0x12__ */ {0xFF, 0x00, 0x1C3E, 0x10E2}, {0xFF, 0x00, 0x1C3E, 0x11E2}, /* 0x14__ */ {0xFF, 0x00, 0x1C3E, 0x12E2}, {0xFF, 0x00, 0x1C3E, 0x13E2}, /* 0x16__ */ {0xFF, 0x00, 0x1C3E, 0x14E2}, {0xFF, 0x00, 0x1C3E, 0x15E2}, /* 0x18__ */ {0xFF, 0x00, 0x1C3E, 0x16E2}, {0xFF, 0x00, 0x1C3E, 0x17E2}, /* 0x1A__ */ {0xFF, 0x00, 0x1C3E, 0x18E2}, {0xFF, 0x00, 0x1C3E, 0x19E2}, /* 0x1C__ */ {0xFF, 0x00, 0x1C3E, 0x1AE2}, {0xFF, 0x00, 0x1C3E, 0x1BE2}, /* 0x1E__ */ {0xFF, 0x00, 0x1C3E, 0x1CE2}, {0xFF, 0x00, 0x1C3E, 0x1DE2}, /* 0x20__ */ {0x10, 0xFF, 0x1C3E, 0x1EE2}, {0x00, 0xFF, 0x1C3E, 0x0000}, /* 0x22__ */ {0x00, 0xFF, 0x1C3E, 0x0000}, {0x00, 0xFF, 0x1C3E, 0x0000}, /* 0x24__ */ {0x00, 0xFF, 0x1C3E, 0x0000}, {0x00, 0xFF, 0x1C3E, 0x0000}, /* 0x26__ */ {0x00, 0x42, 0x1C3E, 0x23C0}, {0xFF, 0x00, 0x247C, 0x24C0}, /* 0x28__ */ {0xFF, 0x00, 0x247C, 0x25C0}, {0xFF, 0x00, 0x247C, 0x26C0}, /* 0x2A__ */ {0xFF, 0x00, 0x247C, 0x27C0}, {0xFF, 0x00, 0x247C, 0x28C0}, /* 0x2C__ */ {0xFF, 0x00, 0x247C, 0x29C0}, {0xFF, 0x00, 0x247C, 0x2AC0}, /* 0x2E__ */ {0x81, 0xFF, 0x247C, 0x2BC0}, {0x00, 0xFF, 0x247C, 0x0000}, /* 0x30__ */ {0x00, 0xFF, 0x247C, 0x0000}, {0x00, 0xFF, 0x247C, 0x0000}, /* 0x32__ */ {0x00, 0xFF, 0x247C, 0x0000}, {0x00, 0xFF, 0x247C, 0x0000}, /* 0x34__ */ {0x00, 0xFF, 0x247C, 0x0000}, {0x00, 0xFF, 0x247C, 0x0000}, /* 0x36__ */ {0x00, 0x1A, 0x247C, 0x3292}, {0xFF, 0x00, 0x2779, 0x3392}, /* 0x38__ */ {0xFF, 0x00, 0x2779, 0x3492}, {0x18, 0xFF, 0x2779, 0x3592}, /* 0x3A__ */ {0x00, 0xFF, 0x2779, 0x0000}, {0x00, 0xFF, 0x2779, 0x0000}, /* 0x3C__ */ {0x00, 0xE0, 0x2779, 0x3889}, {0xFF, 0x00, 0x2AEE, 0x3989}, /* 0x3E__ */ {0xFF, 0x00, 0x2AEE, 0x3A89}, {0xFF, 0x00, 0x2AEE, 0x3B89}, /* 0x40__ */ {0x56, 0xFF, 0x2AEE, 0x3C89}, {0x00, 0x5F, 0x2AEE, 0x3D87}, /* 0x42__ */ {0xFF, 0x00, 0x2CC5, 0x3E87}, {0x37, 0xFF, 0x2CC5, 0x3F87}, /* 0x44__ */ {0x00, 0xD6, 0x2CC5, 0x4082}, {0xFF, 0x00, 0x2E3A, 0x4182}, /* 0x46__ */ {0x4C, 0xFF, 0x2E3A, 0x4282}, {0x00, 0x8D, 0x2E3A, 0x437C}, /* 0x48__ */ {0xFF, 0x00, 0x2FF3, 0x447C}, {0x47, 0xB7, 0x2FF3, 0x457C}, /* 0x4A__ */ {0xFF, 0x00, 0x32B2, 0x4671}, {0xFF, 0x00, 0x32B2, 0x4771}, /* 0x4C__ */ {0x77, 0xFF, 0x32B2, 0x4871}, {0x00, 0xFF, 0x32B2, 0x0000}, /* 0x4E__ */ {0x00, 0xFF, 0x32B2, 0x0000}, {0x00, 0xFF, 0x32B2, 0x0000}, /* 0x50__ */ {0x00, 0xFF, 0x32B2, 0x0000}, {0x00, 0xFF, 0x32B2, 0x0000}, /* 0x52__ */ {0x00, 0xFF, 0x32B2, 0x0000}, {0x00, 0xFF, 0x32B2, 0x0000}, /* 0x54__ */ {0x00, 0xFF, 0x32B2, 0x0000}, {0x00, 0xFF, 0x32B2, 0x0000}, /* 0x56__ */ {0x00, 0xFF, 0x32B2, 0x0000}, {0x00, 0xFF, 0x32B2, 0x0000}, /* 0x58__ */ {0x00, 0xFF, 0x32B2, 0x0000}, {0x00, 0xFF, 0x32B2, 0x0000}, /* 0x5A__ */ {0x00, 0xFF, 0x32B2, 0x0000}, {0x00, 0xFF, 0x32B2, 0x0000}, /* 0x5C__ */ {0x00, 0xFF, 0x32B2, 0x0000}, {0x00, 0xFF, 0x32B2, 0x0000}, /* 0x5E__ */ {0x00, 0xFF, 0x32B2, 0x0000}, {0x00, 0xFF, 0x32B2, 0x0000}, /* 0x60__ */ {0x00, 0xFF, 0x32B2, 0x0000}, {0x00, 0xFF, 0x32B2, 0x0000}, /* 0x62__ */ {0x00, 0xFF, 0x32B2, 0x0000}, {0x00, 0xFF, 0x32B2, 0x0000}, /* 0x64__ */ {0x00, 0xFF, 0x32B2, 0x0000}, {0x00, 0xFF, 0x32B2, 0x0000}, /* 0x66__ */ {0x00, 0xFF, 0x32B2, 0x0000}, {0x00, 0xFF, 0x32B2, 0x0000}, /* 0x68__ */ {0x00, 0xFF, 0x32B2, 0x0000}, {0x00, 0xFF, 0x32B2, 0x0000}, /* 0x6A__ */ {0x00, 0xFF, 0x32B2, 0x0000}, {0x00, 0xFF, 0x32B2, 0x0000}, /* 0x6C__ */ {0x00, 0xFF, 0x32B2, 0x0000}, {0x00, 0xFF, 0x32B2, 0x0000}, /* 0x6E__ */ {0x00, 0xFF, 0x32B2, 0x0000}, {0x00, 0xFF, 0x32B2, 0x0000}, /* 0x70__ */ {0x00, 0xFF, 0x32B2, 0x0000}, {0x00, 0xFF, 0x32B2, 0x0000}, /* 0x72__ */ {0x00, 0xFF, 0x32B2, 0x0000}, {0x00, 0xFF, 0x32B2, 0x0000}, /* 0x74__ */ {0x00, 0xFF, 0x32B2, 0x0000}, {0x00, 0xFF, 0x32B2, 0x0000}, /* 0x76__ */ {0x00, 0xFF, 0x32B2, 0x0000}, {0x00, 0xFF, 0x32B2, 0x0000}, /* 0x78__ */ {0x00, 0xFF, 0x32B2, 0x0000}, {0x00, 0xFF, 0x32B2, 0x0000}, /* 0x7A__ */ {0x00, 0xFF, 0x32B2, 0x0000}, {0x00, 0xFF, 0x32B2, 0x0000}, /* 0x7C__ */ {0x00, 0xFF, 0x32B2, 0x0000}, {0x00, 0xFF, 0x32B2, 0x0000}, /* 0x7E__ */ {0x00, 0xFF, 0x32B2, 0x0000}, {0x00, 0xFF, 0x32B2, 0x0000}, /* 0x80__ */ {0x00, 0xFF, 0x32B2, 0x0000}, {0x00, 0xFF, 0x32B2, 0x0000}, /* 0x82__ */ {0x00, 0xFF, 0x32B2, 0x0000}, {0x00, 0xFF, 0x32B2, 0x0000}, /* 0x84__ */ {0x00, 0xFF, 0x32B2, 0x0000}, {0x00, 0xFF, 0x32B2, 0x0000}, /* 0x86__ */ {0x00, 0xFF, 0x32B2, 0x0000}, {0x00, 0xFF, 0x32B2, 0x0000}, /* 0x88__ */ {0x00, 0xFF, 0x32B2, 0x0000}, {0x00, 0xFF, 0x32B2, 0x0000}, /* 0x8A__ */ {0x00, 0xFF, 0x32B2, 0x0000}, {0x00, 0xFF, 0x32B2, 0x0000}, /* 0x8C__ */ {0x00, 0xFF, 0x32B2, 0x0000}, {0x00, 0xFF, 0x32B2, 0x0000}, /* 0x8E__ */ {0x00, 0xFF, 0x32B2, 0x0000}, {0x00, 0xFF, 0x32B2, 0x0000}, /* 0x90__ */ {0x00, 0xFF, 0x32B2, 0x0000}, {0x00, 0xFF, 0x32B2, 0x0000}, /* 0x92__ */ {0x00, 0xFF, 0x32B2, 0x0000}, {0x00, 0xFF, 0x32B2, 0x0000}, /* 0x94__ */ {0x00, 0xFF, 0x32B2, 0x0000}, {0x00, 0xFF, 0x32B2, 0x0000}, /* 0x96__ */ {0x00, 0xFF, 0x32B2, 0x0000}, {0x00, 0xFF, 0x32B2, 0x0000}, /* 0x98__ */ {0x00, 0xFF, 0x32B2, 0x0000}, {0x00, 0xFF, 0x32B2, 0x0000}, /* 0x9A__ */ {0x00, 0xFF, 0x32B2, 0x0000}, {0x00, 0xFF, 0x32B2, 0x0000}, /* 0x9C__ */ {0x00, 0xFF, 0x32B2, 0x0000}, {0x00, 0xFF, 0x32B2, 0x0000}, /* 0x9E__ */ {0x00, 0xFF, 0x32B2, 0x0000}, {0x00, 0xA5, 0x32B2, 0x49BD}, /* 0xA0__ */ {0xFF, 0x00, 0x6B0C, 0x4ABD}, {0xFF, 0x00, 0x6B0C, 0x4BBD}, /* 0xA2__ */ {0xFF, 0x00, 0x6B0C, 0x4CBD}, {0xFF, 0x00, 0x6B0C, 0x4DBD}, /* 0xA4__ */ {0xFF, 0x00, 0x6B0C, 0x4EBD}, {0xFF, 0x00, 0x6B0C, 0x4FBD}, /* 0xA6__ */ {0xFF, 0x00, 0x6B0C, 0x50BD}, {0xFF, 0x00, 0x6B0C, 0x51BD}, /* 0xA8__ */ {0xFF, 0x00, 0x6B0C, 0x52BD}, {0xFF, 0x00, 0x6B0C, 0x53BD}, /* 0xAA__ */ {0xFF, 0x00, 0x6B0C, 0x54BD}, {0xFF, 0x00, 0x6B0C, 0x55BD}, /* 0xAC__ */ {0xFF, 0x00, 0x6B0C, 0x56BD}, {0xFF, 0x00, 0x6B0C, 0x57BD}, /* 0xAE__ */ {0xFF, 0x00, 0x6B0C, 0x58BD}, {0xFF, 0x00, 0x6B0C, 0x59BD}, /* 0xB0__ */ {0xFF, 0x00, 0x6B0C, 0x5ABD}, {0xFF, 0x00, 0x6B0C, 0x5BBD}, /* 0xB2__ */ {0xFF, 0x00, 0x6B0C, 0x5CBD}, {0xFF, 0x00, 0x6B0C, 0x5DBD}, /* 0xB4__ */ {0xFF, 0x00, 0x6B0C, 0x5EBD}, {0xFF, 0x00, 0x6B0C, 0x5FBD}, /* 0xB6__ */ {0xFF, 0x00, 0x6B0C, 0x60BD}, {0xFF, 0x00, 0x6B0C, 0x61BD}, /* 0xB8__ */ {0xFF, 0x00, 0x6B0C, 0x62BD}, {0xFF, 0x00, 0x6B0C, 0x63BD}, /* 0xBA__ */ {0xFF, 0x00, 0x6B0C, 0x64BD}, {0xFF, 0x00, 0x6B0C, 0x65BD}, /* 0xBC__ */ {0xFF, 0x00, 0x6B0C, 0x66BD}, {0xFF, 0x00, 0x6B0C, 0x67BD}, /* 0xBE__ */ {0xFF, 0x00, 0x6B0C, 0x68BD}, {0xFF, 0x00, 0x6B0C, 0x69BD}, /* 0xC0__ */ {0xFF, 0x00, 0x6B0C, 0x6ABD}, {0xFF, 0x00, 0x6B0C, 0x6BBD}, /* 0xC2__ */ {0xFF, 0x00, 0x6B0C, 0x6CBD}, {0xFF, 0x00, 0x6B0C, 0x6DBD}, /* 0xC4__ */ {0xFF, 0x00, 0x6B0C, 0x6EBD}, {0xFF, 0x00, 0x6B0C, 0x6FBD}, /* 0xC6__ */ {0xFF, 0x00, 0x6B0C, 0x70BD}, {0xFF, 0x00, 0x6B0C, 0x71BD}, /* 0xC8__ */ {0xFF, 0x00, 0x6B0C, 0x72BD}, {0xFF, 0x00, 0x6B0C, 0x73BD}, /* 0xCA__ */ {0xFF, 0x00, 0x6B0C, 0x74BD}, {0xFF, 0x00, 0x6B0C, 0x75BD}, /* 0xCC__ */ {0xFF, 0x00, 0x6B0C, 0x76BD}, {0xFF, 0x00, 0x6B0C, 0x77BD}, /* 0xCE__ */ {0xFF, 0x00, 0x6B0C, 0x78BD}, {0xFF, 0x00, 0x6B0C, 0x79BD}, /* 0xD0__ */ {0xFF, 0x00, 0x6B0C, 0x7ABD}, {0xFF, 0x00, 0x6B0C, 0x7BBD}, /* 0xD2__ */ {0xFF, 0x00, 0x6B0C, 0x7CBD}, {0xFF, 0x00, 0x6B0C, 0x7DBD}, /* 0xD4__ */ {0xFF, 0x00, 0x6B0C, 0x7EBD}, {0xFF, 0x00, 0x6B0C, 0x7FBD}, /* 0xD6__ */ {0xFF, 0x00, 0x6B0C, 0x80BD}, {0xFF, 0x00, 0x6B0C, 0x81BD}, /* 0xD8__ */ {0xFF, 0x00, 0x6B0C, 0x0000}, {0xFF, 0x00, 0x6B0C, 0x0000}, /* 0xDA__ */ {0xFF, 0x00, 0x6B0C, 0x0000}, {0xFF, 0x00, 0x6B0C, 0x0000}, /* 0xDC__ */ {0xFF, 0x00, 0x6B0C, 0x0000}, {0xFF, 0x00, 0x6B0C, 0x0000}, /* 0xDE__ */ {0xFF, 0x00, 0x6B0C, 0x0000}, {0xFF, 0x00, 0x6B0C, 0x0000}, /* 0xE0__ */ {0xFF, 0x00, 0x7A72, 0x0000}, {0xFF, 0x00, 0x7A72, 0x0000}, /* 0xE2__ */ {0xFF, 0x00, 0x7A72, 0x0000}, {0xFF, 0x00, 0x7A72, 0x0000}, /* 0xE4__ */ {0xFF, 0x00, 0x7A72, 0x0000}, {0xFF, 0x00, 0x7A72, 0x0000}, /* 0xE6__ */ {0xFF, 0x00, 0x7A72, 0x0000}, {0x66, 0xFF, 0x7A72, 0x0000}, /* 0xE8__ */ {0x00, 0x64, 0x7A72, 0x82A9}, {0xFF, 0x00, 0x8B39, 0x83A9}, /* 0xEA__ */ {0xFF, 0x00, 0x8B39, 0x84A9}, {0xFF, 0x00, 0x8B39, 0x85A9}, /* 0xEC__ */ {0xFF, 0x00, 0x8B39, 0x86A9}, {0xFF, 0x00, 0x8B39, 0x87A9}, /* 0xEE__ */ {0xFF, 0x00, 0x8B39, 0x88A9}, {0xFF, 0x00, 0x8B39, 0x89A9}, /* 0xF0__ */ {0xFF, 0x00, 0x8B39, 0x8AA9}, {0xFF, 0x00, 0x8B39, 0x8BA9}, /* 0xF2__ */ {0xFF, 0x00, 0x8B39, 0x8CA9}, {0xFF, 0x00, 0x8B39, 0x8DA9}, /* 0xF4__ */ {0xFF, 0x00, 0x8B39, 0x8EA9}, {0xFF, 0x00, 0x8B39, 0x8FA9}, /* 0xF6__ */ {0xFF, 0x00, 0x8B39, 0x90A9}, {0xFF, 0x00, 0x8B39, 0x91A9}, /* 0xF8__ */ {0xFF, 0x00, 0x8B39, 0x92A9}, {0x2C, 0xFF, 0x8B39, 0x93A9}, /* 0xFA__ */ {0x00, 0x29, 0x8B39, 0x9494}, {0xFF, 0x00, 0x8F3F, 0x9594}, /* 0xFC__ */ {0xFF, 0x00, 0x8F3F, 0x9694}, {0xFF, 0x00, 0x8F3F, 0x9794}, /* 0xFE__ */ {0x30, 0xFF, 0x8F3F, 0x9894}, {0x00, 0xE5, 0x8F3F, 0x98FC}, }; static const uint16_t ucs_to_gb18030[28839] = { /* Contiguous area: U+0080 .. U+0451 */ /* U+0080 */ 0x0000, 0x0001, 0x0002, 0x0003, 0x0004, 0x0005, 0x0006, 0x0007, /* U+0088 */ 0x0008, 0x0009, 0x0010, 0x0011, 0x0012, 0x0013, 0x0014, 0x0015, /* U+0090 */ 0x0016, 0x0017, 0x0018, 0x0019, 0x0020, 0x0021, 0x0022, 0x0023, /* U+0098 */ 0x0024, 0x0025, 0x0026, 0x0027, 0x0028, 0x0029, 0x0030, 0x0031, /* U+00A0 */ 0x0032, 0x0033, 0x0034, 0x0035, 0xA1E8, 0x0036, 0x0037, 0xA1EC, /* U+00A8 */ 0xA1A7, 0x0038, 0x0039, 0x0040, 0x0041, 0x0042, 0x0043, 0x0044, /* U+00B0 */ 0xA1E3, 0xA1C0, 0x0045, 0x0046, 0x0047, 0x0048, 0x0049, 0xA1A4, /* U+00B8 */ 0x0050, 0x0051, 0x0052, 0x0053, 0x0054, 0x0055, 0x0056, 0x0057, /* U+00C0 */ 0x0058, 0x0059, 0x0060, 0x0061, 0x0062, 0x0063, 0x0064, 0x0065, /* U+00C8 */ 0x0066, 0x0067, 0x0068, 0x0069, 0x0070, 0x0071, 0x0072, 0x0073, /* U+00D0 */ 0x0074, 0x0075, 0x0076, 0x0077, 0x0078, 0x0079, 0x0080, 0xA1C1, /* U+00D8 */ 0x0081, 0x0082, 0x0083, 0x0084, 0x0085, 0x0086, 0x0087, 0x0088, /* U+00E0 */ 0xA8A4, 0xA8A2, 0x0089, 0x0090, 0x0091, 0x0092, 0x0093, 0x0094, /* U+00E8 */ 0xA8A8, 0xA8A6, 0xA8BA, 0x0095, 0xA8AC, 0xA8AA, 0x0096, 0x0097, /* U+00F0 */ 0x0098, 0x0099, 0xA8B0, 0xA8AE, 0x00A0, 0x00A1, 0x00A2, 0xA1C2, /* U+00F8 */ 0x00A3, 0xA8B4, 0xA8B2, 0x00A4, 0xA8B9, 0x00A5, 0x00A6, 0x00A7, /* U+0100 */ 0x00A8, 0xA8A1, 0x00A9, 0x00B0, 0x00B1, 0x00B2, 0x00B3, 0x00B4, /* U+0108 */ 0x00B5, 0x00B6, 0x00B7, 0x00B8, 0x00B9, 0x00C0, 0x00C1, 0x00C2, /* U+0110 */ 0x00C3, 0x00C4, 0x00C5, 0xA8A5, 0x00C6, 0x00C7, 0x00C8, 0x00C9, /* U+0118 */ 0x00D0, 0x00D1, 0x00D2, 0xA8A7, 0x00D3, 0x00D4, 0x00D5, 0x00D6, /* U+0120 */ 0x00D7, 0x00D8, 0x00D9, 0x00E0, 0x00E1, 0x00E2, 0x00E3, 0x00E4, /* U+0128 */ 0x00E5, 0x00E6, 0x00E7, 0xA8A9, 0x00E8, 0x00E9, 0x00F0, 0x00F1, /* U+0130 */ 0x00F2, 0x00F3, 0x00F4, 0x00F5, 0x00F6, 0x00F7, 0x00F8, 0x00F9, /* U+0138 */ 0x0100, 0x0101, 0x0102, 0x0103, 0x0104, 0x0105, 0x0106, 0x0107, /* U+0140 */ 0x0108, 0x0109, 0x0110, 0x0111, 0xA8BD, 0x0112, 0x0113, 0x0114, /* U+0148 */ 0xA8BE, 0x0115, 0x0116, 0x0117, 0x0118, 0xA8AD, 0x0119, 0x0120, /* U+0150 */ 0x0121, 0x0122, 0x0123, 0x0124, 0x0125, 0x0126, 0x0127, 0x0128, /* U+0158 */ 0x0129, 0x0130, 0x0131, 0x0132, 0x0133, 0x0134, 0x0135, 0x0136, /* U+0160 */ 0x0137, 0x0138, 0x0139, 0x0140, 0x0141, 0x0142, 0x0143, 0x0144, /* U+0168 */ 0x0145, 0x0146, 0x0147, 0xA8B1, 0x0148, 0x0149, 0x0150, 0x0151, /* U+0170 */ 0x0152, 0x0153, 0x0154, 0x0155, 0x0156, 0x0157, 0x0158, 0x0159, /* U+0178 */ 0x0160, 0x0161, 0x0162, 0x0163, 0x0164, 0x0165, 0x0166, 0x0167, /* U+0180 */ 0x0168, 0x0169, 0x0170, 0x0171, 0x0172, 0x0173, 0x0174, 0x0175, /* U+0188 */ 0x0176, 0x0177, 0x0178, 0x0179, 0x0180, 0x0181, 0x0182, 0x0183, /* U+0190 */ 0x0184, 0x0185, 0x0186, 0x0187, 0x0188, 0x0189, 0x0190, 0x0191, /* U+0198 */ 0x0192, 0x0193, 0x0194, 0x0195, 0x0196, 0x0197, 0x0198, 0x0199, /* U+01A0 */ 0x01A0, 0x01A1, 0x01A2, 0x01A3, 0x01A4, 0x01A5, 0x01A6, 0x01A7, /* U+01A8 */ 0x01A8, 0x01A9, 0x01B0, 0x01B1, 0x01B2, 0x01B3, 0x01B4, 0x01B5, /* U+01B0 */ 0x01B6, 0x01B7, 0x01B8, 0x01B9, 0x01C0, 0x01C1, 0x01C2, 0x01C3, /* U+01B8 */ 0x01C4, 0x01C5, 0x01C6, 0x01C7, 0x01C8, 0x01C9, 0x01D0, 0x01D1, /* U+01C0 */ 0x01D2, 0x01D3, 0x01D4, 0x01D5, 0x01D6, 0x01D7, 0x01D8, 0x01D9, /* U+01C8 */ 0x01E0, 0x01E1, 0x01E2, 0x01E3, 0x01E4, 0x01E5, 0xA8A3, 0x01E6, /* U+01D0 */ 0xA8AB, 0x01E7, 0xA8AF, 0x01E8, 0xA8B3, 0x01E9, 0xA8B5, 0x01F0, /* U+01D8 */ 0xA8B6, 0x01F1, 0xA8B7, 0x01F2, 0xA8B8, 0x01F3, 0x01F4, 0x01F5, /* U+01E0 */ 0x01F6, 0x01F7, 0x01F8, 0x01F9, 0x0200, 0x0201, 0x0202, 0x0203, /* U+01E8 */ 0x0204, 0x0205, 0x0206, 0x0207, 0x0208, 0x0209, 0x0210, 0x0211, /* U+01F0 */ 0x0212, 0x0213, 0x0214, 0x0215, 0x0216, 0x0217, 0x0218, 0x0219, /* U+01F8 */ 0x0220, 0xA8BF, 0x0221, 0x0222, 0x0223, 0x0224, 0x0225, 0x0226, /* U+0200 */ 0x0227, 0x0228, 0x0229, 0x0230, 0x0231, 0x0232, 0x0233, 0x0234, /* U+0208 */ 0x0235, 0x0236, 0x0237, 0x0238, 0x0239, 0x0240, 0x0241, 0x0242, /* U+0210 */ 0x0243, 0x0244, 0x0245, 0x0246, 0x0247, 0x0248, 0x0249, 0x0250, /* U+0218 */ 0x0251, 0x0252, 0x0253, 0x0254, 0x0255, 0x0256, 0x0257, 0x0258, /* U+0220 */ 0x0259, 0x0260, 0x0261, 0x0262, 0x0263, 0x0264, 0x0265, 0x0266, /* U+0228 */ 0x0267, 0x0268, 0x0269, 0x0270, 0x0271, 0x0272, 0x0273, 0x0274, /* U+0230 */ 0x0275, 0x0276, 0x0277, 0x0278, 0x0279, 0x0280, 0x0281, 0x0282, /* U+0238 */ 0x0283, 0x0284, 0x0285, 0x0286, 0x0287, 0x0288, 0x0289, 0x0290, /* U+0240 */ 0x0291, 0x0292, 0x0293, 0x0294, 0x0295, 0x0296, 0x0297, 0x0298, /* U+0248 */ 0x0299, 0x02A0, 0x02A1, 0x02A2, 0x02A3, 0x02A4, 0x02A5, 0x02A6, /* U+0250 */ 0x02A7, 0xA8BB, 0x02A8, 0x02A9, 0x02B0, 0x02B1, 0x02B2, 0x02B3, /* U+0258 */ 0x02B4, 0x02B5, 0x02B6, 0x02B7, 0x02B8, 0x02B9, 0x02C0, 0x02C1, /* U+0260 */ 0x02C2, 0xA8C0, 0x02C3, 0x02C4, 0x02C5, 0x02C6, 0x02C7, 0x02C8, /* U+0268 */ 0x02C9, 0x02D0, 0x02D1, 0x02D2, 0x02D3, 0x02D4, 0x02D5, 0x02D6, /* U+0270 */ 0x02D7, 0x02D8, 0x02D9, 0x02E0, 0x02E1, 0x02E2, 0x02E3, 0x02E4, /* U+0278 */ 0x02E5, 0x02E6, 0x02E7, 0x02E8, 0x02E9, 0x02F0, 0x02F1, 0x02F2, /* U+0280 */ 0x02F3, 0x02F4, 0x02F5, 0x02F6, 0x02F7, 0x02F8, 0x02F9, 0x0300, /* U+0288 */ 0x0301, 0x0302, 0x0303, 0x0304, 0x0305, 0x0306, 0x0307, 0x0308, /* U+0290 */ 0x0309, 0x0310, 0x0311, 0x0312, 0x0313, 0x0314, 0x0315, 0x0316, /* U+0298 */ 0x0317, 0x0318, 0x0319, 0x0320, 0x0321, 0x0322, 0x0323, 0x0324, /* U+02A0 */ 0x0325, 0x0326, 0x0327, 0x0328, 0x0329, 0x0330, 0x0331, 0x0332, /* U+02A8 */ 0x0333, 0x0334, 0x0335, 0x0336, 0x0337, 0x0338, 0x0339, 0x0340, /* U+02B0 */ 0x0341, 0x0342, 0x0343, 0x0344, 0x0345, 0x0346, 0x0347, 0x0348, /* U+02B8 */ 0x0349, 0x0350, 0x0351, 0x0352, 0x0353, 0x0354, 0x0355, 0x0356, /* U+02C0 */ 0x0357, 0x0358, 0x0359, 0x0360, 0x0361, 0x0362, 0x0363, 0xA1A6, /* U+02C8 */ 0x0364, 0xA1A5, 0xA840, 0xA841, 0x0365, 0x0366, 0x0367, 0x0368, /* U+02D0 */ 0x0369, 0x0370, 0x0371, 0x0372, 0x0373, 0x0374, 0x0375, 0x0376, /* U+02D8 */ 0x0377, 0xA842, 0x0378, 0x0379, 0x0380, 0x0381, 0x0382, 0x0383, /* U+02E0 */ 0x0384, 0x0385, 0x0386, 0x0387, 0x0388, 0x0389, 0x0390, 0x0391, /* U+02E8 */ 0x0392, 0x0393, 0x0394, 0x0395, 0x0396, 0x0397, 0x0398, 0x0399, /* U+02F0 */ 0x03A0, 0x03A1, 0x03A2, 0x03A3, 0x03A4, 0x03A5, 0x03A6, 0x03A7, /* U+02F8 */ 0x03A8, 0x03A9, 0x03B0, 0x03B1, 0x03B2, 0x03B3, 0x03B4, 0x03B5, /* U+0300 */ 0x03B6, 0x03B7, 0x03B8, 0x03B9, 0x03C0, 0x03C1, 0x03C2, 0x03C3, /* U+0308 */ 0x03C4, 0x03C5, 0x03C6, 0x03C7, 0x03C8, 0x03C9, 0x03D0, 0x03D1, /* U+0310 */ 0x03D2, 0x03D3, 0x03D4, 0x03D5, 0x03D6, 0x03D7, 0x03D8, 0x03D9, /* U+0318 */ 0x03E0, 0x03E1, 0x03E2, 0x03E3, 0x03E4, 0x03E5, 0x03E6, 0x03E7, /* U+0320 */ 0x03E8, 0x03E9, 0x03F0, 0x03F1, 0x03F2, 0x03F3, 0x03F4, 0x03F5, /* U+0328 */ 0x03F6, 0x03F7, 0x03F8, 0x03F9, 0x0400, 0x0401, 0x0402, 0x0403, /* U+0330 */ 0x0404, 0x0405, 0x0406, 0x0407, 0x0408, 0x0409, 0x0410, 0x0411, /* U+0338 */ 0x0412, 0x0413, 0x0414, 0x0415, 0x0416, 0x0417, 0x0418, 0x0419, /* U+0340 */ 0x0420, 0x0421, 0x0422, 0x0423, 0x0424, 0x0425, 0x0426, 0x0427, /* U+0348 */ 0x0428, 0x0429, 0x0430, 0x0431, 0x0432, 0x0433, 0x0434, 0x0435, /* U+0350 */ 0x0436, 0x0437, 0x0438, 0x0439, 0x0440, 0x0441, 0x0442, 0x0443, /* U+0358 */ 0x0444, 0x0445, 0x0446, 0x0447, 0x0448, 0x0449, 0x0450, 0x0451, /* U+0360 */ 0x0452, 0x0453, 0x0454, 0x0455, 0x0456, 0x0457, 0x0458, 0x0459, /* U+0368 */ 0x0460, 0x0461, 0x0462, 0x0463, 0x0464, 0x0465, 0x0466, 0x0467, /* U+0370 */ 0x0468, 0x0469, 0x0470, 0x0471, 0x0472, 0x0473, 0x0474, 0x0475, /* U+0378 */ 0x0476, 0x0477, 0x0478, 0x0479, 0x0480, 0x0481, 0x0482, 0x0483, /* U+0380 */ 0x0484, 0x0485, 0x0486, 0x0487, 0x0488, 0x0489, 0x0490, 0x0491, /* U+0388 */ 0x0492, 0x0493, 0x0494, 0x0495, 0x0496, 0x0497, 0x0498, 0x0499, /* U+0390 */ 0x04A0, 0xA6A1, 0xA6A2, 0xA6A3, 0xA6A4, 0xA6A5, 0xA6A6, 0xA6A7, /* U+0398 */ 0xA6A8, 0xA6A9, 0xA6AA, 0xA6AB, 0xA6AC, 0xA6AD, 0xA6AE, 0xA6AF, /* U+03A0 */ 0xA6B0, 0xA6B1, 0x04A1, 0xA6B2, 0xA6B3, 0xA6B4, 0xA6B5, 0xA6B6, /* U+03A8 */ 0xA6B7, 0xA6B8, 0x04A2, 0x04A3, 0x04A4, 0x04A5, 0x04A6, 0x04A7, /* U+03B0 */ 0x04A8, 0xA6C1, 0xA6C2, 0xA6C3, 0xA6C4, 0xA6C5, 0xA6C6, 0xA6C7, /* U+03B8 */ 0xA6C8, 0xA6C9, 0xA6CA, 0xA6CB, 0xA6CC, 0xA6CD, 0xA6CE, 0xA6CF, /* U+03C0 */ 0xA6D0, 0xA6D1, 0x04A9, 0xA6D2, 0xA6D3, 0xA6D4, 0xA6D5, 0xA6D6, /* U+03C8 */ 0xA6D7, 0xA6D8, 0x04B0, 0x04B1, 0x04B2, 0x04B3, 0x04B4, 0x04B5, /* U+03D0 */ 0x04B6, 0x04B7, 0x04B8, 0x04B9, 0x04C0, 0x04C1, 0x04C2, 0x04C3, /* U+03D8 */ 0x04C4, 0x04C5, 0x04C6, 0x04C7, 0x04C8, 0x04C9, 0x04D0, 0x04D1, /* U+03E0 */ 0x04D2, 0x04D3, 0x04D4, 0x04D5, 0x04D6, 0x04D7, 0x04D8, 0x04D9, /* U+03E8 */ 0x04E0, 0x04E1, 0x04E2, 0x04E3, 0x04E4, 0x04E5, 0x04E6, 0x04E7, /* U+03F0 */ 0x04E8, 0x04E9, 0x04F0, 0x04F1, 0x04F2, 0x04F3, 0x04F4, 0x04F5, /* U+03F8 */ 0x04F6, 0x04F7, 0x04F8, 0x04F9, 0x0500, 0x0501, 0x0502, 0x0503, /* U+0400 */ 0x0504, 0xA7A7, 0x0505, 0x0506, 0x0507, 0x0508, 0x0509, 0x0510, /* U+0408 */ 0x0511, 0x0512, 0x0513, 0x0514, 0x0515, 0x0516, 0x0517, 0x0518, /* U+0410 */ 0xA7A1, 0xA7A2, 0xA7A3, 0xA7A4, 0xA7A5, 0xA7A6, 0xA7A8, 0xA7A9, /* U+0418 */ 0xA7AA, 0xA7AB, 0xA7AC, 0xA7AD, 0xA7AE, 0xA7AF, 0xA7B0, 0xA7B1, /* U+0420 */ 0xA7B2, 0xA7B3, 0xA7B4, 0xA7B5, 0xA7B6, 0xA7B7, 0xA7B8, 0xA7B9, /* U+0428 */ 0xA7BA, 0xA7BB, 0xA7BC, 0xA7BD, 0xA7BE, 0xA7BF, 0xA7C0, 0xA7C1, /* U+0430 */ 0xA7D1, 0xA7D2, 0xA7D3, 0xA7D4, 0xA7D5, 0xA7D6, 0xA7D8, 0xA7D9, /* U+0438 */ 0xA7DA, 0xA7DB, 0xA7DC, 0xA7DD, 0xA7DE, 0xA7DF, 0xA7E0, 0xA7E1, /* U+0440 */ 0xA7E2, 0xA7E3, 0xA7E4, 0xA7E5, 0xA7E6, 0xA7E7, 0xA7E8, 0xA7E9, /* U+0448 */ 0xA7EA, 0xA7EB, 0xA7EC, 0xA7ED, 0xA7EE, 0xA7EF, 0xA7F0, 0xA7F1, /* U+0450 */ 0x0519, 0xA7D7, /* Contiguous area: U+2010 .. U+2642 */ /* U+2010 */ 0xA95C, 0x0A42, 0x0A43, 0xA843, 0xA1AA, 0xA844, 0xA1AC, 0x0A44, /* U+2018 */ 0xA1AE, 0xA1AF, 0x0A45, 0x0A46, 0xA1B0, 0xA1B1, 0x0A47, 0x0A48, /* U+2020 */ 0x0A49, 0x0A50, 0x0A51, 0x0A52, 0x0A53, 0xA845, 0xA1AD, 0x0A54, /* U+2028 */ 0x0A55, 0x0A56, 0x0A57, 0x0A58, 0x0A59, 0x0A60, 0x0A61, 0x0A62, /* U+2030 */ 0xA1EB, 0x0A63, 0xA1E4, 0xA1E5, 0x0A64, 0xA846, 0x0A65, 0x0A66, /* U+2038 */ 0x0A67, 0x0A68, 0x0A69, 0xA1F9, 0x0A70, 0x0A71, 0x0A72, 0x0A73, /* U+2040 */ 0x0A74, 0x0A75, 0x0A76, 0x0A77, 0x0A78, 0x0A79, 0x0A80, 0x0A81, /* U+2048 */ 0x0A82, 0x0A83, 0x0A84, 0x0A85, 0x0A86, 0x0A87, 0x0A88, 0x0A89, /* U+2050 */ 0x0A90, 0x0A91, 0x0A92, 0x0A93, 0x0A94, 0x0A95, 0x0A96, 0x0A97, /* U+2058 */ 0x0A98, 0x0A99, 0x0AA0, 0x0AA1, 0x0AA2, 0x0AA3, 0x0AA4, 0x0AA5, /* U+2060 */ 0x0AA6, 0x0AA7, 0x0AA8, 0x0AA9, 0x0AB0, 0x0AB1, 0x0AB2, 0x0AB3, /* U+2068 */ 0x0AB4, 0x0AB5, 0x0AB6, 0x0AB7, 0x0AB8, 0x0AB9, 0x0AC0, 0x0AC1, /* U+2070 */ 0x0AC2, 0x0AC3, 0x0AC4, 0x0AC5, 0x0AC6, 0x0AC7, 0x0AC8, 0x0AC9, /* U+2078 */ 0x0AD0, 0x0AD1, 0x0AD2, 0x0AD3, 0x0AD4, 0x0AD5, 0x0AD6, 0x0AD7, /* U+2080 */ 0x0AD8, 0x0AD9, 0x0AE0, 0x0AE1, 0x0AE2, 0x0AE3, 0x0AE4, 0x0AE5, /* U+2088 */ 0x0AE6, 0x0AE7, 0x0AE8, 0x0AE9, 0x0AF0, 0x0AF1, 0x0AF2, 0x0AF3, /* U+2090 */ 0x0AF4, 0x0AF5, 0x0AF6, 0x0AF7, 0x0AF8, 0x0AF9, 0x0B00, 0x0B01, /* U+2098 */ 0x0B02, 0x0B03, 0x0B04, 0x0B05, 0x0B06, 0x0B07, 0x0B08, 0x0B09, /* U+20A0 */ 0x0B10, 0x0B11, 0x0B12, 0x0B13, 0x0B14, 0x0B15, 0x0B16, 0x0B17, /* U+20A8 */ 0x0B18, 0x0B19, 0x0B20, 0x0B21, 0xA2E3, 0x0B22, 0x0B23, 0x0B24, /* U+20B0 */ 0x0B25, 0x0B26, 0x0B27, 0x0B28, 0x0B29, 0x0B30, 0x0B31, 0x0B32, /* U+20B8 */ 0x0B33, 0x0B34, 0x0B35, 0x0B36, 0x0B37, 0x0B38, 0x0B39, 0x0B40, /* U+20C0 */ 0x0B41, 0x0B42, 0x0B43, 0x0B44, 0x0B45, 0x0B46, 0x0B47, 0x0B48, /* U+20C8 */ 0x0B49, 0x0B50, 0x0B51, 0x0B52, 0x0B53, 0x0B54, 0x0B55, 0x0B56, /* U+20D0 */ 0x0B57, 0x0B58, 0x0B59, 0x0B60, 0x0B61, 0x0B62, 0x0B63, 0x0B64, /* U+20D8 */ 0x0B65, 0x0B66, 0x0B67, 0x0B68, 0x0B69, 0x0B70, 0x0B71, 0x0B72, /* U+20E0 */ 0x0B73, 0x0B74, 0x0B75, 0x0B76, 0x0B77, 0x0B78, 0x0B79, 0x0B80, /* U+20E8 */ 0x0B81, 0x0B82, 0x0B83, 0x0B84, 0x0B85, 0x0B86, 0x0B87, 0x0B88, /* U+20F0 */ 0x0B89, 0x0B90, 0x0B91, 0x0B92, 0x0B93, 0x0B94, 0x0B95, 0x0B96, /* U+20F8 */ 0x0B97, 0x0B98, 0x0B99, 0x0BA0, 0x0BA1, 0x0BA2, 0x0BA3, 0x0BA4, /* U+2100 */ 0x0BA5, 0x0BA6, 0x0BA7, 0xA1E6, 0x0BA8, 0xA847, 0x0BA9, 0x0BB0, /* U+2108 */ 0x0BB1, 0xA848, 0x0BB2, 0x0BB3, 0x0BB4, 0x0BB5, 0x0BB6, 0x0BB7, /* U+2110 */ 0x0BB8, 0x0BB9, 0x0BC0, 0x0BC1, 0x0BC2, 0x0BC3, 0xA1ED, 0x0BC4, /* U+2118 */ 0x0BC5, 0x0BC6, 0x0BC7, 0x0BC8, 0x0BC9, 0x0BD0, 0x0BD1, 0x0BD2, /* U+2120 */ 0x0BD3, 0xA959, 0x0BD4, 0x0BD5, 0x0BD6, 0x0BD7, 0x0BD8, 0x0BD9, /* U+2128 */ 0x0BE0, 0x0BE1, 0x0BE2, 0x0BE3, 0x0BE4, 0x0BE5, 0x0BE6, 0x0BE7, /* U+2130 */ 0x0BE8, 0x0BE9, 0x0BF0, 0x0BF1, 0x0BF2, 0x0BF3, 0x0BF4, 0x0BF5, /* U+2138 */ 0x0BF6, 0x0BF7, 0x0BF8, 0x0BF9, 0x0C00, 0x0C01, 0x0C02, 0x0C03, /* U+2140 */ 0x0C04, 0x0C05, 0x0C06, 0x0C07, 0x0C08, 0x0C09, 0x0C10, 0x0C11, /* U+2148 */ 0x0C12, 0x0C13, 0x0C14, 0x0C15, 0x0C16, 0x0C17, 0x0C18, 0x0C19, /* U+2150 */ 0x0C20, 0x0C21, 0x0C22, 0x0C23, 0x0C24, 0x0C25, 0x0C26, 0x0C27, /* U+2158 */ 0x0C28, 0x0C29, 0x0C30, 0x0C31, 0x0C32, 0x0C33, 0x0C34, 0x0C35, /* U+2160 */ 0xA2F1, 0xA2F2, 0xA2F3, 0xA2F4, 0xA2F5, 0xA2F6, 0xA2F7, 0xA2F8, /* U+2168 */ 0xA2F9, 0xA2FA, 0xA2FB, 0xA2FC, 0x0C36, 0x0C37, 0x0C38, 0x0C39, /* U+2170 */ 0xA2A1, 0xA2A2, 0xA2A3, 0xA2A4, 0xA2A5, 0xA2A6, 0xA2A7, 0xA2A8, /* U+2178 */ 0xA2A9, 0xA2AA, 0x0C40, 0x0C41, 0x0C42, 0x0C43, 0x0C44, 0x0C45, /* U+2180 */ 0x0C46, 0x0C47, 0x0C48, 0x0C49, 0x0C50, 0x0C51, 0x0C52, 0x0C53, /* U+2188 */ 0x0C54, 0x0C55, 0x0C56, 0x0C57, 0x0C58, 0x0C59, 0x0C60, 0x0C61, /* U+2190 */ 0xA1FB, 0xA1FC, 0xA1FA, 0xA1FD, 0x0C62, 0x0C63, 0xA849, 0xA84A, /* U+2198 */ 0xA84B, 0xA84C, 0x0C64, 0x0C65, 0x0C66, 0x0C67, 0x0C68, 0x0C69, /* U+21A0 */ 0x0C70, 0x0C71, 0x0C72, 0x0C73, 0x0C74, 0x0C75, 0x0C76, 0x0C77, /* U+21A8 */ 0x0C78, 0x0C79, 0x0C80, 0x0C81, 0x0C82, 0x0C83, 0x0C84, 0x0C85, /* U+21B0 */ 0x0C86, 0x0C87, 0x0C88, 0x0C89, 0x0C90, 0x0C91, 0x0C92, 0x0C93, /* U+21B8 */ 0x0C94, 0x0C95, 0x0C96, 0x0C97, 0x0C98, 0x0C99, 0x0CA0, 0x0CA1, /* U+21C0 */ 0x0CA2, 0x0CA3, 0x0CA4, 0x0CA5, 0x0CA6, 0x0CA7, 0x0CA8, 0x0CA9, /* U+21C8 */ 0x0CB0, 0x0CB1, 0x0CB2, 0x0CB3, 0x0CB4, 0x0CB5, 0x0CB6, 0x0CB7, /* U+21D0 */ 0x0CB8, 0x0CB9, 0x0CC0, 0x0CC1, 0x0CC2, 0x0CC3, 0x0CC4, 0x0CC5, /* U+21D8 */ 0x0CC6, 0x0CC7, 0x0CC8, 0x0CC9, 0x0CD0, 0x0CD1, 0x0CD2, 0x0CD3, /* U+21E0 */ 0x0CD4, 0x0CD5, 0x0CD6, 0x0CD7, 0x0CD8, 0x0CD9, 0x0CE0, 0x0CE1, /* U+21E8 */ 0x0CE2, 0x0CE3, 0x0CE4, 0x0CE5, 0x0CE6, 0x0CE7, 0x0CE8, 0x0CE9, /* U+21F0 */ 0x0CF0, 0x0CF1, 0x0CF2, 0x0CF3, 0x0CF4, 0x0CF5, 0x0CF6, 0x0CF7, /* U+21F8 */ 0x0CF8, 0x0CF9, 0x0D00, 0x0D01, 0x0D02, 0x0D03, 0x0D04, 0x0D05, /* U+2200 */ 0x0D06, 0x0D07, 0x0D08, 0x0D09, 0x0D10, 0x0D11, 0x0D12, 0x0D13, /* U+2208 */ 0xA1CA, 0x0D14, 0x0D15, 0x0D16, 0x0D17, 0x0D18, 0x0D19, 0xA1C7, /* U+2210 */ 0x0D20, 0xA1C6, 0x0D21, 0x0D22, 0x0D23, 0xA84D, 0x0D24, 0x0D25, /* U+2218 */ 0x0D26, 0x0D27, 0xA1CC, 0x0D28, 0x0D29, 0xA1D8, 0xA1DE, 0xA84E, /* U+2220 */ 0xA1CF, 0x0D30, 0x0D31, 0xA84F, 0x0D32, 0xA1CE, 0x0D33, 0xA1C4, /* U+2228 */ 0xA1C5, 0xA1C9, 0xA1C8, 0xA1D2, 0x0D34, 0x0D35, 0xA1D3, 0x0D36, /* U+2230 */ 0x0D37, 0x0D38, 0x0D39, 0x0D40, 0xA1E0, 0xA1DF, 0xA1C3, 0xA1CB, /* U+2238 */ 0x0D41, 0x0D42, 0x0D43, 0x0D44, 0x0D45, 0xA1D7, 0x0D46, 0x0D47, /* U+2240 */ 0x0D48, 0x0D49, 0x0D50, 0x0D51, 0x0D52, 0x0D53, 0x0D54, 0x0D55, /* U+2248 */ 0xA1D6, 0x0D56, 0x0D57, 0x0D58, 0xA1D5, 0x0D59, 0x0D60, 0x0D61, /* U+2250 */ 0x0D62, 0x0D63, 0xA850, 0x0D64, 0x0D65, 0x0D66, 0x0D67, 0x0D68, /* U+2258 */ 0x0D69, 0x0D70, 0x0D71, 0x0D72, 0x0D73, 0x0D74, 0x0D75, 0x0D76, /* U+2260 */ 0xA1D9, 0xA1D4, 0x0D77, 0x0D78, 0xA1DC, 0xA1DD, 0xA851, 0xA852, /* U+2268 */ 0x0D79, 0x0D80, 0x0D81, 0x0D82, 0x0D83, 0x0D84, 0xA1DA, 0xA1DB, /* U+2270 */ 0x0D85, 0x0D86, 0x0D87, 0x0D88, 0x0D89, 0x0D90, 0x0D91, 0x0D92, /* U+2278 */ 0x0D93, 0x0D94, 0x0D95, 0x0D96, 0x0D97, 0x0D98, 0x0D99, 0x0DA0, /* U+2280 */ 0x0DA1, 0x0DA2, 0x0DA3, 0x0DA4, 0x0DA5, 0x0DA6, 0x0DA7, 0x0DA8, /* U+2288 */ 0x0DA9, 0x0DB0, 0x0DB1, 0x0DB2, 0x0DB3, 0x0DB4, 0x0DB5, 0x0DB6, /* U+2290 */ 0x0DB7, 0x0DB8, 0x0DB9, 0x0DC0, 0x0DC1, 0xA892, 0x0DC2, 0x0DC3, /* U+2298 */ 0x0DC4, 0xA1D1, 0x0DC5, 0x0DC6, 0x0DC7, 0x0DC8, 0x0DC9, 0x0DD0, /* U+22A0 */ 0x0DD1, 0x0DD2, 0x0DD3, 0x0DD4, 0x0DD5, 0xA1CD, 0x0DD6, 0x0DD7, /* U+22A8 */ 0x0DD8, 0x0DD9, 0x0DE0, 0x0DE1, 0x0DE2, 0x0DE3, 0x0DE4, 0x0DE5, /* U+22B0 */ 0x0DE6, 0x0DE7, 0x0DE8, 0x0DE9, 0x0DF0, 0x0DF1, 0x0DF2, 0x0DF3, /* U+22B8 */ 0x0DF4, 0x0DF5, 0x0DF6, 0x0DF7, 0x0DF8, 0x0DF9, 0x0E00, 0xA853, /* U+22C0 */ 0x0E01, 0x0E02, 0x0E03, 0x0E04, 0x0E05, 0x0E06, 0x0E07, 0x0E08, /* U+22C8 */ 0x0E09, 0x0E10, 0x0E11, 0x0E12, 0x0E13, 0x0E14, 0x0E15, 0x0E16, /* U+22D0 */ 0x0E17, 0x0E18, 0x0E19, 0x0E20, 0x0E21, 0x0E22, 0x0E23, 0x0E24, /* U+22D8 */ 0x0E25, 0x0E26, 0x0E27, 0x0E28, 0x0E29, 0x0E30, 0x0E31, 0x0E32, /* U+22E0 */ 0x0E33, 0x0E34, 0x0E35, 0x0E36, 0x0E37, 0x0E38, 0x0E39, 0x0E40, /* U+22E8 */ 0x0E41, 0x0E42, 0x0E43, 0x0E44, 0x0E45, 0x0E46, 0x0E47, 0x0E48, /* U+22F0 */ 0x0E49, 0x0E50, 0x0E51, 0x0E52, 0x0E53, 0x0E54, 0x0E55, 0x0E56, /* U+22F8 */ 0x0E57, 0x0E58, 0x0E59, 0x0E60, 0x0E61, 0x0E62, 0x0E63, 0x0E64, /* U+2300 */ 0x0E65, 0x0E66, 0x0E67, 0x0E68, 0x0E69, 0x0E70, 0x0E71, 0x0E72, /* U+2308 */ 0x0E73, 0x0E74, 0x0E75, 0x0E76, 0x0E77, 0x0E78, 0x0E79, 0x0E80, /* U+2310 */ 0x0E81, 0x0E82, 0xA1D0, 0x0E83, 0x0E84, 0x0E85, 0x0E86, 0x0E87, /* U+2318 */ 0x0E88, 0x0E89, 0x0E90, 0x0E91, 0x0E92, 0x0E93, 0x0E94, 0x0E95, /* U+2320 */ 0x0E96, 0x0E97, 0x0E98, 0x0E99, 0x0EA0, 0x0EA1, 0x0EA2, 0x0EA3, /* U+2328 */ 0x0EA4, 0x0EA5, 0x0EA6, 0x0EA7, 0x0EA8, 0x0EA9, 0x0EB0, 0x0EB1, /* U+2330 */ 0x0EB2, 0x0EB3, 0x0EB4, 0x0EB5, 0x0EB6, 0x0EB7, 0x0EB8, 0x0EB9, /* U+2338 */ 0x0EC0, 0x0EC1, 0x0EC2, 0x0EC3, 0x0EC4, 0x0EC5, 0x0EC6, 0x0EC7, /* U+2340 */ 0x0EC8, 0x0EC9, 0x0ED0, 0x0ED1, 0x0ED2, 0x0ED3, 0x0ED4, 0x0ED5, /* U+2348 */ 0x0ED6, 0x0ED7, 0x0ED8, 0x0ED9, 0x0EE0, 0x0EE1, 0x0EE2, 0x0EE3, /* U+2350 */ 0x0EE4, 0x0EE5, 0x0EE6, 0x0EE7, 0x0EE8, 0x0EE9, 0x0EF0, 0x0EF1, /* U+2358 */ 0x0EF2, 0x0EF3, 0x0EF4, 0x0EF5, 0x0EF6, 0x0EF7, 0x0EF8, 0x0EF9, /* U+2360 */ 0x0F00, 0x0F01, 0x0F02, 0x0F03, 0x0F04, 0x0F05, 0x0F06, 0x0F07, /* U+2368 */ 0x0F08, 0x0F09, 0x0F10, 0x0F11, 0x0F12, 0x0F13, 0x0F14, 0x0F15, /* U+2370 */ 0x0F16, 0x0F17, 0x0F18, 0x0F19, 0x0F20, 0x0F21, 0x0F22, 0x0F23, /* U+2378 */ 0x0F24, 0x0F25, 0x0F26, 0x0F27, 0x0F28, 0x0F29, 0x0F30, 0x0F31, /* U+2380 */ 0x0F32, 0x0F33, 0x0F34, 0x0F35, 0x0F36, 0x0F37, 0x0F38, 0x0F39, /* U+2388 */ 0x0F40, 0x0F41, 0x0F42, 0x0F43, 0x0F44, 0x0F45, 0x0F46, 0x0F47, /* U+2390 */ 0x0F48, 0x0F49, 0x0F50, 0x0F51, 0x0F52, 0x0F53, 0x0F54, 0x0F55, /* U+2398 */ 0x0F56, 0x0F57, 0x0F58, 0x0F59, 0x0F60, 0x0F61, 0x0F62, 0x0F63, /* U+23A0 */ 0x0F64, 0x0F65, 0x0F66, 0x0F67, 0x0F68, 0x0F69, 0x0F70, 0x0F71, /* U+23A8 */ 0x0F72, 0x0F73, 0x0F74, 0x0F75, 0x0F76, 0x0F77, 0x0F78, 0x0F79, /* U+23B0 */ 0x0F80, 0x0F81, 0x0F82, 0x0F83, 0x0F84, 0x0F85, 0x0F86, 0x0F87, /* U+23B8 */ 0x0F88, 0x0F89, 0x0F90, 0x0F91, 0x0F92, 0x0F93, 0x0F94, 0x0F95, /* U+23C0 */ 0x0F96, 0x0F97, 0x0F98, 0x0F99, 0x0FA0, 0x0FA1, 0x0FA2, 0x0FA3, /* U+23C8 */ 0x0FA4, 0x0FA5, 0x0FA6, 0x0FA7, 0x0FA8, 0x0FA9, 0x0FB0, 0x0FB1, /* U+23D0 */ 0x0FB2, 0x0FB3, 0x0FB4, 0x0FB5, 0x0FB6, 0x0FB7, 0x0FB8, 0x0FB9, /* U+23D8 */ 0x0FC0, 0x0FC1, 0x0FC2, 0x0FC3, 0x0FC4, 0x0FC5, 0x0FC6, 0x0FC7, /* U+23E0 */ 0x0FC8, 0x0FC9, 0x0FD0, 0x0FD1, 0x0FD2, 0x0FD3, 0x0FD4, 0x0FD5, /* U+23E8 */ 0x0FD6, 0x0FD7, 0x0FD8, 0x0FD9, 0x1000, 0x1001, 0x1002, 0x1003, /* U+23F0 */ 0x1004, 0x1005, 0x1006, 0x1007, 0x1008, 0x1009, 0x1010, 0x1011, /* U+23F8 */ 0x1012, 0x1013, 0x1014, 0x1015, 0x1016, 0x1017, 0x1018, 0x1019, /* U+2400 */ 0x1020, 0x1021, 0x1022, 0x1023, 0x1024, 0x1025, 0x1026, 0x1027, /* U+2408 */ 0x1028, 0x1029, 0x1030, 0x1031, 0x1032, 0x1033, 0x1034, 0x1035, /* U+2410 */ 0x1036, 0x1037, 0x1038, 0x1039, 0x1040, 0x1041, 0x1042, 0x1043, /* U+2418 */ 0x1044, 0x1045, 0x1046, 0x1047, 0x1048, 0x1049, 0x1050, 0x1051, /* U+2420 */ 0x1052, 0x1053, 0x1054, 0x1055, 0x1056, 0x1057, 0x1058, 0x1059, /* U+2428 */ 0x1060, 0x1061, 0x1062, 0x1063, 0x1064, 0x1065, 0x1066, 0x1067, /* U+2430 */ 0x1068, 0x1069, 0x1070, 0x1071, 0x1072, 0x1073, 0x1074, 0x1075, /* U+2438 */ 0x1076, 0x1077, 0x1078, 0x1079, 0x1080, 0x1081, 0x1082, 0x1083, /* U+2440 */ 0x1084, 0x1085, 0x1086, 0x1087, 0x1088, 0x1089, 0x1090, 0x1091, /* U+2448 */ 0x1092, 0x1093, 0x1094, 0x1095, 0x1096, 0x1097, 0x1098, 0x1099, /* U+2450 */ 0x10A0, 0x10A1, 0x10A2, 0x10A3, 0x10A4, 0x10A5, 0x10A6, 0x10A7, /* U+2458 */ 0x10A8, 0x10A9, 0x10B0, 0x10B1, 0x10B2, 0x10B3, 0x10B4, 0x10B5, /* U+2460 */ 0xA2D9, 0xA2DA, 0xA2DB, 0xA2DC, 0xA2DD, 0xA2DE, 0xA2DF, 0xA2E0, /* U+2468 */ 0xA2E1, 0xA2E2, 0x10B6, 0x10B7, 0x10B8, 0x10B9, 0x10C0, 0x10C1, /* U+2470 */ 0x10C2, 0x10C3, 0x10C4, 0x10C5, 0xA2C5, 0xA2C6, 0xA2C7, 0xA2C8, /* U+2478 */ 0xA2C9, 0xA2CA, 0xA2CB, 0xA2CC, 0xA2CD, 0xA2CE, 0xA2CF, 0xA2D0, /* U+2480 */ 0xA2D1, 0xA2D2, 0xA2D3, 0xA2D4, 0xA2D5, 0xA2D6, 0xA2D7, 0xA2D8, /* U+2488 */ 0xA2B1, 0xA2B2, 0xA2B3, 0xA2B4, 0xA2B5, 0xA2B6, 0xA2B7, 0xA2B8, /* U+2490 */ 0xA2B9, 0xA2BA, 0xA2BB, 0xA2BC, 0xA2BD, 0xA2BE, 0xA2BF, 0xA2C0, /* U+2498 */ 0xA2C1, 0xA2C2, 0xA2C3, 0xA2C4, 0x10C6, 0x10C7, 0x10C8, 0x10C9, /* U+24A0 */ 0x10D0, 0x10D1, 0x10D2, 0x10D3, 0x10D4, 0x10D5, 0x10D6, 0x10D7, /* U+24A8 */ 0x10D8, 0x10D9, 0x10E0, 0x10E1, 0x10E2, 0x10E3, 0x10E4, 0x10E5, /* U+24B0 */ 0x10E6, 0x10E7, 0x10E8, 0x10E9, 0x10F0, 0x10F1, 0x10F2, 0x10F3, /* U+24B8 */ 0x10F4, 0x10F5, 0x10F6, 0x10F7, 0x10F8, 0x10F9, 0x1100, 0x1101, /* U+24C0 */ 0x1102, 0x1103, 0x1104, 0x1105, 0x1106, 0x1107, 0x1108, 0x1109, /* U+24C8 */ 0x1110, 0x1111, 0x1112, 0x1113, 0x1114, 0x1115, 0x1116, 0x1117, /* U+24D0 */ 0x1118, 0x1119, 0x1120, 0x1121, 0x1122, 0x1123, 0x1124, 0x1125, /* U+24D8 */ 0x1126, 0x1127, 0x1128, 0x1129, 0x1130, 0x1131, 0x1132, 0x1133, /* U+24E0 */ 0x1134, 0x1135, 0x1136, 0x1137, 0x1138, 0x1139, 0x1140, 0x1141, /* U+24E8 */ 0x1142, 0x1143, 0x1144, 0x1145, 0x1146, 0x1147, 0x1148, 0x1149, /* U+24F0 */ 0x1150, 0x1151, 0x1152, 0x1153, 0x1154, 0x1155, 0x1156, 0x1157, /* U+24F8 */ 0x1158, 0x1159, 0x1160, 0x1161, 0x1162, 0x1163, 0x1164, 0x1165, /* U+2500 */ 0xA9A4, 0xA9A5, 0xA9A6, 0xA9A7, 0xA9A8, 0xA9A9, 0xA9AA, 0xA9AB, /* U+2508 */ 0xA9AC, 0xA9AD, 0xA9AE, 0xA9AF, 0xA9B0, 0xA9B1, 0xA9B2, 0xA9B3, /* U+2510 */ 0xA9B4, 0xA9B5, 0xA9B6, 0xA9B7, 0xA9B8, 0xA9B9, 0xA9BA, 0xA9BB, /* U+2518 */ 0xA9BC, 0xA9BD, 0xA9BE, 0xA9BF, 0xA9C0, 0xA9C1, 0xA9C2, 0xA9C3, /* U+2520 */ 0xA9C4, 0xA9C5, 0xA9C6, 0xA9C7, 0xA9C8, 0xA9C9, 0xA9CA, 0xA9CB, /* U+2528 */ 0xA9CC, 0xA9CD, 0xA9CE, 0xA9CF, 0xA9D0, 0xA9D1, 0xA9D2, 0xA9D3, /* U+2530 */ 0xA9D4, 0xA9D5, 0xA9D6, 0xA9D7, 0xA9D8, 0xA9D9, 0xA9DA, 0xA9DB, /* U+2538 */ 0xA9DC, 0xA9DD, 0xA9DE, 0xA9DF, 0xA9E0, 0xA9E1, 0xA9E2, 0xA9E3, /* U+2540 */ 0xA9E4, 0xA9E5, 0xA9E6, 0xA9E7, 0xA9E8, 0xA9E9, 0xA9EA, 0xA9EB, /* U+2548 */ 0xA9EC, 0xA9ED, 0xA9EE, 0xA9EF, 0x1166, 0x1167, 0x1168, 0x1169, /* U+2550 */ 0xA854, 0xA855, 0xA856, 0xA857, 0xA858, 0xA859, 0xA85A, 0xA85B, /* U+2558 */ 0xA85C, 0xA85D, 0xA85E, 0xA85F, 0xA860, 0xA861, 0xA862, 0xA863, /* U+2560 */ 0xA864, 0xA865, 0xA866, 0xA867, 0xA868, 0xA869, 0xA86A, 0xA86B, /* U+2568 */ 0xA86C, 0xA86D, 0xA86E, 0xA86F, 0xA870, 0xA871, 0xA872, 0xA873, /* U+2570 */ 0xA874, 0xA875, 0xA876, 0xA877, 0x1170, 0x1171, 0x1172, 0x1173, /* U+2578 */ 0x1174, 0x1175, 0x1176, 0x1177, 0x1178, 0x1179, 0x1180, 0x1181, /* U+2580 */ 0x1182, 0xA878, 0xA879, 0xA87A, 0xA87B, 0xA87C, 0xA87D, 0xA87E, /* U+2588 */ 0xA880, 0xA881, 0xA882, 0xA883, 0xA884, 0xA885, 0xA886, 0xA887, /* U+2590 */ 0x1183, 0x1184, 0x1185, 0xA888, 0xA889, 0xA88A, 0x1186, 0x1187, /* U+2598 */ 0x1188, 0x1189, 0x1190, 0x1191, 0x1192, 0x1193, 0x1194, 0x1195, /* U+25A0 */ 0xA1F6, 0xA1F5, 0x1196, 0x1197, 0x1198, 0x1199, 0x11A0, 0x11A1, /* U+25A8 */ 0x11A2, 0x11A3, 0x11A4, 0x11A5, 0x11A6, 0x11A7, 0x11A8, 0x11A9, /* U+25B0 */ 0x11B0, 0x11B1, 0xA1F8, 0xA1F7, 0x11B2, 0x11B3, 0x11B4, 0x11B5, /* U+25B8 */ 0x11B6, 0x11B7, 0x11B8, 0x11B9, 0xA88B, 0xA88C, 0x11C0, 0x11C1, /* U+25C0 */ 0x11C2, 0x11C3, 0x11C4, 0x11C5, 0x11C6, 0x11C7, 0xA1F4, 0xA1F3, /* U+25C8 */ 0x11C8, 0x11C9, 0x11D0, 0xA1F0, 0x11D1, 0x11D2, 0xA1F2, 0xA1F1, /* U+25D0 */ 0x11D3, 0x11D4, 0x11D5, 0x11D6, 0x11D7, 0x11D8, 0x11D9, 0x11E0, /* U+25D8 */ 0x11E1, 0x11E2, 0x11E3, 0x11E4, 0x11E5, 0x11E6, 0x11E7, 0x11E8, /* U+25E0 */ 0x11E9, 0x11F0, 0xA88D, 0xA88E, 0xA88F, 0xA890, 0x11F1, 0x11F2, /* U+25E8 */ 0x11F3, 0x11F4, 0x11F5, 0x11F6, 0x11F7, 0x11F8, 0x11F9, 0x1200, /* U+25F0 */ 0x1201, 0x1202, 0x1203, 0x1204, 0x1205, 0x1206, 0x1207, 0x1208, /* U+25F8 */ 0x1209, 0x1210, 0x1211, 0x1212, 0x1213, 0x1214, 0x1215, 0x1216, /* U+2600 */ 0x1217, 0x1218, 0x1219, 0x1220, 0x1221, 0xA1EF, 0xA1EE, 0x1222, /* U+2608 */ 0x1223, 0xA891, 0x1224, 0x1225, 0x1226, 0x1227, 0x1228, 0x1229, /* U+2610 */ 0x1230, 0x1231, 0x1232, 0x1233, 0x1234, 0x1235, 0x1236, 0x1237, /* U+2618 */ 0x1238, 0x1239, 0x1240, 0x1241, 0x1242, 0x1243, 0x1244, 0x1245, /* U+2620 */ 0x1246, 0x1247, 0x1248, 0x1249, 0x1250, 0x1251, 0x1252, 0x1253, /* U+2628 */ 0x1254, 0x1255, 0x1256, 0x1257, 0x1258, 0x1259, 0x1260, 0x1261, /* U+2630 */ 0x1262, 0x1263, 0x1264, 0x1265, 0x1266, 0x1267, 0x1268, 0x1269, /* U+2638 */ 0x1270, 0x1271, 0x1272, 0x1273, 0x1274, 0x1275, 0x1276, 0x1277, /* U+2640 */ 0xA1E2, 0x1278, 0xA1E1, /* Contiguous area: U+2E81 .. U+361A */ /* U+2E81 */ 0xFE50, 0x1FC9, 0x1FD0, 0xFE54, 0x1FD1, 0x1FD2, 0x1FD3, /* U+2E88 */ 0xFE57, 0x1FD4, 0x1FD5, 0xFE58, 0xFE5D, 0x1FD6, 0x1FD7, 0x1FD8, /* U+2E90 */ 0x1FD9, 0x2000, 0x2001, 0x2002, 0x2003, 0x2004, 0x2005, 0xFE5E, /* U+2E98 */ 0x2006, 0x2007, 0x2008, 0x2009, 0x2010, 0x2011, 0x2012, 0x2013, /* U+2EA0 */ 0x2014, 0x2015, 0x2016, 0x2017, 0x2018, 0x2019, 0x2020, 0xFE6B, /* U+2EA8 */ 0x2021, 0x2022, 0xFE6E, 0x2023, 0x2024, 0x2025, 0xFE71, 0x2026, /* U+2EB0 */ 0x2027, 0x2028, 0x2029, 0xFE73, 0x2030, 0x2031, 0xFE74, 0xFE75, /* U+2EB8 */ 0x2032, 0x2033, 0x2034, 0xFE79, 0x2035, 0x2036, 0x2037, 0x2038, /* U+2EC0 */ 0x2039, 0x2040, 0x2041, 0x2042, 0x2043, 0x2044, 0x2045, 0x2046, /* U+2EC8 */ 0x2047, 0x2048, 0xFE84, 0x2049, 0x2050, 0x2051, 0x2052, 0x2053, /* U+2ED0 */ 0x2054, 0x2055, 0x2056, 0x2057, 0x2058, 0x2059, 0x2060, 0x2061, /* U+2ED8 */ 0x2062, 0x2063, 0x2064, 0x2065, 0x2066, 0x2067, 0x2068, 0x2069, /* U+2EE0 */ 0x2070, 0x2071, 0x2072, 0x2073, 0x2074, 0x2075, 0x2076, 0x2077, /* U+2EE8 */ 0x2078, 0x2079, 0x2080, 0x2081, 0x2082, 0x2083, 0x2084, 0x2085, /* U+2EF0 */ 0x2086, 0x2087, 0x2088, 0x2089, 0x2090, 0x2091, 0x2092, 0x2093, /* U+2EF8 */ 0x2094, 0x2095, 0x2096, 0x2097, 0x2098, 0x2099, 0x20A0, 0x20A1, /* U+2F00 */ 0x20A2, 0x20A3, 0x20A4, 0x20A5, 0x20A6, 0x20A7, 0x20A8, 0x20A9, /* U+2F08 */ 0x20B0, 0x20B1, 0x20B2, 0x20B3, 0x20B4, 0x20B5, 0x20B6, 0x20B7, /* U+2F10 */ 0x20B8, 0x20B9, 0x20C0, 0x20C1, 0x20C2, 0x20C3, 0x20C4, 0x20C5, /* U+2F18 */ 0x20C6, 0x20C7, 0x20C8, 0x20C9, 0x20D0, 0x20D1, 0x20D2, 0x20D3, /* U+2F20 */ 0x20D4, 0x20D5, 0x20D6, 0x20D7, 0x20D8, 0x20D9, 0x20E0, 0x20E1, /* U+2F28 */ 0x20E2, 0x20E3, 0x20E4, 0x20E5, 0x20E6, 0x20E7, 0x20E8, 0x20E9, /* U+2F30 */ 0x20F0, 0x20F1, 0x20F2, 0x20F3, 0x20F4, 0x20F5, 0x20F6, 0x20F7, /* U+2F38 */ 0x20F8, 0x20F9, 0x2100, 0x2101, 0x2102, 0x2103, 0x2104, 0x2105, /* U+2F40 */ 0x2106, 0x2107, 0x2108, 0x2109, 0x2110, 0x2111, 0x2112, 0x2113, /* U+2F48 */ 0x2114, 0x2115, 0x2116, 0x2117, 0x2118, 0x2119, 0x2120, 0x2121, /* U+2F50 */ 0x2122, 0x2123, 0x2124, 0x2125, 0x2126, 0x2127, 0x2128, 0x2129, /* U+2F58 */ 0x2130, 0x2131, 0x2132, 0x2133, 0x2134, 0x2135, 0x2136, 0x2137, /* U+2F60 */ 0x2138, 0x2139, 0x2140, 0x2141, 0x2142, 0x2143, 0x2144, 0x2145, /* U+2F68 */ 0x2146, 0x2147, 0x2148, 0x2149, 0x2150, 0x2151, 0x2152, 0x2153, /* U+2F70 */ 0x2154, 0x2155, 0x2156, 0x2157, 0x2158, 0x2159, 0x2160, 0x2161, /* U+2F78 */ 0x2162, 0x2163, 0x2164, 0x2165, 0x2166, 0x2167, 0x2168, 0x2169, /* U+2F80 */ 0x2170, 0x2171, 0x2172, 0x2173, 0x2174, 0x2175, 0x2176, 0x2177, /* U+2F88 */ 0x2178, 0x2179, 0x2180, 0x2181, 0x2182, 0x2183, 0x2184, 0x2185, /* U+2F90 */ 0x2186, 0x2187, 0x2188, 0x2189, 0x2190, 0x2191, 0x2192, 0x2193, /* U+2F98 */ 0x2194, 0x2195, 0x2196, 0x2197, 0x2198, 0x2199, 0x21A0, 0x21A1, /* U+2FA0 */ 0x21A2, 0x21A3, 0x21A4, 0x21A5, 0x21A6, 0x21A7, 0x21A8, 0x21A9, /* U+2FA8 */ 0x21B0, 0x21B1, 0x21B2, 0x21B3, 0x21B4, 0x21B5, 0x21B6, 0x21B7, /* U+2FB0 */ 0x21B8, 0x21B9, 0x21C0, 0x21C1, 0x21C2, 0x21C3, 0x21C4, 0x21C5, /* U+2FB8 */ 0x21C6, 0x21C7, 0x21C8, 0x21C9, 0x21D0, 0x21D1, 0x21D2, 0x21D3, /* U+2FC0 */ 0x21D4, 0x21D5, 0x21D6, 0x21D7, 0x21D8, 0x21D9, 0x21E0, 0x21E1, /* U+2FC8 */ 0x21E2, 0x21E3, 0x21E4, 0x21E5, 0x21E6, 0x21E7, 0x21E8, 0x21E9, /* U+2FD0 */ 0x21F0, 0x21F1, 0x21F2, 0x21F3, 0x21F4, 0x21F5, 0x21F6, 0x21F7, /* U+2FD8 */ 0x21F8, 0x21F9, 0x2200, 0x2201, 0x2202, 0x2203, 0x2204, 0x2205, /* U+2FE0 */ 0x2206, 0x2207, 0x2208, 0x2209, 0x2210, 0x2211, 0x2212, 0x2213, /* U+2FE8 */ 0x2214, 0x2215, 0x2216, 0x2217, 0x2218, 0x2219, 0x2220, 0x2221, /* U+2FF0 */ 0xA98A, 0xA98B, 0xA98C, 0xA98D, 0xA98E, 0xA98F, 0xA990, 0xA991, /* U+2FF8 */ 0xA992, 0xA993, 0xA994, 0xA995, 0x2222, 0x2223, 0x2224, 0x2225, /* U+3000 */ 0xA1A1, 0xA1A2, 0xA1A3, 0xA1A8, 0x2226, 0xA1A9, 0xA965, 0xA996, /* U+3008 */ 0xA1B4, 0xA1B5, 0xA1B6, 0xA1B7, 0xA1B8, 0xA1B9, 0xA1BA, 0xA1BB, /* U+3010 */ 0xA1BE, 0xA1BF, 0xA893, 0xA1FE, 0xA1B2, 0xA1B3, 0xA1BC, 0xA1BD, /* U+3018 */ 0x2227, 0x2228, 0x2229, 0x2230, 0x2231, 0xA894, 0xA895, 0x2232, /* U+3020 */ 0x2233, 0xA940, 0xA941, 0xA942, 0xA943, 0xA944, 0xA945, 0xA946, /* U+3028 */ 0xA947, 0xA948, 0x2234, 0x2235, 0x2236, 0x2237, 0x2238, 0x2239, /* U+3030 */ 0x2240, 0x2241, 0x2242, 0x2243, 0x2244, 0x2245, 0x2246, 0x2247, /* U+3038 */ 0x2248, 0x2249, 0x2250, 0x2251, 0x2252, 0x2253, 0xA989, 0x2254, /* U+3040 */ 0x2255, 0xA4A1, 0xA4A2, 0xA4A3, 0xA4A4, 0xA4A5, 0xA4A6, 0xA4A7, /* U+3048 */ 0xA4A8, 0xA4A9, 0xA4AA, 0xA4AB, 0xA4AC, 0xA4AD, 0xA4AE, 0xA4AF, /* U+3050 */ 0xA4B0, 0xA4B1, 0xA4B2, 0xA4B3, 0xA4B4, 0xA4B5, 0xA4B6, 0xA4B7, /* U+3058 */ 0xA4B8, 0xA4B9, 0xA4BA, 0xA4BB, 0xA4BC, 0xA4BD, 0xA4BE, 0xA4BF, /* U+3060 */ 0xA4C0, 0xA4C1, 0xA4C2, 0xA4C3, 0xA4C4, 0xA4C5, 0xA4C6, 0xA4C7, /* U+3068 */ 0xA4C8, 0xA4C9, 0xA4CA, 0xA4CB, 0xA4CC, 0xA4CD, 0xA4CE, 0xA4CF, /* U+3070 */ 0xA4D0, 0xA4D1, 0xA4D2, 0xA4D3, 0xA4D4, 0xA4D5, 0xA4D6, 0xA4D7, /* U+3078 */ 0xA4D8, 0xA4D9, 0xA4DA, 0xA4DB, 0xA4DC, 0xA4DD, 0xA4DE, 0xA4DF, /* U+3080 */ 0xA4E0, 0xA4E1, 0xA4E2, 0xA4E3, 0xA4E4, 0xA4E5, 0xA4E6, 0xA4E7, /* U+3088 */ 0xA4E8, 0xA4E9, 0xA4EA, 0xA4EB, 0xA4EC, 0xA4ED, 0xA4EE, 0xA4EF, /* U+3090 */ 0xA4F0, 0xA4F1, 0xA4F2, 0xA4F3, 0x2256, 0x2257, 0x2258, 0x2259, /* U+3098 */ 0x2260, 0x2261, 0x2262, 0xA961, 0xA962, 0xA966, 0xA967, 0x2263, /* U+30A0 */ 0x2264, 0xA5A1, 0xA5A2, 0xA5A3, 0xA5A4, 0xA5A5, 0xA5A6, 0xA5A7, /* U+30A8 */ 0xA5A8, 0xA5A9, 0xA5AA, 0xA5AB, 0xA5AC, 0xA5AD, 0xA5AE, 0xA5AF, /* U+30B0 */ 0xA5B0, 0xA5B1, 0xA5B2, 0xA5B3, 0xA5B4, 0xA5B5, 0xA5B6, 0xA5B7, /* U+30B8 */ 0xA5B8, 0xA5B9, 0xA5BA, 0xA5BB, 0xA5BC, 0xA5BD, 0xA5BE, 0xA5BF, /* U+30C0 */ 0xA5C0, 0xA5C1, 0xA5C2, 0xA5C3, 0xA5C4, 0xA5C5, 0xA5C6, 0xA5C7, /* U+30C8 */ 0xA5C8, 0xA5C9, 0xA5CA, 0xA5CB, 0xA5CC, 0xA5CD, 0xA5CE, 0xA5CF, /* U+30D0 */ 0xA5D0, 0xA5D1, 0xA5D2, 0xA5D3, 0xA5D4, 0xA5D5, 0xA5D6, 0xA5D7, /* U+30D8 */ 0xA5D8, 0xA5D9, 0xA5DA, 0xA5DB, 0xA5DC, 0xA5DD, 0xA5DE, 0xA5DF, /* U+30E0 */ 0xA5E0, 0xA5E1, 0xA5E2, 0xA5E3, 0xA5E4, 0xA5E5, 0xA5E6, 0xA5E7, /* U+30E8 */ 0xA5E8, 0xA5E9, 0xA5EA, 0xA5EB, 0xA5EC, 0xA5ED, 0xA5EE, 0xA5EF, /* U+30F0 */ 0xA5F0, 0xA5F1, 0xA5F2, 0xA5F3, 0xA5F4, 0xA5F5, 0xA5F6, 0x2265, /* U+30F8 */ 0x2266, 0x2267, 0x2268, 0x2269, 0xA960, 0xA963, 0xA964, 0x2270, /* U+3100 */ 0x2271, 0x2272, 0x2273, 0x2274, 0x2275, 0xA8C5, 0xA8C6, 0xA8C7, /* U+3108 */ 0xA8C8, 0xA8C9, 0xA8CA, 0xA8CB, 0xA8CC, 0xA8CD, 0xA8CE, 0xA8CF, /* U+3110 */ 0xA8D0, 0xA8D1, 0xA8D2, 0xA8D3, 0xA8D4, 0xA8D5, 0xA8D6, 0xA8D7, /* U+3118 */ 0xA8D8, 0xA8D9, 0xA8DA, 0xA8DB, 0xA8DC, 0xA8DD, 0xA8DE, 0xA8DF, /* U+3120 */ 0xA8E0, 0xA8E1, 0xA8E2, 0xA8E3, 0xA8E4, 0xA8E5, 0xA8E6, 0xA8E7, /* U+3128 */ 0xA8E8, 0xA8E9, 0x2276, 0x2277, 0x2278, 0x2279, 0x2280, 0x2281, /* U+3130 */ 0x2282, 0x2283, 0x2284, 0x2285, 0x2286, 0x2287, 0x2288, 0x2289, /* U+3138 */ 0x2290, 0x2291, 0x2292, 0x2293, 0x2294, 0x2295, 0x2296, 0x2297, /* U+3140 */ 0x2298, 0x2299, 0x22A0, 0x22A1, 0x22A2, 0x22A3, 0x22A4, 0x22A5, /* U+3148 */ 0x22A6, 0x22A7, 0x22A8, 0x22A9, 0x22B0, 0x22B1, 0x22B2, 0x22B3, /* U+3150 */ 0x22B4, 0x22B5, 0x22B6, 0x22B7, 0x22B8, 0x22B9, 0x22C0, 0x22C1, /* U+3158 */ 0x22C2, 0x22C3, 0x22C4, 0x22C5, 0x22C6, 0x22C7, 0x22C8, 0x22C9, /* U+3160 */ 0x22D0, 0x22D1, 0x22D2, 0x22D3, 0x22D4, 0x22D5, 0x22D6, 0x22D7, /* U+3168 */ 0x22D8, 0x22D9, 0x22E0, 0x22E1, 0x22E2, 0x22E3, 0x22E4, 0x22E5, /* U+3170 */ 0x22E6, 0x22E7, 0x22E8, 0x22E9, 0x22F0, 0x22F1, 0x22F2, 0x22F3, /* U+3178 */ 0x22F4, 0x22F5, 0x22F6, 0x22F7, 0x22F8, 0x22F9, 0x2300, 0x2301, /* U+3180 */ 0x2302, 0x2303, 0x2304, 0x2305, 0x2306, 0x2307, 0x2308, 0x2309, /* U+3188 */ 0x2310, 0x2311, 0x2312, 0x2313, 0x2314, 0x2315, 0x2316, 0x2317, /* U+3190 */ 0x2318, 0x2319, 0x2320, 0x2321, 0x2322, 0x2323, 0x2324, 0x2325, /* U+3198 */ 0x2326, 0x2327, 0x2328, 0x2329, 0x2330, 0x2331, 0x2332, 0x2333, /* U+31A0 */ 0x2334, 0x2335, 0x2336, 0x2337, 0x2338, 0x2339, 0x2340, 0x2341, /* U+31A8 */ 0x2342, 0x2343, 0x2344, 0x2345, 0x2346, 0x2347, 0x2348, 0x2349, /* U+31B0 */ 0x2350, 0x2351, 0x2352, 0x2353, 0x2354, 0x2355, 0x2356, 0x2357, /* U+31B8 */ 0x2358, 0x2359, 0x2360, 0x2361, 0x2362, 0x2363, 0x2364, 0x2365, /* U+31C0 */ 0x2366, 0x2367, 0x2368, 0x2369, 0x2370, 0x2371, 0x2372, 0x2373, /* U+31C8 */ 0x2374, 0x2375, 0x2376, 0x2377, 0x2378, 0x2379, 0x2380, 0x2381, /* U+31D0 */ 0x2382, 0x2383, 0x2384, 0x2385, 0x2386, 0x2387, 0x2388, 0x2389, /* U+31D8 */ 0x2390, 0x2391, 0x2392, 0x2393, 0x2394, 0x2395, 0x2396, 0x2397, /* U+31E0 */ 0x2398, 0x2399, 0x23A0, 0x23A1, 0x23A2, 0x23A3, 0x23A4, 0x23A5, /* U+31E8 */ 0x23A6, 0x23A7, 0x23A8, 0x23A9, 0x23B0, 0x23B1, 0x23B2, 0x23B3, /* U+31F0 */ 0x23B4, 0x23B5, 0x23B6, 0x23B7, 0x23B8, 0x23B9, 0x23C0, 0x23C1, /* U+31F8 */ 0x23C2, 0x23C3, 0x23C4, 0x23C5, 0x23C6, 0x23C7, 0x23C8, 0x23C9, /* U+3200 */ 0x23D0, 0x23D1, 0x23D2, 0x23D3, 0x23D4, 0x23D5, 0x23D6, 0x23D7, /* U+3208 */ 0x23D8, 0x23D9, 0x23E0, 0x23E1, 0x23E2, 0x23E3, 0x23E4, 0x23E5, /* U+3210 */ 0x23E6, 0x23E7, 0x23E8, 0x23E9, 0x23F0, 0x23F1, 0x23F2, 0x23F3, /* U+3218 */ 0x23F4, 0x23F5, 0x23F6, 0x23F7, 0x23F8, 0x23F9, 0x2400, 0x2401, /* U+3220 */ 0xA2E5, 0xA2E6, 0xA2E7, 0xA2E8, 0xA2E9, 0xA2EA, 0xA2EB, 0xA2EC, /* U+3228 */ 0xA2ED, 0xA2EE, 0x2402, 0x2403, 0x2404, 0x2405, 0x2406, 0x2407, /* U+3230 */ 0x2408, 0xA95A, 0x2409, 0x2410, 0x2411, 0x2412, 0x2413, 0x2414, /* U+3238 */ 0x2415, 0x2416, 0x2417, 0x2418, 0x2419, 0x2420, 0x2421, 0x2422, /* U+3240 */ 0x2423, 0x2424, 0x2425, 0x2426, 0x2427, 0x2428, 0x2429, 0x2430, /* U+3248 */ 0x2431, 0x2432, 0x2433, 0x2434, 0x2435, 0x2436, 0x2437, 0x2438, /* U+3250 */ 0x2439, 0x2440, 0x2441, 0x2442, 0x2443, 0x2444, 0x2445, 0x2446, /* U+3258 */ 0x2447, 0x2448, 0x2449, 0x2450, 0x2451, 0x2452, 0x2453, 0x2454, /* U+3260 */ 0x2455, 0x2456, 0x2457, 0x2458, 0x2459, 0x2460, 0x2461, 0x2462, /* U+3268 */ 0x2463, 0x2464, 0x2465, 0x2466, 0x2467, 0x2468, 0x2469, 0x2470, /* U+3270 */ 0x2471, 0x2472, 0x2473, 0x2474, 0x2475, 0x2476, 0x2477, 0x2478, /* U+3278 */ 0x2479, 0x2480, 0x2481, 0x2482, 0x2483, 0x2484, 0x2485, 0x2486, /* U+3280 */ 0x2487, 0x2488, 0x2489, 0x2490, 0x2491, 0x2492, 0x2493, 0x2494, /* U+3288 */ 0x2495, 0x2496, 0x2497, 0x2498, 0x2499, 0x24A0, 0x24A1, 0x24A2, /* U+3290 */ 0x24A3, 0x24A4, 0x24A5, 0x24A6, 0x24A7, 0x24A8, 0x24A9, 0x24B0, /* U+3298 */ 0x24B1, 0x24B2, 0x24B3, 0x24B4, 0x24B5, 0x24B6, 0x24B7, 0x24B8, /* U+32A0 */ 0x24B9, 0x24C0, 0x24C1, 0xA949, 0x24C2, 0x24C3, 0x24C4, 0x24C5, /* U+32A8 */ 0x24C6, 0x24C7, 0x24C8, 0x24C9, 0x24D0, 0x24D1, 0x24D2, 0x24D3, /* U+32B0 */ 0x24D4, 0x24D5, 0x24D6, 0x24D7, 0x24D8, 0x24D9, 0x24E0, 0x24E1, /* U+32B8 */ 0x24E2, 0x24E3, 0x24E4, 0x24E5, 0x24E6, 0x24E7, 0x24E8, 0x24E9, /* U+32C0 */ 0x24F0, 0x24F1, 0x24F2, 0x24F3, 0x24F4, 0x24F5, 0x24F6, 0x24F7, /* U+32C8 */ 0x24F8, 0x24F9, 0x2500, 0x2501, 0x2502, 0x2503, 0x2504, 0x2505, /* U+32D0 */ 0x2506, 0x2507, 0x2508, 0x2509, 0x2510, 0x2511, 0x2512, 0x2513, /* U+32D8 */ 0x2514, 0x2515, 0x2516, 0x2517, 0x2518, 0x2519, 0x2520, 0x2521, /* U+32E0 */ 0x2522, 0x2523, 0x2524, 0x2525, 0x2526, 0x2527, 0x2528, 0x2529, /* U+32E8 */ 0x2530, 0x2531, 0x2532, 0x2533, 0x2534, 0x2535, 0x2536, 0x2537, /* U+32F0 */ 0x2538, 0x2539, 0x2540, 0x2541, 0x2542, 0x2543, 0x2544, 0x2545, /* U+32F8 */ 0x2546, 0x2547, 0x2548, 0x2549, 0x2550, 0x2551, 0x2552, 0x2553, /* U+3300 */ 0x2554, 0x2555, 0x2556, 0x2557, 0x2558, 0x2559, 0x2560, 0x2561, /* U+3308 */ 0x2562, 0x2563, 0x2564, 0x2565, 0x2566, 0x2567, 0x2568, 0x2569, /* U+3310 */ 0x2570, 0x2571, 0x2572, 0x2573, 0x2574, 0x2575, 0x2576, 0x2577, /* U+3318 */ 0x2578, 0x2579, 0x2580, 0x2581, 0x2582, 0x2583, 0x2584, 0x2585, /* U+3320 */ 0x2586, 0x2587, 0x2588, 0x2589, 0x2590, 0x2591, 0x2592, 0x2593, /* U+3328 */ 0x2594, 0x2595, 0x2596, 0x2597, 0x2598, 0x2599, 0x25A0, 0x25A1, /* U+3330 */ 0x25A2, 0x25A3, 0x25A4, 0x25A5, 0x25A6, 0x25A7, 0x25A8, 0x25A9, /* U+3338 */ 0x25B0, 0x25B1, 0x25B2, 0x25B3, 0x25B4, 0x25B5, 0x25B6, 0x25B7, /* U+3340 */ 0x25B8, 0x25B9, 0x25C0, 0x25C1, 0x25C2, 0x25C3, 0x25C4, 0x25C5, /* U+3348 */ 0x25C6, 0x25C7, 0x25C8, 0x25C9, 0x25D0, 0x25D1, 0x25D2, 0x25D3, /* U+3350 */ 0x25D4, 0x25D5, 0x25D6, 0x25D7, 0x25D8, 0x25D9, 0x25E0, 0x25E1, /* U+3358 */ 0x25E2, 0x25E3, 0x25E4, 0x25E5, 0x25E6, 0x25E7, 0x25E8, 0x25E9, /* U+3360 */ 0x25F0, 0x25F1, 0x25F2, 0x25F3, 0x25F4, 0x25F5, 0x25F6, 0x25F7, /* U+3368 */ 0x25F8, 0x25F9, 0x2600, 0x2601, 0x2602, 0x2603, 0x2604, 0x2605, /* U+3370 */ 0x2606, 0x2607, 0x2608, 0x2609, 0x2610, 0x2611, 0x2612, 0x2613, /* U+3378 */ 0x2614, 0x2615, 0x2616, 0x2617, 0x2618, 0x2619, 0x2620, 0x2621, /* U+3380 */ 0x2622, 0x2623, 0x2624, 0x2625, 0x2626, 0x2627, 0x2628, 0x2629, /* U+3388 */ 0x2630, 0x2631, 0x2632, 0x2633, 0x2634, 0x2635, 0xA94A, 0xA94B, /* U+3390 */ 0x2636, 0x2637, 0x2638, 0x2639, 0x2640, 0x2641, 0x2642, 0x2643, /* U+3398 */ 0x2644, 0x2645, 0x2646, 0x2647, 0xA94C, 0xA94D, 0xA94E, 0x2648, /* U+33A0 */ 0x2649, 0xA94F, 0x2650, 0x2651, 0x2652, 0x2653, 0x2654, 0x2655, /* U+33A8 */ 0x2656, 0x2657, 0x2658, 0x2659, 0x2660, 0x2661, 0x2662, 0x2663, /* U+33B0 */ 0x2664, 0x2665, 0x2666, 0x2667, 0x2668, 0x2669, 0x2670, 0x2671, /* U+33B8 */ 0x2672, 0x2673, 0x2674, 0x2675, 0x2676, 0x2677, 0x2678, 0x2679, /* U+33C0 */ 0x2680, 0x2681, 0x2682, 0x2683, 0xA950, 0x2684, 0x2685, 0x2686, /* U+33C8 */ 0x2687, 0x2688, 0x2689, 0x2690, 0x2691, 0x2692, 0xA951, 0x2693, /* U+33D0 */ 0x2694, 0xA952, 0xA953, 0x2695, 0x2696, 0xA954, 0x2697, 0x2698, /* U+33D8 */ 0x2699, 0x26A0, 0x26A1, 0x26A2, 0x26A3, 0x26A4, 0x26A5, 0x26A6, /* U+33E0 */ 0x26A7, 0x26A8, 0x26A9, 0x26B0, 0x26B1, 0x26B2, 0x26B3, 0x26B4, /* U+33E8 */ 0x26B5, 0x26B6, 0x26B7, 0x26B8, 0x26B9, 0x26C0, 0x26C1, 0x26C2, /* U+33F0 */ 0x26C3, 0x26C4, 0x26C5, 0x26C6, 0x26C7, 0x26C8, 0x26C9, 0x26D0, /* U+33F8 */ 0x26D1, 0x26D2, 0x26D3, 0x26D4, 0x26D5, 0x26D6, 0x26D7, 0x26D8, /* U+3400 */ 0x26D9, 0x26E0, 0x26E1, 0x26E2, 0x26E3, 0x26E4, 0x26E5, 0x26E6, /* U+3408 */ 0x26E7, 0x26E8, 0x26E9, 0x26F0, 0x26F1, 0x26F2, 0x26F3, 0x26F4, /* U+3410 */ 0x26F5, 0x26F6, 0x26F7, 0x26F8, 0x26F9, 0x2700, 0x2701, 0x2702, /* U+3418 */ 0x2703, 0x2704, 0x2705, 0x2706, 0x2707, 0x2708, 0x2709, 0x2710, /* U+3420 */ 0x2711, 0x2712, 0x2713, 0x2714, 0x2715, 0x2716, 0x2717, 0x2718, /* U+3428 */ 0x2719, 0x2720, 0x2721, 0x2722, 0x2723, 0x2724, 0x2725, 0x2726, /* U+3430 */ 0x2727, 0x2728, 0x2729, 0x2730, 0x2731, 0x2732, 0x2733, 0x2734, /* U+3438 */ 0x2735, 0x2736, 0x2737, 0x2738, 0x2739, 0x2740, 0x2741, 0x2742, /* U+3440 */ 0x2743, 0x2744, 0x2745, 0x2746, 0x2747, 0x2748, 0x2749, 0xFE56, /* U+3448 */ 0x2750, 0x2751, 0x2752, 0x2753, 0x2754, 0x2755, 0x2756, 0x2757, /* U+3450 */ 0x2758, 0x2759, 0x2760, 0x2761, 0x2762, 0x2763, 0x2764, 0x2765, /* U+3458 */ 0x2766, 0x2767, 0x2768, 0x2769, 0x2770, 0x2771, 0x2772, 0x2773, /* U+3460 */ 0x2774, 0x2775, 0x2776, 0x2777, 0x2778, 0x2779, 0x2780, 0x2781, /* U+3468 */ 0x2782, 0x2783, 0x2784, 0x2785, 0x2786, 0x2787, 0x2788, 0x2789, /* U+3470 */ 0x2790, 0x2791, 0x2792, 0xFE55, 0x2793, 0x2794, 0x2795, 0x2796, /* U+3478 */ 0x2797, 0x2798, 0x2799, 0x27A0, 0x27A1, 0x27A2, 0x27A3, 0x27A4, /* U+3480 */ 0x27A5, 0x27A6, 0x27A7, 0x27A8, 0x27A9, 0x27B0, 0x27B1, 0x27B2, /* U+3488 */ 0x27B3, 0x27B4, 0x27B5, 0x27B6, 0x27B7, 0x27B8, 0x27B9, 0x27C0, /* U+3490 */ 0x27C1, 0x27C2, 0x27C3, 0x27C4, 0x27C5, 0x27C6, 0x27C7, 0x27C8, /* U+3498 */ 0x27C9, 0x27D0, 0x27D1, 0x27D2, 0x27D3, 0x27D4, 0x27D5, 0x27D6, /* U+34A0 */ 0x27D7, 0x27D8, 0x27D9, 0x3000, 0x3001, 0x3002, 0x3003, 0x3004, /* U+34A8 */ 0x3005, 0x3006, 0x3007, 0x3008, 0x3009, 0x3010, 0x3011, 0x3012, /* U+34B0 */ 0x3013, 0x3014, 0x3015, 0x3016, 0x3017, 0x3018, 0x3019, 0x3020, /* U+34B8 */ 0x3021, 0x3022, 0x3023, 0x3024, 0x3025, 0x3026, 0x3027, 0x3028, /* U+34C0 */ 0x3029, 0x3030, 0x3031, 0x3032, 0x3033, 0x3034, 0x3035, 0x3036, /* U+34C8 */ 0x3037, 0x3038, 0x3039, 0x3040, 0x3041, 0x3042, 0x3043, 0x3044, /* U+34D0 */ 0x3045, 0x3046, 0x3047, 0x3048, 0x3049, 0x3050, 0x3051, 0x3052, /* U+34D8 */ 0x3053, 0x3054, 0x3055, 0x3056, 0x3057, 0x3058, 0x3059, 0x3060, /* U+34E0 */ 0x3061, 0x3062, 0x3063, 0x3064, 0x3065, 0x3066, 0x3067, 0x3068, /* U+34E8 */ 0x3069, 0x3070, 0x3071, 0x3072, 0x3073, 0x3074, 0x3075, 0x3076, /* U+34F0 */ 0x3077, 0x3078, 0x3079, 0x3080, 0x3081, 0x3082, 0x3083, 0x3084, /* U+34F8 */ 0x3085, 0x3086, 0x3087, 0x3088, 0x3089, 0x3090, 0x3091, 0x3092, /* U+3500 */ 0x3093, 0x3094, 0x3095, 0x3096, 0x3097, 0x3098, 0x3099, 0x30A0, /* U+3508 */ 0x30A1, 0x30A2, 0x30A3, 0x30A4, 0x30A5, 0x30A6, 0x30A7, 0x30A8, /* U+3510 */ 0x30A9, 0x30B0, 0x30B1, 0x30B2, 0x30B3, 0x30B4, 0x30B5, 0x30B6, /* U+3518 */ 0x30B7, 0x30B8, 0x30B9, 0x30C0, 0x30C1, 0x30C2, 0x30C3, 0x30C4, /* U+3520 */ 0x30C5, 0x30C6, 0x30C7, 0x30C8, 0x30C9, 0x30D0, 0x30D1, 0x30D2, /* U+3528 */ 0x30D3, 0x30D4, 0x30D5, 0x30D6, 0x30D7, 0x30D8, 0x30D9, 0x30E0, /* U+3530 */ 0x30E1, 0x30E2, 0x30E3, 0x30E4, 0x30E5, 0x30E6, 0x30E7, 0x30E8, /* U+3538 */ 0x30E9, 0x30F0, 0x30F1, 0x30F2, 0x30F3, 0x30F4, 0x30F5, 0x30F6, /* U+3540 */ 0x30F7, 0x30F8, 0x30F9, 0x3100, 0x3101, 0x3102, 0x3103, 0x3104, /* U+3548 */ 0x3105, 0x3106, 0x3107, 0x3108, 0x3109, 0x3110, 0x3111, 0x3112, /* U+3550 */ 0x3113, 0x3114, 0x3115, 0x3116, 0x3117, 0x3118, 0x3119, 0x3120, /* U+3558 */ 0x3121, 0x3122, 0x3123, 0x3124, 0x3125, 0x3126, 0x3127, 0x3128, /* U+3560 */ 0x3129, 0x3130, 0x3131, 0x3132, 0x3133, 0x3134, 0x3135, 0x3136, /* U+3568 */ 0x3137, 0x3138, 0x3139, 0x3140, 0x3141, 0x3142, 0x3143, 0x3144, /* U+3570 */ 0x3145, 0x3146, 0x3147, 0x3148, 0x3149, 0x3150, 0x3151, 0x3152, /* U+3578 */ 0x3153, 0x3154, 0x3155, 0x3156, 0x3157, 0x3158, 0x3159, 0x3160, /* U+3580 */ 0x3161, 0x3162, 0x3163, 0x3164, 0x3165, 0x3166, 0x3167, 0x3168, /* U+3588 */ 0x3169, 0x3170, 0x3171, 0x3172, 0x3173, 0x3174, 0x3175, 0x3176, /* U+3590 */ 0x3177, 0x3178, 0x3179, 0x3180, 0x3181, 0x3182, 0x3183, 0x3184, /* U+3598 */ 0x3185, 0x3186, 0x3187, 0x3188, 0x3189, 0x3190, 0xFE5A, 0x3191, /* U+35A0 */ 0x3192, 0x3193, 0x3194, 0x3195, 0x3196, 0x3197, 0x3198, 0x3199, /* U+35A8 */ 0x31A0, 0x31A1, 0x31A2, 0x31A3, 0x31A4, 0x31A5, 0x31A6, 0x31A7, /* U+35B0 */ 0x31A8, 0x31A9, 0x31B0, 0x31B1, 0x31B2, 0x31B3, 0x31B4, 0x31B5, /* U+35B8 */ 0x31B6, 0x31B7, 0x31B8, 0x31B9, 0x31C0, 0x31C1, 0x31C2, 0x31C3, /* U+35C0 */ 0x31C4, 0x31C5, 0x31C6, 0x31C7, 0x31C8, 0x31C9, 0x31D0, 0x31D1, /* U+35C8 */ 0x31D2, 0x31D3, 0x31D4, 0x31D5, 0x31D6, 0x31D7, 0x31D8, 0x31D9, /* U+35D0 */ 0x31E0, 0x31E1, 0x31E2, 0x31E3, 0x31E4, 0x31E5, 0x31E6, 0x31E7, /* U+35D8 */ 0x31E8, 0x31E9, 0x31F0, 0x31F1, 0x31F2, 0x31F3, 0x31F4, 0x31F5, /* U+35E0 */ 0x31F6, 0x31F7, 0x31F8, 0x31F9, 0x3200, 0x3201, 0x3202, 0x3203, /* U+35E8 */ 0x3204, 0x3205, 0x3206, 0x3207, 0x3208, 0x3209, 0x3210, 0x3211, /* U+35F0 */ 0x3212, 0x3213, 0x3214, 0x3215, 0x3216, 0x3217, 0x3218, 0x3219, /* U+35F8 */ 0x3220, 0x3221, 0x3222, 0x3223, 0x3224, 0x3225, 0x3226, 0x3227, /* U+3600 */ 0x3228, 0x3229, 0x3230, 0x3231, 0x3232, 0x3233, 0x3234, 0x3235, /* U+3608 */ 0x3236, 0x3237, 0x3238, 0x3239, 0x3240, 0x3241, 0xFE5C, 0x3242, /* U+3610 */ 0x3243, 0x3244, 0x3245, 0x3246, 0x3247, 0x3248, 0x3249, 0x3250, /* U+3618 */ 0x3251, 0x3252, 0xFE5B, /* Contiguous area: U+3918 .. U+3CE0 */ /* U+3918 */ 0xFE60, 0x3718, 0x3719, 0x3720, 0x3721, 0x3722, 0x3723, 0x3724, /* U+3920 */ 0x3725, 0x3726, 0x3727, 0x3728, 0x3729, 0x3730, 0x3731, 0x3732, /* U+3928 */ 0x3733, 0x3734, 0x3735, 0x3736, 0x3737, 0x3738, 0x3739, 0x3740, /* U+3930 */ 0x3741, 0x3742, 0x3743, 0x3744, 0x3745, 0x3746, 0x3747, 0x3748, /* U+3938 */ 0x3749, 0x3750, 0x3751, 0x3752, 0x3753, 0x3754, 0x3755, 0x3756, /* U+3940 */ 0x3757, 0x3758, 0x3759, 0x3760, 0x3761, 0x3762, 0x3763, 0x3764, /* U+3948 */ 0x3765, 0x3766, 0x3767, 0x3768, 0x3769, 0x3770, 0x3771, 0x3772, /* U+3950 */ 0x3773, 0x3774, 0x3775, 0x3776, 0x3777, 0x3778, 0x3779, 0x3780, /* U+3958 */ 0x3781, 0x3782, 0x3783, 0x3784, 0x3785, 0x3786, 0x3787, 0x3788, /* U+3960 */ 0x3789, 0x3790, 0x3791, 0x3792, 0x3793, 0x3794, 0x3795, 0x3796, /* U+3968 */ 0x3797, 0x3798, 0x3799, 0x37A0, 0x37A1, 0x37A2, 0xFE5F, 0x37A3, /* U+3970 */ 0x37A4, 0x37A5, 0x37A6, 0x37A7, 0x37A8, 0x37A9, 0x37B0, 0x37B1, /* U+3978 */ 0x37B2, 0x37B3, 0x37B4, 0x37B5, 0x37B6, 0x37B7, 0x37B8, 0x37B9, /* U+3980 */ 0x37C0, 0x37C1, 0x37C2, 0x37C3, 0x37C4, 0x37C5, 0x37C6, 0x37C7, /* U+3988 */ 0x37C8, 0x37C9, 0x37D0, 0x37D1, 0x37D2, 0x37D3, 0x37D4, 0x37D5, /* U+3990 */ 0x37D6, 0x37D7, 0x37D8, 0x37D9, 0x3800, 0x3801, 0x3802, 0x3803, /* U+3998 */ 0x3804, 0x3805, 0x3806, 0x3807, 0x3808, 0x3809, 0x3810, 0x3811, /* U+39A0 */ 0x3812, 0x3813, 0x3814, 0x3815, 0x3816, 0x3817, 0x3818, 0x3819, /* U+39A8 */ 0x3820, 0x3821, 0x3822, 0x3823, 0x3824, 0x3825, 0x3826, 0x3827, /* U+39B0 */ 0x3828, 0x3829, 0x3830, 0x3831, 0x3832, 0x3833, 0x3834, 0x3835, /* U+39B8 */ 0x3836, 0x3837, 0x3838, 0x3839, 0x3840, 0x3841, 0x3842, 0x3843, /* U+39C0 */ 0x3844, 0x3845, 0x3846, 0x3847, 0x3848, 0x3849, 0x3850, 0x3851, /* U+39C8 */ 0x3852, 0x3853, 0x3854, 0x3855, 0x3856, 0x3857, 0x3858, 0xFE62, /* U+39D0 */ 0xFE65, 0x3859, 0x3860, 0x3861, 0x3862, 0x3863, 0x3864, 0x3865, /* U+39D8 */ 0x3866, 0x3867, 0x3868, 0x3869, 0x3870, 0x3871, 0x3872, 0xFE63, /* U+39E0 */ 0x3873, 0x3874, 0x3875, 0x3876, 0x3877, 0x3878, 0x3879, 0x3880, /* U+39E8 */ 0x3881, 0x3882, 0x3883, 0x3884, 0x3885, 0x3886, 0x3887, 0x3888, /* U+39F0 */ 0x3889, 0x3890, 0x3891, 0x3892, 0x3893, 0x3894, 0x3895, 0x3896, /* U+39F8 */ 0x3897, 0x3898, 0x3899, 0x38A0, 0x38A1, 0x38A2, 0x38A3, 0x38A4, /* U+3A00 */ 0x38A5, 0x38A6, 0x38A7, 0x38A8, 0x38A9, 0x38B0, 0x38B1, 0x38B2, /* U+3A08 */ 0x38B3, 0x38B4, 0x38B5, 0x38B6, 0x38B7, 0x38B8, 0x38B9, 0x38C0, /* U+3A10 */ 0x38C1, 0x38C2, 0x38C3, 0x38C4, 0x38C5, 0x38C6, 0x38C7, 0x38C8, /* U+3A18 */ 0x38C9, 0x38D0, 0x38D1, 0x38D2, 0x38D3, 0x38D4, 0x38D5, 0x38D6, /* U+3A20 */ 0x38D7, 0x38D8, 0x38D9, 0x38E0, 0x38E1, 0x38E2, 0x38E3, 0x38E4, /* U+3A28 */ 0x38E5, 0x38E6, 0x38E7, 0x38E8, 0x38E9, 0x38F0, 0x38F1, 0x38F2, /* U+3A30 */ 0x38F3, 0x38F4, 0x38F5, 0x38F6, 0x38F7, 0x38F8, 0x38F9, 0x3900, /* U+3A38 */ 0x3901, 0x3902, 0x3903, 0x3904, 0x3905, 0x3906, 0x3907, 0x3908, /* U+3A40 */ 0x3909, 0x3910, 0x3911, 0x3912, 0x3913, 0x3914, 0x3915, 0x3916, /* U+3A48 */ 0x3917, 0x3918, 0x3919, 0x3920, 0x3921, 0x3922, 0x3923, 0x3924, /* U+3A50 */ 0x3925, 0x3926, 0x3927, 0x3928, 0x3929, 0x3930, 0x3931, 0x3932, /* U+3A58 */ 0x3933, 0x3934, 0x3935, 0x3936, 0x3937, 0x3938, 0x3939, 0x3940, /* U+3A60 */ 0x3941, 0x3942, 0x3943, 0x3944, 0x3945, 0x3946, 0x3947, 0x3948, /* U+3A68 */ 0x3949, 0x3950, 0x3951, 0x3952, 0x3953, 0x3954, 0x3955, 0x3956, /* U+3A70 */ 0x3957, 0x3958, 0x3959, 0xFE64, 0x3960, 0x3961, 0x3962, 0x3963, /* U+3A78 */ 0x3964, 0x3965, 0x3966, 0x3967, 0x3968, 0x3969, 0x3970, 0x3971, /* U+3A80 */ 0x3972, 0x3973, 0x3974, 0x3975, 0x3976, 0x3977, 0x3978, 0x3979, /* U+3A88 */ 0x3980, 0x3981, 0x3982, 0x3983, 0x3984, 0x3985, 0x3986, 0x3987, /* U+3A90 */ 0x3988, 0x3989, 0x3990, 0x3991, 0x3992, 0x3993, 0x3994, 0x3995, /* U+3A98 */ 0x3996, 0x3997, 0x3998, 0x3999, 0x39A0, 0x39A1, 0x39A2, 0x39A3, /* U+3AA0 */ 0x39A4, 0x39A5, 0x39A6, 0x39A7, 0x39A8, 0x39A9, 0x39B0, 0x39B1, /* U+3AA8 */ 0x39B2, 0x39B3, 0x39B4, 0x39B5, 0x39B6, 0x39B7, 0x39B8, 0x39B9, /* U+3AB0 */ 0x39C0, 0x39C1, 0x39C2, 0x39C3, 0x39C4, 0x39C5, 0x39C6, 0x39C7, /* U+3AB8 */ 0x39C8, 0x39C9, 0x39D0, 0x39D1, 0x39D2, 0x39D3, 0x39D4, 0x39D5, /* U+3AC0 */ 0x39D6, 0x39D7, 0x39D8, 0x39D9, 0x39E0, 0x39E1, 0x39E2, 0x39E3, /* U+3AC8 */ 0x39E4, 0x39E5, 0x39E6, 0x39E7, 0x39E8, 0x39E9, 0x39F0, 0x39F1, /* U+3AD0 */ 0x39F2, 0x39F3, 0x39F4, 0x39F5, 0x39F6, 0x39F7, 0x39F8, 0x39F9, /* U+3AD8 */ 0x3A00, 0x3A01, 0x3A02, 0x3A03, 0x3A04, 0x3A05, 0x3A06, 0x3A07, /* U+3AE0 */ 0x3A08, 0x3A09, 0x3A10, 0x3A11, 0x3A12, 0x3A13, 0x3A14, 0x3A15, /* U+3AE8 */ 0x3A16, 0x3A17, 0x3A18, 0x3A19, 0x3A20, 0x3A21, 0x3A22, 0x3A23, /* U+3AF0 */ 0x3A24, 0x3A25, 0x3A26, 0x3A27, 0x3A28, 0x3A29, 0x3A30, 0x3A31, /* U+3AF8 */ 0x3A32, 0x3A33, 0x3A34, 0x3A35, 0x3A36, 0x3A37, 0x3A38, 0x3A39, /* U+3B00 */ 0x3A40, 0x3A41, 0x3A42, 0x3A43, 0x3A44, 0x3A45, 0x3A46, 0x3A47, /* U+3B08 */ 0x3A48, 0x3A49, 0x3A50, 0x3A51, 0x3A52, 0x3A53, 0x3A54, 0x3A55, /* U+3B10 */ 0x3A56, 0x3A57, 0x3A58, 0x3A59, 0x3A60, 0x3A61, 0x3A62, 0x3A63, /* U+3B18 */ 0x3A64, 0x3A65, 0x3A66, 0x3A67, 0x3A68, 0x3A69, 0x3A70, 0x3A71, /* U+3B20 */ 0x3A72, 0x3A73, 0x3A74, 0x3A75, 0x3A76, 0x3A77, 0x3A78, 0x3A79, /* U+3B28 */ 0x3A80, 0x3A81, 0x3A82, 0x3A83, 0x3A84, 0x3A85, 0x3A86, 0x3A87, /* U+3B30 */ 0x3A88, 0x3A89, 0x3A90, 0x3A91, 0x3A92, 0x3A93, 0x3A94, 0x3A95, /* U+3B38 */ 0x3A96, 0x3A97, 0x3A98, 0x3A99, 0x3AA0, 0x3AA1, 0x3AA2, 0x3AA3, /* U+3B40 */ 0x3AA4, 0x3AA5, 0x3AA6, 0x3AA7, 0x3AA8, 0x3AA9, 0x3AB0, 0x3AB1, /* U+3B48 */ 0x3AB2, 0x3AB3, 0x3AB4, 0x3AB5, 0x3AB6, 0x3AB7, 0xFE68, 0x3AB8, /* U+3B50 */ 0x3AB9, 0x3AC0, 0x3AC1, 0x3AC2, 0x3AC3, 0x3AC4, 0x3AC5, 0x3AC6, /* U+3B58 */ 0x3AC7, 0x3AC8, 0x3AC9, 0x3AD0, 0x3AD1, 0x3AD2, 0x3AD3, 0x3AD4, /* U+3B60 */ 0x3AD5, 0x3AD6, 0x3AD7, 0x3AD8, 0x3AD9, 0x3AE0, 0x3AE1, 0x3AE2, /* U+3B68 */ 0x3AE3, 0x3AE4, 0x3AE5, 0x3AE6, 0x3AE7, 0x3AE8, 0x3AE9, 0x3AF0, /* U+3B70 */ 0x3AF1, 0x3AF2, 0x3AF3, 0x3AF4, 0x3AF5, 0x3AF6, 0x3AF7, 0x3AF8, /* U+3B78 */ 0x3AF9, 0x3B00, 0x3B01, 0x3B02, 0x3B03, 0x3B04, 0x3B05, 0x3B06, /* U+3B80 */ 0x3B07, 0x3B08, 0x3B09, 0x3B10, 0x3B11, 0x3B12, 0x3B13, 0x3B14, /* U+3B88 */ 0x3B15, 0x3B16, 0x3B17, 0x3B18, 0x3B19, 0x3B20, 0x3B21, 0x3B22, /* U+3B90 */ 0x3B23, 0x3B24, 0x3B25, 0x3B26, 0x3B27, 0x3B28, 0x3B29, 0x3B30, /* U+3B98 */ 0x3B31, 0x3B32, 0x3B33, 0x3B34, 0x3B35, 0x3B36, 0x3B37, 0x3B38, /* U+3BA0 */ 0x3B39, 0x3B40, 0x3B41, 0x3B42, 0x3B43, 0x3B44, 0x3B45, 0x3B46, /* U+3BA8 */ 0x3B47, 0x3B48, 0x3B49, 0x3B50, 0x3B51, 0x3B52, 0x3B53, 0x3B54, /* U+3BB0 */ 0x3B55, 0x3B56, 0x3B57, 0x3B58, 0x3B59, 0x3B60, 0x3B61, 0x3B62, /* U+3BB8 */ 0x3B63, 0x3B64, 0x3B65, 0x3B66, 0x3B67, 0x3B68, 0x3B69, 0x3B70, /* U+3BC0 */ 0x3B71, 0x3B72, 0x3B73, 0x3B74, 0x3B75, 0x3B76, 0x3B77, 0x3B78, /* U+3BC8 */ 0x3B79, 0x3B80, 0x3B81, 0x3B82, 0x3B83, 0x3B84, 0x3B85, 0x3B86, /* U+3BD0 */ 0x3B87, 0x3B88, 0x3B89, 0x3B90, 0x3B91, 0x3B92, 0x3B93, 0x3B94, /* U+3BD8 */ 0x3B95, 0x3B96, 0x3B97, 0x3B98, 0x3B99, 0x3BA0, 0x3BA1, 0x3BA2, /* U+3BE0 */ 0x3BA3, 0x3BA4, 0x3BA5, 0x3BA6, 0x3BA7, 0x3BA8, 0x3BA9, 0x3BB0, /* U+3BE8 */ 0x3BB1, 0x3BB2, 0x3BB3, 0x3BB4, 0x3BB5, 0x3BB6, 0x3BB7, 0x3BB8, /* U+3BF0 */ 0x3BB9, 0x3BC0, 0x3BC1, 0x3BC2, 0x3BC3, 0x3BC4, 0x3BC5, 0x3BC6, /* U+3BF8 */ 0x3BC7, 0x3BC8, 0x3BC9, 0x3BD0, 0x3BD1, 0x3BD2, 0x3BD3, 0x3BD4, /* U+3C00 */ 0x3BD5, 0x3BD6, 0x3BD7, 0x3BD8, 0x3BD9, 0x3BE0, 0x3BE1, 0x3BE2, /* U+3C08 */ 0x3BE3, 0x3BE4, 0x3BE5, 0x3BE6, 0x3BE7, 0x3BE8, 0x3BE9, 0x3BF0, /* U+3C10 */ 0x3BF1, 0x3BF2, 0x3BF3, 0x3BF4, 0x3BF5, 0x3BF6, 0x3BF7, 0x3BF8, /* U+3C18 */ 0x3BF9, 0x3C00, 0x3C01, 0x3C02, 0x3C03, 0x3C04, 0x3C05, 0x3C06, /* U+3C20 */ 0x3C07, 0x3C08, 0x3C09, 0x3C10, 0x3C11, 0x3C12, 0x3C13, 0x3C14, /* U+3C28 */ 0x3C15, 0x3C16, 0x3C17, 0x3C18, 0x3C19, 0x3C20, 0x3C21, 0x3C22, /* U+3C30 */ 0x3C23, 0x3C24, 0x3C25, 0x3C26, 0x3C27, 0x3C28, 0x3C29, 0x3C30, /* U+3C38 */ 0x3C31, 0x3C32, 0x3C33, 0x3C34, 0x3C35, 0x3C36, 0x3C37, 0x3C38, /* U+3C40 */ 0x3C39, 0x3C40, 0x3C41, 0x3C42, 0x3C43, 0x3C44, 0x3C45, 0x3C46, /* U+3C48 */ 0x3C47, 0x3C48, 0x3C49, 0x3C50, 0x3C51, 0x3C52, 0x3C53, 0x3C54, /* U+3C50 */ 0x3C55, 0x3C56, 0x3C57, 0x3C58, 0x3C59, 0x3C60, 0x3C61, 0x3C62, /* U+3C58 */ 0x3C63, 0x3C64, 0x3C65, 0x3C66, 0x3C67, 0x3C68, 0x3C69, 0x3C70, /* U+3C60 */ 0x3C71, 0x3C72, 0x3C73, 0x3C74, 0x3C75, 0x3C76, 0x3C77, 0x3C78, /* U+3C68 */ 0x3C79, 0x3C80, 0x3C81, 0x3C82, 0x3C83, 0x3C84, 0xFE69, 0x3C85, /* U+3C70 */ 0x3C86, 0x3C87, 0x3C88, 0x3C89, 0x3C90, 0x3C91, 0x3C92, 0x3C93, /* U+3C78 */ 0x3C94, 0x3C95, 0x3C96, 0x3C97, 0x3C98, 0x3C99, 0x3CA0, 0x3CA1, /* U+3C80 */ 0x3CA2, 0x3CA3, 0x3CA4, 0x3CA5, 0x3CA6, 0x3CA7, 0x3CA8, 0x3CA9, /* U+3C88 */ 0x3CB0, 0x3CB1, 0x3CB2, 0x3CB3, 0x3CB4, 0x3CB5, 0x3CB6, 0x3CB7, /* U+3C90 */ 0x3CB8, 0x3CB9, 0x3CC0, 0x3CC1, 0x3CC2, 0x3CC3, 0x3CC4, 0x3CC5, /* U+3C98 */ 0x3CC6, 0x3CC7, 0x3CC8, 0x3CC9, 0x3CD0, 0x3CD1, 0x3CD2, 0x3CD3, /* U+3CA0 */ 0x3CD4, 0x3CD5, 0x3CD6, 0x3CD7, 0x3CD8, 0x3CD9, 0x3CE0, 0x3CE1, /* U+3CA8 */ 0x3CE2, 0x3CE3, 0x3CE4, 0x3CE5, 0x3CE6, 0x3CE7, 0x3CE8, 0x3CE9, /* U+3CB0 */ 0x3CF0, 0x3CF1, 0x3CF2, 0x3CF3, 0x3CF4, 0x3CF5, 0x3CF6, 0x3CF7, /* U+3CB8 */ 0x3CF8, 0x3CF9, 0x3D00, 0x3D01, 0x3D02, 0x3D03, 0x3D04, 0x3D05, /* U+3CC0 */ 0x3D06, 0x3D07, 0x3D08, 0x3D09, 0x3D10, 0x3D11, 0x3D12, 0x3D13, /* U+3CC8 */ 0x3D14, 0x3D15, 0x3D16, 0x3D17, 0x3D18, 0x3D19, 0x3D20, 0x3D21, /* U+3CD0 */ 0x3D22, 0x3D23, 0x3D24, 0x3D25, 0x3D26, 0x3D27, 0x3D28, 0x3D29, /* U+3CD8 */ 0x3D30, 0x3D31, 0x3D32, 0x3D33, 0x3D34, 0x3D35, 0x3D36, 0x3D37, /* U+3CE0 */ 0xFE6A, /* Contiguous area: U+4056 .. U+415F */ /* U+4056 */ 0xFE6F, 0x42E3, /* U+4058 */ 0x42E4, 0x42E5, 0x42E6, 0x42E7, 0x42E8, 0x42E9, 0x42F0, 0x42F1, /* U+4060 */ 0x42F2, 0x42F3, 0x42F4, 0x42F5, 0x42F6, 0x42F7, 0x42F8, 0x42F9, /* U+4068 */ 0x4300, 0x4301, 0x4302, 0x4303, 0x4304, 0x4305, 0x4306, 0x4307, /* U+4070 */ 0x4308, 0x4309, 0x4310, 0x4311, 0x4312, 0x4313, 0x4314, 0x4315, /* U+4078 */ 0x4316, 0x4317, 0x4318, 0x4319, 0x4320, 0x4321, 0x4322, 0x4323, /* U+4080 */ 0x4324, 0x4325, 0x4326, 0x4327, 0x4328, 0x4329, 0x4330, 0x4331, /* U+4088 */ 0x4332, 0x4333, 0x4334, 0x4335, 0x4336, 0x4337, 0x4338, 0x4339, /* U+4090 */ 0x4340, 0x4341, 0x4342, 0x4343, 0x4344, 0x4345, 0x4346, 0x4347, /* U+4098 */ 0x4348, 0x4349, 0x4350, 0x4351, 0x4352, 0x4353, 0x4354, 0x4355, /* U+40A0 */ 0x4356, 0x4357, 0x4358, 0x4359, 0x4360, 0x4361, 0x4362, 0x4363, /* U+40A8 */ 0x4364, 0x4365, 0x4366, 0x4367, 0x4368, 0x4369, 0x4370, 0x4371, /* U+40B0 */ 0x4372, 0x4373, 0x4374, 0x4375, 0x4376, 0x4377, 0x4378, 0x4379, /* U+40B8 */ 0x4380, 0x4381, 0x4382, 0x4383, 0x4384, 0x4385, 0x4386, 0x4387, /* U+40C0 */ 0x4388, 0x4389, 0x4390, 0x4391, 0x4392, 0x4393, 0x4394, 0x4395, /* U+40C8 */ 0x4396, 0x4397, 0x4398, 0x4399, 0x43A0, 0x43A1, 0x43A2, 0x43A3, /* U+40D0 */ 0x43A4, 0x43A5, 0x43A6, 0x43A7, 0x43A8, 0x43A9, 0x43B0, 0x43B1, /* U+40D8 */ 0x43B2, 0x43B3, 0x43B4, 0x43B5, 0x43B6, 0x43B7, 0x43B8, 0x43B9, /* U+40E0 */ 0x43C0, 0x43C1, 0x43C2, 0x43C3, 0x43C4, 0x43C5, 0x43C6, 0x43C7, /* U+40E8 */ 0x43C8, 0x43C9, 0x43D0, 0x43D1, 0x43D2, 0x43D3, 0x43D4, 0x43D5, /* U+40F0 */ 0x43D6, 0x43D7, 0x43D8, 0x43D9, 0x43E0, 0x43E1, 0x43E2, 0x43E3, /* U+40F8 */ 0x43E4, 0x43E5, 0x43E6, 0x43E7, 0x43E8, 0x43E9, 0x43F0, 0x43F1, /* U+4100 */ 0x43F2, 0x43F3, 0x43F4, 0x43F5, 0x43F6, 0x43F7, 0x43F8, 0x43F9, /* U+4108 */ 0x4400, 0x4401, 0x4402, 0x4403, 0x4404, 0x4405, 0x4406, 0x4407, /* U+4110 */ 0x4408, 0x4409, 0x4410, 0x4411, 0x4412, 0x4413, 0x4414, 0x4415, /* U+4118 */ 0x4416, 0x4417, 0x4418, 0x4419, 0x4420, 0x4421, 0x4422, 0x4423, /* U+4120 */ 0x4424, 0x4425, 0x4426, 0x4427, 0x4428, 0x4429, 0x4430, 0x4431, /* U+4128 */ 0x4432, 0x4433, 0x4434, 0x4435, 0x4436, 0x4437, 0x4438, 0x4439, /* U+4130 */ 0x4440, 0x4441, 0x4442, 0x4443, 0x4444, 0x4445, 0x4446, 0x4447, /* U+4138 */ 0x4448, 0x4449, 0x4450, 0x4451, 0x4452, 0x4453, 0x4454, 0x4455, /* U+4140 */ 0x4456, 0x4457, 0x4458, 0x4459, 0x4460, 0x4461, 0x4462, 0x4463, /* U+4148 */ 0x4464, 0x4465, 0x4466, 0x4467, 0x4468, 0x4469, 0x4470, 0x4471, /* U+4150 */ 0x4472, 0x4473, 0x4474, 0x4475, 0x4476, 0x4477, 0x4478, 0x4479, /* U+4158 */ 0x4480, 0x4481, 0x4482, 0x4483, 0x4484, 0x4485, 0x4486, 0xFE70, /* Contiguous area: U+4337 .. U+44D6 */ /* U+4337 */ 0xFE72, /* U+4338 */ 0x4778, 0x4779, 0x4780, 0x4781, 0x4782, 0x4783, 0x4784, 0x4785, /* U+4340 */ 0x4786, 0x4787, 0x4788, 0x4789, 0x4790, 0x4791, 0x4792, 0x4793, /* U+4348 */ 0x4794, 0x4795, 0x4796, 0x4797, 0x4798, 0x4799, 0x47A0, 0x47A1, /* U+4350 */ 0x47A2, 0x47A3, 0x47A4, 0x47A5, 0x47A6, 0x47A7, 0x47A8, 0x47A9, /* U+4358 */ 0x47B0, 0x47B1, 0x47B2, 0x47B3, 0x47B4, 0x47B5, 0x47B6, 0x47B7, /* U+4360 */ 0x47B8, 0x47B9, 0x47C0, 0x47C1, 0x47C2, 0x47C3, 0x47C4, 0x47C5, /* U+4368 */ 0x47C6, 0x47C7, 0x47C8, 0x47C9, 0x47D0, 0x47D1, 0x47D2, 0x47D3, /* U+4370 */ 0x47D4, 0x47D5, 0x47D6, 0x47D7, 0x47D8, 0x47D9, 0x4800, 0x4801, /* U+4378 */ 0x4802, 0x4803, 0x4804, 0x4805, 0x4806, 0x4807, 0x4808, 0x4809, /* U+4380 */ 0x4810, 0x4811, 0x4812, 0x4813, 0x4814, 0x4815, 0x4816, 0x4817, /* U+4388 */ 0x4818, 0x4819, 0x4820, 0x4821, 0x4822, 0x4823, 0x4824, 0x4825, /* U+4390 */ 0x4826, 0x4827, 0x4828, 0x4829, 0x4830, 0x4831, 0x4832, 0x4833, /* U+4398 */ 0x4834, 0x4835, 0x4836, 0x4837, 0x4838, 0x4839, 0x4840, 0x4841, /* U+43A0 */ 0x4842, 0x4843, 0x4844, 0x4845, 0x4846, 0x4847, 0x4848, 0x4849, /* U+43A8 */ 0x4850, 0x4851, 0x4852, 0x4853, 0xFE78, 0x4854, 0x4855, 0x4856, /* U+43B0 */ 0x4857, 0xFE77, 0x4858, 0x4859, 0x4860, 0x4861, 0x4862, 0x4863, /* U+43B8 */ 0x4864, 0x4865, 0x4866, 0x4867, 0x4868, 0x4869, 0x4870, 0x4871, /* U+43C0 */ 0x4872, 0x4873, 0x4874, 0x4875, 0x4876, 0x4877, 0x4878, 0x4879, /* U+43C8 */ 0x4880, 0x4881, 0x4882, 0x4883, 0x4884, 0x4885, 0x4886, 0x4887, /* U+43D0 */ 0x4888, 0x4889, 0x4890, 0x4891, 0x4892, 0x4893, 0x4894, 0x4895, /* U+43D8 */ 0x4896, 0x4897, 0x4898, 0x4899, 0x48A0, 0xFE7A, 0x48A1, 0x48A2, /* U+43E0 */ 0x48A3, 0x48A4, 0x48A5, 0x48A6, 0x48A7, 0x48A8, 0x48A9, 0x48B0, /* U+43E8 */ 0x48B1, 0x48B2, 0x48B3, 0x48B4, 0x48B5, 0x48B6, 0x48B7, 0x48B8, /* U+43F0 */ 0x48B9, 0x48C0, 0x48C1, 0x48C2, 0x48C3, 0x48C4, 0x48C5, 0x48C6, /* U+43F8 */ 0x48C7, 0x48C8, 0x48C9, 0x48D0, 0x48D1, 0x48D2, 0x48D3, 0x48D4, /* U+4400 */ 0x48D5, 0x48D6, 0x48D7, 0x48D8, 0x48D9, 0x48E0, 0x48E1, 0x48E2, /* U+4408 */ 0x48E3, 0x48E4, 0x48E5, 0x48E6, 0x48E7, 0x48E8, 0x48E9, 0x48F0, /* U+4410 */ 0x48F1, 0x48F2, 0x48F3, 0x48F4, 0x48F5, 0x48F6, 0x48F7, 0x48F8, /* U+4418 */ 0x48F9, 0x4900, 0x4901, 0x4902, 0x4903, 0x4904, 0x4905, 0x4906, /* U+4420 */ 0x4907, 0x4908, 0x4909, 0x4910, 0x4911, 0x4912, 0x4913, 0x4914, /* U+4428 */ 0x4915, 0x4916, 0x4917, 0x4918, 0x4919, 0x4920, 0x4921, 0x4922, /* U+4430 */ 0x4923, 0x4924, 0x4925, 0x4926, 0x4927, 0x4928, 0x4929, 0x4930, /* U+4438 */ 0x4931, 0x4932, 0x4933, 0x4934, 0x4935, 0x4936, 0x4937, 0x4938, /* U+4440 */ 0x4939, 0x4940, 0x4941, 0x4942, 0x4943, 0x4944, 0x4945, 0x4946, /* U+4448 */ 0x4947, 0x4948, 0x4949, 0x4950, 0x4951, 0x4952, 0x4953, 0x4954, /* U+4450 */ 0x4955, 0x4956, 0x4957, 0x4958, 0x4959, 0x4960, 0x4961, 0x4962, /* U+4458 */ 0x4963, 0x4964, 0x4965, 0x4966, 0x4967, 0x4968, 0x4969, 0x4970, /* U+4460 */ 0x4971, 0x4972, 0x4973, 0x4974, 0x4975, 0x4976, 0x4977, 0x4978, /* U+4468 */ 0x4979, 0x4980, 0x4981, 0x4982, 0x4983, 0x4984, 0x4985, 0x4986, /* U+4470 */ 0x4987, 0x4988, 0x4989, 0x4990, 0x4991, 0x4992, 0x4993, 0x4994, /* U+4478 */ 0x4995, 0x4996, 0x4997, 0x4998, 0x4999, 0x49A0, 0x49A1, 0x49A2, /* U+4480 */ 0x49A3, 0x49A4, 0x49A5, 0x49A6, 0x49A7, 0x49A8, 0x49A9, 0x49B0, /* U+4488 */ 0x49B1, 0x49B2, 0x49B3, 0x49B4, 0x49B5, 0x49B6, 0x49B7, 0x49B8, /* U+4490 */ 0x49B9, 0x49C0, 0x49C1, 0x49C2, 0x49C3, 0x49C4, 0x49C5, 0x49C6, /* U+4498 */ 0x49C7, 0x49C8, 0x49C9, 0x49D0, 0x49D1, 0x49D2, 0x49D3, 0x49D4, /* U+44A0 */ 0x49D5, 0x49D6, 0x49D7, 0x49D8, 0x49D9, 0x49E0, 0x49E1, 0x49E2, /* U+44A8 */ 0x49E3, 0x49E4, 0x49E5, 0x49E6, 0x49E7, 0x49E8, 0x49E9, 0x49F0, /* U+44B0 */ 0x49F1, 0x49F2, 0x49F3, 0x49F4, 0x49F5, 0x49F6, 0x49F7, 0x49F8, /* U+44B8 */ 0x49F9, 0x4A00, 0x4A01, 0x4A02, 0x4A03, 0x4A04, 0x4A05, 0x4A06, /* U+44C0 */ 0x4A07, 0x4A08, 0x4A09, 0x4A10, 0x4A11, 0x4A12, 0x4A13, 0x4A14, /* U+44C8 */ 0x4A15, 0x4A16, 0x4A17, 0x4A18, 0x4A19, 0x4A20, 0x4A21, 0x4A22, /* U+44D0 */ 0x4A23, 0x4A24, 0x4A25, 0x4A26, 0x4A27, 0x4A28, 0xFE7B, /* Contiguous area: U+464C .. U+478D */ /* U+464C */ 0xFE7D, 0x4C82, 0x4C83, 0x4C84, /* U+4650 */ 0x4C85, 0x4C86, 0x4C87, 0x4C88, 0x4C89, 0x4C90, 0x4C91, 0x4C92, /* U+4658 */ 0x4C93, 0x4C94, 0x4C95, 0x4C96, 0x4C97, 0x4C98, 0x4C99, 0x4CA0, /* U+4660 */ 0x4CA1, 0xFE7C, 0x4CA2, 0x4CA3, 0x4CA4, 0x4CA5, 0x4CA6, 0x4CA7, /* U+4668 */ 0x4CA8, 0x4CA9, 0x4CB0, 0x4CB1, 0x4CB2, 0x4CB3, 0x4CB4, 0x4CB5, /* U+4670 */ 0x4CB6, 0x4CB7, 0x4CB8, 0x4CB9, 0x4CC0, 0x4CC1, 0x4CC2, 0x4CC3, /* U+4678 */ 0x4CC4, 0x4CC5, 0x4CC6, 0x4CC7, 0x4CC8, 0x4CC9, 0x4CD0, 0x4CD1, /* U+4680 */ 0x4CD2, 0x4CD3, 0x4CD4, 0x4CD5, 0x4CD6, 0x4CD7, 0x4CD8, 0x4CD9, /* U+4688 */ 0x4CE0, 0x4CE1, 0x4CE2, 0x4CE3, 0x4CE4, 0x4CE5, 0x4CE6, 0x4CE7, /* U+4690 */ 0x4CE8, 0x4CE9, 0x4CF0, 0x4CF1, 0x4CF2, 0x4CF3, 0x4CF4, 0x4CF5, /* U+4698 */ 0x4CF6, 0x4CF7, 0x4CF8, 0x4CF9, 0x4D00, 0x4D01, 0x4D02, 0x4D03, /* U+46A0 */ 0x4D04, 0x4D05, 0x4D06, 0x4D07, 0x4D08, 0x4D09, 0x4D10, 0x4D11, /* U+46A8 */ 0x4D12, 0x4D13, 0x4D14, 0x4D15, 0x4D16, 0x4D17, 0x4D18, 0x4D19, /* U+46B0 */ 0x4D20, 0x4D21, 0x4D22, 0x4D23, 0x4D24, 0x4D25, 0x4D26, 0x4D27, /* U+46B8 */ 0x4D28, 0x4D29, 0x4D30, 0x4D31, 0x4D32, 0x4D33, 0x4D34, 0x4D35, /* U+46C0 */ 0x4D36, 0x4D37, 0x4D38, 0x4D39, 0x4D40, 0x4D41, 0x4D42, 0x4D43, /* U+46C8 */ 0x4D44, 0x4D45, 0x4D46, 0x4D47, 0x4D48, 0x4D49, 0x4D50, 0x4D51, /* U+46D0 */ 0x4D52, 0x4D53, 0x4D54, 0x4D55, 0x4D56, 0x4D57, 0x4D58, 0x4D59, /* U+46D8 */ 0x4D60, 0x4D61, 0x4D62, 0x4D63, 0x4D64, 0x4D65, 0x4D66, 0x4D67, /* U+46E0 */ 0x4D68, 0x4D69, 0x4D70, 0x4D71, 0x4D72, 0x4D73, 0x4D74, 0x4D75, /* U+46E8 */ 0x4D76, 0x4D77, 0x4D78, 0x4D79, 0x4D80, 0x4D81, 0x4D82, 0x4D83, /* U+46F0 */ 0x4D84, 0x4D85, 0x4D86, 0x4D87, 0x4D88, 0x4D89, 0x4D90, 0x4D91, /* U+46F8 */ 0x4D92, 0x4D93, 0x4D94, 0x4D95, 0x4D96, 0x4D97, 0x4D98, 0x4D99, /* U+4700 */ 0x4DA0, 0x4DA1, 0x4DA2, 0x4DA3, 0x4DA4, 0x4DA5, 0x4DA6, 0x4DA7, /* U+4708 */ 0x4DA8, 0x4DA9, 0x4DB0, 0x4DB1, 0x4DB2, 0x4DB3, 0x4DB4, 0x4DB5, /* U+4710 */ 0x4DB6, 0x4DB7, 0x4DB8, 0x4DB9, 0x4DC0, 0x4DC1, 0x4DC2, 0x4DC3, /* U+4718 */ 0x4DC4, 0x4DC5, 0x4DC6, 0x4DC7, 0x4DC8, 0x4DC9, 0x4DD0, 0x4DD1, /* U+4720 */ 0x4DD2, 0x4DD3, 0x4DD4, 0xFE80, 0x4DD5, 0x4DD6, 0x4DD7, 0x4DD8, /* U+4728 */ 0x4DD9, 0xFE81, 0x4DE0, 0x4DE1, 0x4DE2, 0x4DE3, 0x4DE4, 0x4DE5, /* U+4730 */ 0x4DE6, 0x4DE7, 0x4DE8, 0x4DE9, 0x4DF0, 0x4DF1, 0x4DF2, 0x4DF3, /* U+4738 */ 0x4DF4, 0x4DF5, 0x4DF6, 0x4DF7, 0x4DF8, 0x4DF9, 0x4E00, 0x4E01, /* U+4740 */ 0x4E02, 0x4E03, 0x4E04, 0x4E05, 0x4E06, 0x4E07, 0x4E08, 0x4E09, /* U+4748 */ 0x4E10, 0x4E11, 0x4E12, 0x4E13, 0x4E14, 0x4E15, 0x4E16, 0x4E17, /* U+4750 */ 0x4E18, 0x4E19, 0x4E20, 0x4E21, 0x4E22, 0x4E23, 0x4E24, 0x4E25, /* U+4758 */ 0x4E26, 0x4E27, 0x4E28, 0x4E29, 0x4E30, 0x4E31, 0x4E32, 0x4E33, /* U+4760 */ 0x4E34, 0x4E35, 0x4E36, 0x4E37, 0x4E38, 0x4E39, 0x4E40, 0x4E41, /* U+4768 */ 0x4E42, 0x4E43, 0x4E44, 0x4E45, 0x4E46, 0x4E47, 0x4E48, 0x4E49, /* U+4770 */ 0x4E50, 0x4E51, 0x4E52, 0x4E53, 0x4E54, 0x4E55, 0x4E56, 0x4E57, /* U+4778 */ 0x4E58, 0x4E59, 0x4E60, 0x4E61, 0xFE82, 0x4E62, 0x4E63, 0x4E64, /* U+4780 */ 0x4E65, 0x4E66, 0x4E67, 0x4E68, 0x4E69, 0x4E70, 0x4E71, 0x4E72, /* U+4788 */ 0x4E73, 0x4E74, 0x4E75, 0x4E76, 0x4E77, 0xFE83, /* Contiguous area: U+4947 .. U+49B7 */ /* U+4947 */ 0xFE85, /* U+4948 */ 0x5159, 0x5160, 0x5161, 0x5162, 0x5163, 0x5164, 0x5165, 0x5166, /* U+4950 */ 0x5167, 0x5168, 0x5169, 0x5170, 0x5171, 0x5172, 0x5173, 0x5174, /* U+4958 */ 0x5175, 0x5176, 0x5177, 0x5178, 0x5179, 0x5180, 0x5181, 0x5182, /* U+4960 */ 0x5183, 0x5184, 0x5185, 0x5186, 0x5187, 0x5188, 0x5189, 0x5190, /* U+4968 */ 0x5191, 0x5192, 0x5193, 0x5194, 0x5195, 0x5196, 0x5197, 0x5198, /* U+4970 */ 0x5199, 0x51A0, 0x51A1, 0x51A2, 0x51A3, 0x51A4, 0x51A5, 0x51A6, /* U+4978 */ 0x51A7, 0x51A8, 0xFE86, 0x51A9, 0x51B0, 0xFE87, 0x51B1, 0x51B2, /* U+4980 */ 0x51B3, 0x51B4, 0xFE88, 0xFE89, 0x51B5, 0xFE8A, 0xFE8B, 0x51B6, /* U+4988 */ 0x51B7, 0x51B8, 0x51B9, 0x51C0, 0x51C1, 0x51C2, 0x51C3, 0x51C4, /* U+4990 */ 0x51C5, 0x51C6, 0x51C7, 0x51C8, 0x51C9, 0x51D0, 0x51D1, 0x51D2, /* U+4998 */ 0x51D3, 0x51D4, 0x51D5, 0xFE8D, 0x51D6, 0x51D7, 0x51D8, 0xFE8C, /* U+49A0 */ 0x51D9, 0x51E0, 0x51E1, 0x51E2, 0x51E3, 0x51E4, 0x51E5, 0x51E6, /* U+49A8 */ 0x51E7, 0x51E8, 0x51E9, 0x51F0, 0x51F1, 0x51F2, 0x51F3, 0x51F4, /* U+49B0 */ 0x51F5, 0x51F6, 0x51F7, 0x51F8, 0x51F9, 0x5200, 0xFE8F, 0xFE8E, /* Contiguous area: U+4C77 .. U+9FA5 */ /* U+4C77 */ 0xFE96, /* U+4C78 */ 0x5664, 0x5665, 0x5666, 0x5667, 0x5668, 0x5669, 0x5670, 0x5671, /* U+4C80 */ 0x5672, 0x5673, 0x5674, 0x5675, 0x5676, 0x5677, 0x5678, 0x5679, /* U+4C88 */ 0x5680, 0x5681, 0x5682, 0x5683, 0x5684, 0x5685, 0x5686, 0x5687, /* U+4C90 */ 0x5688, 0x5689, 0x5690, 0x5691, 0x5692, 0x5693, 0x5694, 0x5695, /* U+4C98 */ 0x5696, 0x5697, 0x5698, 0x5699, 0x56A0, 0x56A1, 0x56A2, 0xFE93, /* U+4CA0 */ 0xFE94, 0xFE95, 0xFE97, 0xFE92, 0x56A3, 0x56A4, 0x56A5, 0x56A6, /* U+4CA8 */ 0x56A7, 0x56A8, 0x56A9, 0x56B0, 0x56B1, 0x56B2, 0x56B3, 0x56B4, /* U+4CB0 */ 0x56B5, 0x56B6, 0x56B7, 0x56B8, 0x56B9, 0x56C0, 0x56C1, 0x56C2, /* U+4CB8 */ 0x56C3, 0x56C4, 0x56C5, 0x56C6, 0x56C7, 0x56C8, 0x56C9, 0x56D0, /* U+4CC0 */ 0x56D1, 0x56D2, 0x56D3, 0x56D4, 0x56D5, 0x56D6, 0x56D7, 0x56D8, /* U+4CC8 */ 0x56D9, 0x56E0, 0x56E1, 0x56E2, 0x56E3, 0x56E4, 0x56E5, 0x56E6, /* U+4CD0 */ 0x56E7, 0x56E8, 0x56E9, 0x56F0, 0x56F1, 0x56F2, 0x56F3, 0x56F4, /* U+4CD8 */ 0x56F5, 0x56F6, 0x56F7, 0x56F8, 0x56F9, 0x5700, 0x5701, 0x5702, /* U+4CE0 */ 0x5703, 0x5704, 0x5705, 0x5706, 0x5707, 0x5708, 0x5709, 0x5710, /* U+4CE8 */ 0x5711, 0x5712, 0x5713, 0x5714, 0x5715, 0x5716, 0x5717, 0x5718, /* U+4CF0 */ 0x5719, 0x5720, 0x5721, 0x5722, 0x5723, 0x5724, 0x5725, 0x5726, /* U+4CF8 */ 0x5727, 0x5728, 0x5729, 0x5730, 0x5731, 0x5732, 0x5733, 0x5734, /* U+4D00 */ 0x5735, 0x5736, 0x5737, 0x5738, 0x5739, 0x5740, 0x5741, 0x5742, /* U+4D08 */ 0x5743, 0x5744, 0x5745, 0x5746, 0x5747, 0x5748, 0x5749, 0x5750, /* U+4D10 */ 0x5751, 0x5752, 0x5753, 0xFE98, 0xFE99, 0xFE9A, 0xFE9B, 0xFE9C, /* U+4D18 */ 0xFE9D, 0xFE9E, 0x5754, 0x5755, 0x5756, 0x5757, 0x5758, 0x5759, /* U+4D20 */ 0x5760, 0x5761, 0x5762, 0x5763, 0x5764, 0x5765, 0x5766, 0x5767, /* U+4D28 */ 0x5768, 0x5769, 0x5770, 0x5771, 0x5772, 0x5773, 0x5774, 0x5775, /* U+4D30 */ 0x5776, 0x5777, 0x5778, 0x5779, 0x5780, 0x5781, 0x5782, 0x5783, /* U+4D38 */ 0x5784, 0x5785, 0x5786, 0x5787, 0x5788, 0x5789, 0x5790, 0x5791, /* U+4D40 */ 0x5792, 0x5793, 0x5794, 0x5795, 0x5796, 0x5797, 0x5798, 0x5799, /* U+4D48 */ 0x57A0, 0x57A1, 0x57A2, 0x57A3, 0x57A4, 0x57A5, 0x57A6, 0x57A7, /* U+4D50 */ 0x57A8, 0x57A9, 0x57B0, 0x57B1, 0x57B2, 0x57B3, 0x57B4, 0x57B5, /* U+4D58 */ 0x57B6, 0x57B7, 0x57B8, 0x57B9, 0x57C0, 0x57C1, 0x57C2, 0x57C3, /* U+4D60 */ 0x57C4, 0x57C5, 0x57C6, 0x57C7, 0x57C8, 0x57C9, 0x57D0, 0x57D1, /* U+4D68 */ 0x57D2, 0x57D3, 0x57D4, 0x57D5, 0x57D6, 0x57D7, 0x57D8, 0x57D9, /* U+4D70 */ 0x5800, 0x5801, 0x5802, 0x5803, 0x5804, 0x5805, 0x5806, 0x5807, /* U+4D78 */ 0x5808, 0x5809, 0x5810, 0x5811, 0x5812, 0x5813, 0x5814, 0x5815, /* U+4D80 */ 0x5816, 0x5817, 0x5818, 0x5819, 0x5820, 0x5821, 0x5822, 0x5823, /* U+4D88 */ 0x5824, 0x5825, 0x5826, 0x5827, 0x5828, 0x5829, 0x5830, 0x5831, /* U+4D90 */ 0x5832, 0x5833, 0x5834, 0x5835, 0x5836, 0x5837, 0x5838, 0x5839, /* U+4D98 */ 0x5840, 0x5841, 0x5842, 0x5843, 0x5844, 0x5845, 0x5846, 0x5847, /* U+4DA0 */ 0x5848, 0x5849, 0x5850, 0x5851, 0x5852, 0x5853, 0x5854, 0x5855, /* U+4DA8 */ 0x5856, 0x5857, 0x5858, 0x5859, 0x5860, 0x5861, 0xFE9F, 0x5862, /* U+4DB0 */ 0x5863, 0x5864, 0x5865, 0x5866, 0x5867, 0x5868, 0x5869, 0x5870, /* U+4DB8 */ 0x5871, 0x5872, 0x5873, 0x5874, 0x5875, 0x5876, 0x5877, 0x5878, /* U+4DC0 */ 0x5879, 0x5880, 0x5881, 0x5882, 0x5883, 0x5884, 0x5885, 0x5886, /* U+4DC8 */ 0x5887, 0x5888, 0x5889, 0x5890, 0x5891, 0x5892, 0x5893, 0x5894, /* U+4DD0 */ 0x5895, 0x5896, 0x5897, 0x5898, 0x5899, 0x58A0, 0x58A1, 0x58A2, /* U+4DD8 */ 0x58A3, 0x58A4, 0x58A5, 0x58A6, 0x58A7, 0x58A8, 0x58A9, 0x58B0, /* U+4DE0 */ 0x58B1, 0x58B2, 0x58B3, 0x58B4, 0x58B5, 0x58B6, 0x58B7, 0x58B8, /* U+4DE8 */ 0x58B9, 0x58C0, 0x58C1, 0x58C2, 0x58C3, 0x58C4, 0x58C5, 0x58C6, /* U+4DF0 */ 0x58C7, 0x58C8, 0x58C9, 0x58D0, 0x58D1, 0x58D2, 0x58D3, 0x58D4, /* U+4DF8 */ 0x58D5, 0x58D6, 0x58D7, 0x58D8, 0x58D9, 0x58E0, 0x58E1, 0x58E2, /* U+4E00 */ 0xD2BB, 0xB6A1, 0x8140, 0xC6DF, 0x8141, 0x8142, 0x8143, 0xCDF2, /* U+4E08 */ 0xD5C9, 0xC8FD, 0xC9CF, 0xCFC2, 0xD8A2, 0xB2BB, 0xD3EB, 0x8144, /* U+4E10 */ 0xD8A4, 0xB3F3, 0x8145, 0xD7A8, 0xC7D2, 0xD8A7, 0xCAC0, 0x8146, /* U+4E18 */ 0xC7F0, 0xB1FB, 0xD2B5, 0xB4D4, 0xB6AB, 0xCBBF, 0xD8A9, 0x8147, /* U+4E20 */ 0x8148, 0x8149, 0xB6AA, 0x814A, 0xC1BD, 0xD1CF, 0x814B, 0xC9A5, /* U+4E28 */ 0xD8AD, 0x814C, 0xB8F6, 0xD1BE, 0xE3DC, 0xD6D0, 0x814D, 0x814E, /* U+4E30 */ 0xB7E1, 0x814F, 0xB4AE, 0x8150, 0xC1D9, 0x8151, 0xD8BC, 0x8152, /* U+4E38 */ 0xCDE8, 0xB5A4, 0xCEAA, 0xD6F7, 0x8153, 0xC0F6, 0xBED9, 0xD8AF, /* U+4E40 */ 0x8154, 0x8155, 0x8156, 0xC4CB, 0x8157, 0xBEC3, 0x8158, 0xD8B1, /* U+4E48 */ 0xC3B4, 0xD2E5, 0x8159, 0xD6AE, 0xCEDA, 0xD5A7, 0xBAF5, 0xB7A6, /* U+4E50 */ 0xC0D6, 0x815A, 0xC6B9, 0xC5D2, 0xC7C7, 0x815B, 0xB9D4, 0x815C, /* U+4E58 */ 0xB3CB, 0xD2D2, 0x815D, 0x815E, 0xD8BF, 0xBEC5, 0xC6F2, 0xD2B2, /* U+4E60 */ 0xCFB0, 0xCFE7, 0x815F, 0x8160, 0x8161, 0x8162, 0xCAE9, 0x8163, /* U+4E68 */ 0x8164, 0xD8C0, 0x8165, 0x8166, 0x8167, 0x8168, 0x8169, 0x816A, /* U+4E70 */ 0xC2F2, 0xC2D2, 0x816B, 0xC8E9, 0x816C, 0x816D, 0x816E, 0x816F, /* U+4E78 */ 0x8170, 0x8171, 0x8172, 0x8173, 0x8174, 0x8175, 0xC7AC, 0x8176, /* U+4E80 */ 0x8177, 0x8178, 0x8179, 0x817A, 0x817B, 0x817C, 0xC1CB, 0x817D, /* U+4E88 */ 0xD3E8, 0xD5F9, 0x817E, 0xCAC2, 0xB6FE, 0xD8A1, 0xD3DA, 0xBFF7, /* U+4E90 */ 0x8180, 0xD4C6, 0xBBA5, 0xD8C1, 0xCEE5, 0xBEAE, 0x8181, 0x8182, /* U+4E98 */ 0xD8A8, 0x8183, 0xD1C7, 0xD0A9, 0x8184, 0x8185, 0x8186, 0xD8BD, /* U+4EA0 */ 0xD9EF, 0xCDF6, 0xBFBA, 0x8187, 0xBDBB, 0xBAA5, 0xD2E0, 0xB2FA, /* U+4EA8 */ 0xBAE0, 0xC4B6, 0x8188, 0xCFED, 0xBEA9, 0xCDA4, 0xC1C1, 0x8189, /* U+4EB0 */ 0x818A, 0x818B, 0xC7D7, 0xD9F1, 0x818C, 0xD9F4, 0x818D, 0x818E, /* U+4EB8 */ 0x818F, 0x8190, 0xC8CB, 0xD8E9, 0x8191, 0x8192, 0x8193, 0xD2DA, /* U+4EC0 */ 0xCAB2, 0xC8CA, 0xD8EC, 0xD8EA, 0xD8C6, 0xBDF6, 0xC6CD, 0xB3F0, /* U+4EC8 */ 0x8194, 0xD8EB, 0xBDF1, 0xBDE9, 0x8195, 0xC8D4, 0xB4D3, 0x8196, /* U+4ED0 */ 0x8197, 0xC2D8, 0x8198, 0xB2D6, 0xD7D0, 0xCACB, 0xCBFB, 0xD5CC, /* U+4ED8 */ 0xB8B6, 0xCFC9, 0x8199, 0x819A, 0x819B, 0xD9DA, 0xD8F0, 0xC7AA, /* U+4EE0 */ 0x819C, 0xD8EE, 0x819D, 0xB4FA, 0xC1EE, 0xD2D4, 0x819E, 0x819F, /* U+4EE8 */ 0xD8ED, 0x81A0, 0xD2C7, 0xD8EF, 0xC3C7, 0x81A1, 0x81A2, 0x81A3, /* U+4EF0 */ 0xD1F6, 0x81A4, 0xD6D9, 0xD8F2, 0x81A5, 0xD8F5, 0xBCFE, 0xBCDB, /* U+4EF8 */ 0x81A6, 0x81A7, 0x81A8, 0xC8CE, 0x81A9, 0xB7DD, 0x81AA, 0xB7C2, /* U+4F00 */ 0x81AB, 0xC6F3, 0x81AC, 0x81AD, 0x81AE, 0x81AF, 0x81B0, 0x81B1, /* U+4F08 */ 0x81B2, 0xD8F8, 0xD2C1, 0x81B3, 0x81B4, 0xCEE9, 0xBCBF, 0xB7FC, /* U+4F10 */ 0xB7A5, 0xD0DD, 0x81B5, 0x81B6, 0x81B7, 0x81B8, 0x81B9, 0xD6DA, /* U+4F18 */ 0xD3C5, 0xBBEF, 0xBBE1, 0xD8F1, 0x81BA, 0x81BB, 0xC9A1, 0xCEB0, /* U+4F20 */ 0xB4AB, 0x81BC, 0xD8F3, 0x81BD, 0xC9CB, 0xD8F6, 0xC2D7, 0xD8F7, /* U+4F28 */ 0x81BE, 0x81BF, 0xCEB1, 0xD8F9, 0x81C0, 0x81C1, 0x81C2, 0xB2AE, /* U+4F30 */ 0xB9C0, 0x81C3, 0xD9A3, 0x81C4, 0xB0E9, 0x81C5, 0xC1E6, 0x81C6, /* U+4F38 */ 0xC9EC, 0x81C7, 0xCBC5, 0x81C8, 0xCBC6, 0xD9A4, 0x81C9, 0x81CA, /* U+4F40 */ 0x81CB, 0x81CC, 0x81CD, 0xB5E8, 0x81CE, 0x81CF, 0xB5AB, 0x81D0, /* U+4F48 */ 0x81D1, 0x81D2, 0x81D3, 0x81D4, 0x81D5, 0xCEBB, 0xB5CD, 0xD7A1, /* U+4F50 */ 0xD7F4, 0xD3D3, 0x81D6, 0xCCE5, 0x81D7, 0xBACE, 0x81D8, 0xD9A2, /* U+4F58 */ 0xD9DC, 0xD3E0, 0xD8FD, 0xB7F0, 0xD7F7, 0xD8FE, 0xD8FA, 0xD9A1, /* U+4F60 */ 0xC4E3, 0x81D9, 0x81DA, 0xD3B6, 0xD8F4, 0xD9DD, 0x81DB, 0xD8FB, /* U+4F68 */ 0x81DC, 0xC5E5, 0x81DD, 0x81DE, 0xC0D0, 0x81DF, 0x81E0, 0xD1F0, /* U+4F70 */ 0xB0DB, 0x81E1, 0x81E2, 0xBCD1, 0xD9A6, 0x81E3, 0xD9A5, 0x81E4, /* U+4F78 */ 0x81E5, 0x81E6, 0x81E7, 0xD9AC, 0xD9AE, 0x81E8, 0xD9AB, 0xCAB9, /* U+4F80 */ 0x81E9, 0x81EA, 0x81EB, 0xD9A9, 0xD6B6, 0x81EC, 0x81ED, 0x81EE, /* U+4F88 */ 0xB3DE, 0xD9A8, 0x81EF, 0xC0FD, 0x81F0, 0xCACC, 0x81F1, 0xD9AA, /* U+4F90 */ 0x81F2, 0xD9A7, 0x81F3, 0x81F4, 0xD9B0, 0x81F5, 0x81F6, 0xB6B1, /* U+4F98 */ 0x81F7, 0x81F8, 0x81F9, 0xB9A9, 0x81FA, 0xD2C0, 0x81FB, 0x81FC, /* U+4FA0 */ 0xCFC0, 0x81FD, 0x81FE, 0xC2C2, 0x8240, 0xBDC4, 0xD5EC, 0xB2E0, /* U+4FA8 */ 0xC7C8, 0xBFEB, 0xD9AD, 0x8241, 0xD9AF, 0x8242, 0xCEEA, 0xBAEE, /* U+4FB0 */ 0x8243, 0x8244, 0x8245, 0x8246, 0x8247, 0xC7D6, 0x8248, 0x8249, /* U+4FB8 */ 0x824A, 0x824B, 0x824C, 0x824D, 0x824E, 0x824F, 0x8250, 0xB1E3, /* U+4FC0 */ 0x8251, 0x8252, 0x8253, 0xB4D9, 0xB6ED, 0xD9B4, 0x8254, 0x8255, /* U+4FC8 */ 0x8256, 0x8257, 0xBFA1, 0x8258, 0x8259, 0x825A, 0xD9DE, 0xC7CE, /* U+4FD0 */ 0xC0FE, 0xD9B8, 0x825B, 0x825C, 0x825D, 0x825E, 0x825F, 0xCBD7, /* U+4FD8 */ 0xB7FD, 0x8260, 0xD9B5, 0x8261, 0xD9B7, 0xB1A3, 0xD3E1, 0xD9B9, /* U+4FE0 */ 0x8262, 0xD0C5, 0x8263, 0xD9B6, 0x8264, 0x8265, 0xD9B1, 0x8266, /* U+4FE8 */ 0xD9B2, 0xC1A9, 0xD9B3, 0x8267, 0x8268, 0xBCF3, 0xD0DE, 0xB8A9, /* U+4FF0 */ 0x8269, 0xBEE3, 0x826A, 0xD9BD, 0x826B, 0x826C, 0x826D, 0x826E, /* U+4FF8 */ 0xD9BA, 0x826F, 0xB0B3, 0x8270, 0x8271, 0x8272, 0xD9C2, 0x8273, /* U+5000 */ 0x8274, 0x8275, 0x8276, 0x8277, 0x8278, 0x8279, 0x827A, 0x827B, /* U+5008 */ 0x827C, 0x827D, 0x827E, 0x8280, 0xD9C4, 0xB1B6, 0x8281, 0xD9BF, /* U+5010 */ 0x8282, 0x8283, 0xB5B9, 0x8284, 0xBEF3, 0x8285, 0x8286, 0x8287, /* U+5018 */ 0xCCC8, 0xBAF2, 0xD2D0, 0x8288, 0xD9C3, 0x8289, 0x828A, 0xBDE8, /* U+5020 */ 0x828B, 0xB3AB, 0x828C, 0x828D, 0x828E, 0xD9C5, 0xBEEB, 0x828F, /* U+5028 */ 0xD9C6, 0xD9BB, 0xC4DF, 0x8290, 0xD9BE, 0xD9C1, 0xD9C0, 0x8291, /* U+5030 */ 0x8292, 0x8293, 0x8294, 0x8295, 0x8296, 0x8297, 0x8298, 0x8299, /* U+5038 */ 0x829A, 0x829B, 0xD5AE, 0x829C, 0xD6B5, 0x829D, 0xC7E3, 0x829E, /* U+5040 */ 0x829F, 0x82A0, 0x82A1, 0xD9C8, 0x82A2, 0x82A3, 0x82A4, 0xBCD9, /* U+5048 */ 0xD9CA, 0x82A5, 0x82A6, 0x82A7, 0xD9BC, 0x82A8, 0xD9CB, 0xC6AB, /* U+5050 */ 0x82A9, 0x82AA, 0x82AB, 0x82AC, 0x82AD, 0xD9C9, 0x82AE, 0x82AF, /* U+5058 */ 0x82B0, 0x82B1, 0xD7F6, 0x82B2, 0xCDA3, 0x82B3, 0x82B4, 0x82B5, /* U+5060 */ 0x82B6, 0x82B7, 0x82B8, 0x82B9, 0x82BA, 0xBDA1, 0x82BB, 0x82BC, /* U+5068 */ 0x82BD, 0x82BE, 0x82BF, 0x82C0, 0xD9CC, 0x82C1, 0x82C2, 0x82C3, /* U+5070 */ 0x82C4, 0x82C5, 0x82C6, 0x82C7, 0x82C8, 0x82C9, 0xC5BC, 0xCDB5, /* U+5078 */ 0x82CA, 0x82CB, 0x82CC, 0xD9CD, 0x82CD, 0x82CE, 0xD9C7, 0xB3A5, /* U+5080 */ 0xBFFE, 0x82CF, 0x82D0, 0x82D1, 0x82D2, 0xB8B5, 0x82D3, 0x82D4, /* U+5088 */ 0xC0FC, 0x82D5, 0x82D6, 0x82D7, 0x82D8, 0xB0F8, 0x82D9, 0x82DA, /* U+5090 */ 0x82DB, 0x82DC, 0x82DD, 0x82DE, 0x82DF, 0x82E0, 0x82E1, 0x82E2, /* U+5098 */ 0x82E3, 0x82E4, 0x82E5, 0x82E6, 0x82E7, 0x82E8, 0x82E9, 0x82EA, /* U+50A0 */ 0x82EB, 0x82EC, 0x82ED, 0xB4F6, 0x82EE, 0xD9CE, 0x82EF, 0xD9CF, /* U+50A8 */ 0xB4A2, 0xD9D0, 0x82F0, 0x82F1, 0xB4DF, 0x82F2, 0x82F3, 0x82F4, /* U+50B0 */ 0x82F5, 0x82F6, 0xB0C1, 0x82F7, 0x82F8, 0x82F9, 0x82FA, 0x82FB, /* U+50B8 */ 0x82FC, 0x82FD, 0xD9D1, 0xC9B5, 0x82FE, 0x8340, 0x8341, 0x8342, /* U+50C0 */ 0x8343, 0x8344, 0x8345, 0x8346, 0x8347, 0x8348, 0x8349, 0x834A, /* U+50C8 */ 0x834B, 0x834C, 0x834D, 0x834E, 0x834F, 0x8350, 0x8351, 0xCFF1, /* U+50D0 */ 0x8352, 0x8353, 0x8354, 0x8355, 0x8356, 0x8357, 0xD9D2, 0x8358, /* U+50D8 */ 0x8359, 0x835A, 0xC1C5, 0x835B, 0x835C, 0x835D, 0x835E, 0x835F, /* U+50E0 */ 0x8360, 0x8361, 0x8362, 0x8363, 0x8364, 0x8365, 0xD9D6, 0xC9AE, /* U+50E8 */ 0x8366, 0x8367, 0x8368, 0x8369, 0xD9D5, 0xD9D4, 0xD9D7, 0x836A, /* U+50F0 */ 0x836B, 0x836C, 0x836D, 0xCBDB, 0x836E, 0xBDA9, 0x836F, 0x8370, /* U+50F8 */ 0x8371, 0x8372, 0x8373, 0xC6A7, 0x8374, 0x8375, 0x8376, 0x8377, /* U+5100 */ 0x8378, 0x8379, 0x837A, 0x837B, 0x837C, 0x837D, 0xD9D3, 0xD9D8, /* U+5108 */ 0x837E, 0x8380, 0x8381, 0xD9D9, 0x8382, 0x8383, 0x8384, 0x8385, /* U+5110 */ 0x8386, 0x8387, 0xC8E5, 0x8388, 0x8389, 0x838A, 0x838B, 0x838C, /* U+5118 */ 0x838D, 0x838E, 0x838F, 0x8390, 0x8391, 0x8392, 0x8393, 0x8394, /* U+5120 */ 0x8395, 0xC0DC, 0x8396, 0x8397, 0x8398, 0x8399, 0x839A, 0x839B, /* U+5128 */ 0x839C, 0x839D, 0x839E, 0x839F, 0x83A0, 0x83A1, 0x83A2, 0x83A3, /* U+5130 */ 0x83A4, 0x83A5, 0x83A6, 0x83A7, 0x83A8, 0x83A9, 0x83AA, 0x83AB, /* U+5138 */ 0x83AC, 0x83AD, 0x83AE, 0x83AF, 0x83B0, 0x83B1, 0x83B2, 0xB6F9, /* U+5140 */ 0xD8A3, 0xD4CA, 0x83B3, 0xD4AA, 0xD0D6, 0xB3E4, 0xD5D7, 0x83B4, /* U+5148 */ 0xCFC8, 0xB9E2, 0x83B5, 0xBFCB, 0x83B6, 0xC3E2, 0x83B7, 0x83B8, /* U+5150 */ 0x83B9, 0xB6D2, 0x83BA, 0x83BB, 0xCDC3, 0xD9EE, 0xD9F0, 0x83BC, /* U+5158 */ 0x83BD, 0x83BE, 0xB5B3, 0x83BF, 0xB6B5, 0x83C0, 0x83C1, 0x83C2, /* U+5160 */ 0x83C3, 0x83C4, 0xBEA4, 0x83C5, 0x83C6, 0xC8EB, 0x83C7, 0x83C8, /* U+5168 */ 0xC8AB, 0x83C9, 0x83CA, 0xB0CB, 0xB9AB, 0xC1F9, 0xD9E2, 0x83CB, /* U+5170 */ 0xC0BC, 0xB9B2, 0x83CC, 0xB9D8, 0xD0CB, 0xB1F8, 0xC6E4, 0xBEDF, /* U+5178 */ 0xB5E4, 0xD7C8, 0x83CD, 0xD1F8, 0xBCE6, 0xCADE, 0x83CE, 0x83CF, /* U+5180 */ 0xBCBD, 0xD9E6, 0xD8E7, 0x83D0, 0x83D1, 0xC4DA, 0x83D2, 0x83D3, /* U+5188 */ 0xB8D4, 0xC8BD, 0x83D4, 0x83D5, 0xB2E1, 0xD4D9, 0x83D6, 0x83D7, /* U+5190 */ 0x83D8, 0x83D9, 0xC3B0, 0x83DA, 0x83DB, 0xC3E1, 0xDAA2, 0xC8DF, /* U+5198 */ 0x83DC, 0xD0B4, 0x83DD, 0xBEFC, 0xC5A9, 0x83DE, 0x83DF, 0x83E0, /* U+51A0 */ 0xB9DA, 0x83E1, 0xDAA3, 0x83E2, 0xD4A9, 0xDAA4, 0x83E3, 0x83E4, /* U+51A8 */ 0x83E5, 0x83E6, 0x83E7, 0xD9FB, 0xB6AC, 0x83E8, 0x83E9, 0xB7EB, /* U+51B0 */ 0xB1F9, 0xD9FC, 0xB3E5, 0xBEF6, 0x83EA, 0xBFF6, 0xD2B1, 0xC0E4, /* U+51B8 */ 0x83EB, 0x83EC, 0x83ED, 0xB6B3, 0xD9FE, 0xD9FD, 0x83EE, 0x83EF, /* U+51C0 */ 0xBEBB, 0x83F0, 0x83F1, 0x83F2, 0xC6E0, 0x83F3, 0xD7BC, 0xDAA1, /* U+51C8 */ 0x83F4, 0xC1B9, 0x83F5, 0xB5F2, 0xC1E8, 0x83F6, 0x83F7, 0xBCF5, /* U+51D0 */ 0x83F8, 0xB4D5, 0x83F9, 0x83FA, 0x83FB, 0x83FC, 0x83FD, 0x83FE, /* U+51D8 */ 0x8440, 0x8441, 0x8442, 0xC1DD, 0x8443, 0xC4FD, 0x8444, 0x8445, /* U+51E0 */ 0xBCB8, 0xB7B2, 0x8446, 0x8447, 0xB7EF, 0x8448, 0x8449, 0x844A, /* U+51E8 */ 0x844B, 0x844C, 0x844D, 0xD9EC, 0x844E, 0xC6BE, 0x844F, 0xBFAD, /* U+51F0 */ 0xBBCB, 0x8450, 0x8451, 0xB5CA, 0x8452, 0xDBC9, 0xD0D7, 0x8453, /* U+51F8 */ 0xCDB9, 0xB0BC, 0xB3F6, 0xBBF7, 0xDBCA, 0xBAAF, 0x8454, 0xD4E4, /* U+5200 */ 0xB5B6, 0xB5F3, 0xD8D6, 0xC8D0, 0x8455, 0x8456, 0xB7D6, 0xC7D0, /* U+5208 */ 0xD8D7, 0x8457, 0xBFAF, 0x8458, 0x8459, 0xDBBB, 0xD8D8, 0x845A, /* U+5210 */ 0x845B, 0xD0CC, 0xBBAE, 0x845C, 0x845D, 0x845E, 0xEBBE, 0xC1D0, /* U+5218 */ 0xC1F5, 0xD4F2, 0xB8D5, 0xB4B4, 0x845F, 0xB3F5, 0x8460, 0x8461, /* U+5220 */ 0xC9BE, 0x8462, 0x8463, 0x8464, 0xC5D0, 0x8465, 0x8466, 0x8467, /* U+5228 */ 0xC5D9, 0xC0FB, 0x8468, 0xB1F0, 0x8469, 0xD8D9, 0xB9CE, 0x846A, /* U+5230 */ 0xB5BD, 0x846B, 0x846C, 0xD8DA, 0x846D, 0x846E, 0xD6C6, 0xCBA2, /* U+5238 */ 0xC8AF, 0xC9B2, 0xB4CC, 0xBFCC, 0x846F, 0xB9F4, 0x8470, 0xD8DB, /* U+5240 */ 0xD8DC, 0xB6E7, 0xBCC1, 0xCCEA, 0x8471, 0x8472, 0x8473, 0x8474, /* U+5248 */ 0x8475, 0x8476, 0xCFF7, 0x8477, 0xD8DD, 0xC7B0, 0x8478, 0x8479, /* U+5250 */ 0xB9D0, 0xBDA3, 0x847A, 0x847B, 0xCCDE, 0x847C, 0xC6CA, 0x847D, /* U+5258 */ 0x847E, 0x8480, 0x8481, 0x8482, 0xD8E0, 0x8483, 0xD8DE, 0x8484, /* U+5260 */ 0x8485, 0xD8DF, 0x8486, 0x8487, 0x8488, 0xB0FE, 0x8489, 0xBEE7, /* U+5268 */ 0x848A, 0xCAA3, 0xBCF4, 0x848B, 0x848C, 0x848D, 0x848E, 0xB8B1, /* U+5270 */ 0x848F, 0x8490, 0xB8EE, 0x8491, 0x8492, 0x8493, 0x8494, 0x8495, /* U+5278 */ 0x8496, 0x8497, 0x8498, 0x8499, 0x849A, 0xD8E2, 0x849B, 0xBDCB, /* U+5280 */ 0x849C, 0xD8E4, 0xD8E3, 0x849D, 0x849E, 0x849F, 0x84A0, 0x84A1, /* U+5288 */ 0xC5FC, 0x84A2, 0x84A3, 0x84A4, 0x84A5, 0x84A6, 0x84A7, 0x84A8, /* U+5290 */ 0xD8E5, 0x84A9, 0x84AA, 0xD8E6, 0x84AB, 0x84AC, 0x84AD, 0x84AE, /* U+5298 */ 0x84AF, 0x84B0, 0x84B1, 0xC1A6, 0x84B2, 0xC8B0, 0xB0EC, 0xB9A6, /* U+52A0 */ 0xBCD3, 0xCEF1, 0xDBBD, 0xC1D3, 0x84B3, 0x84B4, 0x84B5, 0x84B6, /* U+52A8 */ 0xB6AF, 0xD6FA, 0xC5AC, 0xBDD9, 0xDBBE, 0xDBBF, 0x84B7, 0x84B8, /* U+52B0 */ 0x84B9, 0xC0F8, 0xBEA2, 0xC0CD, 0x84BA, 0x84BB, 0x84BC, 0x84BD, /* U+52B8 */ 0x84BE, 0x84BF, 0x84C0, 0x84C1, 0x84C2, 0x84C3, 0xDBC0, 0xCAC6, /* U+52C0 */ 0x84C4, 0x84C5, 0x84C6, 0xB2AA, 0x84C7, 0x84C8, 0x84C9, 0xD3C2, /* U+52C8 */ 0x84CA, 0xC3E3, 0x84CB, 0xD1AB, 0x84CC, 0x84CD, 0x84CE, 0x84CF, /* U+52D0 */ 0xDBC2, 0x84D0, 0xC0D5, 0x84D1, 0x84D2, 0x84D3, 0xDBC3, 0x84D4, /* U+52D8 */ 0xBFB1, 0x84D5, 0x84D6, 0x84D7, 0x84D8, 0x84D9, 0x84DA, 0xC4BC, /* U+52E0 */ 0x84DB, 0x84DC, 0x84DD, 0x84DE, 0xC7DA, 0x84DF, 0x84E0, 0x84E1, /* U+52E8 */ 0x84E2, 0x84E3, 0x84E4, 0x84E5, 0x84E6, 0x84E7, 0x84E8, 0x84E9, /* U+52F0 */ 0xDBC4, 0x84EA, 0x84EB, 0x84EC, 0x84ED, 0x84EE, 0x84EF, 0x84F0, /* U+52F8 */ 0x84F1, 0xD9E8, 0xC9D7, 0x84F2, 0x84F3, 0x84F4, 0xB9B4, 0xCEF0, /* U+5300 */ 0xD4C8, 0x84F5, 0x84F6, 0x84F7, 0x84F8, 0xB0FC, 0xB4D2, 0x84F9, /* U+5308 */ 0xD0D9, 0x84FA, 0x84FB, 0x84FC, 0x84FD, 0xD9E9, 0x84FE, 0xDECB, /* U+5310 */ 0xD9EB, 0x8540, 0x8541, 0x8542, 0x8543, 0xD8B0, 0xBBAF, 0xB1B1, /* U+5318 */ 0x8544, 0xB3D7, 0xD8CE, 0x8545, 0x8546, 0xD4D1, 0x8547, 0x8548, /* U+5320 */ 0xBDB3, 0xBFEF, 0x8549, 0xCFBB, 0x854A, 0x854B, 0xD8D0, 0x854C, /* U+5328 */ 0x854D, 0x854E, 0xB7CB, 0x854F, 0x8550, 0x8551, 0xD8D1, 0x8552, /* U+5330 */ 0x8553, 0x8554, 0x8555, 0x8556, 0x8557, 0x8558, 0x8559, 0x855A, /* U+5338 */ 0x855B, 0xC6A5, 0xC7F8, 0xD2BD, 0x855C, 0x855D, 0xD8D2, 0xC4E4, /* U+5340 */ 0x855E, 0xCAAE, 0x855F, 0xC7A7, 0x8560, 0xD8A6, 0x8561, 0xC9FD, /* U+5348 */ 0xCEE7, 0xBBDC, 0xB0EB, 0x8562, 0x8563, 0x8564, 0xBBAA, 0xD0AD, /* U+5350 */ 0x8565, 0xB1B0, 0xD7E4, 0xD7BF, 0x8566, 0xB5A5, 0xC2F4, 0xC4CF, /* U+5358 */ 0x8567, 0x8568, 0xB2A9, 0x8569, 0xB2B7, 0x856A, 0xB1E5, 0xDFB2, /* U+5360 */ 0xD5BC, 0xBFA8, 0xC2AC, 0xD8D5, 0xC2B1, 0x856B, 0xD8D4, 0xCED4, /* U+5368 */ 0x856C, 0xDAE0, 0x856D, 0xCEC0, 0x856E, 0x856F, 0xD8B4, 0xC3AE, /* U+5370 */ 0xD3A1, 0xCEA3, 0x8570, 0xBCB4, 0xC8B4, 0xC2D1, 0x8571, 0xBEED, /* U+5378 */ 0xD0B6, 0x8572, 0xDAE1, 0x8573, 0x8574, 0x8575, 0x8576, 0xC7E4, /* U+5380 */ 0x8577, 0x8578, 0xB3A7, 0x8579, 0xB6F2, 0xCCFC, 0xC0FA, 0x857A, /* U+5388 */ 0x857B, 0xC0F7, 0x857C, 0xD1B9, 0xD1E1, 0xD8C7, 0x857D, 0x857E, /* U+5390 */ 0x8580, 0x8581, 0x8582, 0x8583, 0x8584, 0xB2DE, 0x8585, 0x8586, /* U+5398 */ 0xC0E5, 0x8587, 0xBAF1, 0x8588, 0x8589, 0xD8C8, 0x858A, 0xD4AD, /* U+53A0 */ 0x858B, 0x858C, 0xCFE1, 0xD8C9, 0x858D, 0xD8CA, 0xCFC3, 0x858E, /* U+53A8 */ 0xB3F8, 0xBEC7, 0x858F, 0x8590, 0x8591, 0x8592, 0xD8CB, 0x8593, /* U+53B0 */ 0x8594, 0x8595, 0x8596, 0x8597, 0x8598, 0x8599, 0xDBCC, 0x859A, /* U+53B8 */ 0x859B, 0x859C, 0x859D, 0xC8A5, 0x859E, 0x859F, 0x85A0, 0xCFD8, /* U+53C0 */ 0x85A1, 0xC8FE, 0xB2CE, 0x85A2, 0x85A3, 0x85A4, 0x85A5, 0x85A6, /* U+53C8 */ 0xD3D6, 0xB2E6, 0xBCB0, 0xD3D1, 0xCBAB, 0xB7B4, 0x85A7, 0x85A8, /* U+53D0 */ 0x85A9, 0xB7A2, 0x85AA, 0x85AB, 0xCAE5, 0x85AC, 0xC8A1, 0xCADC, /* U+53D8 */ 0xB1E4, 0xD0F0, 0x85AD, 0xC5D1, 0x85AE, 0x85AF, 0x85B0, 0xDBC5, /* U+53E0 */ 0xB5FE, 0x85B1, 0x85B2, 0xBFDA, 0xB9C5, 0xBEE4, 0xC1ED, 0x85B3, /* U+53E8 */ 0xDFB6, 0xDFB5, 0xD6BB, 0xBDD0, 0xD5D9, 0xB0C8, 0xB6A3, 0xBFC9, /* U+53F0 */ 0xCCA8, 0xDFB3, 0xCAB7, 0xD3D2, 0x85B4, 0xD8CF, 0xD2B6, 0xBAC5, /* U+53F8 */ 0xCBBE, 0xCCBE, 0x85B5, 0xDFB7, 0xB5F0, 0xDFB4, 0x85B6, 0x85B7, /* U+5400 */ 0x85B8, 0xD3F5, 0x85B9, 0xB3D4, 0xB8F7, 0x85BA, 0xDFBA, 0x85BB, /* U+5408 */ 0xBACF, 0xBCAA, 0xB5F5, 0x85BC, 0xCDAC, 0xC3FB, 0xBAF3, 0xC0F4, /* U+5410 */ 0xCDC2, 0xCFF2, 0xDFB8, 0xCFC5, 0x85BD, 0xC2C0, 0xDFB9, 0xC2F0, /* U+5418 */ 0x85BE, 0x85BF, 0x85C0, 0xBEFD, 0x85C1, 0xC1DF, 0xCDCC, 0xD2F7, /* U+5420 */ 0xB7CD, 0xDFC1, 0x85C2, 0xDFC4, 0x85C3, 0x85C4, 0xB7F1, 0xB0C9, /* U+5428 */ 0xB6D6, 0xB7D4, 0x85C5, 0xBAAC, 0xCCFD, 0xBFD4, 0xCBB1, 0xC6F4, /* U+5430 */ 0x85C6, 0xD6A8, 0xDFC5, 0x85C7, 0xCEE2, 0xB3B3, 0x85C8, 0x85C9, /* U+5438 */ 0xCEFC, 0xB4B5, 0x85CA, 0xCEC7, 0xBAF0, 0x85CB, 0xCEE1, 0x85CC, /* U+5440 */ 0xD1BD, 0x85CD, 0x85CE, 0xDFC0, 0x85CF, 0x85D0, 0xB4F4, 0x85D1, /* U+5448 */ 0xB3CA, 0x85D2, 0xB8E6, 0xDFBB, 0x85D3, 0x85D4, 0x85D5, 0x85D6, /* U+5450 */ 0xC4C5, 0x85D7, 0xDFBC, 0xDFBD, 0xDFBE, 0xC5BB, 0xDFBF, 0xDFC2, /* U+5458 */ 0xD4B1, 0xDFC3, 0x85D8, 0xC7BA, 0xCED8, 0x85D9, 0x85DA, 0x85DB, /* U+5460 */ 0x85DC, 0x85DD, 0xC4D8, 0x85DE, 0xDFCA, 0x85DF, 0xDFCF, 0x85E0, /* U+5468 */ 0xD6DC, 0x85E1, 0x85E2, 0x85E3, 0x85E4, 0x85E5, 0x85E6, 0x85E7, /* U+5470 */ 0x85E8, 0xDFC9, 0xDFDA, 0xCEB6, 0x85E9, 0xBAC7, 0xDFCE, 0xDFC8, /* U+5478 */ 0xC5DE, 0x85EA, 0x85EB, 0xC9EB, 0xBAF4, 0xC3FC, 0x85EC, 0x85ED, /* U+5480 */ 0xBED7, 0x85EE, 0xDFC6, 0x85EF, 0xDFCD, 0x85F0, 0xC5D8, 0x85F1, /* U+5488 */ 0x85F2, 0x85F3, 0x85F4, 0xD5A6, 0xBACD, 0x85F5, 0xBECC, 0xD3BD, /* U+5490 */ 0xB8C0, 0x85F6, 0xD6E4, 0x85F7, 0xDFC7, 0xB9BE, 0xBFA7, 0x85F8, /* U+5498 */ 0x85F9, 0xC1FC, 0xDFCB, 0xDFCC, 0x85FA, 0xDFD0, 0x85FB, 0x85FC, /* U+54A0 */ 0x85FD, 0x85FE, 0x8640, 0xDFDB, 0xDFE5, 0x8641, 0xDFD7, 0xDFD6, /* U+54A8 */ 0xD7C9, 0xDFE3, 0xDFE4, 0xE5EB, 0xD2A7, 0xDFD2, 0x8642, 0xBFA9, /* U+54B0 */ 0x8643, 0xD4DB, 0x8644, 0xBFC8, 0xDFD4, 0x8645, 0x8646, 0x8647, /* U+54B8 */ 0xCFCC, 0x8648, 0x8649, 0xDFDD, 0x864A, 0xD1CA, 0x864B, 0xDFDE, /* U+54C0 */ 0xB0A7, 0xC6B7, 0xDFD3, 0x864C, 0xBAE5, 0x864D, 0xB6DF, 0xCDDB, /* U+54C8 */ 0xB9FE, 0xD4D5, 0x864E, 0x864F, 0xDFDF, 0xCFEC, 0xB0A5, 0xDFE7, /* U+54D0 */ 0xDFD1, 0xD1C6, 0xDFD5, 0xDFD8, 0xDFD9, 0xDFDC, 0x8650, 0xBBA9, /* U+54D8 */ 0x8651, 0xDFE0, 0xDFE1, 0x8652, 0xDFE2, 0xDFE6, 0xDFE8, 0xD3B4, /* U+54E0 */ 0x8653, 0x8654, 0x8655, 0x8656, 0x8657, 0xB8E7, 0xC5B6, 0xDFEA, /* U+54E8 */ 0xC9DA, 0xC1A8, 0xC4C4, 0x8658, 0x8659, 0xBFDE, 0xCFF8, 0x865A, /* U+54F0 */ 0x865B, 0x865C, 0xD5DC, 0xDFEE, 0x865D, 0x865E, 0x865F, 0x8660, /* U+54F8 */ 0x8661, 0x8662, 0xB2B8, 0x8663, 0xBADF, 0xDFEC, 0x8664, 0xDBC1, /* U+5500 */ 0x8665, 0xD1E4, 0x8666, 0x8667, 0x8668, 0x8669, 0xCBF4, 0xB4BD, /* U+5508 */ 0x866A, 0xB0A6, 0x866B, 0x866C, 0x866D, 0x866E, 0x866F, 0xDFF1, /* U+5510 */ 0xCCC6, 0xDFF2, 0x8670, 0x8671, 0xDFED, 0x8672, 0x8673, 0x8674, /* U+5518 */ 0x8675, 0x8676, 0x8677, 0xDFE9, 0x8678, 0x8679, 0x867A, 0x867B, /* U+5520 */ 0xDFEB, 0x867C, 0xDFEF, 0xDFF0, 0xBBBD, 0x867D, 0x867E, 0xDFF3, /* U+5528 */ 0x8680, 0x8681, 0xDFF4, 0x8682, 0xBBA3, 0x8683, 0xCADB, 0xCEA8, /* U+5530 */ 0xE0A7, 0xB3AA, 0x8684, 0xE0A6, 0x8685, 0x8686, 0x8687, 0xE0A1, /* U+5538 */ 0x8688, 0x8689, 0x868A, 0x868B, 0xDFFE, 0x868C, 0xCDD9, 0xDFFC, /* U+5540 */ 0x868D, 0xDFFA, 0x868E, 0xBFD0, 0xD7C4, 0x868F, 0xC9CC, 0x8690, /* U+5548 */ 0x8691, 0xDFF8, 0xB0A1, 0x8692, 0x8693, 0x8694, 0x8695, 0x8696, /* U+5550 */ 0xDFFD, 0x8697, 0x8698, 0x8699, 0x869A, 0xDFFB, 0xE0A2, 0x869B, /* U+5558 */ 0x869C, 0x869D, 0x869E, 0x869F, 0xE0A8, 0x86A0, 0x86A1, 0x86A2, /* U+5560 */ 0x86A3, 0xB7C8, 0x86A4, 0x86A5, 0xC6A1, 0xC9B6, 0xC0B2, 0xDFF5, /* U+5568 */ 0x86A6, 0x86A7, 0xC5BE, 0x86A8, 0xD8C4, 0xDFF9, 0xC4F6, 0x86A9, /* U+5570 */ 0x86AA, 0x86AB, 0x86AC, 0x86AD, 0x86AE, 0xE0A3, 0xE0A4, 0xE0A5, /* U+5578 */ 0xD0A5, 0x86AF, 0x86B0, 0xE0B4, 0xCCE4, 0x86B1, 0xE0B1, 0x86B2, /* U+5580 */ 0xBFA6, 0xE0AF, 0xCEB9, 0xE0AB, 0xC9C6, 0x86B3, 0x86B4, 0xC0AE, /* U+5588 */ 0xE0AE, 0xBAED, 0xBAB0, 0xE0A9, 0x86B5, 0x86B6, 0x86B7, 0xDFF6, /* U+5590 */ 0x86B8, 0xE0B3, 0x86B9, 0x86BA, 0xE0B8, 0x86BB, 0x86BC, 0x86BD, /* U+5598 */ 0xB4AD, 0xE0B9, 0x86BE, 0x86BF, 0xCFB2, 0xBAC8, 0x86C0, 0xE0B0, /* U+55A0 */ 0x86C1, 0x86C2, 0x86C3, 0x86C4, 0x86C5, 0x86C6, 0x86C7, 0xD0FA, /* U+55A8 */ 0x86C8, 0x86C9, 0x86CA, 0x86CB, 0x86CC, 0x86CD, 0x86CE, 0x86CF, /* U+55B0 */ 0x86D0, 0xE0AC, 0x86D1, 0xD4FB, 0x86D2, 0xDFF7, 0x86D3, 0xC5E7, /* U+55B8 */ 0x86D4, 0xE0AD, 0x86D5, 0xD3F7, 0x86D6, 0xE0B6, 0xE0B7, 0x86D7, /* U+55C0 */ 0x86D8, 0x86D9, 0x86DA, 0x86DB, 0xE0C4, 0xD0E1, 0x86DC, 0x86DD, /* U+55C8 */ 0x86DE, 0xE0BC, 0x86DF, 0x86E0, 0xE0C9, 0xE0CA, 0x86E1, 0x86E2, /* U+55D0 */ 0x86E3, 0xE0BE, 0xE0AA, 0xC9A4, 0xE0C1, 0x86E4, 0xE0B2, 0x86E5, /* U+55D8 */ 0x86E6, 0x86E7, 0x86E8, 0x86E9, 0xCAC8, 0xE0C3, 0x86EA, 0xE0B5, /* U+55E0 */ 0x86EB, 0xCECB, 0x86EC, 0xCBC3, 0xE0CD, 0xE0C6, 0xE0C2, 0x86ED, /* U+55E8 */ 0xE0CB, 0x86EE, 0xE0BA, 0xE0BF, 0xE0C0, 0x86EF, 0x86F0, 0xE0C5, /* U+55F0 */ 0x86F1, 0x86F2, 0xE0C7, 0xE0C8, 0x86F3, 0xE0CC, 0x86F4, 0xE0BB, /* U+55F8 */ 0x86F5, 0x86F6, 0x86F7, 0x86F8, 0x86F9, 0xCBD4, 0xE0D5, 0x86FA, /* U+5600 */ 0xE0D6, 0xE0D2, 0x86FB, 0x86FC, 0x86FD, 0x86FE, 0x8740, 0x8741, /* U+5608 */ 0xE0D0, 0xBCCE, 0x8742, 0x8743, 0xE0D1, 0x8744, 0xB8C2, 0xD8C5, /* U+5610 */ 0x8745, 0x8746, 0x8747, 0x8748, 0x8749, 0x874A, 0x874B, 0x874C, /* U+5618 */ 0xD0EA, 0x874D, 0x874E, 0xC2EF, 0x874F, 0x8750, 0xE0CF, 0xE0BD, /* U+5620 */ 0x8751, 0x8752, 0x8753, 0xE0D4, 0xE0D3, 0x8754, 0x8755, 0xE0D7, /* U+5628 */ 0x8756, 0x8757, 0x8758, 0x8759, 0xE0DC, 0xE0D8, 0x875A, 0x875B, /* U+5630 */ 0x875C, 0xD6F6, 0xB3B0, 0x875D, 0xD7EC, 0x875E, 0xCBBB, 0x875F, /* U+5638 */ 0x8760, 0xE0DA, 0x8761, 0xCEFB, 0x8762, 0x8763, 0x8764, 0xBAD9, /* U+5640 */ 0x8765, 0x8766, 0x8767, 0x8768, 0x8769, 0x876A, 0x876B, 0x876C, /* U+5648 */ 0x876D, 0x876E, 0x876F, 0x8770, 0xE0E1, 0xE0DD, 0xD2AD, 0x8771, /* U+5650 */ 0x8772, 0x8773, 0x8774, 0x8775, 0xE0E2, 0x8776, 0x8777, 0xE0DB, /* U+5658 */ 0xE0D9, 0xE0DF, 0x8778, 0x8779, 0xE0E0, 0x877A, 0x877B, 0x877C, /* U+5660 */ 0x877D, 0x877E, 0xE0DE, 0x8780, 0xE0E4, 0x8781, 0x8782, 0x8783, /* U+5668 */ 0xC6F7, 0xD8AC, 0xD4EB, 0xE0E6, 0xCAC9, 0x8784, 0x8785, 0x8786, /* U+5670 */ 0x8787, 0xE0E5, 0x8788, 0x8789, 0x878A, 0x878B, 0xB8C1, 0x878C, /* U+5678 */ 0x878D, 0x878E, 0x878F, 0xE0E7, 0xE0E8, 0x8790, 0x8791, 0x8792, /* U+5680 */ 0x8793, 0x8794, 0x8795, 0x8796, 0x8797, 0xE0E9, 0xE0E3, 0x8798, /* U+5688 */ 0x8799, 0x879A, 0x879B, 0x879C, 0x879D, 0x879E, 0xBABF, 0xCCE7, /* U+5690 */ 0x879F, 0x87A0, 0x87A1, 0xE0EA, 0x87A2, 0x87A3, 0x87A4, 0x87A5, /* U+5698 */ 0x87A6, 0x87A7, 0x87A8, 0x87A9, 0x87AA, 0x87AB, 0x87AC, 0x87AD, /* U+56A0 */ 0x87AE, 0x87AF, 0x87B0, 0xCFF9, 0x87B1, 0x87B2, 0x87B3, 0x87B4, /* U+56A8 */ 0x87B5, 0x87B6, 0x87B7, 0x87B8, 0x87B9, 0x87BA, 0x87BB, 0xE0EB, /* U+56B0 */ 0x87BC, 0x87BD, 0x87BE, 0x87BF, 0x87C0, 0x87C1, 0x87C2, 0xC8C2, /* U+56B8 */ 0x87C3, 0x87C4, 0x87C5, 0x87C6, 0xBDC0, 0x87C7, 0x87C8, 0x87C9, /* U+56C0 */ 0x87CA, 0x87CB, 0x87CC, 0x87CD, 0x87CE, 0x87CF, 0x87D0, 0x87D1, /* U+56C8 */ 0x87D2, 0x87D3, 0xC4D2, 0x87D4, 0x87D5, 0x87D6, 0x87D7, 0x87D8, /* U+56D0 */ 0x87D9, 0x87DA, 0x87DB, 0x87DC, 0xE0EC, 0x87DD, 0x87DE, 0xE0ED, /* U+56D8 */ 0x87DF, 0x87E0, 0xC7F4, 0xCBC4, 0x87E1, 0xE0EE, 0xBBD8, 0xD8B6, /* U+56E0 */ 0xD2F2, 0xE0EF, 0xCDC5, 0x87E2, 0xB6DA, 0x87E3, 0x87E4, 0x87E5, /* U+56E8 */ 0x87E6, 0x87E7, 0x87E8, 0xE0F1, 0x87E9, 0xD4B0, 0x87EA, 0x87EB, /* U+56F0 */ 0xC0A7, 0xB4D1, 0x87EC, 0x87ED, 0xCEA7, 0xE0F0, 0x87EE, 0x87EF, /* U+56F8 */ 0x87F0, 0xE0F2, 0xB9CC, 0x87F1, 0x87F2, 0xB9FA, 0xCDBC, 0xE0F3, /* U+5700 */ 0x87F3, 0x87F4, 0x87F5, 0xC6D4, 0xE0F4, 0x87F6, 0xD4B2, 0x87F7, /* U+5708 */ 0xC8A6, 0xE0F6, 0xE0F5, 0x87F8, 0x87F9, 0x87FA, 0x87FB, 0x87FC, /* U+5710 */ 0x87FD, 0x87FE, 0x8840, 0x8841, 0x8842, 0x8843, 0x8844, 0x8845, /* U+5718 */ 0x8846, 0x8847, 0x8848, 0x8849, 0xE0F7, 0x884A, 0x884B, 0xCDC1, /* U+5720 */ 0x884C, 0x884D, 0x884E, 0xCAA5, 0x884F, 0x8850, 0x8851, 0x8852, /* U+5728 */ 0xD4DA, 0xDBD7, 0xDBD9, 0x8853, 0xDBD8, 0xB9E7, 0xDBDC, 0xDBDD, /* U+5730 */ 0xB5D8, 0x8854, 0x8855, 0xDBDA, 0x8856, 0x8857, 0x8858, 0x8859, /* U+5738 */ 0x885A, 0xDBDB, 0xB3A1, 0xDBDF, 0x885B, 0x885C, 0xBBF8, 0x885D, /* U+5740 */ 0xD6B7, 0x885E, 0xDBE0, 0x885F, 0x8860, 0x8861, 0x8862, 0xBEF9, /* U+5748 */ 0x8863, 0x8864, 0xB7BB, 0x8865, 0xDBD0, 0xCCAE, 0xBFB2, 0xBBB5, /* U+5750 */ 0xD7F8, 0xBFD3, 0x8866, 0x8867, 0x8868, 0x8869, 0x886A, 0xBFE9, /* U+5758 */ 0x886B, 0x886C, 0xBCE1, 0xCCB3, 0xDBDE, 0xB0D3, 0xCEEB, 0xB7D8, /* U+5760 */ 0xD7B9, 0xC6C2, 0x886D, 0x886E, 0xC0A4, 0x886F, 0xCCB9, 0x8870, /* U+5768 */ 0xDBE7, 0xDBE1, 0xC6BA, 0xDBE3, 0x8871, 0xDBE8, 0x8872, 0xC5F7, /* U+5770 */ 0x8873, 0x8874, 0x8875, 0xDBEA, 0x8876, 0x8877, 0xDBE9, 0xBFC0, /* U+5778 */ 0x8878, 0x8879, 0x887A, 0xDBE6, 0xDBE5, 0x887B, 0x887C, 0x887D, /* U+5780 */ 0x887E, 0x8880, 0xB4B9, 0xC0AC, 0xC2A2, 0xDBE2, 0xDBE4, 0x8881, /* U+5788 */ 0x8882, 0x8883, 0x8884, 0xD0CD, 0xDBED, 0x8885, 0x8886, 0x8887, /* U+5790 */ 0x8888, 0x8889, 0xC0DD, 0xDBF2, 0x888A, 0x888B, 0x888C, 0x888D, /* U+5798 */ 0x888E, 0x888F, 0x8890, 0xB6E2, 0x8891, 0x8892, 0x8893, 0x8894, /* U+57A0 */ 0xDBF3, 0xDBD2, 0xB9B8, 0xD4AB, 0xDBEC, 0x8895, 0xBFD1, 0xDBF0, /* U+57A8 */ 0x8896, 0xDBD1, 0x8897, 0xB5E6, 0x8898, 0xDBEB, 0xBFE5, 0x8899, /* U+57B0 */ 0x889A, 0x889B, 0xDBEE, 0x889C, 0xDBF1, 0x889D, 0x889E, 0x889F, /* U+57B8 */ 0xDBF9, 0x88A0, 0x88A1, 0x88A2, 0x88A3, 0x88A4, 0x88A5, 0x88A6, /* U+57C0 */ 0x88A7, 0x88A8, 0xB9A1, 0xB0A3, 0x88A9, 0x88AA, 0x88AB, 0x88AC, /* U+57C8 */ 0x88AD, 0x88AE, 0x88AF, 0xC2F1, 0x88B0, 0x88B1, 0xB3C7, 0xDBEF, /* U+57D0 */ 0x88B2, 0x88B3, 0xDBF8, 0x88B4, 0xC6D2, 0xDBF4, 0x88B5, 0x88B6, /* U+57D8 */ 0xDBF5, 0xDBF7, 0xDBF6, 0x88B7, 0x88B8, 0xDBFE, 0x88B9, 0xD3F2, /* U+57E0 */ 0xB2BA, 0x88BA, 0x88BB, 0x88BC, 0xDBFD, 0x88BD, 0x88BE, 0x88BF, /* U+57E8 */ 0x88C0, 0x88C1, 0x88C2, 0x88C3, 0x88C4, 0xDCA4, 0x88C5, 0xDBFB, /* U+57F0 */ 0x88C6, 0x88C7, 0x88C8, 0x88C9, 0xDBFA, 0x88CA, 0x88CB, 0x88CC, /* U+57F8 */ 0xDBFC, 0xC5E0, 0xBBF9, 0x88CD, 0x88CE, 0xDCA3, 0x88CF, 0x88D0, /* U+5800 */ 0xDCA5, 0x88D1, 0xCCC3, 0x88D2, 0x88D3, 0x88D4, 0xB6D1, 0xDDC0, /* U+5808 */ 0x88D5, 0x88D6, 0x88D7, 0xDCA1, 0x88D8, 0xDCA2, 0x88D9, 0x88DA, /* U+5810 */ 0x88DB, 0xC7B5, 0x88DC, 0x88DD, 0x88DE, 0xB6E9, 0x88DF, 0x88E0, /* U+5818 */ 0x88E1, 0xDCA7, 0x88E2, 0x88E3, 0x88E4, 0x88E5, 0xDCA6, 0x88E6, /* U+5820 */ 0xDCA9, 0xB1A4, 0x88E7, 0x88E8, 0xB5CC, 0x88E9, 0x88EA, 0x88EB, /* U+5828 */ 0x88EC, 0x88ED, 0xBFB0, 0x88EE, 0x88EF, 0x88F0, 0x88F1, 0x88F2, /* U+5830 */ 0xD1DF, 0x88F3, 0x88F4, 0x88F5, 0x88F6, 0xB6C2, 0x88F7, 0x88F8, /* U+5838 */ 0x88F9, 0x88FA, 0x88FB, 0x88FC, 0x88FD, 0x88FE, 0x8940, 0x8941, /* U+5840 */ 0x8942, 0x8943, 0x8944, 0x8945, 0xDCA8, 0x8946, 0x8947, 0x8948, /* U+5848 */ 0x8949, 0x894A, 0x894B, 0x894C, 0xCBFA, 0xEBF3, 0x894D, 0x894E, /* U+5850 */ 0x894F, 0xCBDC, 0x8950, 0x8951, 0xCBFE, 0x8952, 0x8953, 0x8954, /* U+5858 */ 0xCCC1, 0x8955, 0x8956, 0x8957, 0x8958, 0x8959, 0xC8FB, 0x895A, /* U+5860 */ 0x895B, 0x895C, 0x895D, 0x895E, 0x895F, 0xDCAA, 0x8960, 0x8961, /* U+5868 */ 0x8962, 0x8963, 0x8964, 0xCCEE, 0xDCAB, 0x8965, 0x8966, 0x8967, /* U+5870 */ 0x8968, 0x8969, 0x896A, 0x896B, 0x896C, 0x896D, 0x896E, 0x896F, /* U+5878 */ 0x8970, 0x8971, 0x8972, 0x8973, 0x8974, 0x8975, 0xDBD3, 0x8976, /* U+5880 */ 0xDCAF, 0xDCAC, 0x8977, 0xBEB3, 0x8978, 0xCAFB, 0x8979, 0x897A, /* U+5888 */ 0x897B, 0xDCAD, 0x897C, 0x897D, 0x897E, 0x8980, 0x8981, 0x8982, /* U+5890 */ 0x8983, 0x8984, 0xC9CA, 0xC4B9, 0x8985, 0x8986, 0x8987, 0x8988, /* U+5898 */ 0x8989, 0xC7BD, 0xDCAE, 0x898A, 0x898B, 0x898C, 0xD4F6, 0xD0E6, /* U+58A0 */ 0x898D, 0x898E, 0x898F, 0x8990, 0x8991, 0x8992, 0x8993, 0x8994, /* U+58A8 */ 0xC4AB, 0xB6D5, 0x8995, 0x8996, 0x8997, 0x8998, 0x8999, 0x899A, /* U+58B0 */ 0x899B, 0x899C, 0x899D, 0x899E, 0x899F, 0x89A0, 0x89A1, 0x89A2, /* U+58B8 */ 0x89A3, 0x89A4, 0x89A5, 0x89A6, 0xDBD4, 0x89A7, 0x89A8, 0x89A9, /* U+58C0 */ 0x89AA, 0xB1DA, 0x89AB, 0x89AC, 0x89AD, 0xDBD5, 0x89AE, 0x89AF, /* U+58C8 */ 0x89B0, 0x89B1, 0x89B2, 0x89B3, 0x89B4, 0x89B5, 0x89B6, 0x89B7, /* U+58D0 */ 0x89B8, 0xDBD6, 0x89B9, 0x89BA, 0x89BB, 0xBABE, 0x89BC, 0x89BD, /* U+58D8 */ 0x89BE, 0x89BF, 0x89C0, 0x89C1, 0x89C2, 0x89C3, 0x89C4, 0x89C5, /* U+58E0 */ 0x89C6, 0x89C7, 0x89C8, 0x89C9, 0xC8C0, 0x89CA, 0x89CB, 0x89CC, /* U+58E8 */ 0x89CD, 0x89CE, 0x89CF, 0xCABF, 0xC8C9, 0x89D0, 0xD7B3, 0x89D1, /* U+58F0 */ 0xC9F9, 0x89D2, 0x89D3, 0xBFC7, 0x89D4, 0x89D5, 0xBAF8, 0x89D6, /* U+58F8 */ 0x89D7, 0xD2BC, 0x89D8, 0x89D9, 0x89DA, 0x89DB, 0x89DC, 0x89DD, /* U+5900 */ 0x89DE, 0x89DF, 0xE2BA, 0x89E0, 0xB4A6, 0x89E1, 0x89E2, 0xB1B8, /* U+5908 */ 0x89E3, 0x89E4, 0x89E5, 0x89E6, 0x89E7, 0xB8B4, 0x89E8, 0xCFC4, /* U+5910 */ 0x89E9, 0x89EA, 0x89EB, 0x89EC, 0xD9E7, 0xCFA6, 0xCDE2, 0x89ED, /* U+5918 */ 0x89EE, 0xD9ED, 0xB6E0, 0x89EF, 0xD2B9, 0x89F0, 0x89F1, 0xB9BB, /* U+5920 */ 0x89F2, 0x89F3, 0x89F4, 0x89F5, 0xE2B9, 0xE2B7, 0x89F6, 0xB4F3, /* U+5928 */ 0x89F7, 0xCCEC, 0xCCAB, 0xB7F2, 0x89F8, 0xD8B2, 0xD1EB, 0xBABB, /* U+5930 */ 0x89F9, 0xCAA7, 0x89FA, 0x89FB, 0xCDB7, 0x89FC, 0x89FD, 0xD2C4, /* U+5938 */ 0xBFE4, 0xBCD0, 0xB6E1, 0x89FE, 0xDEC5, 0x8A40, 0x8A41, 0x8A42, /* U+5940 */ 0x8A43, 0xDEC6, 0xDBBC, 0x8A44, 0xD1D9, 0x8A45, 0x8A46, 0xC6E6, /* U+5948 */ 0xC4CE, 0xB7EE, 0x8A47, 0xB7DC, 0x8A48, 0x8A49, 0xBFFC, 0xD7E0, /* U+5950 */ 0x8A4A, 0xC6F5, 0x8A4B, 0x8A4C, 0xB1BC, 0xDEC8, 0xBDB1, 0xCCD7, /* U+5958 */ 0xDECA, 0x8A4D, 0xDEC9, 0x8A4E, 0x8A4F, 0x8A50, 0x8A51, 0x8A52, /* U+5960 */ 0xB5EC, 0x8A53, 0xC9DD, 0x8A54, 0x8A55, 0xB0C2, 0x8A56, 0x8A57, /* U+5968 */ 0x8A58, 0x8A59, 0x8A5A, 0x8A5B, 0x8A5C, 0x8A5D, 0x8A5E, 0x8A5F, /* U+5970 */ 0x8A60, 0x8A61, 0x8A62, 0xC5AE, 0xC5AB, 0x8A63, 0xC4CC, 0x8A64, /* U+5978 */ 0xBCE9, 0xCBFD, 0x8A65, 0x8A66, 0x8A67, 0xBAC3, 0x8A68, 0x8A69, /* U+5980 */ 0x8A6A, 0xE5F9, 0xC8E7, 0xE5FA, 0xCDFD, 0x8A6B, 0xD7B1, 0xB8BE, /* U+5988 */ 0xC2E8, 0x8A6C, 0xC8D1, 0x8A6D, 0x8A6E, 0xE5FB, 0x8A6F, 0x8A70, /* U+5990 */ 0x8A71, 0x8A72, 0xB6CA, 0xBCCB, 0x8A73, 0x8A74, 0xD1FD, 0xE6A1, /* U+5998 */ 0x8A75, 0xC3EE, 0x8A76, 0x8A77, 0x8A78, 0x8A79, 0xE6A4, 0x8A7A, /* U+59A0 */ 0x8A7B, 0x8A7C, 0x8A7D, 0xE5FE, 0xE6A5, 0xCDD7, 0x8A7E, 0x8A80, /* U+59A8 */ 0xB7C1, 0xE5FC, 0xE5FD, 0xE6A3, 0x8A81, 0x8A82, 0xC4DD, 0xE6A8, /* U+59B0 */ 0x8A83, 0x8A84, 0xE6A7, 0x8A85, 0x8A86, 0x8A87, 0x8A88, 0x8A89, /* U+59B8 */ 0x8A8A, 0xC3C3, 0x8A8B, 0xC6DE, 0x8A8C, 0x8A8D, 0xE6AA, 0x8A8E, /* U+59C0 */ 0x8A8F, 0x8A90, 0x8A91, 0x8A92, 0x8A93, 0x8A94, 0xC4B7, 0x8A95, /* U+59C8 */ 0x8A96, 0x8A97, 0xE6A2, 0xCABC, 0x8A98, 0x8A99, 0x8A9A, 0x8A9B, /* U+59D0 */ 0xBDE3, 0xB9C3, 0xE6A6, 0xD0D5, 0xCEAF, 0x8A9C, 0x8A9D, 0xE6A9, /* U+59D8 */ 0xE6B0, 0x8A9E, 0xD2A6, 0x8A9F, 0xBDAA, 0xE6AD, 0x8AA0, 0x8AA1, /* U+59E0 */ 0x8AA2, 0x8AA3, 0x8AA4, 0xE6AF, 0x8AA5, 0xC0D1, 0x8AA6, 0x8AA7, /* U+59E8 */ 0xD2CC, 0x8AA8, 0x8AA9, 0x8AAA, 0xBCA7, 0x8AAB, 0x8AAC, 0x8AAD, /* U+59F0 */ 0x8AAE, 0x8AAF, 0x8AB0, 0x8AB1, 0x8AB2, 0x8AB3, 0x8AB4, 0x8AB5, /* U+59F8 */ 0x8AB6, 0xE6B1, 0x8AB7, 0xD2F6, 0x8AB8, 0x8AB9, 0x8ABA, 0xD7CB, /* U+5A00 */ 0x8ABB, 0xCDFE, 0x8ABC, 0xCDDE, 0xC2A6, 0xE6AB, 0xE6AC, 0xBDBF, /* U+5A08 */ 0xE6AE, 0xE6B3, 0x8ABD, 0x8ABE, 0xE6B2, 0x8ABF, 0x8AC0, 0x8AC1, /* U+5A10 */ 0x8AC2, 0xE6B6, 0x8AC3, 0xE6B8, 0x8AC4, 0x8AC5, 0x8AC6, 0x8AC7, /* U+5A18 */ 0xC4EF, 0x8AC8, 0x8AC9, 0x8ACA, 0xC4C8, 0x8ACB, 0x8ACC, 0xBEEA, /* U+5A20 */ 0xC9EF, 0x8ACD, 0x8ACE, 0xE6B7, 0x8ACF, 0xB6F0, 0x8AD0, 0x8AD1, /* U+5A28 */ 0x8AD2, 0xC3E4, 0x8AD3, 0x8AD4, 0x8AD5, 0x8AD6, 0x8AD7, 0x8AD8, /* U+5A30 */ 0x8AD9, 0xD3E9, 0xE6B4, 0x8ADA, 0xE6B5, 0x8ADB, 0xC8A2, 0x8ADC, /* U+5A38 */ 0x8ADD, 0x8ADE, 0x8ADF, 0x8AE0, 0xE6BD, 0x8AE1, 0x8AE2, 0x8AE3, /* U+5A40 */ 0xE6B9, 0x8AE4, 0x8AE5, 0x8AE6, 0x8AE7, 0x8AE8, 0xC6C5, 0x8AE9, /* U+5A48 */ 0x8AEA, 0xCDF1, 0xE6BB, 0x8AEB, 0x8AEC, 0x8AED, 0x8AEE, 0x8AEF, /* U+5A50 */ 0x8AF0, 0x8AF1, 0x8AF2, 0x8AF3, 0x8AF4, 0xE6BC, 0x8AF5, 0x8AF6, /* U+5A58 */ 0x8AF7, 0x8AF8, 0xBBE9, 0x8AF9, 0x8AFA, 0x8AFB, 0x8AFC, 0x8AFD, /* U+5A60 */ 0x8AFE, 0x8B40, 0xE6BE, 0x8B41, 0x8B42, 0x8B43, 0x8B44, 0xE6BA, /* U+5A68 */ 0x8B45, 0x8B46, 0xC0B7, 0x8B47, 0x8B48, 0x8B49, 0x8B4A, 0x8B4B, /* U+5A70 */ 0x8B4C, 0x8B4D, 0x8B4E, 0x8B4F, 0xD3A4, 0xE6BF, 0xC9F4, 0xE6C3, /* U+5A78 */ 0x8B50, 0x8B51, 0xE6C4, 0x8B52, 0x8B53, 0x8B54, 0x8B55, 0xD0F6, /* U+5A80 */ 0x8B56, 0x8B57, 0x8B58, 0x8B59, 0x8B5A, 0x8B5B, 0x8B5C, 0x8B5D, /* U+5A88 */ 0x8B5E, 0x8B5F, 0x8B60, 0x8B61, 0x8B62, 0x8B63, 0x8B64, 0x8B65, /* U+5A90 */ 0x8B66, 0x8B67, 0xC3BD, 0x8B68, 0x8B69, 0x8B6A, 0x8B6B, 0x8B6C, /* U+5A98 */ 0x8B6D, 0x8B6E, 0xC3C4, 0xE6C2, 0x8B6F, 0x8B70, 0x8B71, 0x8B72, /* U+5AA0 */ 0x8B73, 0x8B74, 0x8B75, 0x8B76, 0x8B77, 0x8B78, 0x8B79, 0x8B7A, /* U+5AA8 */ 0x8B7B, 0x8B7C, 0xE6C1, 0x8B7D, 0x8B7E, 0x8B80, 0x8B81, 0x8B82, /* U+5AB0 */ 0x8B83, 0x8B84, 0xE6C7, 0xCFB1, 0x8B85, 0xEBF4, 0x8B86, 0x8B87, /* U+5AB8 */ 0xE6CA, 0x8B88, 0x8B89, 0x8B8A, 0x8B8B, 0x8B8C, 0xE6C5, 0x8B8D, /* U+5AC0 */ 0x8B8E, 0xBCDE, 0xC9A9, 0x8B8F, 0x8B90, 0x8B91, 0x8B92, 0x8B93, /* U+5AC8 */ 0x8B94, 0xBCB5, 0x8B95, 0x8B96, 0xCFD3, 0x8B97, 0x8B98, 0x8B99, /* U+5AD0 */ 0x8B9A, 0x8B9B, 0xE6C8, 0x8B9C, 0xE6C9, 0x8B9D, 0xE6CE, 0x8B9E, /* U+5AD8 */ 0xE6D0, 0x8B9F, 0x8BA0, 0x8BA1, 0xE6D1, 0x8BA2, 0x8BA3, 0x8BA4, /* U+5AE0 */ 0xE6CB, 0xB5D5, 0x8BA5, 0xE6CC, 0x8BA6, 0x8BA7, 0xE6CF, 0x8BA8, /* U+5AE8 */ 0x8BA9, 0xC4DB, 0x8BAA, 0xE6C6, 0x8BAB, 0x8BAC, 0x8BAD, 0x8BAE, /* U+5AF0 */ 0x8BAF, 0xE6CD, 0x8BB0, 0x8BB1, 0x8BB2, 0x8BB3, 0x8BB4, 0x8BB5, /* U+5AF8 */ 0x8BB6, 0x8BB7, 0x8BB8, 0x8BB9, 0x8BBA, 0x8BBB, 0x8BBC, 0x8BBD, /* U+5B00 */ 0x8BBE, 0x8BBF, 0x8BC0, 0x8BC1, 0x8BC2, 0x8BC3, 0x8BC4, 0x8BC5, /* U+5B08 */ 0x8BC6, 0xE6D2, 0x8BC7, 0x8BC8, 0x8BC9, 0x8BCA, 0x8BCB, 0x8BCC, /* U+5B10 */ 0x8BCD, 0x8BCE, 0x8BCF, 0x8BD0, 0x8BD1, 0x8BD2, 0xE6D4, 0xE6D3, /* U+5B18 */ 0x8BD3, 0x8BD4, 0x8BD5, 0x8BD6, 0x8BD7, 0x8BD8, 0x8BD9, 0x8BDA, /* U+5B20 */ 0x8BDB, 0x8BDC, 0x8BDD, 0x8BDE, 0x8BDF, 0x8BE0, 0x8BE1, 0x8BE2, /* U+5B28 */ 0x8BE3, 0x8BE4, 0x8BE5, 0x8BE6, 0x8BE7, 0x8BE8, 0x8BE9, 0x8BEA, /* U+5B30 */ 0x8BEB, 0x8BEC, 0xE6D5, 0x8BED, 0xD9F8, 0x8BEE, 0x8BEF, 0xE6D6, /* U+5B38 */ 0x8BF0, 0x8BF1, 0x8BF2, 0x8BF3, 0x8BF4, 0x8BF5, 0x8BF6, 0x8BF7, /* U+5B40 */ 0xE6D7, 0x8BF8, 0x8BF9, 0x8BFA, 0x8BFB, 0x8BFC, 0x8BFD, 0x8BFE, /* U+5B48 */ 0x8C40, 0x8C41, 0x8C42, 0x8C43, 0x8C44, 0x8C45, 0x8C46, 0x8C47, /* U+5B50 */ 0xD7D3, 0xE6DD, 0x8C48, 0xE6DE, 0xBFD7, 0xD4D0, 0x8C49, 0xD7D6, /* U+5B58 */ 0xB4E6, 0xCBEF, 0xE6DA, 0xD8C3, 0xD7CE, 0xD0A2, 0x8C4A, 0xC3CF, /* U+5B60 */ 0x8C4B, 0x8C4C, 0xE6DF, 0xBCBE, 0xB9C2, 0xE6DB, 0xD1A7, 0x8C4D, /* U+5B68 */ 0x8C4E, 0xBAA2, 0xC2CF, 0x8C4F, 0xD8AB, 0x8C50, 0x8C51, 0x8C52, /* U+5B70 */ 0xCAEB, 0xE5EE, 0x8C53, 0xE6DC, 0x8C54, 0xB7F5, 0x8C55, 0x8C56, /* U+5B78 */ 0x8C57, 0x8C58, 0xC8E6, 0x8C59, 0x8C5A, 0xC4F5, 0x8C5B, 0x8C5C, /* U+5B80 */ 0xE5B2, 0xC4FE, 0x8C5D, 0xCBFC, 0xE5B3, 0xD5AC, 0x8C5E, 0xD3EE, /* U+5B88 */ 0xCAD8, 0xB0B2, 0x8C5F, 0xCBCE, 0xCDEA, 0x8C60, 0x8C61, 0xBAEA, /* U+5B90 */ 0x8C62, 0x8C63, 0x8C64, 0xE5B5, 0x8C65, 0xE5B4, 0x8C66, 0xD7DA, /* U+5B98 */ 0xB9D9, 0xD6E6, 0xB6A8, 0xCDF0, 0xD2CB, 0xB1A6, 0xCAB5, 0x8C67, /* U+5BA0 */ 0xB3E8, 0xC9F3, 0xBFCD, 0xD0FB, 0xCAD2, 0xE5B6, 0xBBC2, 0x8C68, /* U+5BA8 */ 0x8C69, 0x8C6A, 0xCFDC, 0xB9AC, 0x8C6B, 0x8C6C, 0x8C6D, 0x8C6E, /* U+5BB0 */ 0xD4D7, 0x8C6F, 0x8C70, 0xBAA6, 0xD1E7, 0xCFFC, 0xBCD2, 0x8C71, /* U+5BB8 */ 0xE5B7, 0xC8DD, 0x8C72, 0x8C73, 0x8C74, 0xBFED, 0xB1F6, 0xCBDE, /* U+5BC0 */ 0x8C75, 0x8C76, 0xBCC5, 0x8C77, 0xBCC4, 0xD2FA, 0xC3DC, 0xBFDC, /* U+5BC8 */ 0x8C78, 0x8C79, 0x8C7A, 0x8C7B, 0xB8BB, 0x8C7C, 0x8C7D, 0x8C7E, /* U+5BD0 */ 0xC3C2, 0x8C80, 0xBAAE, 0xD4A2, 0x8C81, 0x8C82, 0x8C83, 0x8C84, /* U+5BD8 */ 0x8C85, 0x8C86, 0x8C87, 0x8C88, 0x8C89, 0xC7DE, 0xC4AF, 0xB2EC, /* U+5BE0 */ 0x8C8A, 0xB9D1, 0x8C8B, 0x8C8C, 0xE5BB, 0xC1C8, 0x8C8D, 0x8C8E, /* U+5BE8 */ 0xD5AF, 0x8C8F, 0x8C90, 0x8C91, 0x8C92, 0x8C93, 0xE5BC, 0x8C94, /* U+5BF0 */ 0xE5BE, 0x8C95, 0x8C96, 0x8C97, 0x8C98, 0x8C99, 0x8C9A, 0x8C9B, /* U+5BF8 */ 0xB4E7, 0xB6D4, 0xCBC2, 0xD1B0, 0xB5BC, 0x8C9C, 0x8C9D, 0xCAD9, /* U+5C00 */ 0x8C9E, 0xB7E2, 0x8C9F, 0x8CA0, 0xC9E4, 0x8CA1, 0xBDAB, 0x8CA2, /* U+5C08 */ 0x8CA3, 0xCEBE, 0xD7F0, 0x8CA4, 0x8CA5, 0x8CA6, 0x8CA7, 0xD0A1, /* U+5C10 */ 0x8CA8, 0xC9D9, 0x8CA9, 0x8CAA, 0xB6FB, 0xE6D8, 0xBCE2, 0x8CAB, /* U+5C18 */ 0xB3BE, 0x8CAC, 0xC9D0, 0x8CAD, 0xE6D9, 0xB3A2, 0x8CAE, 0x8CAF, /* U+5C20 */ 0x8CB0, 0x8CB1, 0xDECC, 0x8CB2, 0xD3C8, 0xDECD, 0x8CB3, 0xD2A2, /* U+5C28 */ 0x8CB4, 0x8CB5, 0x8CB6, 0x8CB7, 0xDECE, 0x8CB8, 0x8CB9, 0x8CBA, /* U+5C30 */ 0x8CBB, 0xBECD, 0x8CBC, 0x8CBD, 0xDECF, 0x8CBE, 0x8CBF, 0x8CC0, /* U+5C38 */ 0xCAAC, 0xD2FC, 0xB3DF, 0xE5EA, 0xC4E1, 0xBEA1, 0xCEB2, 0xC4F2, /* U+5C40 */ 0xBED6, 0xC6A8, 0xB2E3, 0x8CC1, 0x8CC2, 0xBED3, 0x8CC3, 0x8CC4, /* U+5C48 */ 0xC7FC, 0xCCEB, 0xBDEC, 0xCEDD, 0x8CC5, 0x8CC6, 0xCABA, 0xC6C1, /* U+5C50 */ 0xE5EC, 0xD0BC, 0x8CC7, 0x8CC8, 0x8CC9, 0xD5B9, 0x8CCA, 0x8CCB, /* U+5C58 */ 0x8CCC, 0xE5ED, 0x8CCD, 0x8CCE, 0x8CCF, 0x8CD0, 0xCAF4, 0x8CD1, /* U+5C60 */ 0xCDC0, 0xC2C5, 0x8CD2, 0xE5EF, 0x8CD3, 0xC2C4, 0xE5F0, 0x8CD4, /* U+5C68 */ 0x8CD5, 0x8CD6, 0x8CD7, 0x8CD8, 0x8CD9, 0x8CDA, 0xE5F8, 0xCDCD, /* U+5C70 */ 0x8CDB, 0xC9BD, 0x8CDC, 0x8CDD, 0x8CDE, 0x8CDF, 0x8CE0, 0x8CE1, /* U+5C78 */ 0x8CE2, 0xD2D9, 0xE1A8, 0x8CE3, 0x8CE4, 0x8CE5, 0x8CE6, 0xD3EC, /* U+5C80 */ 0x8CE7, 0xCBEA, 0xC6F1, 0x8CE8, 0x8CE9, 0x8CEA, 0x8CEB, 0x8CEC, /* U+5C88 */ 0xE1AC, 0x8CED, 0x8CEE, 0x8CEF, 0xE1A7, 0xE1A9, 0x8CF0, 0x8CF1, /* U+5C90 */ 0xE1AA, 0xE1AF, 0x8CF2, 0x8CF3, 0xB2ED, 0x8CF4, 0xE1AB, 0xB8DA, /* U+5C98 */ 0xE1AD, 0xE1AE, 0xE1B0, 0xB5BA, 0xE1B1, 0x8CF5, 0x8CF6, 0x8CF7, /* U+5CA0 */ 0x8CF8, 0x8CF9, 0xE1B3, 0xE1B8, 0x8CFA, 0x8CFB, 0x8CFC, 0x8CFD, /* U+5CA8 */ 0x8CFE, 0xD1D2, 0x8D40, 0xE1B6, 0xE1B5, 0xC1EB, 0x8D41, 0x8D42, /* U+5CB0 */ 0x8D43, 0xE1B7, 0x8D44, 0xD4C0, 0x8D45, 0xE1B2, 0x8D46, 0xE1BA, /* U+5CB8 */ 0xB0B6, 0x8D47, 0x8D48, 0x8D49, 0x8D4A, 0xE1B4, 0x8D4B, 0xBFF9, /* U+5CC0 */ 0x8D4C, 0xE1B9, 0x8D4D, 0x8D4E, 0xE1BB, 0x8D4F, 0x8D50, 0x8D51, /* U+5CC8 */ 0x8D52, 0x8D53, 0x8D54, 0xE1BE, 0x8D55, 0x8D56, 0x8D57, 0x8D58, /* U+5CD0 */ 0x8D59, 0x8D5A, 0xE1BC, 0x8D5B, 0x8D5C, 0x8D5D, 0x8D5E, 0x8D5F, /* U+5CD8 */ 0x8D60, 0xD6C5, 0x8D61, 0x8D62, 0x8D63, 0x8D64, 0x8D65, 0x8D66, /* U+5CE0 */ 0x8D67, 0xCFBF, 0x8D68, 0x8D69, 0xE1BD, 0xE1BF, 0xC2CD, 0x8D6A, /* U+5CE8 */ 0xB6EB, 0x8D6B, 0xD3F8, 0x8D6C, 0x8D6D, 0xC7CD, 0x8D6E, 0x8D6F, /* U+5CF0 */ 0xB7E5, 0x8D70, 0x8D71, 0x8D72, 0x8D73, 0x8D74, 0x8D75, 0x8D76, /* U+5CF8 */ 0x8D77, 0x8D78, 0x8D79, 0xBEFE, 0x8D7A, 0x8D7B, 0x8D7C, 0x8D7D, /* U+5D00 */ 0x8D7E, 0x8D80, 0xE1C0, 0xE1C1, 0x8D81, 0x8D82, 0xE1C7, 0xB3E7, /* U+5D08 */ 0x8D83, 0x8D84, 0x8D85, 0x8D86, 0x8D87, 0x8D88, 0xC6E9, 0x8D89, /* U+5D10 */ 0x8D8A, 0x8D8B, 0x8D8C, 0x8D8D, 0xB4DE, 0x8D8E, 0xD1C2, 0x8D8F, /* U+5D18 */ 0x8D90, 0x8D91, 0x8D92, 0xE1C8, 0x8D93, 0x8D94, 0xE1C6, 0x8D95, /* U+5D20 */ 0x8D96, 0x8D97, 0x8D98, 0x8D99, 0xE1C5, 0x8D9A, 0xE1C3, 0xE1C2, /* U+5D28 */ 0x8D9B, 0xB1C0, 0x8D9C, 0x8D9D, 0x8D9E, 0xD5B8, 0xE1C4, 0x8D9F, /* U+5D30 */ 0x8DA0, 0x8DA1, 0x8DA2, 0x8DA3, 0xE1CB, 0x8DA4, 0x8DA5, 0x8DA6, /* U+5D38 */ 0x8DA7, 0x8DA8, 0x8DA9, 0x8DAA, 0x8DAB, 0xE1CC, 0xE1CA, 0x8DAC, /* U+5D40 */ 0x8DAD, 0x8DAE, 0x8DAF, 0x8DB0, 0x8DB1, 0x8DB2, 0x8DB3, 0xEFFA, /* U+5D48 */ 0x8DB4, 0x8DB5, 0xE1D3, 0xE1D2, 0xC7B6, 0x8DB6, 0x8DB7, 0x8DB8, /* U+5D50 */ 0x8DB9, 0x8DBA, 0x8DBB, 0x8DBC, 0x8DBD, 0x8DBE, 0x8DBF, 0x8DC0, /* U+5D58 */ 0xE1C9, 0x8DC1, 0x8DC2, 0xE1CE, 0x8DC3, 0xE1D0, 0x8DC4, 0x8DC5, /* U+5D60 */ 0x8DC6, 0x8DC7, 0x8DC8, 0x8DC9, 0x8DCA, 0x8DCB, 0x8DCC, 0x8DCD, /* U+5D68 */ 0x8DCE, 0xE1D4, 0x8DCF, 0xE1D1, 0xE1CD, 0x8DD0, 0x8DD1, 0xE1CF, /* U+5D70 */ 0x8DD2, 0x8DD3, 0x8DD4, 0x8DD5, 0xE1D5, 0x8DD6, 0x8DD7, 0x8DD8, /* U+5D78 */ 0x8DD9, 0x8DDA, 0x8DDB, 0x8DDC, 0x8DDD, 0x8DDE, 0x8DDF, 0x8DE0, /* U+5D80 */ 0x8DE1, 0x8DE2, 0xE1D6, 0x8DE3, 0x8DE4, 0x8DE5, 0x8DE6, 0x8DE7, /* U+5D88 */ 0x8DE8, 0x8DE9, 0x8DEA, 0x8DEB, 0x8DEC, 0x8DED, 0x8DEE, 0x8DEF, /* U+5D90 */ 0x8DF0, 0x8DF1, 0x8DF2, 0x8DF3, 0x8DF4, 0x8DF5, 0x8DF6, 0x8DF7, /* U+5D98 */ 0x8DF8, 0xE1D7, 0x8DF9, 0x8DFA, 0x8DFB, 0xE1D8, 0x8DFC, 0x8DFD, /* U+5DA0 */ 0x8DFE, 0x8E40, 0x8E41, 0x8E42, 0x8E43, 0x8E44, 0x8E45, 0x8E46, /* U+5DA8 */ 0x8E47, 0x8E48, 0x8E49, 0x8E4A, 0x8E4B, 0x8E4C, 0x8E4D, 0x8E4E, /* U+5DB0 */ 0x8E4F, 0x8E50, 0x8E51, 0x8E52, 0x8E53, 0x8E54, 0x8E55, 0xE1DA, /* U+5DB8 */ 0x8E56, 0x8E57, 0x8E58, 0x8E59, 0x8E5A, 0x8E5B, 0x8E5C, 0x8E5D, /* U+5DC0 */ 0x8E5E, 0x8E5F, 0x8E60, 0x8E61, 0x8E62, 0xE1DB, 0x8E63, 0x8E64, /* U+5DC8 */ 0x8E65, 0x8E66, 0x8E67, 0x8E68, 0x8E69, 0xCEA1, 0x8E6A, 0x8E6B, /* U+5DD0 */ 0x8E6C, 0x8E6D, 0x8E6E, 0x8E6F, 0x8E70, 0x8E71, 0x8E72, 0x8E73, /* U+5DD8 */ 0x8E74, 0x8E75, 0x8E76, 0xE7DD, 0x8E77, 0xB4A8, 0xD6DD, 0x8E78, /* U+5DE0 */ 0x8E79, 0xD1B2, 0xB3B2, 0x8E7A, 0x8E7B, 0xB9A4, 0xD7F3, 0xC7C9, /* U+5DE8 */ 0xBEDE, 0xB9AE, 0x8E7C, 0xCED7, 0x8E7D, 0x8E7E, 0xB2EE, 0xDBCF, /* U+5DF0 */ 0x8E80, 0xBCBA, 0xD2D1, 0xCBC8, 0xB0CD, 0x8E81, 0x8E82, 0xCFEF, /* U+5DF8 */ 0x8E83, 0x8E84, 0x8E85, 0x8E86, 0x8E87, 0xD9E3, 0xBDED, 0x8E88, /* U+5E00 */ 0x8E89, 0xB1D2, 0xCAD0, 0xB2BC, 0x8E8A, 0xCBA7, 0xB7AB, 0x8E8B, /* U+5E08 */ 0xCAA6, 0x8E8C, 0x8E8D, 0x8E8E, 0xCFA3, 0x8E8F, 0x8E90, 0xE0F8, /* U+5E10 */ 0xD5CA, 0xE0FB, 0x8E91, 0x8E92, 0xE0FA, 0xC5C1, 0xCCFB, 0x8E93, /* U+5E18 */ 0xC1B1, 0xE0F9, 0xD6E3, 0xB2AF, 0xD6C4, 0xB5DB, 0x8E94, 0x8E95, /* U+5E20 */ 0x8E96, 0x8E97, 0x8E98, 0x8E99, 0x8E9A, 0x8E9B, 0xB4F8, 0xD6A1, /* U+5E28 */ 0x8E9C, 0x8E9D, 0x8E9E, 0x8E9F, 0x8EA0, 0xCFAF, 0xB0EF, 0x8EA1, /* U+5E30 */ 0x8EA2, 0xE0FC, 0x8EA3, 0x8EA4, 0x8EA5, 0x8EA6, 0x8EA7, 0xE1A1, /* U+5E38 */ 0xB3A3, 0x8EA8, 0x8EA9, 0xE0FD, 0xE0FE, 0xC3B1, 0x8EAA, 0x8EAB, /* U+5E40 */ 0x8EAC, 0x8EAD, 0xC3DD, 0x8EAE, 0xE1A2, 0xB7F9, 0x8EAF, 0x8EB0, /* U+5E48 */ 0x8EB1, 0x8EB2, 0x8EB3, 0x8EB4, 0xBBCF, 0x8EB5, 0x8EB6, 0x8EB7, /* U+5E50 */ 0x8EB8, 0x8EB9, 0x8EBA, 0x8EBB, 0xE1A3, 0xC4BB, 0x8EBC, 0x8EBD, /* U+5E58 */ 0x8EBE, 0x8EBF, 0x8EC0, 0xE1A4, 0x8EC1, 0x8EC2, 0xE1A5, 0x8EC3, /* U+5E60 */ 0x8EC4, 0xE1A6, 0xB4B1, 0x8EC5, 0x8EC6, 0x8EC7, 0x8EC8, 0x8EC9, /* U+5E68 */ 0x8ECA, 0x8ECB, 0x8ECC, 0x8ECD, 0x8ECE, 0x8ECF, 0x8ED0, 0x8ED1, /* U+5E70 */ 0x8ED2, 0x8ED3, 0xB8C9, 0xC6BD, 0xC4EA, 0x8ED4, 0xB2A2, 0x8ED5, /* U+5E78 */ 0xD0D2, 0x8ED6, 0xE7DB, 0xBBC3, 0xD3D7, 0xD3C4, 0x8ED7, 0xB9E3, /* U+5E80 */ 0xE2CF, 0x8ED8, 0x8ED9, 0x8EDA, 0xD7AF, 0x8EDB, 0xC7EC, 0xB1D3, /* U+5E88 */ 0x8EDC, 0x8EDD, 0xB4B2, 0xE2D1, 0x8EDE, 0x8EDF, 0x8EE0, 0xD0F2, /* U+5E90 */ 0xC2AE, 0xE2D0, 0x8EE1, 0xBFE2, 0xD3A6, 0xB5D7, 0xE2D2, 0xB5EA, /* U+5E98 */ 0x8EE2, 0xC3ED, 0xB8FD, 0x8EE3, 0xB8AE, 0x8EE4, 0xC5D3, 0xB7CF, /* U+5EA0 */ 0xE2D4, 0x8EE5, 0x8EE6, 0x8EE7, 0x8EE8, 0xE2D3, 0xB6C8, 0xD7F9, /* U+5EA8 */ 0x8EE9, 0x8EEA, 0x8EEB, 0x8EEC, 0x8EED, 0xCDA5, 0x8EEE, 0x8EEF, /* U+5EB0 */ 0x8EF0, 0x8EF1, 0x8EF2, 0xE2D8, 0x8EF3, 0xE2D6, 0xCAFC, 0xBFB5, /* U+5EB8 */ 0xD3B9, 0xE2D5, 0x8EF4, 0x8EF5, 0x8EF6, 0x8EF7, 0xE2D7, 0x8EF8, /* U+5EC0 */ 0x8EF9, 0x8EFA, 0x8EFB, 0x8EFC, 0x8EFD, 0x8EFE, 0x8F40, 0x8F41, /* U+5EC8 */ 0x8F42, 0xC1AE, 0xC0C8, 0x8F43, 0x8F44, 0x8F45, 0x8F46, 0x8F47, /* U+5ED0 */ 0x8F48, 0xE2DB, 0xE2DA, 0xC0AA, 0x8F49, 0x8F4A, 0xC1CE, 0x8F4B, /* U+5ED8 */ 0x8F4C, 0x8F4D, 0x8F4E, 0xE2DC, 0x8F4F, 0x8F50, 0x8F51, 0x8F52, /* U+5EE0 */ 0x8F53, 0x8F54, 0x8F55, 0x8F56, 0x8F57, 0x8F58, 0x8F59, 0x8F5A, /* U+5EE8 */ 0xE2DD, 0x8F5B, 0xE2DE, 0x8F5C, 0x8F5D, 0x8F5E, 0x8F5F, 0x8F60, /* U+5EF0 */ 0x8F61, 0x8F62, 0x8F63, 0x8F64, 0xDBC8, 0x8F65, 0xD1D3, 0xCDA2, /* U+5EF8 */ 0x8F66, 0x8F67, 0xBDA8, 0x8F68, 0x8F69, 0x8F6A, 0xDEC3, 0xD8A5, /* U+5F00 */ 0xBFAA, 0xDBCD, 0xD2EC, 0xC6FA, 0xC5AA, 0x8F6B, 0x8F6C, 0x8F6D, /* U+5F08 */ 0xDEC4, 0x8F6E, 0xB1D7, 0xDFAE, 0x8F6F, 0x8F70, 0x8F71, 0xCABD, /* U+5F10 */ 0x8F72, 0xDFB1, 0x8F73, 0xB9AD, 0x8F74, 0xD2FD, 0x8F75, 0xB8A5, /* U+5F18 */ 0xBAEB, 0x8F76, 0x8F77, 0xB3DA, 0x8F78, 0x8F79, 0x8F7A, 0xB5DC, /* U+5F20 */ 0xD5C5, 0x8F7B, 0x8F7C, 0x8F7D, 0x8F7E, 0xC3D6, 0xCFD2, 0xBBA1, /* U+5F28 */ 0x8F80, 0xE5F3, 0xE5F2, 0x8F81, 0x8F82, 0xE5F4, 0x8F83, 0xCDE4, /* U+5F30 */ 0x8F84, 0xC8F5, 0x8F85, 0x8F86, 0x8F87, 0x8F88, 0x8F89, 0x8F8A, /* U+5F38 */ 0x8F8B, 0xB5AF, 0xC7BF, 0x8F8C, 0xE5F6, 0x8F8D, 0x8F8E, 0x8F8F, /* U+5F40 */ 0xECB0, 0x8F90, 0x8F91, 0x8F92, 0x8F93, 0x8F94, 0x8F95, 0x8F96, /* U+5F48 */ 0x8F97, 0x8F98, 0x8F99, 0x8F9A, 0x8F9B, 0x8F9C, 0x8F9D, 0x8F9E, /* U+5F50 */ 0xE5E6, 0x8F9F, 0xB9E9, 0xB5B1, 0x8FA0, 0xC2BC, 0xE5E8, 0xE5E7, /* U+5F58 */ 0xE5E9, 0x8FA1, 0x8FA2, 0x8FA3, 0x8FA4, 0xD2CD, 0x8FA5, 0x8FA6, /* U+5F60 */ 0x8FA7, 0xE1EA, 0xD0CE, 0x8FA8, 0xCDAE, 0x8FA9, 0xD1E5, 0x8FAA, /* U+5F68 */ 0x8FAB, 0xB2CA, 0xB1EB, 0x8FAC, 0xB1F2, 0xC5ED, 0x8FAD, 0x8FAE, /* U+5F70 */ 0xD5C3, 0xD3B0, 0x8FAF, 0xE1DC, 0x8FB0, 0x8FB1, 0x8FB2, 0xE1DD, /* U+5F78 */ 0x8FB3, 0xD2DB, 0x8FB4, 0xB3B9, 0xB1CB, 0x8FB5, 0x8FB6, 0x8FB7, /* U+5F80 */ 0xCDF9, 0xD5F7, 0xE1DE, 0x8FB8, 0xBEB6, 0xB4FD, 0x8FB9, 0xE1DF, /* U+5F88 */ 0xBADC, 0xE1E0, 0xBBB2, 0xC2C9, 0xE1E1, 0x8FBA, 0x8FBB, 0x8FBC, /* U+5F90 */ 0xD0EC, 0x8FBD, 0xCDBD, 0x8FBE, 0x8FBF, 0xE1E2, 0x8FC0, 0xB5C3, /* U+5F98 */ 0xC5C7, 0xE1E3, 0x8FC1, 0x8FC2, 0xE1E4, 0x8FC3, 0x8FC4, 0x8FC5, /* U+5FA0 */ 0x8FC6, 0xD3F9, 0x8FC7, 0x8FC8, 0x8FC9, 0x8FCA, 0x8FCB, 0x8FCC, /* U+5FA8 */ 0xE1E5, 0x8FCD, 0xD1AD, 0x8FCE, 0x8FCF, 0xE1E6, 0xCEA2, 0x8FD0, /* U+5FB0 */ 0x8FD1, 0x8FD2, 0x8FD3, 0x8FD4, 0x8FD5, 0xE1E7, 0x8FD6, 0xB5C2, /* U+5FB8 */ 0x8FD7, 0x8FD8, 0x8FD9, 0x8FDA, 0xE1E8, 0xBBD5, 0x8FDB, 0x8FDC, /* U+5FC0 */ 0x8FDD, 0x8FDE, 0x8FDF, 0xD0C4, 0xE2E0, 0xB1D8, 0xD2E4, 0x8FE0, /* U+5FC8 */ 0x8FE1, 0xE2E1, 0x8FE2, 0x8FE3, 0xBCC9, 0xC8CC, 0x8FE4, 0xE2E3, /* U+5FD0 */ 0xECFE, 0xECFD, 0xDFAF, 0x8FE5, 0x8FE6, 0x8FE7, 0xE2E2, 0xD6BE, /* U+5FD8 */ 0xCDFC, 0xC3A6, 0x8FE8, 0x8FE9, 0x8FEA, 0xE3C3, 0x8FEB, 0x8FEC, /* U+5FE0 */ 0xD6D2, 0xE2E7, 0x8FED, 0x8FEE, 0xE2E8, 0x8FEF, 0x8FF0, 0xD3C7, /* U+5FE8 */ 0x8FF1, 0x8FF2, 0xE2EC, 0xBFEC, 0x8FF3, 0xE2ED, 0xE2E5, 0x8FF4, /* U+5FF0 */ 0x8FF5, 0xB3C0, 0x8FF6, 0x8FF7, 0x8FF8, 0xC4EE, 0x8FF9, 0x8FFA, /* U+5FF8 */ 0xE2EE, 0x8FFB, 0x8FFC, 0xD0C3, 0x8FFD, 0xBAF6, 0xE2E9, 0xB7DE, /* U+6000 */ 0xBBB3, 0xCCAC, 0xCBCB, 0xE2E4, 0xE2E6, 0xE2EA, 0xE2EB, 0x8FFE, /* U+6008 */ 0x9040, 0x9041, 0xE2F7, 0x9042, 0x9043, 0xE2F4, 0xD4F5, 0xE2F3, /* U+6010 */ 0x9044, 0x9045, 0xC5AD, 0x9046, 0xD5FA, 0xC5C2, 0xB2C0, 0x9047, /* U+6018 */ 0x9048, 0xE2EF, 0x9049, 0xE2F2, 0xC1AF, 0xCBBC, 0x904A, 0x904B, /* U+6020 */ 0xB5A1, 0xE2F9, 0x904C, 0x904D, 0x904E, 0xBCB1, 0xE2F1, 0xD0D4, /* U+6028 */ 0xD4B9, 0xE2F5, 0xB9D6, 0xE2F6, 0x904F, 0x9050, 0x9051, 0xC7D3, /* U+6030 */ 0x9052, 0x9053, 0x9054, 0x9055, 0x9056, 0xE2F0, 0x9057, 0x9058, /* U+6038 */ 0x9059, 0x905A, 0x905B, 0xD7DC, 0xEDA1, 0x905C, 0x905D, 0xE2F8, /* U+6040 */ 0x905E, 0xEDA5, 0xE2FE, 0xCAD1, 0x905F, 0x9060, 0x9061, 0x9062, /* U+6048 */ 0x9063, 0x9064, 0x9065, 0xC1B5, 0x9066, 0xBBD0, 0x9067, 0x9068, /* U+6050 */ 0xBFD6, 0x9069, 0xBAE3, 0x906A, 0x906B, 0xCBA1, 0x906C, 0x906D, /* U+6058 */ 0x906E, 0xEDA6, 0xEDA3, 0x906F, 0x9070, 0xEDA2, 0x9071, 0x9072, /* U+6060 */ 0x9073, 0x9074, 0xBBD6, 0xEDA7, 0xD0F4, 0x9075, 0x9076, 0xEDA4, /* U+6068 */ 0xBADE, 0xB6F7, 0xE3A1, 0xB6B2, 0xCCF1, 0xB9A7, 0x9077, 0xCFA2, /* U+6070 */ 0xC7A1, 0x9078, 0x9079, 0xBFD2, 0x907A, 0x907B, 0xB6F1, 0x907C, /* U+6078 */ 0xE2FA, 0xE2FB, 0xE2FD, 0xE2FC, 0xC4D5, 0xE3A2, 0x907D, 0xD3C1, /* U+6080 */ 0x907E, 0x9080, 0x9081, 0xE3A7, 0xC7C4, 0x9082, 0x9083, 0x9084, /* U+6088 */ 0x9085, 0xCFA4, 0x9086, 0x9087, 0xE3A9, 0xBAB7, 0x9088, 0x9089, /* U+6090 */ 0x908A, 0x908B, 0xE3A8, 0x908C, 0xBBDA, 0x908D, 0xE3A3, 0x908E, /* U+6098 */ 0x908F, 0x9090, 0xE3A4, 0xE3AA, 0x9091, 0xE3A6, 0x9092, 0xCEF2, /* U+60A0 */ 0xD3C6, 0x9093, 0x9094, 0xBBBC, 0x9095, 0x9096, 0xD4C3, 0x9097, /* U+60A8 */ 0xC4FA, 0x9098, 0x9099, 0xEDA8, 0xD0FC, 0xE3A5, 0x909A, 0xC3F5, /* U+60B0 */ 0x909B, 0xE3AD, 0xB1AF, 0x909C, 0xE3B2, 0x909D, 0x909E, 0x909F, /* U+60B8 */ 0xBCC2, 0x90A0, 0x90A1, 0xE3AC, 0xB5BF, 0x90A2, 0x90A3, 0x90A4, /* U+60C0 */ 0x90A5, 0x90A6, 0x90A7, 0x90A8, 0x90A9, 0xC7E9, 0xE3B0, 0x90AA, /* U+60C8 */ 0x90AB, 0x90AC, 0xBEAA, 0xCDEF, 0x90AD, 0x90AE, 0x90AF, 0x90B0, /* U+60D0 */ 0x90B1, 0xBBF3, 0x90B2, 0x90B3, 0x90B4, 0xCCE8, 0x90B5, 0x90B6, /* U+60D8 */ 0xE3AF, 0x90B7, 0xE3B1, 0x90B8, 0xCFA7, 0xE3AE, 0x90B9, 0xCEA9, /* U+60E0 */ 0xBBDD, 0x90BA, 0x90BB, 0x90BC, 0x90BD, 0x90BE, 0xB5EB, 0xBEE5, /* U+60E8 */ 0xB2D2, 0xB3CD, 0x90BF, 0xB1B9, 0xE3AB, 0xB2D1, 0xB5AC, 0xB9DF, /* U+60F0 */ 0xB6E8, 0x90C0, 0x90C1, 0xCFEB, 0xE3B7, 0x90C2, 0xBBCC, 0x90C3, /* U+60F8 */ 0x90C4, 0xC8C7, 0xD0CA, 0x90C5, 0x90C6, 0x90C7, 0x90C8, 0x90C9, /* U+6100 */ 0xE3B8, 0xB3EE, 0x90CA, 0x90CB, 0x90CC, 0x90CD, 0xEDA9, 0x90CE, /* U+6108 */ 0xD3FA, 0xD3E4, 0x90CF, 0x90D0, 0x90D1, 0xEDAA, 0xE3B9, 0xD2E2, /* U+6110 */ 0x90D2, 0x90D3, 0x90D4, 0x90D5, 0x90D6, 0xE3B5, 0x90D7, 0x90D8, /* U+6118 */ 0x90D9, 0x90DA, 0xD3DE, 0x90DB, 0x90DC, 0x90DD, 0x90DE, 0xB8D0, /* U+6120 */ 0xE3B3, 0x90DF, 0x90E0, 0xE3B6, 0xB7DF, 0x90E1, 0xE3B4, 0xC0A2, /* U+6128 */ 0x90E2, 0x90E3, 0x90E4, 0xE3BA, 0x90E5, 0x90E6, 0x90E7, 0x90E8, /* U+6130 */ 0x90E9, 0x90EA, 0x90EB, 0x90EC, 0x90ED, 0x90EE, 0x90EF, 0x90F0, /* U+6138 */ 0x90F1, 0x90F2, 0x90F3, 0x90F4, 0x90F5, 0x90F6, 0x90F7, 0xD4B8, /* U+6140 */ 0x90F8, 0x90F9, 0x90FA, 0x90FB, 0x90FC, 0x90FD, 0x90FE, 0x9140, /* U+6148 */ 0xB4C8, 0x9141, 0xE3BB, 0x9142, 0xBBC5, 0x9143, 0xC9F7, 0x9144, /* U+6150 */ 0x9145, 0xC9E5, 0x9146, 0x9147, 0x9148, 0xC4BD, 0x9149, 0x914A, /* U+6158 */ 0x914B, 0x914C, 0x914D, 0x914E, 0x914F, 0xEDAB, 0x9150, 0x9151, /* U+6160 */ 0x9152, 0x9153, 0xC2FD, 0x9154, 0x9155, 0x9156, 0x9157, 0xBBDB, /* U+6168 */ 0xBFAE, 0x9158, 0x9159, 0x915A, 0x915B, 0x915C, 0x915D, 0x915E, /* U+6170 */ 0xCEBF, 0x915F, 0x9160, 0x9161, 0x9162, 0xE3BC, 0x9163, 0xBFB6, /* U+6178 */ 0x9164, 0x9165, 0x9166, 0x9167, 0x9168, 0x9169, 0x916A, 0x916B, /* U+6180 */ 0x916C, 0x916D, 0x916E, 0x916F, 0x9170, 0x9171, 0x9172, 0x9173, /* U+6188 */ 0x9174, 0x9175, 0x9176, 0xB1EF, 0x9177, 0x9178, 0xD4F7, 0x9179, /* U+6190 */ 0x917A, 0x917B, 0x917C, 0x917D, 0xE3BE, 0x917E, 0x9180, 0x9181, /* U+6198 */ 0x9182, 0x9183, 0x9184, 0x9185, 0x9186, 0xEDAD, 0x9187, 0x9188, /* U+61A0 */ 0x9189, 0x918A, 0x918B, 0x918C, 0x918D, 0x918E, 0x918F, 0xE3BF, /* U+61A8 */ 0xBAA9, 0xEDAC, 0x9190, 0x9191, 0xE3BD, 0x9192, 0x9193, 0x9194, /* U+61B0 */ 0x9195, 0x9196, 0x9197, 0x9198, 0x9199, 0x919A, 0x919B, 0xE3C0, /* U+61B8 */ 0x919C, 0x919D, 0x919E, 0x919F, 0x91A0, 0x91A1, 0xBAB6, 0x91A2, /* U+61C0 */ 0x91A3, 0x91A4, 0xB6AE, 0x91A5, 0x91A6, 0x91A7, 0x91A8, 0x91A9, /* U+61C8 */ 0xD0B8, 0x91AA, 0xB0C3, 0xEDAE, 0x91AB, 0x91AC, 0x91AD, 0x91AE, /* U+61D0 */ 0x91AF, 0xEDAF, 0xC0C1, 0x91B0, 0xE3C1, 0x91B1, 0x91B2, 0x91B3, /* U+61D8 */ 0x91B4, 0x91B5, 0x91B6, 0x91B7, 0x91B8, 0x91B9, 0x91BA, 0x91BB, /* U+61E0 */ 0x91BC, 0x91BD, 0x91BE, 0x91BF, 0x91C0, 0x91C1, 0xC5B3, 0x91C2, /* U+61E8 */ 0x91C3, 0x91C4, 0x91C5, 0x91C6, 0x91C7, 0x91C8, 0x91C9, 0x91CA, /* U+61F0 */ 0x91CB, 0x91CC, 0x91CD, 0x91CE, 0x91CF, 0xE3C2, 0x91D0, 0x91D1, /* U+61F8 */ 0x91D2, 0x91D3, 0x91D4, 0x91D5, 0x91D6, 0x91D7, 0x91D8, 0xDCB2, /* U+6200 */ 0x91D9, 0x91DA, 0x91DB, 0x91DC, 0x91DD, 0x91DE, 0xEDB0, 0x91DF, /* U+6208 */ 0xB8EA, 0x91E0, 0xCEEC, 0xEAA7, 0xD0E7, 0xCAF9, 0xC8D6, 0xCFB7, /* U+6210 */ 0xB3C9, 0xCED2, 0xBDE4, 0x91E1, 0x91E2, 0xE3DE, 0xBBF2, 0xEAA8, /* U+6218 */ 0xD5BD, 0x91E3, 0xC6DD, 0xEAA9, 0x91E4, 0x91E5, 0x91E6, 0xEAAA, /* U+6220 */ 0x91E7, 0xEAAC, 0xEAAB, 0x91E8, 0xEAAE, 0xEAAD, 0x91E9, 0x91EA, /* U+6228 */ 0x91EB, 0x91EC, 0xBDD8, 0x91ED, 0xEAAF, 0x91EE, 0xC2BE, 0x91EF, /* U+6230 */ 0x91F0, 0x91F1, 0x91F2, 0xB4C1, 0xB4F7, 0x91F3, 0x91F4, 0xBBA7, /* U+6238 */ 0x91F5, 0x91F6, 0x91F7, 0x91F8, 0x91F9, 0xECE6, 0xECE5, 0xB7BF, /* U+6240 */ 0xCBF9, 0xB1E2, 0x91FA, 0xECE7, 0x91FB, 0x91FC, 0x91FD, 0xC9C8, /* U+6248 */ 0xECE8, 0xECE9, 0x91FE, 0xCAD6, 0xDED0, 0xB2C5, 0xD4FA, 0x9240, /* U+6250 */ 0x9241, 0xC6CB, 0xB0C7, 0xB4F2, 0xC8D3, 0x9242, 0x9243, 0x9244, /* U+6258 */ 0xCDD0, 0x9245, 0x9246, 0xBFB8, 0x9247, 0x9248, 0x9249, 0x924A, /* U+6260 */ 0x924B, 0x924C, 0x924D, 0xBFDB, 0x924E, 0x924F, 0xC7A4, 0xD6B4, /* U+6268 */ 0x9250, 0xC0A9, 0xDED1, 0xC9A8, 0xD1EF, 0xC5A4, 0xB0E7, 0xB3B6, /* U+6270 */ 0xC8C5, 0x9251, 0x9252, 0xB0E2, 0x9253, 0x9254, 0xB7F6, 0x9255, /* U+6278 */ 0x9256, 0xC5FA, 0x9257, 0x9258, 0xB6F3, 0x9259, 0xD5D2, 0xB3D0, /* U+6280 */ 0xBCBC, 0x925A, 0x925B, 0x925C, 0xB3AD, 0x925D, 0x925E, 0x925F, /* U+6288 */ 0x9260, 0xBEF1, 0xB0D1, 0x9261, 0x9262, 0x9263, 0x9264, 0x9265, /* U+6290 */ 0x9266, 0xD2D6, 0xCAE3, 0xD7A5, 0x9267, 0xCDB6, 0xB6B6, 0xBFB9, /* U+6298 */ 0xD5DB, 0x9268, 0xB8A7, 0xC5D7, 0x9269, 0x926A, 0x926B, 0xDED2, /* U+62A0 */ 0xBFD9, 0xC2D5, 0xC7C0, 0x926C, 0xBBA4, 0xB1A8, 0x926D, 0x926E, /* U+62A8 */ 0xC5EA, 0x926F, 0x9270, 0xC5FB, 0xCCA7, 0x9271, 0x9272, 0x9273, /* U+62B0 */ 0x9274, 0xB1A7, 0x9275, 0x9276, 0x9277, 0xB5D6, 0x9278, 0x9279, /* U+62B8 */ 0x927A, 0xC4A8, 0x927B, 0xDED3, 0xD1BA, 0xB3E9, 0x927C, 0xC3F2, /* U+62C0 */ 0x927D, 0x927E, 0xB7F7, 0x9280, 0xD6F4, 0xB5A3, 0xB2F0, 0xC4B4, /* U+62C8 */ 0xC4E9, 0xC0AD, 0xDED4, 0x9281, 0xB0E8, 0xC5C4, 0xC1E0, 0x9282, /* U+62D0 */ 0xB9D5, 0x9283, 0xBEDC, 0xCDD8, 0xB0CE, 0x9284, 0xCDCF, 0xDED6, /* U+62D8 */ 0xBED0, 0xD7BE, 0xDED5, 0xD5D0, 0xB0DD, 0x9285, 0x9286, 0xC4E2, /* U+62E0 */ 0x9287, 0x9288, 0xC2A3, 0xBCF0, 0x9289, 0xD3B5, 0xC0B9, 0xC5A1, /* U+62E8 */ 0xB2A6, 0xD4F1, 0x928A, 0x928B, 0xC0A8, 0xCAC3, 0xDED7, 0xD5FC, /* U+62F0 */ 0x928C, 0xB9B0, 0x928D, 0xC8AD, 0xCBA9, 0x928E, 0xDED9, 0xBFBD, /* U+62F8 */ 0x928F, 0x9290, 0x9291, 0x9292, 0xC6B4, 0xD7A7, 0xCAB0, 0xC4C3, /* U+6300 */ 0x9293, 0xB3D6, 0xB9D2, 0x9294, 0x9295, 0x9296, 0x9297, 0xD6B8, /* U+6308 */ 0xEAFC, 0xB0B4, 0x9298, 0x9299, 0x929A, 0x929B, 0xBFE6, 0x929C, /* U+6310 */ 0x929D, 0xCCF4, 0x929E, 0x929F, 0x92A0, 0x92A1, 0xCDDA, 0x92A2, /* U+6318 */ 0x92A3, 0x92A4, 0xD6BF, 0xC2CE, 0x92A5, 0xCECE, 0xCCA2, 0xD0AE, /* U+6320 */ 0xC4D3, 0xB5B2, 0xDED8, 0xD5F5, 0xBCB7, 0xBBD3, 0x92A6, 0x92A7, /* U+6328 */ 0xB0A4, 0x92A8, 0xC5B2, 0xB4EC, 0x92A9, 0x92AA, 0x92AB, 0xD5F1, /* U+6330 */ 0x92AC, 0x92AD, 0xEAFD, 0x92AE, 0x92AF, 0x92B0, 0x92B1, 0x92B2, /* U+6338 */ 0x92B3, 0xDEDA, 0xCDA6, 0x92B4, 0x92B5, 0xCDEC, 0x92B6, 0x92B7, /* U+6340 */ 0x92B8, 0x92B9, 0xCEE6, 0xDEDC, 0x92BA, 0xCDB1, 0xC0A6, 0x92BB, /* U+6348 */ 0x92BC, 0xD7BD, 0x92BD, 0xDEDB, 0xB0C6, 0xBAB4, 0xC9D3, 0xC4F3, /* U+6350 */ 0xBEE8, 0x92BE, 0x92BF, 0x92C0, 0x92C1, 0xB2B6, 0x92C2, 0x92C3, /* U+6358 */ 0x92C4, 0x92C5, 0x92C6, 0x92C7, 0x92C8, 0x92C9, 0xC0CC, 0xCBF0, /* U+6360 */ 0x92CA, 0xBCF1, 0xBBBB, 0xB5B7, 0x92CB, 0x92CC, 0x92CD, 0xC5F5, /* U+6368 */ 0x92CE, 0xDEE6, 0x92CF, 0x92D0, 0x92D1, 0xDEE3, 0xBEDD, 0x92D2, /* U+6370 */ 0x92D3, 0xDEDF, 0x92D4, 0x92D5, 0x92D6, 0x92D7, 0xB4B7, 0xBDDD, /* U+6378 */ 0x92D8, 0x92D9, 0xDEE0, 0xC4ED, 0x92DA, 0x92DB, 0x92DC, 0x92DD, /* U+6380 */ 0xCFC6, 0x92DE, 0xB5E0, 0x92DF, 0x92E0, 0x92E1, 0x92E2, 0xB6DE, /* U+6388 */ 0xCADA, 0xB5F4, 0xDEE5, 0x92E3, 0xD5C6, 0x92E4, 0xDEE1, 0xCCCD, /* U+6390 */ 0xC6FE, 0x92E5, 0xC5C5, 0x92E6, 0x92E7, 0x92E8, 0xD2B4, 0x92E9, /* U+6398 */ 0xBEF2, 0x92EA, 0x92EB, 0x92EC, 0x92ED, 0x92EE, 0x92EF, 0x92F0, /* U+63A0 */ 0xC2D3, 0x92F1, 0xCCBD, 0xB3B8, 0x92F2, 0xBDD3, 0x92F3, 0xBFD8, /* U+63A8 */ 0xCDC6, 0xD1DA, 0xB4EB, 0x92F4, 0xDEE4, 0xDEDD, 0xDEE7, 0x92F5, /* U+63B0 */ 0xEAFE, 0x92F6, 0x92F7, 0xC2B0, 0xDEE2, 0x92F8, 0x92F9, 0xD6C0, /* U+63B8 */ 0xB5A7, 0x92FA, 0xB2F4, 0x92FB, 0xDEE8, 0x92FC, 0xDEF2, 0x92FD, /* U+63C0 */ 0x92FE, 0x9340, 0x9341, 0x9342, 0xDEED, 0x9343, 0xDEF1, 0x9344, /* U+63C8 */ 0x9345, 0xC8E0, 0x9346, 0x9347, 0x9348, 0xD7E1, 0xDEEF, 0xC3E8, /* U+63D0 */ 0xCCE1, 0x9349, 0xB2E5, 0x934A, 0x934B, 0x934C, 0xD2BE, 0x934D, /* U+63D8 */ 0x934E, 0x934F, 0x9350, 0x9351, 0x9352, 0x9353, 0xDEEE, 0x9354, /* U+63E0 */ 0xDEEB, 0xCED5, 0x9355, 0xB4A7, 0x9356, 0x9357, 0x9358, 0x9359, /* U+63E8 */ 0x935A, 0xBFAB, 0xBEBE, 0x935B, 0x935C, 0xBDD2, 0x935D, 0x935E, /* U+63F0 */ 0x935F, 0x9360, 0xDEE9, 0x9361, 0xD4AE, 0x9362, 0xDEDE, 0x9363, /* U+63F8 */ 0xDEEA, 0x9364, 0x9365, 0x9366, 0x9367, 0xC0BF, 0x9368, 0xDEEC, /* U+6400 */ 0xB2F3, 0xB8E9, 0xC2A7, 0x9369, 0x936A, 0xBDC1, 0x936B, 0x936C, /* U+6408 */ 0x936D, 0x936E, 0x936F, 0xDEF5, 0xDEF8, 0x9370, 0x9371, 0xB2AB, /* U+6410 */ 0xB4A4, 0x9372, 0x9373, 0xB4EA, 0xC9A6, 0x9374, 0x9375, 0x9376, /* U+6418 */ 0x9377, 0x9378, 0x9379, 0xDEF6, 0xCBD1, 0x937A, 0xB8E3, 0x937B, /* U+6420 */ 0xDEF7, 0xDEFA, 0x937C, 0x937D, 0x937E, 0x9380, 0xDEF9, 0x9381, /* U+6428 */ 0x9382, 0x9383, 0xCCC2, 0x9384, 0xB0E1, 0xB4EE, 0x9385, 0x9386, /* U+6430 */ 0x9387, 0x9388, 0x9389, 0x938A, 0xE5BA, 0x938B, 0x938C, 0x938D, /* U+6438 */ 0x938E, 0x938F, 0xD0AF, 0x9390, 0x9391, 0xB2EB, 0x9392, 0xEBA1, /* U+6440 */ 0x9393, 0xDEF4, 0x9394, 0x9395, 0xC9E3, 0xDEF3, 0xB0DA, 0xD2A1, /* U+6448 */ 0xB1F7, 0x9396, 0xCCAF, 0x9397, 0x9398, 0x9399, 0x939A, 0x939B, /* U+6450 */ 0x939C, 0x939D, 0xDEF0, 0x939E, 0xCBA4, 0x939F, 0x93A0, 0x93A1, /* U+6458 */ 0xD5AA, 0x93A2, 0x93A3, 0x93A4, 0x93A5, 0x93A6, 0xDEFB, 0x93A7, /* U+6460 */ 0x93A8, 0x93A9, 0x93AA, 0x93AB, 0x93AC, 0x93AD, 0x93AE, 0xB4DD, /* U+6468 */ 0x93AF, 0xC4A6, 0x93B0, 0x93B1, 0x93B2, 0xDEFD, 0x93B3, 0x93B4, /* U+6470 */ 0x93B5, 0x93B6, 0x93B7, 0x93B8, 0x93B9, 0x93BA, 0x93BB, 0x93BC, /* U+6478 */ 0xC3FE, 0xC4A1, 0xDFA1, 0x93BD, 0x93BE, 0x93BF, 0x93C0, 0x93C1, /* U+6480 */ 0x93C2, 0x93C3, 0xC1CC, 0x93C4, 0xDEFC, 0xBEEF, 0x93C5, 0xC6B2, /* U+6488 */ 0x93C6, 0x93C7, 0x93C8, 0x93C9, 0x93CA, 0x93CB, 0x93CC, 0x93CD, /* U+6490 */ 0x93CE, 0xB3C5, 0xC8F6, 0x93CF, 0x93D0, 0xCBBA, 0xDEFE, 0x93D1, /* U+6498 */ 0x93D2, 0xDFA4, 0x93D3, 0x93D4, 0x93D5, 0x93D6, 0xD7B2, 0x93D7, /* U+64A0 */ 0x93D8, 0x93D9, 0x93DA, 0x93DB, 0xB3B7, 0x93DC, 0x93DD, 0x93DE, /* U+64A8 */ 0x93DF, 0xC1C3, 0x93E0, 0x93E1, 0xC7CB, 0xB2A5, 0xB4E9, 0x93E2, /* U+64B0 */ 0xD7AB, 0x93E3, 0x93E4, 0x93E5, 0x93E6, 0xC4EC, 0x93E7, 0xDFA2, /* U+64B8 */ 0xDFA3, 0x93E8, 0xDFA5, 0x93E9, 0xBAB3, 0x93EA, 0x93EB, 0x93EC, /* U+64C0 */ 0xDFA6, 0x93ED, 0xC0DE, 0x93EE, 0x93EF, 0xC9C3, 0x93F0, 0x93F1, /* U+64C8 */ 0x93F2, 0x93F3, 0x93F4, 0x93F5, 0x93F6, 0xB2D9, 0xC7E6, 0x93F7, /* U+64D0 */ 0xDFA7, 0x93F8, 0xC7DC, 0x93F9, 0x93FA, 0x93FB, 0x93FC, 0xDFA8, /* U+64D8 */ 0xEBA2, 0x93FD, 0x93FE, 0x9440, 0x9441, 0x9442, 0xCBD3, 0x9443, /* U+64E0 */ 0x9444, 0x9445, 0xDFAA, 0x9446, 0xDFA9, 0x9447, 0xB2C1, 0x9448, /* U+64E8 */ 0x9449, 0x944A, 0x944B, 0x944C, 0x944D, 0x944E, 0x944F, 0x9450, /* U+64F0 */ 0x9451, 0x9452, 0x9453, 0x9454, 0x9455, 0x9456, 0x9457, 0x9458, /* U+64F8 */ 0x9459, 0x945A, 0x945B, 0x945C, 0x945D, 0x945E, 0x945F, 0x9460, /* U+6500 */ 0xC5CA, 0x9461, 0x9462, 0x9463, 0x9464, 0x9465, 0x9466, 0x9467, /* U+6508 */ 0x9468, 0xDFAB, 0x9469, 0x946A, 0x946B, 0x946C, 0x946D, 0x946E, /* U+6510 */ 0x946F, 0x9470, 0xD4DC, 0x9471, 0x9472, 0x9473, 0x9474, 0x9475, /* U+6518 */ 0xC8C1, 0x9476, 0x9477, 0x9478, 0x9479, 0x947A, 0x947B, 0x947C, /* U+6520 */ 0x947D, 0x947E, 0x9480, 0x9481, 0x9482, 0xDFAC, 0x9483, 0x9484, /* U+6528 */ 0x9485, 0x9486, 0x9487, 0xBEF0, 0x9488, 0x9489, 0xDFAD, 0xD6A7, /* U+6530 */ 0x948A, 0x948B, 0x948C, 0x948D, 0xEAB7, 0xEBB6, 0xCAD5, 0x948E, /* U+6538 */ 0xD8FC, 0xB8C4, 0x948F, 0xB9A5, 0x9490, 0x9491, 0xB7C5, 0xD5FE, /* U+6540 */ 0x9492, 0x9493, 0x9494, 0x9495, 0x9496, 0xB9CA, 0x9497, 0x9498, /* U+6548 */ 0xD0A7, 0xF4CD, 0x9499, 0x949A, 0xB5D0, 0x949B, 0x949C, 0xC3F4, /* U+6550 */ 0x949D, 0xBEC8, 0x949E, 0x949F, 0x94A0, 0xEBB7, 0xB0BD, 0x94A1, /* U+6558 */ 0x94A2, 0xBDCC, 0x94A3, 0xC1B2, 0x94A4, 0xB1D6, 0xB3A8, 0x94A5, /* U+6560 */ 0x94A6, 0x94A7, 0xB8D2, 0xC9A2, 0x94A8, 0x94A9, 0xB6D8, 0x94AA, /* U+6568 */ 0x94AB, 0x94AC, 0x94AD, 0xEBB8, 0xBEB4, 0x94AE, 0x94AF, 0x94B0, /* U+6570 */ 0xCAFD, 0x94B1, 0xC7C3, 0x94B2, 0xD5FB, 0x94B3, 0x94B4, 0xB7F3, /* U+6578 */ 0x94B5, 0x94B6, 0x94B7, 0x94B8, 0x94B9, 0x94BA, 0x94BB, 0x94BC, /* U+6580 */ 0x94BD, 0x94BE, 0x94BF, 0x94C0, 0x94C1, 0x94C2, 0x94C3, 0xCEC4, /* U+6588 */ 0x94C4, 0x94C5, 0x94C6, 0xD5AB, 0xB1F3, 0x94C7, 0x94C8, 0x94C9, /* U+6590 */ 0xECB3, 0xB0DF, 0x94CA, 0xECB5, 0x94CB, 0x94CC, 0x94CD, 0xB6B7, /* U+6598 */ 0x94CE, 0xC1CF, 0x94CF, 0xF5FA, 0xD0B1, 0x94D0, 0x94D1, 0xD5E5, /* U+65A0 */ 0x94D2, 0xCED3, 0x94D3, 0x94D4, 0xBDEF, 0xB3E2, 0x94D5, 0xB8AB, /* U+65A8 */ 0x94D6, 0xD5B6, 0x94D7, 0xEDBD, 0x94D8, 0xB6CF, 0x94D9, 0xCBB9, /* U+65B0 */ 0xD0C2, 0x94DA, 0x94DB, 0x94DC, 0x94DD, 0x94DE, 0x94DF, 0x94E0, /* U+65B8 */ 0x94E1, 0xB7BD, 0x94E2, 0x94E3, 0xECB6, 0xCAA9, 0x94E4, 0x94E5, /* U+65C0 */ 0x94E6, 0xC5D4, 0x94E7, 0xECB9, 0xECB8, 0xC2C3, 0xECB7, 0x94E8, /* U+65C8 */ 0x94E9, 0x94EA, 0x94EB, 0xD0FD, 0xECBA, 0x94EC, 0xECBB, 0xD7E5, /* U+65D0 */ 0x94ED, 0x94EE, 0xECBC, 0x94EF, 0x94F0, 0x94F1, 0xECBD, 0xC6EC, /* U+65D8 */ 0x94F2, 0x94F3, 0x94F4, 0x94F5, 0x94F6, 0x94F7, 0x94F8, 0x94F9, /* U+65E0 */ 0xCEDE, 0x94FA, 0xBCC8, 0x94FB, 0x94FC, 0xC8D5, 0xB5A9, 0xBEC9, /* U+65E8 */ 0xD6BC, 0xD4E7, 0x94FD, 0x94FE, 0xD1AE, 0xD0F1, 0xEAB8, 0xEAB9, /* U+65F0 */ 0xEABA, 0xBAB5, 0x9540, 0x9541, 0x9542, 0x9543, 0xCAB1, 0xBFF5, /* U+65F8 */ 0x9544, 0x9545, 0xCDFA, 0x9546, 0x9547, 0x9548, 0x9549, 0x954A, /* U+6600 */ 0xEAC0, 0x954B, 0xB0BA, 0xEABE, 0x954C, 0x954D, 0xC0A5, 0x954E, /* U+6608 */ 0x954F, 0x9550, 0xEABB, 0x9551, 0xB2FD, 0x9552, 0xC3F7, 0xBBE8, /* U+6610 */ 0x9553, 0x9554, 0x9555, 0xD2D7, 0xCEF4, 0xEABF, 0x9556, 0x9557, /* U+6618 */ 0x9558, 0xEABC, 0x9559, 0x955A, 0x955B, 0xEAC3, 0x955C, 0xD0C7, /* U+6620 */ 0xD3B3, 0x955D, 0x955E, 0x955F, 0x9560, 0xB4BA, 0x9561, 0xC3C1, /* U+6628 */ 0xD7F2, 0x9562, 0x9563, 0x9564, 0x9565, 0xD5D1, 0x9566, 0xCAC7, /* U+6630 */ 0x9567, 0xEAC5, 0x9568, 0x9569, 0xEAC4, 0xEAC7, 0xEAC6, 0x956A, /* U+6638 */ 0x956B, 0x956C, 0x956D, 0x956E, 0xD6E7, 0x956F, 0xCFD4, 0x9570, /* U+6640 */ 0x9571, 0xEACB, 0x9572, 0xBBCE, 0x9573, 0x9574, 0x9575, 0x9576, /* U+6648 */ 0x9577, 0x9578, 0x9579, 0xBDFA, 0xC9CE, 0x957A, 0x957B, 0xEACC, /* U+6650 */ 0x957C, 0x957D, 0xC9B9, 0xCFFE, 0xEACA, 0xD4CE, 0xEACD, 0xEACF, /* U+6658 */ 0x957E, 0x9580, 0xCDED, 0x9581, 0x9582, 0x9583, 0x9584, 0xEAC9, /* U+6660 */ 0x9585, 0xEACE, 0x9586, 0x9587, 0xCEEE, 0x9588, 0xBBDE, 0x9589, /* U+6668 */ 0xB3BF, 0x958A, 0x958B, 0x958C, 0x958D, 0x958E, 0xC6D5, 0xBEB0, /* U+6670 */ 0xCEFA, 0x958F, 0x9590, 0x9591, 0xC7E7, 0x9592, 0xBEA7, 0xEAD0, /* U+6678 */ 0x9593, 0x9594, 0xD6C7, 0x9595, 0x9596, 0x9597, 0xC1C0, 0x9598, /* U+6680 */ 0x9599, 0x959A, 0xD4DD, 0x959B, 0xEAD1, 0x959C, 0x959D, 0xCFBE, /* U+6688 */ 0x959E, 0x959F, 0x95A0, 0x95A1, 0xEAD2, 0x95A2, 0x95A3, 0x95A4, /* U+6690 */ 0x95A5, 0xCAEE, 0x95A6, 0x95A7, 0x95A8, 0x95A9, 0xC5AF, 0xB0B5, /* U+6698 */ 0x95AA, 0x95AB, 0x95AC, 0x95AD, 0x95AE, 0xEAD4, 0x95AF, 0x95B0, /* U+66A0 */ 0x95B1, 0x95B2, 0x95B3, 0x95B4, 0x95B5, 0x95B6, 0x95B7, 0xEAD3, /* U+66A8 */ 0xF4DF, 0x95B8, 0x95B9, 0x95BA, 0x95BB, 0x95BC, 0xC4BA, 0x95BD, /* U+66B0 */ 0x95BE, 0x95BF, 0x95C0, 0x95C1, 0xB1A9, 0x95C2, 0x95C3, 0x95C4, /* U+66B8 */ 0x95C5, 0xE5DF, 0x95C6, 0x95C7, 0x95C8, 0x95C9, 0xEAD5, 0x95CA, /* U+66C0 */ 0x95CB, 0x95CC, 0x95CD, 0x95CE, 0x95CF, 0x95D0, 0x95D1, 0x95D2, /* U+66C8 */ 0x95D3, 0x95D4, 0x95D5, 0x95D6, 0x95D7, 0x95D8, 0x95D9, 0x95DA, /* U+66D0 */ 0x95DB, 0x95DC, 0x95DD, 0x95DE, 0x95DF, 0x95E0, 0x95E1, 0x95E2, /* U+66D8 */ 0x95E3, 0xCAEF, 0x95E4, 0xEAD6, 0xEAD7, 0xC6D8, 0x95E5, 0x95E6, /* U+66E0 */ 0x95E7, 0x95E8, 0x95E9, 0x95EA, 0x95EB, 0x95EC, 0xEAD8, 0x95ED, /* U+66E8 */ 0x95EE, 0xEAD9, 0x95EF, 0x95F0, 0x95F1, 0x95F2, 0x95F3, 0x95F4, /* U+66F0 */ 0xD4BB, 0x95F5, 0xC7FA, 0xD2B7, 0xB8FC, 0x95F6, 0x95F7, 0xEAC2, /* U+66F8 */ 0x95F8, 0xB2DC, 0x95F9, 0x95FA, 0xC2FC, 0x95FB, 0xD4F8, 0xCCE6, /* U+6700 */ 0xD7EE, 0x95FC, 0x95FD, 0x95FE, 0x9640, 0x9641, 0x9642, 0x9643, /* U+6708 */ 0xD4C2, 0xD3D0, 0xEBC3, 0xC5F3, 0x9644, 0xB7FE, 0x9645, 0x9646, /* U+6710 */ 0xEBD4, 0x9647, 0x9648, 0x9649, 0xCBB7, 0xEBDE, 0x964A, 0xC0CA, /* U+6718 */ 0x964B, 0x964C, 0x964D, 0xCDFB, 0x964E, 0xB3AF, 0x964F, 0xC6DA, /* U+6720 */ 0x9650, 0x9651, 0x9652, 0x9653, 0x9654, 0x9655, 0xEBFC, 0x9656, /* U+6728 */ 0xC4BE, 0x9657, 0xCEB4, 0xC4A9, 0xB1BE, 0xD4FD, 0x9658, 0xCAF5, /* U+6730 */ 0x9659, 0xD6EC, 0x965A, 0x965B, 0xC6D3, 0xB6E4, 0x965C, 0x965D, /* U+6738 */ 0x965E, 0x965F, 0xBBFA, 0x9660, 0x9661, 0xD0E0, 0x9662, 0x9663, /* U+6740 */ 0xC9B1, 0x9664, 0xD4D3, 0xC8A8, 0x9665, 0x9666, 0xB8CB, 0x9667, /* U+6748 */ 0xE8BE, 0xC9BC, 0x9668, 0x9669, 0xE8BB, 0x966A, 0xC0EE, 0xD0D3, /* U+6750 */ 0xB2C4, 0xB4E5, 0x966B, 0xE8BC, 0x966C, 0x966D, 0xD5C8, 0x966E, /* U+6758 */ 0x966F, 0x9670, 0x9671, 0x9672, 0xB6C5, 0x9673, 0xE8BD, 0xCAF8, /* U+6760 */ 0xB8DC, 0xCCF5, 0x9674, 0x9675, 0x9676, 0xC0B4, 0x9677, 0x9678, /* U+6768 */ 0xD1EE, 0xE8BF, 0xE8C2, 0x9679, 0x967A, 0xBABC, 0x967B, 0xB1AD, /* U+6770 */ 0xBDDC, 0x967C, 0xEABD, 0xE8C3, 0x967D, 0xE8C6, 0x967E, 0xE8CB, /* U+6778 */ 0x9680, 0x9681, 0x9682, 0x9683, 0xE8CC, 0x9684, 0xCBC9, 0xB0E5, /* U+6780 */ 0x9685, 0xBCAB, 0x9686, 0x9687, 0xB9B9, 0x9688, 0x9689, 0xE8C1, /* U+6788 */ 0x968A, 0xCDF7, 0x968B, 0xE8CA, 0x968C, 0x968D, 0x968E, 0x968F, /* U+6790 */ 0xCEF6, 0x9690, 0x9691, 0x9692, 0x9693, 0xD5ED, 0x9694, 0xC1D6, /* U+6798 */ 0xE8C4, 0x9695, 0xC3B6, 0x9696, 0xB9FB, 0xD6A6, 0xE8C8, 0x9697, /* U+67A0 */ 0x9698, 0x9699, 0xCAE0, 0xD4E6, 0x969A, 0xE8C0, 0x969B, 0xE8C5, /* U+67A8 */ 0xE8C7, 0x969C, 0xC7B9, 0xB7E3, 0x969D, 0xE8C9, 0x969E, 0xBFDD, /* U+67B0 */ 0xE8D2, 0x969F, 0x96A0, 0xE8D7, 0x96A1, 0xE8D5, 0xBCDC, 0xBCCF, /* U+67B8 */ 0xE8DB, 0x96A2, 0x96A3, 0x96A4, 0x96A5, 0x96A6, 0x96A7, 0x96A8, /* U+67C0 */ 0x96A9, 0xE8DE, 0x96AA, 0xE8DA, 0xB1FA, 0x96AB, 0x96AC, 0x96AD, /* U+67C8 */ 0x96AE, 0x96AF, 0x96B0, 0x96B1, 0x96B2, 0x96B3, 0x96B4, 0xB0D8, /* U+67D0 */ 0xC4B3, 0xB8CC, 0xC6E2, 0xC8BE, 0xC8E1, 0x96B5, 0x96B6, 0x96B7, /* U+67D8 */ 0xE8CF, 0xE8D4, 0xE8D6, 0x96B8, 0xB9F1, 0xE8D8, 0xD7F5, 0x96B9, /* U+67E0 */ 0xC4FB, 0x96BA, 0xE8DC, 0x96BB, 0x96BC, 0xB2E9, 0x96BD, 0x96BE, /* U+67E8 */ 0x96BF, 0xE8D1, 0x96C0, 0x96C1, 0xBCED, 0x96C2, 0x96C3, 0xBFC2, /* U+67F0 */ 0xE8CD, 0xD6F9, 0x96C4, 0xC1F8, 0xB2F1, 0x96C5, 0x96C6, 0x96C7, /* U+67F8 */ 0x96C8, 0x96C9, 0x96CA, 0x96CB, 0x96CC, 0xE8DF, 0x96CD, 0xCAC1, /* U+6800 */ 0xE8D9, 0x96CE, 0x96CF, 0x96D0, 0x96D1, 0xD5A4, 0x96D2, 0xB1EA, /* U+6808 */ 0xD5BB, 0xE8CE, 0xE8D0, 0xB6B0, 0xE8D3, 0x96D3, 0xE8DD, 0xC0B8, /* U+6810 */ 0x96D4, 0xCAF7, 0x96D5, 0xCBA8, 0x96D6, 0x96D7, 0xC6DC, 0xC0F5, /* U+6818 */ 0x96D8, 0x96D9, 0x96DA, 0x96DB, 0x96DC, 0xE8E9, 0x96DD, 0x96DE, /* U+6820 */ 0x96DF, 0xD0A3, 0x96E0, 0x96E1, 0x96E2, 0x96E3, 0x96E4, 0x96E5, /* U+6828 */ 0x96E6, 0xE8F2, 0xD6EA, 0x96E7, 0x96E8, 0x96E9, 0x96EA, 0x96EB, /* U+6830 */ 0x96EC, 0x96ED, 0xE8E0, 0xE8E1, 0x96EE, 0x96EF, 0x96F0, 0xD1F9, /* U+6838 */ 0xBACB, 0xB8F9, 0x96F1, 0x96F2, 0xB8F1, 0xD4D4, 0xE8EF, 0x96F3, /* U+6840 */ 0xE8EE, 0xE8EC, 0xB9F0, 0xCCD2, 0xE8E6, 0xCEA6, 0xBFF2, 0x96F4, /* U+6848 */ 0xB0B8, 0xE8F1, 0xE8F0, 0x96F5, 0xD7C0, 0x96F6, 0xE8E4, 0x96F7, /* U+6850 */ 0xCDA9, 0xC9A3, 0x96F8, 0xBBB8, 0xBDDB, 0xE8EA, 0x96F9, 0x96FA, /* U+6858 */ 0x96FB, 0x96FC, 0x96FD, 0x96FE, 0x9740, 0x9741, 0x9742, 0x9743, /* U+6860 */ 0xE8E2, 0xE8E3, 0xE8E5, 0xB5B5, 0xE8E7, 0xC7C5, 0xE8EB, 0xE8ED, /* U+6868 */ 0xBDB0, 0xD7AE, 0x9744, 0xE8F8, 0x9745, 0x9746, 0x9747, 0x9748, /* U+6870 */ 0x9749, 0x974A, 0x974B, 0x974C, 0xE8F5, 0x974D, 0xCDB0, 0xE8F6, /* U+6878 */ 0x974E, 0x974F, 0x9750, 0x9751, 0x9752, 0x9753, 0x9754, 0x9755, /* U+6880 */ 0x9756, 0xC1BA, 0x9757, 0xE8E8, 0x9758, 0xC3B7, 0xB0F0, 0x9759, /* U+6888 */ 0x975A, 0x975B, 0x975C, 0x975D, 0x975E, 0x975F, 0x9760, 0xE8F4, /* U+6890 */ 0x9761, 0x9762, 0x9763, 0xE8F7, 0x9764, 0x9765, 0x9766, 0xB9A3, /* U+6898 */ 0x9767, 0x9768, 0x9769, 0x976A, 0x976B, 0x976C, 0x976D, 0x976E, /* U+68A0 */ 0x976F, 0x9770, 0xC9D2, 0x9771, 0x9772, 0x9773, 0xC3CE, 0xCEE0, /* U+68A8 */ 0xC0E6, 0x9774, 0x9775, 0x9776, 0x9777, 0xCBF3, 0x9778, 0xCCDD, /* U+68B0 */ 0xD0B5, 0x9779, 0x977A, 0xCAE1, 0x977B, 0xE8F3, 0x977C, 0x977D, /* U+68B8 */ 0x977E, 0x9780, 0x9781, 0x9782, 0x9783, 0x9784, 0x9785, 0x9786, /* U+68C0 */ 0xBCEC, 0x9787, 0xE8F9, 0x9788, 0x9789, 0x978A, 0x978B, 0x978C, /* U+68C8 */ 0x978D, 0xC3DE, 0x978E, 0xC6E5, 0x978F, 0xB9F7, 0x9790, 0x9791, /* U+68D0 */ 0x9792, 0x9793, 0xB0F4, 0x9794, 0x9795, 0xD7D8, 0x9796, 0x9797, /* U+68D8 */ 0xBCAC, 0x9798, 0xC5EF, 0x9799, 0x979A, 0x979B, 0x979C, 0x979D, /* U+68E0 */ 0xCCC4, 0x979E, 0x979F, 0xE9A6, 0x97A0, 0x97A1, 0x97A2, 0x97A3, /* U+68E8 */ 0x97A4, 0x97A5, 0x97A6, 0x97A7, 0x97A8, 0x97A9, 0xC9AD, 0x97AA, /* U+68F0 */ 0xE9A2, 0xC0E2, 0x97AB, 0x97AC, 0x97AD, 0xBFC3, 0x97AE, 0x97AF, /* U+68F8 */ 0x97B0, 0xE8FE, 0xB9D7, 0x97B1, 0xE8FB, 0x97B2, 0x97B3, 0x97B4, /* U+6900 */ 0x97B5, 0xE9A4, 0x97B6, 0x97B7, 0x97B8, 0xD2CE, 0x97B9, 0x97BA, /* U+6908 */ 0x97BB, 0x97BC, 0x97BD, 0xE9A3, 0x97BE, 0xD6B2, 0xD7B5, 0x97BF, /* U+6910 */ 0xE9A7, 0x97C0, 0xBDB7, 0x97C1, 0x97C2, 0x97C3, 0x97C4, 0x97C5, /* U+6918 */ 0x97C6, 0x97C7, 0x97C8, 0x97C9, 0x97CA, 0x97CB, 0x97CC, 0xE8FC, /* U+6920 */ 0xE8FD, 0x97CD, 0x97CE, 0x97CF, 0xE9A1, 0x97D0, 0x97D1, 0x97D2, /* U+6928 */ 0x97D3, 0x97D4, 0x97D5, 0x97D6, 0x97D7, 0xCDD6, 0x97D8, 0x97D9, /* U+6930 */ 0xD2AC, 0x97DA, 0x97DB, 0x97DC, 0xE9B2, 0x97DD, 0x97DE, 0x97DF, /* U+6938 */ 0x97E0, 0xE9A9, 0x97E1, 0x97E2, 0x97E3, 0xB4AA, 0x97E4, 0xB4BB, /* U+6940 */ 0x97E5, 0x97E6, 0xE9AB, 0x97E7, 0x97E8, 0x97E9, 0x97EA, 0x97EB, /* U+6948 */ 0x97EC, 0x97ED, 0x97EE, 0x97EF, 0x97F0, 0x97F1, 0x97F2, 0x97F3, /* U+6950 */ 0x97F4, 0x97F5, 0x97F6, 0x97F7, 0xD0A8, 0x97F8, 0x97F9, 0xE9A5, /* U+6958 */ 0x97FA, 0x97FB, 0xB3FE, 0x97FC, 0x97FD, 0xE9AC, 0xC0E3, 0x97FE, /* U+6960 */ 0xE9AA, 0x9840, 0x9841, 0xE9B9, 0x9842, 0x9843, 0xE9B8, 0x9844, /* U+6968 */ 0x9845, 0x9846, 0x9847, 0xE9AE, 0x9848, 0x9849, 0xE8FA, 0x984A, /* U+6970 */ 0x984B, 0xE9A8, 0x984C, 0x984D, 0x984E, 0x984F, 0x9850, 0xBFAC, /* U+6978 */ 0xE9B1, 0xE9BA, 0x9851, 0x9852, 0xC2A5, 0x9853, 0x9854, 0x9855, /* U+6980 */ 0xE9AF, 0x9856, 0xB8C5, 0x9857, 0xE9AD, 0x9858, 0xD3DC, 0xE9B4, /* U+6988 */ 0xE9B5, 0xE9B7, 0x9859, 0x985A, 0x985B, 0xE9C7, 0x985C, 0x985D, /* U+6990 */ 0x985E, 0x985F, 0x9860, 0x9861, 0xC0C6, 0xE9C5, 0x9862, 0x9863, /* U+6998 */ 0xE9B0, 0x9864, 0x9865, 0xE9BB, 0xB0F1, 0x9866, 0x9867, 0x9868, /* U+69A0 */ 0x9869, 0x986A, 0x986B, 0x986C, 0x986D, 0x986E, 0x986F, 0xE9BC, /* U+69A8 */ 0xD5A5, 0x9870, 0x9871, 0xE9BE, 0x9872, 0xE9BF, 0x9873, 0x9874, /* U+69B0 */ 0x9875, 0xE9C1, 0x9876, 0x9877, 0xC1F1, 0x9878, 0x9879, 0xC8B6, /* U+69B8 */ 0x987A, 0x987B, 0x987C, 0xE9BD, 0x987D, 0x987E, 0x9880, 0x9881, /* U+69C0 */ 0x9882, 0xE9C2, 0x9883, 0x9884, 0x9885, 0x9886, 0x9887, 0x9888, /* U+69C8 */ 0x9889, 0x988A, 0xE9C3, 0x988B, 0xE9B3, 0x988C, 0xE9B6, 0x988D, /* U+69D0 */ 0xBBB1, 0x988E, 0x988F, 0x9890, 0xE9C0, 0x9891, 0x9892, 0x9893, /* U+69D8 */ 0x9894, 0x9895, 0x9896, 0xBCF7, 0x9897, 0x9898, 0x9899, 0xE9C4, /* U+69E0 */ 0xE9C6, 0x989A, 0x989B, 0x989C, 0x989D, 0x989E, 0x989F, 0x98A0, /* U+69E8 */ 0x98A1, 0x98A2, 0x98A3, 0x98A4, 0x98A5, 0xE9CA, 0x98A6, 0x98A7, /* U+69F0 */ 0x98A8, 0x98A9, 0xE9CE, 0x98AA, 0x98AB, 0x98AC, 0x98AD, 0x98AE, /* U+69F8 */ 0x98AF, 0x98B0, 0x98B1, 0x98B2, 0x98B3, 0xB2DB, 0x98B4, 0xE9C8, /* U+6A00 */ 0x98B5, 0x98B6, 0x98B7, 0x98B8, 0x98B9, 0x98BA, 0x98BB, 0x98BC, /* U+6A08 */ 0x98BD, 0x98BE, 0xB7AE, 0x98BF, 0x98C0, 0x98C1, 0x98C2, 0x98C3, /* U+6A10 */ 0x98C4, 0x98C5, 0x98C6, 0x98C7, 0x98C8, 0x98C9, 0x98CA, 0xE9CB, /* U+6A18 */ 0xE9CC, 0x98CB, 0x98CC, 0x98CD, 0x98CE, 0x98CF, 0x98D0, 0xD5C1, /* U+6A20 */ 0x98D1, 0xC4A3, 0x98D2, 0x98D3, 0x98D4, 0x98D5, 0x98D6, 0x98D7, /* U+6A28 */ 0xE9D8, 0x98D8, 0xBAE1, 0x98D9, 0x98DA, 0x98DB, 0x98DC, 0xE9C9, /* U+6A30 */ 0x98DD, 0xD3A3, 0x98DE, 0x98DF, 0x98E0, 0xE9D4, 0x98E1, 0x98E2, /* U+6A38 */ 0x98E3, 0x98E4, 0x98E5, 0x98E6, 0x98E7, 0xE9D7, 0xE9D0, 0x98E8, /* U+6A40 */ 0x98E9, 0x98EA, 0x98EB, 0x98EC, 0xE9CF, 0x98ED, 0x98EE, 0xC7C1, /* U+6A48 */ 0x98EF, 0x98F0, 0x98F1, 0x98F2, 0x98F3, 0x98F4, 0x98F5, 0x98F6, /* U+6A50 */ 0xE9D2, 0x98F7, 0x98F8, 0x98F9, 0x98FA, 0x98FB, 0x98FC, 0x98FD, /* U+6A58 */ 0xE9D9, 0xB3C8, 0x98FE, 0xE9D3, 0x9940, 0x9941, 0x9942, 0x9943, /* U+6A60 */ 0x9944, 0xCFF0, 0x9945, 0x9946, 0x9947, 0xE9CD, 0x9948, 0x9949, /* U+6A68 */ 0x994A, 0x994B, 0x994C, 0x994D, 0x994E, 0x994F, 0x9950, 0x9951, /* U+6A70 */ 0x9952, 0xB3F7, 0x9953, 0x9954, 0x9955, 0x9956, 0x9957, 0x9958, /* U+6A78 */ 0x9959, 0xE9D6, 0x995A, 0x995B, 0xE9DA, 0x995C, 0x995D, 0x995E, /* U+6A80 */ 0xCCB4, 0x995F, 0x9960, 0x9961, 0xCFAD, 0x9962, 0x9963, 0x9964, /* U+6A88 */ 0x9965, 0x9966, 0x9967, 0x9968, 0x9969, 0x996A, 0xE9D5, 0x996B, /* U+6A90 */ 0xE9DC, 0xE9DB, 0x996C, 0x996D, 0x996E, 0x996F, 0x9970, 0xE9DE, /* U+6A98 */ 0x9971, 0x9972, 0x9973, 0x9974, 0x9975, 0x9976, 0x9977, 0x9978, /* U+6AA0 */ 0xE9D1, 0x9979, 0x997A, 0x997B, 0x997C, 0x997D, 0x997E, 0x9980, /* U+6AA8 */ 0x9981, 0xE9DD, 0x9982, 0xE9DF, 0xC3CA, 0x9983, 0x9984, 0x9985, /* U+6AB0 */ 0x9986, 0x9987, 0x9988, 0x9989, 0x998A, 0x998B, 0x998C, 0x998D, /* U+6AB8 */ 0x998E, 0x998F, 0x9990, 0x9991, 0x9992, 0x9993, 0x9994, 0x9995, /* U+6AC0 */ 0x9996, 0x9997, 0x9998, 0x9999, 0x999A, 0x999B, 0x999C, 0x999D, /* U+6AC8 */ 0x999E, 0x999F, 0x99A0, 0x99A1, 0x99A2, 0x99A3, 0x99A4, 0x99A5, /* U+6AD0 */ 0x99A6, 0x99A7, 0x99A8, 0x99A9, 0x99AA, 0x99AB, 0x99AC, 0x99AD, /* U+6AD8 */ 0x99AE, 0x99AF, 0x99B0, 0x99B1, 0x99B2, 0x99B3, 0x99B4, 0x99B5, /* U+6AE0 */ 0x99B6, 0x99B7, 0x99B8, 0x99B9, 0x99BA, 0x99BB, 0x99BC, 0x99BD, /* U+6AE8 */ 0x99BE, 0x99BF, 0x99C0, 0x99C1, 0x99C2, 0x99C3, 0x99C4, 0x99C5, /* U+6AF0 */ 0x99C6, 0x99C7, 0x99C8, 0x99C9, 0x99CA, 0x99CB, 0x99CC, 0x99CD, /* U+6AF8 */ 0x99CE, 0x99CF, 0x99D0, 0x99D1, 0x99D2, 0x99D3, 0x99D4, 0x99D5, /* U+6B00 */ 0x99D6, 0x99D7, 0x99D8, 0x99D9, 0x99DA, 0x99DB, 0x99DC, 0x99DD, /* U+6B08 */ 0x99DE, 0x99DF, 0x99E0, 0x99E1, 0x99E2, 0x99E3, 0x99E4, 0x99E5, /* U+6B10 */ 0x99E6, 0x99E7, 0x99E8, 0x99E9, 0x99EA, 0x99EB, 0x99EC, 0x99ED, /* U+6B18 */ 0x99EE, 0x99EF, 0x99F0, 0x99F1, 0x99F2, 0x99F3, 0x99F4, 0x99F5, /* U+6B20 */ 0xC7B7, 0xB4CE, 0xBBB6, 0xD0C0, 0xECA3, 0x99F6, 0x99F7, 0xC5B7, /* U+6B28 */ 0x99F8, 0x99F9, 0x99FA, 0x99FB, 0x99FC, 0x99FD, 0x99FE, 0x9A40, /* U+6B30 */ 0x9A41, 0x9A42, 0xD3FB, 0x9A43, 0x9A44, 0x9A45, 0x9A46, 0xECA4, /* U+6B38 */ 0x9A47, 0xECA5, 0xC6DB, 0x9A48, 0x9A49, 0x9A4A, 0xBFEE, 0x9A4B, /* U+6B40 */ 0x9A4C, 0x9A4D, 0x9A4E, 0xECA6, 0x9A4F, 0x9A50, 0xECA7, 0xD0AA, /* U+6B48 */ 0x9A51, 0xC7B8, 0x9A52, 0x9A53, 0xB8E8, 0x9A54, 0x9A55, 0x9A56, /* U+6B50 */ 0x9A57, 0x9A58, 0x9A59, 0x9A5A, 0x9A5B, 0x9A5C, 0x9A5D, 0x9A5E, /* U+6B58 */ 0x9A5F, 0xECA8, 0x9A60, 0x9A61, 0x9A62, 0x9A63, 0x9A64, 0x9A65, /* U+6B60 */ 0x9A66, 0x9A67, 0xD6B9, 0xD5FD, 0xB4CB, 0xB2BD, 0xCEE4, 0xC6E7, /* U+6B68 */ 0x9A68, 0x9A69, 0xCDE1, 0x9A6A, 0x9A6B, 0x9A6C, 0x9A6D, 0x9A6E, /* U+6B70 */ 0x9A6F, 0x9A70, 0x9A71, 0x9A72, 0x9A73, 0x9A74, 0x9A75, 0x9A76, /* U+6B78 */ 0x9A77, 0xB4F5, 0x9A78, 0xCBC0, 0xBCDF, 0x9A79, 0x9A7A, 0x9A7B, /* U+6B80 */ 0x9A7C, 0xE9E2, 0xE9E3, 0xD1EA, 0xE9E5, 0x9A7D, 0xB4F9, 0xE9E4, /* U+6B88 */ 0x9A7E, 0xD1B3, 0xCAE2, 0xB2D0, 0x9A80, 0xE9E8, 0x9A81, 0x9A82, /* U+6B90 */ 0x9A83, 0x9A84, 0xE9E6, 0xE9E7, 0x9A85, 0x9A86, 0xD6B3, 0x9A87, /* U+6B98 */ 0x9A88, 0x9A89, 0xE9E9, 0xE9EA, 0x9A8A, 0x9A8B, 0x9A8C, 0x9A8D, /* U+6BA0 */ 0x9A8E, 0xE9EB, 0x9A8F, 0x9A90, 0x9A91, 0x9A92, 0x9A93, 0x9A94, /* U+6BA8 */ 0x9A95, 0x9A96, 0xE9EC, 0x9A97, 0x9A98, 0x9A99, 0x9A9A, 0x9A9B, /* U+6BB0 */ 0x9A9C, 0x9A9D, 0x9A9E, 0xECAF, 0xC5B9, 0xB6CE, 0x9A9F, 0xD2F3, /* U+6BB8 */ 0x9AA0, 0x9AA1, 0x9AA2, 0x9AA3, 0x9AA4, 0x9AA5, 0x9AA6, 0xB5EE, /* U+6BC0 */ 0x9AA7, 0xBBD9, 0xECB1, 0x9AA8, 0x9AA9, 0xD2E3, 0x9AAA, 0x9AAB, /* U+6BC8 */ 0x9AAC, 0x9AAD, 0x9AAE, 0xCEE3, 0x9AAF, 0xC4B8, 0x9AB0, 0xC3BF, /* U+6BD0 */ 0x9AB1, 0x9AB2, 0xB6BE, 0xD8B9, 0xB1C8, 0xB1CF, 0xB1D1, 0xC5FE, /* U+6BD8 */ 0x9AB3, 0xB1D0, 0x9AB4, 0xC3AB, 0x9AB5, 0x9AB6, 0x9AB7, 0x9AB8, /* U+6BE0 */ 0x9AB9, 0xD5B1, 0x9ABA, 0x9ABB, 0x9ABC, 0x9ABD, 0x9ABE, 0x9ABF, /* U+6BE8 */ 0x9AC0, 0x9AC1, 0xEBA4, 0xBAC1, 0x9AC2, 0x9AC3, 0x9AC4, 0xCCBA, /* U+6BF0 */ 0x9AC5, 0x9AC6, 0x9AC7, 0xEBA5, 0x9AC8, 0xEBA7, 0x9AC9, 0x9ACA, /* U+6BF8 */ 0x9ACB, 0xEBA8, 0x9ACC, 0x9ACD, 0x9ACE, 0xEBA6, 0x9ACF, 0x9AD0, /* U+6C00 */ 0x9AD1, 0x9AD2, 0x9AD3, 0x9AD4, 0x9AD5, 0xEBA9, 0xEBAB, 0xEBAA, /* U+6C08 */ 0x9AD6, 0x9AD7, 0x9AD8, 0x9AD9, 0x9ADA, 0xEBAC, 0x9ADB, 0xCACF, /* U+6C10 */ 0xD8B5, 0xC3F1, 0x9ADC, 0xC3A5, 0xC6F8, 0xEBAD, 0xC4CA, 0x9ADD, /* U+6C18 */ 0xEBAE, 0xEBAF, 0xEBB0, 0xB7D5, 0x9ADE, 0x9ADF, 0x9AE0, 0xB7FA, /* U+6C20 */ 0x9AE1, 0xEBB1, 0xC7E2, 0x9AE2, 0xEBB3, 0x9AE3, 0xBAA4, 0xD1F5, /* U+6C28 */ 0xB0B1, 0xEBB2, 0xEBB4, 0x9AE4, 0x9AE5, 0x9AE6, 0xB5AA, 0xC2C8, /* U+6C30 */ 0xC7E8, 0x9AE7, 0xEBB5, 0x9AE8, 0xCBAE, 0xE3DF, 0x9AE9, 0x9AEA, /* U+6C38 */ 0xD3C0, 0x9AEB, 0x9AEC, 0x9AED, 0x9AEE, 0xD9DB, 0x9AEF, 0x9AF0, /* U+6C40 */ 0xCDA1, 0xD6AD, 0xC7F3, 0x9AF1, 0x9AF2, 0x9AF3, 0xD9E0, 0xBBE3, /* U+6C48 */ 0x9AF4, 0xBABA, 0xE3E2, 0x9AF5, 0x9AF6, 0x9AF7, 0x9AF8, 0x9AF9, /* U+6C50 */ 0xCFAB, 0x9AFA, 0x9AFB, 0x9AFC, 0xE3E0, 0xC9C7, 0x9AFD, 0xBAB9, /* U+6C58 */ 0x9AFE, 0x9B40, 0x9B41, 0xD1B4, 0xE3E1, 0xC8EA, 0xB9AF, 0xBDAD, /* U+6C60 */ 0xB3D8, 0xCEDB, 0x9B42, 0x9B43, 0xCCC0, 0x9B44, 0x9B45, 0x9B46, /* U+6C68 */ 0xE3E8, 0xE3E9, 0xCDF4, 0x9B47, 0x9B48, 0x9B49, 0x9B4A, 0x9B4B, /* U+6C70 */ 0xCCAD, 0x9B4C, 0xBCB3, 0x9B4D, 0xE3EA, 0x9B4E, 0xE3EB, 0x9B4F, /* U+6C78 */ 0x9B50, 0xD0DA, 0x9B51, 0x9B52, 0x9B53, 0xC6FB, 0xB7DA, 0x9B54, /* U+6C80 */ 0x9B55, 0xC7DF, 0xD2CA, 0xCED6, 0x9B56, 0xE3E4, 0xE3EC, 0x9B57, /* U+6C88 */ 0xC9F2, 0xB3C1, 0x9B58, 0x9B59, 0xE3E7, 0x9B5A, 0x9B5B, 0xC6E3, /* U+6C90 */ 0xE3E5, 0x9B5C, 0x9B5D, 0xEDB3, 0xE3E6, 0x9B5E, 0x9B5F, 0x9B60, /* U+6C98 */ 0x9B61, 0xC9B3, 0x9B62, 0xC5E6, 0x9B63, 0x9B64, 0x9B65, 0xB9B5, /* U+6CA0 */ 0x9B66, 0xC3BB, 0x9B67, 0xE3E3, 0xC5BD, 0xC1A4, 0xC2D9, 0xB2D7, /* U+6CA8 */ 0x9B68, 0xE3ED, 0xBBA6, 0xC4AD, 0x9B69, 0xE3F0, 0xBEDA, 0x9B6A, /* U+6CB0 */ 0x9B6B, 0xE3FB, 0xE3F5, 0xBAD3, 0x9B6C, 0x9B6D, 0x9B6E, 0x9B6F, /* U+6CB8 */ 0xB7D0, 0xD3CD, 0x9B70, 0xD6CE, 0xD5D3, 0xB9C1, 0xD5B4, 0xD1D8, /* U+6CC0 */ 0x9B71, 0x9B72, 0x9B73, 0x9B74, 0xD0B9, 0xC7F6, 0x9B75, 0x9B76, /* U+6CC8 */ 0x9B77, 0xC8AA, 0xB2B4, 0x9B78, 0xC3DA, 0x9B79, 0x9B7A, 0x9B7B, /* U+6CD0 */ 0xE3EE, 0x9B7C, 0x9B7D, 0xE3FC, 0xE3EF, 0xB7A8, 0xE3F7, 0xE3F4, /* U+6CD8 */ 0x9B7E, 0x9B80, 0x9B81, 0xB7BA, 0x9B82, 0x9B83, 0xC5A2, 0x9B84, /* U+6CE0 */ 0xE3F6, 0xC5DD, 0xB2A8, 0xC6FC, 0x9B85, 0xC4E0, 0x9B86, 0x9B87, /* U+6CE8 */ 0xD7A2, 0x9B88, 0xC0E1, 0xE3F9, 0x9B89, 0x9B8A, 0xE3FA, 0xE3FD, /* U+6CF0 */ 0xCCA9, 0xE3F3, 0x9B8B, 0xD3BE, 0x9B8C, 0xB1C3, 0xEDB4, 0xE3F1, /* U+6CF8 */ 0xE3F2, 0x9B8D, 0xE3F8, 0xD0BA, 0xC6C3, 0xD4F3, 0xE3FE, 0x9B8E, /* U+6D00 */ 0x9B8F, 0xBDE0, 0x9B90, 0x9B91, 0xE4A7, 0x9B92, 0x9B93, 0xE4A6, /* U+6D08 */ 0x9B94, 0x9B95, 0x9B96, 0xD1F3, 0xE4A3, 0x9B97, 0xE4A9, 0x9B98, /* U+6D10 */ 0x9B99, 0x9B9A, 0xC8F7, 0x9B9B, 0x9B9C, 0x9B9D, 0x9B9E, 0xCFB4, /* U+6D18 */ 0x9B9F, 0xE4A8, 0xE4AE, 0xC2E5, 0x9BA0, 0x9BA1, 0xB6B4, 0x9BA2, /* U+6D20 */ 0x9BA3, 0x9BA4, 0x9BA5, 0x9BA6, 0x9BA7, 0xBDF2, 0x9BA8, 0xE4A2, /* U+6D28 */ 0x9BA9, 0x9BAA, 0xBAE9, 0xE4AA, 0x9BAB, 0x9BAC, 0xE4AC, 0x9BAD, /* U+6D30 */ 0x9BAE, 0xB6FD, 0xD6DE, 0xE4B2, 0x9BAF, 0xE4AD, 0x9BB0, 0x9BB1, /* U+6D38 */ 0x9BB2, 0xE4A1, 0x9BB3, 0xBBEE, 0xCDDD, 0xC7A2, 0xC5C9, 0x9BB4, /* U+6D40 */ 0x9BB5, 0xC1F7, 0x9BB6, 0xE4A4, 0x9BB7, 0xC7B3, 0xBDAC, 0xBDBD, /* U+6D48 */ 0xE4A5, 0x9BB8, 0xD7C7, 0xB2E2, 0x9BB9, 0xE4AB, 0xBCC3, 0xE4AF, /* U+6D50 */ 0x9BBA, 0xBBEB, 0xE4B0, 0xC5A8, 0xE4B1, 0x9BBB, 0x9BBC, 0x9BBD, /* U+6D58 */ 0x9BBE, 0xD5E3, 0xBFA3, 0x9BBF, 0xE4BA, 0x9BC0, 0xE4B7, 0x9BC1, /* U+6D60 */ 0xE4BB, 0x9BC2, 0x9BC3, 0xE4BD, 0x9BC4, 0x9BC5, 0xC6D6, 0x9BC6, /* U+6D68 */ 0x9BC7, 0xBAC6, 0xC0CB, 0x9BC8, 0x9BC9, 0x9BCA, 0xB8A1, 0xE4B4, /* U+6D70 */ 0x9BCB, 0x9BCC, 0x9BCD, 0x9BCE, 0xD4A1, 0x9BCF, 0x9BD0, 0xBAA3, /* U+6D78 */ 0xBDFE, 0x9BD1, 0x9BD2, 0x9BD3, 0xE4BC, 0x9BD4, 0x9BD5, 0x9BD6, /* U+6D80 */ 0x9BD7, 0x9BD8, 0xCDBF, 0x9BD9, 0x9BDA, 0xC4F9, 0x9BDB, 0x9BDC, /* U+6D88 */ 0xCFFB, 0xC9E6, 0x9BDD, 0x9BDE, 0xD3BF, 0x9BDF, 0xCFD1, 0x9BE0, /* U+6D90 */ 0x9BE1, 0xE4B3, 0x9BE2, 0xE4B8, 0xE4B9, 0xCCE9, 0x9BE3, 0x9BE4, /* U+6D98 */ 0x9BE5, 0x9BE6, 0x9BE7, 0xCCCE, 0x9BE8, 0xC0D4, 0xE4B5, 0xC1B0, /* U+6DA0 */ 0xE4B6, 0xCED0, 0x9BE9, 0xBBC1, 0xB5D3, 0x9BEA, 0xC8F3, 0xBDA7, /* U+6DA8 */ 0xD5C7, 0xC9AC, 0xB8A2, 0xE4CA, 0x9BEB, 0x9BEC, 0xE4CC, 0xD1C4, /* U+6DB0 */ 0x9BED, 0x9BEE, 0xD2BA, 0x9BEF, 0x9BF0, 0xBAAD, 0x9BF1, 0x9BF2, /* U+6DB8 */ 0xBAD4, 0x9BF3, 0x9BF4, 0x9BF5, 0x9BF6, 0x9BF7, 0x9BF8, 0xE4C3, /* U+6DC0 */ 0xB5ED, 0x9BF9, 0x9BFA, 0x9BFB, 0xD7CD, 0xE4C0, 0xCFFD, 0xE4BF, /* U+6DC8 */ 0x9BFC, 0x9BFD, 0x9BFE, 0xC1DC, 0xCCCA, 0x9C40, 0x9C41, 0x9C42, /* U+6DD0 */ 0x9C43, 0xCAE7, 0x9C44, 0x9C45, 0x9C46, 0x9C47, 0xC4D7, 0x9C48, /* U+6DD8 */ 0xCCD4, 0xE4C8, 0x9C49, 0x9C4A, 0x9C4B, 0xE4C7, 0xE4C1, 0x9C4C, /* U+6DE0 */ 0xE4C4, 0xB5AD, 0x9C4D, 0x9C4E, 0xD3D9, 0x9C4F, 0xE4C6, 0x9C50, /* U+6DE8 */ 0x9C51, 0x9C52, 0x9C53, 0xD2F9, 0xB4E3, 0x9C54, 0xBBB4, 0x9C55, /* U+6DF0 */ 0x9C56, 0xC9EE, 0x9C57, 0xB4BE, 0x9C58, 0x9C59, 0x9C5A, 0xBBEC, /* U+6DF8 */ 0x9C5B, 0xD1CD, 0x9C5C, 0xCCED, 0xEDB5, 0x9C5D, 0x9C5E, 0x9C5F, /* U+6E00 */ 0x9C60, 0x9C61, 0x9C62, 0x9C63, 0x9C64, 0xC7E5, 0x9C65, 0x9C66, /* U+6E08 */ 0x9C67, 0x9C68, 0xD4A8, 0x9C69, 0xE4CB, 0xD7D5, 0xE4C2, 0x9C6A, /* U+6E10 */ 0xBDA5, 0xE4C5, 0x9C6B, 0x9C6C, 0xD3E6, 0x9C6D, 0xE4C9, 0xC9F8, /* U+6E18 */ 0x9C6E, 0x9C6F, 0xE4BE, 0x9C70, 0x9C71, 0xD3E5, 0x9C72, 0x9C73, /* U+6E20 */ 0xC7FE, 0xB6C9, 0x9C74, 0xD4FC, 0xB2B3, 0xE4D7, 0x9C75, 0x9C76, /* U+6E28 */ 0x9C77, 0xCEC2, 0x9C78, 0xE4CD, 0x9C79, 0xCEBC, 0x9C7A, 0xB8DB, /* U+6E30 */ 0x9C7B, 0x9C7C, 0xE4D6, 0x9C7D, 0xBFCA, 0x9C7E, 0x9C80, 0x9C81, /* U+6E38 */ 0xD3CE, 0x9C82, 0xC3EC, 0x9C83, 0x9C84, 0x9C85, 0x9C86, 0x9C87, /* U+6E40 */ 0x9C88, 0x9C89, 0x9C8A, 0xC5C8, 0xE4D8, 0x9C8B, 0x9C8C, 0x9C8D, /* U+6E48 */ 0x9C8E, 0x9C8F, 0x9C90, 0x9C91, 0x9C92, 0xCDC4, 0xE4CF, 0x9C93, /* U+6E50 */ 0x9C94, 0x9C95, 0x9C96, 0xE4D4, 0xE4D5, 0x9C97, 0xBAFE, 0x9C98, /* U+6E58 */ 0xCFE6, 0x9C99, 0x9C9A, 0xD5BF, 0x9C9B, 0x9C9C, 0x9C9D, 0xE4D2, /* U+6E60 */ 0x9C9E, 0x9C9F, 0x9CA0, 0x9CA1, 0x9CA2, 0x9CA3, 0x9CA4, 0x9CA5, /* U+6E68 */ 0x9CA6, 0x9CA7, 0x9CA8, 0xE4D0, 0x9CA9, 0x9CAA, 0xE4CE, 0x9CAB, /* U+6E70 */ 0x9CAC, 0x9CAD, 0x9CAE, 0x9CAF, 0x9CB0, 0x9CB1, 0x9CB2, 0x9CB3, /* U+6E78 */ 0x9CB4, 0x9CB5, 0x9CB6, 0x9CB7, 0x9CB8, 0x9CB9, 0xCDE5, 0xCAAA, /* U+6E80 */ 0x9CBA, 0x9CBB, 0x9CBC, 0xC0A3, 0x9CBD, 0xBDA6, 0xE4D3, 0x9CBE, /* U+6E88 */ 0x9CBF, 0xB8C8, 0x9CC0, 0x9CC1, 0x9CC2, 0x9CC3, 0x9CC4, 0xE4E7, /* U+6E90 */ 0xD4B4, 0x9CC5, 0x9CC6, 0x9CC7, 0x9CC8, 0x9CC9, 0x9CCA, 0x9CCB, /* U+6E98 */ 0xE4DB, 0x9CCC, 0x9CCD, 0x9CCE, 0xC1EF, 0x9CCF, 0x9CD0, 0xE4E9, /* U+6EA0 */ 0x9CD1, 0x9CD2, 0xD2E7, 0x9CD3, 0x9CD4, 0xE4DF, 0x9CD5, 0xE4E0, /* U+6EA8 */ 0x9CD6, 0x9CD7, 0xCFAA, 0x9CD8, 0x9CD9, 0x9CDA, 0x9CDB, 0xCBDD, /* U+6EB0 */ 0x9CDC, 0xE4DA, 0xE4D1, 0x9CDD, 0xE4E5, 0x9CDE, 0xC8DC, 0xE4E3, /* U+6EB8 */ 0x9CDF, 0x9CE0, 0xC4E7, 0xE4E2, 0x9CE1, 0xE4E1, 0x9CE2, 0x9CE3, /* U+6EC0 */ 0x9CE4, 0xB3FC, 0xE4E8, 0x9CE5, 0x9CE6, 0x9CE7, 0x9CE8, 0xB5E1, /* U+6EC8 */ 0x9CE9, 0x9CEA, 0x9CEB, 0xD7CC, 0x9CEC, 0x9CED, 0x9CEE, 0xE4E6, /* U+6ED0 */ 0x9CEF, 0xBBAC, 0x9CF0, 0xD7D2, 0xCCCF, 0xEBF8, 0x9CF1, 0xE4E4, /* U+6ED8 */ 0x9CF2, 0x9CF3, 0xB9F6, 0x9CF4, 0x9CF5, 0x9CF6, 0xD6CD, 0xE4D9, /* U+6EE0 */ 0xE4DC, 0xC2FA, 0xE4DE, 0x9CF7, 0xC2CB, 0xC0C4, 0xC2D0, 0x9CF8, /* U+6EE8 */ 0xB1F5, 0xCCB2, 0x9CF9, 0x9CFA, 0x9CFB, 0x9CFC, 0x9CFD, 0x9CFE, /* U+6EF0 */ 0x9D40, 0x9D41, 0x9D42, 0x9D43, 0xB5CE, 0x9D44, 0x9D45, 0x9D46, /* U+6EF8 */ 0x9D47, 0xE4EF, 0x9D48, 0x9D49, 0x9D4A, 0x9D4B, 0x9D4C, 0x9D4D, /* U+6F00 */ 0x9D4E, 0x9D4F, 0xC6AF, 0x9D50, 0x9D51, 0x9D52, 0xC6E1, 0x9D53, /* U+6F08 */ 0x9D54, 0xE4F5, 0x9D55, 0x9D56, 0x9D57, 0x9D58, 0x9D59, 0xC2A9, /* U+6F10 */ 0x9D5A, 0x9D5B, 0x9D5C, 0xC0EC, 0xD1DD, 0xE4EE, 0x9D5D, 0x9D5E, /* U+6F18 */ 0x9D5F, 0x9D60, 0x9D61, 0x9D62, 0x9D63, 0x9D64, 0x9D65, 0x9D66, /* U+6F20 */ 0xC4AE, 0x9D67, 0x9D68, 0x9D69, 0xE4ED, 0x9D6A, 0x9D6B, 0x9D6C, /* U+6F28 */ 0x9D6D, 0xE4F6, 0xE4F4, 0xC2FE, 0x9D6E, 0xE4DD, 0x9D6F, 0xE4F0, /* U+6F30 */ 0x9D70, 0xCAFE, 0x9D71, 0xD5C4, 0x9D72, 0x9D73, 0xE4F1, 0x9D74, /* U+6F38 */ 0x9D75, 0x9D76, 0x9D77, 0x9D78, 0x9D79, 0x9D7A, 0xD1FA, 0x9D7B, /* U+6F40 */ 0x9D7C, 0x9D7D, 0x9D7E, 0x9D80, 0x9D81, 0x9D82, 0xE4EB, 0xE4EC, /* U+6F48 */ 0x9D83, 0x9D84, 0x9D85, 0xE4F2, 0x9D86, 0xCEAB, 0x9D87, 0x9D88, /* U+6F50 */ 0x9D89, 0x9D8A, 0x9D8B, 0x9D8C, 0x9D8D, 0x9D8E, 0x9D8F, 0x9D90, /* U+6F58 */ 0xC5CB, 0x9D91, 0x9D92, 0x9D93, 0xC7B1, 0x9D94, 0xC2BA, 0x9D95, /* U+6F60 */ 0x9D96, 0x9D97, 0xE4EA, 0x9D98, 0x9D99, 0x9D9A, 0xC1CA, 0x9D9B, /* U+6F68 */ 0x9D9C, 0x9D9D, 0x9D9E, 0x9D9F, 0x9DA0, 0xCCB6, 0xB3B1, 0x9DA1, /* U+6F70 */ 0x9DA2, 0x9DA3, 0xE4FB, 0x9DA4, 0xE4F3, 0x9DA5, 0x9DA6, 0x9DA7, /* U+6F78 */ 0xE4FA, 0x9DA8, 0xE4FD, 0x9DA9, 0xE4FC, 0x9DAA, 0x9DAB, 0x9DAC, /* U+6F80 */ 0x9DAD, 0x9DAE, 0x9DAF, 0x9DB0, 0xB3CE, 0x9DB1, 0x9DB2, 0x9DB3, /* U+6F88 */ 0xB3BA, 0xE4F7, 0x9DB4, 0x9DB5, 0xE4F9, 0xE4F8, 0xC5EC, 0x9DB6, /* U+6F90 */ 0x9DB7, 0x9DB8, 0x9DB9, 0x9DBA, 0x9DBB, 0x9DBC, 0x9DBD, 0x9DBE, /* U+6F98 */ 0x9DBF, 0x9DC0, 0x9DC1, 0x9DC2, 0xC0BD, 0x9DC3, 0x9DC4, 0x9DC5, /* U+6FA0 */ 0x9DC6, 0xD4E8, 0x9DC7, 0x9DC8, 0x9DC9, 0x9DCA, 0x9DCB, 0xE5A2, /* U+6FA8 */ 0x9DCC, 0x9DCD, 0x9DCE, 0x9DCF, 0x9DD0, 0x9DD1, 0x9DD2, 0x9DD3, /* U+6FB0 */ 0x9DD4, 0x9DD5, 0x9DD6, 0xB0C4, 0x9DD7, 0x9DD8, 0xE5A4, 0x9DD9, /* U+6FB8 */ 0x9DDA, 0xE5A3, 0x9DDB, 0x9DDC, 0x9DDD, 0x9DDE, 0x9DDF, 0x9DE0, /* U+6FC0 */ 0xBCA4, 0x9DE1, 0xE5A5, 0x9DE2, 0x9DE3, 0x9DE4, 0x9DE5, 0x9DE6, /* U+6FC8 */ 0x9DE7, 0xE5A1, 0x9DE8, 0x9DE9, 0x9DEA, 0x9DEB, 0x9DEC, 0x9DED, /* U+6FD0 */ 0x9DEE, 0xE4FE, 0xB1F4, 0x9DEF, 0x9DF0, 0x9DF1, 0x9DF2, 0x9DF3, /* U+6FD8 */ 0x9DF4, 0x9DF5, 0x9DF6, 0x9DF7, 0x9DF8, 0x9DF9, 0xE5A8, 0x9DFA, /* U+6FE0 */ 0xE5A9, 0xE5A6, 0x9DFB, 0x9DFC, 0x9DFD, 0x9DFE, 0x9E40, 0x9E41, /* U+6FE8 */ 0x9E42, 0x9E43, 0x9E44, 0x9E45, 0x9E46, 0x9E47, 0xE5A7, 0xE5AA, /* U+6FF0 */ 0x9E48, 0x9E49, 0x9E4A, 0x9E4B, 0x9E4C, 0x9E4D, 0x9E4E, 0x9E4F, /* U+6FF8 */ 0x9E50, 0x9E51, 0x9E52, 0x9E53, 0x9E54, 0x9E55, 0x9E56, 0x9E57, /* U+7000 */ 0x9E58, 0x9E59, 0x9E5A, 0x9E5B, 0x9E5C, 0x9E5D, 0x9E5E, 0x9E5F, /* U+7008 */ 0x9E60, 0x9E61, 0x9E62, 0x9E63, 0x9E64, 0x9E65, 0x9E66, 0x9E67, /* U+7010 */ 0x9E68, 0xC6D9, 0x9E69, 0x9E6A, 0x9E6B, 0x9E6C, 0x9E6D, 0x9E6E, /* U+7018 */ 0x9E6F, 0x9E70, 0xE5AB, 0xE5AD, 0x9E71, 0x9E72, 0x9E73, 0x9E74, /* U+7020 */ 0x9E75, 0x9E76, 0x9E77, 0xE5AC, 0x9E78, 0x9E79, 0x9E7A, 0x9E7B, /* U+7028 */ 0x9E7C, 0x9E7D, 0x9E7E, 0x9E80, 0x9E81, 0x9E82, 0x9E83, 0x9E84, /* U+7030 */ 0x9E85, 0x9E86, 0x9E87, 0x9E88, 0x9E89, 0xE5AF, 0x9E8A, 0x9E8B, /* U+7038 */ 0x9E8C, 0xE5AE, 0x9E8D, 0x9E8E, 0x9E8F, 0x9E90, 0x9E91, 0x9E92, /* U+7040 */ 0x9E93, 0x9E94, 0x9E95, 0x9E96, 0x9E97, 0x9E98, 0x9E99, 0x9E9A, /* U+7048 */ 0x9E9B, 0x9E9C, 0x9E9D, 0x9E9E, 0xB9E0, 0x9E9F, 0x9EA0, 0xE5B0, /* U+7050 */ 0x9EA1, 0x9EA2, 0x9EA3, 0x9EA4, 0x9EA5, 0x9EA6, 0x9EA7, 0x9EA8, /* U+7058 */ 0x9EA9, 0x9EAA, 0x9EAB, 0x9EAC, 0x9EAD, 0x9EAE, 0xE5B1, 0x9EAF, /* U+7060 */ 0x9EB0, 0x9EB1, 0x9EB2, 0x9EB3, 0x9EB4, 0x9EB5, 0x9EB6, 0x9EB7, /* U+7068 */ 0x9EB8, 0x9EB9, 0x9EBA, 0xBBF0, 0xECE1, 0xC3F0, 0x9EBB, 0xB5C6, /* U+7070 */ 0xBBD2, 0x9EBC, 0x9EBD, 0x9EBE, 0x9EBF, 0xC1E9, 0xD4EE, 0x9EC0, /* U+7078 */ 0xBEC4, 0x9EC1, 0x9EC2, 0x9EC3, 0xD7C6, 0x9EC4, 0xD4D6, 0xB2D3, /* U+7080 */ 0xECBE, 0x9EC5, 0x9EC6, 0x9EC7, 0x9EC8, 0xEAC1, 0x9EC9, 0x9ECA, /* U+7088 */ 0x9ECB, 0xC2AF, 0xB4B6, 0x9ECC, 0x9ECD, 0x9ECE, 0xD1D7, 0x9ECF, /* U+7090 */ 0x9ED0, 0x9ED1, 0xB3B4, 0x9ED2, 0xC8B2, 0xBFBB, 0xECC0, 0x9ED3, /* U+7098 */ 0x9ED4, 0xD6CB, 0x9ED5, 0x9ED6, 0xECBF, 0xECC1, 0x9ED7, 0x9ED8, /* U+70A0 */ 0x9ED9, 0x9EDA, 0x9EDB, 0x9EDC, 0x9EDD, 0x9EDE, 0x9EDF, 0x9EE0, /* U+70A8 */ 0x9EE1, 0x9EE2, 0x9EE3, 0xECC5, 0xBEE6, 0xCCBF, 0xC5DA, 0xBEBC, /* U+70B0 */ 0x9EE4, 0xECC6, 0x9EE5, 0xB1FE, 0x9EE6, 0x9EE7, 0x9EE8, 0xECC4, /* U+70B8 */ 0xD5A8, 0xB5E3, 0x9EE9, 0xECC2, 0xC1B6, 0xB3E3, 0x9EEA, 0x9EEB, /* U+70C0 */ 0xECC3, 0xCBB8, 0xC0C3, 0xCCFE, 0x9EEC, 0x9EED, 0x9EEE, 0x9EEF, /* U+70C8 */ 0xC1D2, 0x9EF0, 0xECC8, 0x9EF1, 0x9EF2, 0x9EF3, 0x9EF4, 0x9EF5, /* U+70D0 */ 0x9EF6, 0x9EF7, 0x9EF8, 0x9EF9, 0x9EFA, 0x9EFB, 0x9EFC, 0x9EFD, /* U+70D8 */ 0xBAE6, 0xC0D3, 0x9EFE, 0xD6F2, 0x9F40, 0x9F41, 0x9F42, 0xD1CC, /* U+70E0 */ 0x9F43, 0x9F44, 0x9F45, 0x9F46, 0xBFBE, 0x9F47, 0xB7B3, 0xC9D5, /* U+70E8 */ 0xECC7, 0xBBE2, 0x9F48, 0xCCCC, 0xBDFD, 0xC8C8, 0x9F49, 0xCFA9, /* U+70F0 */ 0x9F4A, 0x9F4B, 0x9F4C, 0x9F4D, 0x9F4E, 0x9F4F, 0x9F50, 0xCDE9, /* U+70F8 */ 0x9F51, 0xC5EB, 0x9F52, 0x9F53, 0x9F54, 0xB7E9, 0x9F55, 0x9F56, /* U+7100 */ 0x9F57, 0x9F58, 0x9F59, 0x9F5A, 0x9F5B, 0x9F5C, 0x9F5D, 0x9F5E, /* U+7108 */ 0x9F5F, 0xD1C9, 0xBAB8, 0x9F60, 0x9F61, 0x9F62, 0x9F63, 0x9F64, /* U+7110 */ 0xECC9, 0x9F65, 0x9F66, 0xECCA, 0x9F67, 0xBBC0, 0xECCB, 0x9F68, /* U+7118 */ 0xECE2, 0xB1BA, 0xB7D9, 0x9F69, 0x9F6A, 0x9F6B, 0x9F6C, 0x9F6D, /* U+7120 */ 0x9F6E, 0x9F6F, 0x9F70, 0x9F71, 0x9F72, 0x9F73, 0xBDB9, 0x9F74, /* U+7128 */ 0x9F75, 0x9F76, 0x9F77, 0x9F78, 0x9F79, 0x9F7A, 0x9F7B, 0xECCC, /* U+7130 */ 0xD1E6, 0xECCD, 0x9F7C, 0x9F7D, 0x9F7E, 0x9F80, 0xC8BB, 0x9F81, /* U+7138 */ 0x9F82, 0x9F83, 0x9F84, 0x9F85, 0x9F86, 0x9F87, 0x9F88, 0x9F89, /* U+7140 */ 0x9F8A, 0x9F8B, 0x9F8C, 0x9F8D, 0x9F8E, 0xECD1, 0x9F8F, 0x9F90, /* U+7148 */ 0x9F91, 0x9F92, 0xECD3, 0x9F93, 0xBBCD, 0x9F94, 0xBCE5, 0x9F95, /* U+7150 */ 0x9F96, 0x9F97, 0x9F98, 0x9F99, 0x9F9A, 0x9F9B, 0x9F9C, 0x9F9D, /* U+7158 */ 0x9F9E, 0x9F9F, 0x9FA0, 0x9FA1, 0xECCF, 0x9FA2, 0xC9B7, 0x9FA3, /* U+7160 */ 0x9FA4, 0x9FA5, 0x9FA6, 0x9FA7, 0xC3BA, 0x9FA8, 0xECE3, 0xD5D5, /* U+7168 */ 0xECD0, 0x9FA9, 0x9FAA, 0x9FAB, 0x9FAC, 0x9FAD, 0xD6F3, 0x9FAE, /* U+7170 */ 0x9FAF, 0x9FB0, 0xECD2, 0xECCE, 0x9FB1, 0x9FB2, 0x9FB3, 0x9FB4, /* U+7178 */ 0xECD4, 0x9FB5, 0xECD5, 0x9FB6, 0x9FB7, 0xC9BF, 0x9FB8, 0x9FB9, /* U+7180 */ 0x9FBA, 0x9FBB, 0x9FBC, 0x9FBD, 0xCFA8, 0x9FBE, 0x9FBF, 0x9FC0, /* U+7188 */ 0x9FC1, 0x9FC2, 0xD0DC, 0x9FC3, 0x9FC4, 0x9FC5, 0x9FC6, 0xD1AC, /* U+7190 */ 0x9FC7, 0x9FC8, 0x9FC9, 0x9FCA, 0xC8DB, 0x9FCB, 0x9FCC, 0x9FCD, /* U+7198 */ 0xECD6, 0xCEF5, 0x9FCE, 0x9FCF, 0x9FD0, 0x9FD1, 0x9FD2, 0xCAEC, /* U+71A0 */ 0xECDA, 0x9FD3, 0x9FD4, 0x9FD5, 0x9FD6, 0x9FD7, 0x9FD8, 0x9FD9, /* U+71A8 */ 0xECD9, 0x9FDA, 0x9FDB, 0x9FDC, 0xB0BE, 0x9FDD, 0x9FDE, 0x9FDF, /* U+71B0 */ 0x9FE0, 0x9FE1, 0x9FE2, 0xECD7, 0x9FE3, 0xECD8, 0x9FE4, 0x9FE5, /* U+71B8 */ 0x9FE6, 0xECE4, 0x9FE7, 0x9FE8, 0x9FE9, 0x9FEA, 0x9FEB, 0x9FEC, /* U+71C0 */ 0x9FED, 0x9FEE, 0x9FEF, 0xC8BC, 0x9FF0, 0x9FF1, 0x9FF2, 0x9FF3, /* U+71C8 */ 0x9FF4, 0x9FF5, 0x9FF6, 0x9FF7, 0x9FF8, 0x9FF9, 0xC1C7, 0x9FFA, /* U+71D0 */ 0x9FFB, 0x9FFC, 0x9FFD, 0x9FFE, 0xECDC, 0xD1E0, 0xA040, 0xA041, /* U+71D8 */ 0xA042, 0xA043, 0xA044, 0xA045, 0xA046, 0xA047, 0xA048, 0xA049, /* U+71E0 */ 0xECDB, 0xA04A, 0xA04B, 0xA04C, 0xA04D, 0xD4EF, 0xA04E, 0xECDD, /* U+71E8 */ 0xA04F, 0xA050, 0xA051, 0xA052, 0xA053, 0xA054, 0xDBC6, 0xA055, /* U+71F0 */ 0xA056, 0xA057, 0xA058, 0xA059, 0xA05A, 0xA05B, 0xA05C, 0xA05D, /* U+71F8 */ 0xA05E, 0xECDE, 0xA05F, 0xA060, 0xA061, 0xA062, 0xA063, 0xA064, /* U+7200 */ 0xA065, 0xA066, 0xA067, 0xA068, 0xA069, 0xA06A, 0xB1AC, 0xA06B, /* U+7208 */ 0xA06C, 0xA06D, 0xA06E, 0xA06F, 0xA070, 0xA071, 0xA072, 0xA073, /* U+7210 */ 0xA074, 0xA075, 0xA076, 0xA077, 0xA078, 0xA079, 0xA07A, 0xA07B, /* U+7218 */ 0xA07C, 0xA07D, 0xA07E, 0xA080, 0xA081, 0xECDF, 0xA082, 0xA083, /* U+7220 */ 0xA084, 0xA085, 0xA086, 0xA087, 0xA088, 0xA089, 0xA08A, 0xA08B, /* U+7228 */ 0xECE0, 0xA08C, 0xD7A6, 0xA08D, 0xC5C0, 0xA08E, 0xA08F, 0xA090, /* U+7230 */ 0xEBBC, 0xB0AE, 0xA091, 0xA092, 0xA093, 0xBEF4, 0xB8B8, 0xD2AF, /* U+7238 */ 0xB0D6, 0xB5F9, 0xA094, 0xD8B3, 0xA095, 0xCBAC, 0xA096, 0xE3DD, /* U+7240 */ 0xA097, 0xA098, 0xA099, 0xA09A, 0xA09B, 0xA09C, 0xA09D, 0xC6AC, /* U+7248 */ 0xB0E6, 0xA09E, 0xA09F, 0xA0A0, 0xC5C6, 0xEBB9, 0xA0A1, 0xA0A2, /* U+7250 */ 0xA0A3, 0xA0A4, 0xEBBA, 0xA0A5, 0xA0A6, 0xA0A7, 0xEBBB, 0xA0A8, /* U+7258 */ 0xA0A9, 0xD1C0, 0xA0AA, 0xC5A3, 0xA0AB, 0xEAF2, 0xA0AC, 0xC4B2, /* U+7260 */ 0xA0AD, 0xC4B5, 0xC0CE, 0xA0AE, 0xA0AF, 0xA0B0, 0xEAF3, 0xC4C1, /* U+7268 */ 0xA0B1, 0xCEEF, 0xA0B2, 0xA0B3, 0xA0B4, 0xA0B5, 0xEAF0, 0xEAF4, /* U+7270 */ 0xA0B6, 0xA0B7, 0xC9FC, 0xA0B8, 0xA0B9, 0xC7A3, 0xA0BA, 0xA0BB, /* U+7278 */ 0xA0BC, 0xCCD8, 0xCEFE, 0xA0BD, 0xA0BE, 0xA0BF, 0xEAF5, 0xEAF6, /* U+7280 */ 0xCFAC, 0xC0E7, 0xA0C0, 0xA0C1, 0xEAF7, 0xA0C2, 0xA0C3, 0xA0C4, /* U+7288 */ 0xA0C5, 0xA0C6, 0xB6BF, 0xEAF8, 0xA0C7, 0xEAF9, 0xA0C8, 0xEAFA, /* U+7290 */ 0xA0C9, 0xA0CA, 0xEAFB, 0xA0CB, 0xA0CC, 0xA0CD, 0xA0CE, 0xA0CF, /* U+7298 */ 0xA0D0, 0xA0D1, 0xA0D2, 0xA0D3, 0xA0D4, 0xA0D5, 0xA0D6, 0xEAF1, /* U+72A0 */ 0xA0D7, 0xA0D8, 0xA0D9, 0xA0DA, 0xA0DB, 0xA0DC, 0xA0DD, 0xA0DE, /* U+72A8 */ 0xA0DF, 0xA0E0, 0xA0E1, 0xA0E2, 0xC8AE, 0xE1EB, 0xA0E3, 0xB7B8, /* U+72B0 */ 0xE1EC, 0xA0E4, 0xA0E5, 0xA0E6, 0xE1ED, 0xA0E7, 0xD7B4, 0xE1EE, /* U+72B8 */ 0xE1EF, 0xD3CC, 0xA0E8, 0xA0E9, 0xA0EA, 0xA0EB, 0xA0EC, 0xA0ED, /* U+72C0 */ 0xA0EE, 0xE1F1, 0xBFF1, 0xE1F0, 0xB5D2, 0xA0EF, 0xA0F0, 0xA0F1, /* U+72C8 */ 0xB1B7, 0xA0F2, 0xA0F3, 0xA0F4, 0xA0F5, 0xE1F3, 0xE1F2, 0xA0F6, /* U+72D0 */ 0xBAFC, 0xA0F7, 0xE1F4, 0xA0F8, 0xA0F9, 0xA0FA, 0xA0FB, 0xB9B7, /* U+72D8 */ 0xA0FC, 0xBED1, 0xA0FD, 0xA0FE, 0xAA40, 0xAA41, 0xC4FC, 0xAA42, /* U+72E0 */ 0xBADD, 0xBDC6, 0xAA43, 0xAA44, 0xAA45, 0xAA46, 0xAA47, 0xAA48, /* U+72E8 */ 0xE1F5, 0xE1F7, 0xAA49, 0xAA4A, 0xB6C0, 0xCFC1, 0xCAA8, 0xE1F6, /* U+72F0 */ 0xD5F8, 0xD3FC, 0xE1F8, 0xE1FC, 0xE1F9, 0xAA4B, 0xAA4C, 0xE1FA, /* U+72F8 */ 0xC0EA, 0xAA4D, 0xE1FE, 0xE2A1, 0xC0C7, 0xAA4E, 0xAA4F, 0xAA50, /* U+7300 */ 0xAA51, 0xE1FB, 0xAA52, 0xE1FD, 0xAA53, 0xAA54, 0xAA55, 0xAA56, /* U+7308 */ 0xAA57, 0xAA58, 0xE2A5, 0xAA59, 0xAA5A, 0xAA5B, 0xC1D4, 0xAA5C, /* U+7310 */ 0xAA5D, 0xAA5E, 0xAA5F, 0xE2A3, 0xAA60, 0xE2A8, 0xB2FE, 0xE2A2, /* U+7318 */ 0xAA61, 0xAA62, 0xAA63, 0xC3CD, 0xB2C2, 0xE2A7, 0xE2A6, 0xAA64, /* U+7320 */ 0xAA65, 0xE2A4, 0xE2A9, 0xAA66, 0xAA67, 0xE2AB, 0xAA68, 0xAA69, /* U+7328 */ 0xAA6A, 0xD0C9, 0xD6ED, 0xC3A8, 0xE2AC, 0xAA6B, 0xCFD7, 0xAA6C, /* U+7330 */ 0xAA6D, 0xE2AE, 0xAA6E, 0xAA6F, 0xBAEF, 0xAA70, 0xAA71, 0xE9E0, /* U+7338 */ 0xE2AD, 0xE2AA, 0xAA72, 0xAA73, 0xAA74, 0xAA75, 0xBBAB, 0xD4B3, /* U+7340 */ 0xAA76, 0xAA77, 0xAA78, 0xAA79, 0xAA7A, 0xAA7B, 0xAA7C, 0xAA7D, /* U+7348 */ 0xAA7E, 0xAA80, 0xAA81, 0xAA82, 0xAA83, 0xE2B0, 0xAA84, 0xAA85, /* U+7350 */ 0xE2AF, 0xAA86, 0xE9E1, 0xAA87, 0xAA88, 0xAA89, 0xAA8A, 0xE2B1, /* U+7358 */ 0xAA8B, 0xAA8C, 0xAA8D, 0xAA8E, 0xAA8F, 0xAA90, 0xAA91, 0xAA92, /* U+7360 */ 0xE2B2, 0xAA93, 0xAA94, 0xAA95, 0xAA96, 0xAA97, 0xAA98, 0xAA99, /* U+7368 */ 0xAA9A, 0xAA9B, 0xAA9C, 0xAA9D, 0xE2B3, 0xCCA1, 0xAA9E, 0xE2B4, /* U+7370 */ 0xAA9F, 0xAAA0, 0xAB40, 0xAB41, 0xAB42, 0xAB43, 0xAB44, 0xAB45, /* U+7378 */ 0xAB46, 0xAB47, 0xAB48, 0xAB49, 0xAB4A, 0xAB4B, 0xE2B5, 0xAB4C, /* U+7380 */ 0xAB4D, 0xAB4E, 0xAB4F, 0xAB50, 0xD0FE, 0xAB51, 0xAB52, 0xC2CA, /* U+7388 */ 0xAB53, 0xD3F1, 0xAB54, 0xCDF5, 0xAB55, 0xAB56, 0xE7E0, 0xAB57, /* U+7390 */ 0xAB58, 0xE7E1, 0xAB59, 0xAB5A, 0xAB5B, 0xAB5C, 0xBEC1, 0xAB5D, /* U+7398 */ 0xAB5E, 0xAB5F, 0xAB60, 0xC2EA, 0xAB61, 0xAB62, 0xAB63, 0xE7E4, /* U+73A0 */ 0xAB64, 0xAB65, 0xE7E3, 0xAB66, 0xAB67, 0xAB68, 0xAB69, 0xAB6A, /* U+73A8 */ 0xAB6B, 0xCDE6, 0xAB6C, 0xC3B5, 0xAB6D, 0xAB6E, 0xE7E2, 0xBBB7, /* U+73B0 */ 0xCFD6, 0xAB6F, 0xC1E1, 0xE7E9, 0xAB70, 0xAB71, 0xAB72, 0xE7E8, /* U+73B8 */ 0xAB73, 0xAB74, 0xE7F4, 0xB2A3, 0xAB75, 0xAB76, 0xAB77, 0xAB78, /* U+73C0 */ 0xE7EA, 0xAB79, 0xE7E6, 0xAB7A, 0xAB7B, 0xAB7C, 0xAB7D, 0xAB7E, /* U+73C8 */ 0xE7EC, 0xE7EB, 0xC9BA, 0xAB80, 0xAB81, 0xD5E4, 0xAB82, 0xE7E5, /* U+73D0 */ 0xB7A9, 0xE7E7, 0xAB83, 0xAB84, 0xAB85, 0xAB86, 0xAB87, 0xAB88, /* U+73D8 */ 0xAB89, 0xE7EE, 0xAB8A, 0xAB8B, 0xAB8C, 0xAB8D, 0xE7F3, 0xAB8E, /* U+73E0 */ 0xD6E9, 0xAB8F, 0xAB90, 0xAB91, 0xAB92, 0xE7ED, 0xAB93, 0xE7F2, /* U+73E8 */ 0xAB94, 0xE7F1, 0xAB95, 0xAB96, 0xAB97, 0xB0E0, 0xAB98, 0xAB99, /* U+73F0 */ 0xAB9A, 0xAB9B, 0xE7F5, 0xAB9C, 0xAB9D, 0xAB9E, 0xAB9F, 0xABA0, /* U+73F8 */ 0xAC40, 0xAC41, 0xAC42, 0xAC43, 0xAC44, 0xAC45, 0xAC46, 0xAC47, /* U+7400 */ 0xAC48, 0xAC49, 0xAC4A, 0xC7F2, 0xAC4B, 0xC0C5, 0xC0ED, 0xAC4C, /* U+7408 */ 0xAC4D, 0xC1F0, 0xE7F0, 0xAC4E, 0xAC4F, 0xAC50, 0xAC51, 0xE7F6, /* U+7410 */ 0xCBF6, 0xAC52, 0xAC53, 0xAC54, 0xAC55, 0xAC56, 0xAC57, 0xAC58, /* U+7418 */ 0xAC59, 0xAC5A, 0xE8A2, 0xE8A1, 0xAC5B, 0xAC5C, 0xAC5D, 0xAC5E, /* U+7420 */ 0xAC5F, 0xAC60, 0xD7C1, 0xAC61, 0xAC62, 0xE7FA, 0xE7F9, 0xAC63, /* U+7428 */ 0xE7FB, 0xAC64, 0xE7F7, 0xAC65, 0xE7FE, 0xAC66, 0xE7FD, 0xAC67, /* U+7430 */ 0xE7FC, 0xAC68, 0xAC69, 0xC1D5, 0xC7D9, 0xC5FD, 0xC5C3, 0xAC6A, /* U+7438 */ 0xAC6B, 0xAC6C, 0xAC6D, 0xAC6E, 0xC7ED, 0xAC6F, 0xAC70, 0xAC71, /* U+7440 */ 0xAC72, 0xE8A3, 0xAC73, 0xAC74, 0xAC75, 0xAC76, 0xAC77, 0xAC78, /* U+7448 */ 0xAC79, 0xAC7A, 0xAC7B, 0xAC7C, 0xAC7D, 0xAC7E, 0xAC80, 0xAC81, /* U+7450 */ 0xAC82, 0xAC83, 0xAC84, 0xAC85, 0xAC86, 0xE8A6, 0xAC87, 0xE8A5, /* U+7458 */ 0xAC88, 0xE8A7, 0xBAF7, 0xE7F8, 0xE8A4, 0xAC89, 0xC8F0, 0xC9AA, /* U+7460 */ 0xAC8A, 0xAC8B, 0xAC8C, 0xAC8D, 0xAC8E, 0xAC8F, 0xAC90, 0xAC91, /* U+7468 */ 0xAC92, 0xAC93, 0xAC94, 0xAC95, 0xAC96, 0xE8A9, 0xAC97, 0xAC98, /* U+7470 */ 0xB9E5, 0xAC99, 0xAC9A, 0xAC9B, 0xAC9C, 0xAC9D, 0xD1FE, 0xE8A8, /* U+7478 */ 0xAC9E, 0xAC9F, 0xACA0, 0xAD40, 0xAD41, 0xAD42, 0xE8AA, 0xAD43, /* U+7480 */ 0xE8AD, 0xE8AE, 0xAD44, 0xC1A7, 0xAD45, 0xAD46, 0xAD47, 0xE8AF, /* U+7488 */ 0xAD48, 0xAD49, 0xAD4A, 0xE8B0, 0xAD4B, 0xAD4C, 0xE8AC, 0xAD4D, /* U+7490 */ 0xE8B4, 0xAD4E, 0xAD4F, 0xAD50, 0xAD51, 0xAD52, 0xAD53, 0xAD54, /* U+7498 */ 0xAD55, 0xAD56, 0xAD57, 0xAD58, 0xE8AB, 0xAD59, 0xE8B1, 0xAD5A, /* U+74A0 */ 0xAD5B, 0xAD5C, 0xAD5D, 0xAD5E, 0xAD5F, 0xAD60, 0xAD61, 0xE8B5, /* U+74A8 */ 0xE8B2, 0xE8B3, 0xAD62, 0xAD63, 0xAD64, 0xAD65, 0xAD66, 0xAD67, /* U+74B0 */ 0xAD68, 0xAD69, 0xAD6A, 0xAD6B, 0xAD6C, 0xAD6D, 0xAD6E, 0xAD6F, /* U+74B8 */ 0xAD70, 0xAD71, 0xE8B7, 0xAD72, 0xAD73, 0xAD74, 0xAD75, 0xAD76, /* U+74C0 */ 0xAD77, 0xAD78, 0xAD79, 0xAD7A, 0xAD7B, 0xAD7C, 0xAD7D, 0xAD7E, /* U+74C8 */ 0xAD80, 0xAD81, 0xAD82, 0xAD83, 0xAD84, 0xAD85, 0xAD86, 0xAD87, /* U+74D0 */ 0xAD88, 0xAD89, 0xE8B6, 0xAD8A, 0xAD8B, 0xAD8C, 0xAD8D, 0xAD8E, /* U+74D8 */ 0xAD8F, 0xAD90, 0xAD91, 0xAD92, 0xB9CF, 0xAD93, 0xF0AC, 0xAD94, /* U+74E0 */ 0xF0AD, 0xAD95, 0xC6B0, 0xB0EA, 0xC8BF, 0xAD96, 0xCDDF, 0xAD97, /* U+74E8 */ 0xAD98, 0xAD99, 0xAD9A, 0xAD9B, 0xAD9C, 0xAD9D, 0xCECD, 0xEAB1, /* U+74F0 */ 0xAD9E, 0xAD9F, 0xADA0, 0xAE40, 0xEAB2, 0xAE41, 0xC6BF, 0xB4C9, /* U+74F8 */ 0xAE42, 0xAE43, 0xAE44, 0xAE45, 0xAE46, 0xAE47, 0xAE48, 0xEAB3, /* U+7500 */ 0xAE49, 0xAE4A, 0xAE4B, 0xAE4C, 0xD5E7, 0xAE4D, 0xAE4E, 0xAE4F, /* U+7508 */ 0xAE50, 0xAE51, 0xAE52, 0xAE53, 0xAE54, 0xDDF9, 0xAE55, 0xEAB4, /* U+7510 */ 0xAE56, 0xEAB5, 0xAE57, 0xEAB6, 0xAE58, 0xAE59, 0xAE5A, 0xAE5B, /* U+7518 */ 0xB8CA, 0xDFB0, 0xC9F5, 0xAE5C, 0xCCF0, 0xAE5D, 0xAE5E, 0xC9FA, /* U+7520 */ 0xAE5F, 0xAE60, 0xAE61, 0xAE62, 0xAE63, 0xC9FB, 0xAE64, 0xAE65, /* U+7528 */ 0xD3C3, 0xCBA6, 0xAE66, 0xB8A6, 0xF0AE, 0xB1C2, 0xAE67, 0xE5B8, /* U+7530 */ 0xCCEF, 0xD3C9, 0xBCD7, 0xC9EA, 0xAE68, 0xB5E7, 0xAE69, 0xC4D0, /* U+7538 */ 0xB5E9, 0xAE6A, 0xEEAE, 0xBBAD, 0xAE6B, 0xAE6C, 0xE7DE, 0xAE6D, /* U+7540 */ 0xEEAF, 0xAE6E, 0xAE6F, 0xAE70, 0xAE71, 0xB3A9, 0xAE72, 0xAE73, /* U+7548 */ 0xEEB2, 0xAE74, 0xAE75, 0xEEB1, 0xBDE7, 0xAE76, 0xEEB0, 0xCEB7, /* U+7550 */ 0xAE77, 0xAE78, 0xAE79, 0xAE7A, 0xC5CF, 0xAE7B, 0xAE7C, 0xAE7D, /* U+7558 */ 0xAE7E, 0xC1F4, 0xDBCE, 0xEEB3, 0xD0F3, 0xAE80, 0xAE81, 0xAE82, /* U+7560 */ 0xAE83, 0xAE84, 0xAE85, 0xAE86, 0xAE87, 0xC2D4, 0xC6E8, 0xAE88, /* U+7568 */ 0xAE89, 0xAE8A, 0xB7AC, 0xAE8B, 0xAE8C, 0xAE8D, 0xAE8E, 0xAE8F, /* U+7570 */ 0xAE90, 0xAE91, 0xEEB4, 0xAE92, 0xB3EB, 0xAE93, 0xAE94, 0xAE95, /* U+7578 */ 0xBBFB, 0xEEB5, 0xAE96, 0xAE97, 0xAE98, 0xAE99, 0xAE9A, 0xE7DC, /* U+7580 */ 0xAE9B, 0xAE9C, 0xAE9D, 0xEEB6, 0xAE9E, 0xAE9F, 0xBDAE, 0xAEA0, /* U+7588 */ 0xAF40, 0xAF41, 0xAF42, 0xF1E2, 0xAF43, 0xAF44, 0xAF45, 0xCAE8, /* U+7590 */ 0xAF46, 0xD2C9, 0xF0DA, 0xAF47, 0xF0DB, 0xAF48, 0xF0DC, 0xC1C6, /* U+7598 */ 0xAF49, 0xB8ED, 0xBECE, 0xAF4A, 0xAF4B, 0xF0DE, 0xAF4C, 0xC5B1, /* U+75A0 */ 0xF0DD, 0xD1F1, 0xAF4D, 0xF0E0, 0xB0CC, 0xBDEA, 0xAF4E, 0xAF4F, /* U+75A8 */ 0xAF50, 0xAF51, 0xAF52, 0xD2DF, 0xF0DF, 0xAF53, 0xB4AF, 0xB7E8, /* U+75B0 */ 0xF0E6, 0xF0E5, 0xC6A3, 0xF0E1, 0xF0E2, 0xB4C3, 0xAF54, 0xAF55, /* U+75B8 */ 0xF0E3, 0xD5EE, 0xAF56, 0xAF57, 0xCCDB, 0xBED2, 0xBCB2, 0xAF58, /* U+75C0 */ 0xAF59, 0xAF5A, 0xF0E8, 0xF0E7, 0xF0E4, 0xB2A1, 0xAF5B, 0xD6A2, /* U+75C8 */ 0xD3B8, 0xBEB7, 0xC8AC, 0xAF5C, 0xAF5D, 0xF0EA, 0xAF5E, 0xAF5F, /* U+75D0 */ 0xAF60, 0xAF61, 0xD1F7, 0xAF62, 0xD6CC, 0xBADB, 0xF0E9, 0xAF63, /* U+75D8 */ 0xB6BB, 0xAF64, 0xAF65, 0xCDB4, 0xAF66, 0xAF67, 0xC6A6, 0xAF68, /* U+75E0 */ 0xAF69, 0xAF6A, 0xC1A1, 0xF0EB, 0xF0EE, 0xAF6B, 0xF0ED, 0xF0F0, /* U+75E8 */ 0xF0EC, 0xAF6C, 0xBBBE, 0xF0EF, 0xAF6D, 0xAF6E, 0xAF6F, 0xAF70, /* U+75F0 */ 0xCCB5, 0xF0F2, 0xAF71, 0xAF72, 0xB3D5, 0xAF73, 0xAF74, 0xAF75, /* U+75F8 */ 0xAF76, 0xB1D4, 0xAF77, 0xAF78, 0xF0F3, 0xAF79, 0xAF7A, 0xF0F4, /* U+7600 */ 0xF0F6, 0xB4E1, 0xAF7B, 0xF0F1, 0xAF7C, 0xF0F7, 0xAF7D, 0xAF7E, /* U+7608 */ 0xAF80, 0xAF81, 0xF0FA, 0xAF82, 0xF0F8, 0xAF83, 0xAF84, 0xAF85, /* U+7610 */ 0xF0F5, 0xAF86, 0xAF87, 0xAF88, 0xAF89, 0xF0FD, 0xAF8A, 0xF0F9, /* U+7618 */ 0xF0FC, 0xF0FE, 0xAF8B, 0xF1A1, 0xAF8C, 0xAF8D, 0xAF8E, 0xCEC1, /* U+7620 */ 0xF1A4, 0xAF8F, 0xF1A3, 0xAF90, 0xC1F6, 0xF0FB, 0xCADD, 0xAF91, /* U+7628 */ 0xAF92, 0xB4F1, 0xB1F1, 0xCCB1, 0xAF93, 0xF1A6, 0xAF94, 0xAF95, /* U+7630 */ 0xF1A7, 0xAF96, 0xAF97, 0xF1AC, 0xD5CE, 0xF1A9, 0xAF98, 0xAF99, /* U+7638 */ 0xC8B3, 0xAF9A, 0xAF9B, 0xAF9C, 0xF1A2, 0xAF9D, 0xF1AB, 0xF1A8, /* U+7640 */ 0xF1A5, 0xAF9E, 0xAF9F, 0xF1AA, 0xAFA0, 0xB040, 0xB041, 0xB042, /* U+7648 */ 0xB043, 0xB044, 0xB045, 0xB046, 0xB0A9, 0xF1AD, 0xB047, 0xB048, /* U+7650 */ 0xB049, 0xB04A, 0xB04B, 0xB04C, 0xF1AF, 0xB04D, 0xF1B1, 0xB04E, /* U+7658 */ 0xB04F, 0xB050, 0xB051, 0xB052, 0xF1B0, 0xB053, 0xF1AE, 0xB054, /* U+7660 */ 0xB055, 0xB056, 0xB057, 0xD1A2, 0xB058, 0xB059, 0xB05A, 0xB05B, /* U+7668 */ 0xB05C, 0xB05D, 0xB05E, 0xF1B2, 0xB05F, 0xB060, 0xB061, 0xF1B3, /* U+7670 */ 0xB062, 0xB063, 0xB064, 0xB065, 0xB066, 0xB067, 0xB068, 0xB069, /* U+7678 */ 0xB9EF, 0xB06A, 0xB06B, 0xB5C7, 0xB06C, 0xB0D7, 0xB0D9, 0xB06D, /* U+7680 */ 0xB06E, 0xB06F, 0xD4ED, 0xB070, 0xB5C4, 0xB071, 0xBDD4, 0xBBCA, /* U+7688 */ 0xF0A7, 0xB072, 0xB073, 0xB8DE, 0xB074, 0xB075, 0xF0A8, 0xB076, /* U+7690 */ 0xB077, 0xB0A8, 0xB078, 0xF0A9, 0xB079, 0xB07A, 0xCDEE, 0xB07B, /* U+7698 */ 0xB07C, 0xF0AA, 0xB07D, 0xB07E, 0xB080, 0xB081, 0xB082, 0xB083, /* U+76A0 */ 0xB084, 0xB085, 0xB086, 0xB087, 0xF0AB, 0xB088, 0xB089, 0xB08A, /* U+76A8 */ 0xB08B, 0xB08C, 0xB08D, 0xB08E, 0xB08F, 0xB090, 0xC6A4, 0xB091, /* U+76B0 */ 0xB092, 0xD6E5, 0xF1E4, 0xB093, 0xF1E5, 0xB094, 0xB095, 0xB096, /* U+76B8 */ 0xB097, 0xB098, 0xB099, 0xB09A, 0xB09B, 0xB09C, 0xB09D, 0xC3F3, /* U+76C0 */ 0xB09E, 0xB09F, 0xD3DB, 0xB0A0, 0xB140, 0xD6D1, 0xC5E8, 0xB141, /* U+76C8 */ 0xD3AF, 0xB142, 0xD2E6, 0xB143, 0xB144, 0xEEC1, 0xB0BB, 0xD5B5, /* U+76D0 */ 0xD1CE, 0xBCE0, 0xBAD0, 0xB145, 0xBFF8, 0xB146, 0xB8C7, 0xB5C1, /* U+76D8 */ 0xC5CC, 0xB147, 0xB148, 0xCAA2, 0xB149, 0xB14A, 0xB14B, 0xC3CB, /* U+76E0 */ 0xB14C, 0xB14D, 0xB14E, 0xB14F, 0xB150, 0xEEC2, 0xB151, 0xB152, /* U+76E8 */ 0xB153, 0xB154, 0xB155, 0xB156, 0xB157, 0xB158, 0xC4BF, 0xB6A2, /* U+76F0 */ 0xB159, 0xEDEC, 0xC3A4, 0xB15A, 0xD6B1, 0xB15B, 0xB15C, 0xB15D, /* U+76F8 */ 0xCFE0, 0xEDEF, 0xB15E, 0xB15F, 0xC5CE, 0xB160, 0xB6DC, 0xB161, /* U+7700 */ 0xB162, 0xCAA1, 0xB163, 0xB164, 0xEDED, 0xB165, 0xB166, 0xEDF0, /* U+7708 */ 0xEDF1, 0xC3BC, 0xB167, 0xBFB4, 0xB168, 0xEDEE, 0xB169, 0xB16A, /* U+7710 */ 0xB16B, 0xB16C, 0xB16D, 0xB16E, 0xB16F, 0xB170, 0xB171, 0xB172, /* U+7718 */ 0xB173, 0xEDF4, 0xEDF2, 0xB174, 0xB175, 0xB176, 0xB177, 0xD5E6, /* U+7720 */ 0xC3DF, 0xB178, 0xEDF3, 0xB179, 0xB17A, 0xB17B, 0xEDF6, 0xB17C, /* U+7728 */ 0xD5A3, 0xD1A3, 0xB17D, 0xB17E, 0xB180, 0xEDF5, 0xB181, 0xC3D0, /* U+7730 */ 0xB182, 0xB183, 0xB184, 0xB185, 0xB186, 0xEDF7, 0xBFF4, 0xBEEC, /* U+7738 */ 0xEDF8, 0xB187, 0xCCF7, 0xB188, 0xD1DB, 0xB189, 0xB18A, 0xB18B, /* U+7740 */ 0xD7C5, 0xD5F6, 0xB18C, 0xEDFC, 0xB18D, 0xB18E, 0xB18F, 0xEDFB, /* U+7748 */ 0xB190, 0xB191, 0xB192, 0xB193, 0xB194, 0xB195, 0xB196, 0xB197, /* U+7750 */ 0xEDF9, 0xEDFA, 0xB198, 0xB199, 0xB19A, 0xB19B, 0xB19C, 0xB19D, /* U+7758 */ 0xB19E, 0xB19F, 0xEDFD, 0xBEA6, 0xB1A0, 0xB240, 0xB241, 0xB242, /* U+7760 */ 0xB243, 0xCBAF, 0xEEA1, 0xB6BD, 0xB244, 0xEEA2, 0xC4C0, 0xB245, /* U+7768 */ 0xEDFE, 0xB246, 0xB247, 0xBDDE, 0xB2C7, 0xB248, 0xB249, 0xB24A, /* U+7770 */ 0xB24B, 0xB24C, 0xB24D, 0xB24E, 0xB24F, 0xB250, 0xB251, 0xB252, /* U+7778 */ 0xB253, 0xB6C3, 0xB254, 0xB255, 0xB256, 0xEEA5, 0xD8BA, 0xEEA3, /* U+7780 */ 0xEEA6, 0xB257, 0xB258, 0xB259, 0xC3E9, 0xB3F2, 0xB25A, 0xB25B, /* U+7788 */ 0xB25C, 0xB25D, 0xB25E, 0xB25F, 0xEEA7, 0xEEA4, 0xCFB9, 0xB260, /* U+7790 */ 0xB261, 0xEEA8, 0xC2F7, 0xB262, 0xB263, 0xB264, 0xB265, 0xB266, /* U+7798 */ 0xB267, 0xB268, 0xB269, 0xB26A, 0xB26B, 0xB26C, 0xB26D, 0xEEA9, /* U+77A0 */ 0xEEAA, 0xB26E, 0xDEAB, 0xB26F, 0xB270, 0xC6B3, 0xB271, 0xC7C6, /* U+77A8 */ 0xB272, 0xD6F5, 0xB5C9, 0xB273, 0xCBB2, 0xB274, 0xB275, 0xB276, /* U+77B0 */ 0xEEAB, 0xB277, 0xB278, 0xCDAB, 0xB279, 0xEEAC, 0xB27A, 0xB27B, /* U+77B8 */ 0xB27C, 0xB27D, 0xB27E, 0xD5B0, 0xB280, 0xEEAD, 0xB281, 0xF6C4, /* U+77C0 */ 0xB282, 0xB283, 0xB284, 0xB285, 0xB286, 0xB287, 0xB288, 0xB289, /* U+77C8 */ 0xB28A, 0xB28B, 0xB28C, 0xB28D, 0xB28E, 0xDBC7, 0xB28F, 0xB290, /* U+77D0 */ 0xB291, 0xB292, 0xB293, 0xB294, 0xB295, 0xB296, 0xB297, 0xB4A3, /* U+77D8 */ 0xB298, 0xB299, 0xB29A, 0xC3AC, 0xF1E6, 0xB29B, 0xB29C, 0xB29D, /* U+77E0 */ 0xB29E, 0xB29F, 0xCAB8, 0xD2D3, 0xB2A0, 0xD6AA, 0xB340, 0xEFF2, /* U+77E8 */ 0xB341, 0xBED8, 0xB342, 0xBDC3, 0xEFF3, 0xB6CC, 0xB0AB, 0xB343, /* U+77F0 */ 0xB344, 0xB345, 0xB346, 0xCAAF, 0xB347, 0xB348, 0xEDB6, 0xB349, /* U+77F8 */ 0xEDB7, 0xB34A, 0xB34B, 0xB34C, 0xB34D, 0xCEF9, 0xB7AF, 0xBFF3, /* U+7800 */ 0xEDB8, 0xC2EB, 0xC9B0, 0xB34E, 0xB34F, 0xB350, 0xB351, 0xB352, /* U+7808 */ 0xB353, 0xEDB9, 0xB354, 0xB355, 0xC6F6, 0xBFB3, 0xB356, 0xB357, /* U+7810 */ 0xB358, 0xEDBC, 0xC5F8, 0xB359, 0xD1D0, 0xB35A, 0xD7A9, 0xEDBA, /* U+7818 */ 0xEDBB, 0xB35B, 0xD1E2, 0xB35C, 0xEDBF, 0xEDC0, 0xB35D, 0xEDC4, /* U+7820 */ 0xB35E, 0xB35F, 0xB360, 0xEDC8, 0xB361, 0xEDC6, 0xEDCE, 0xD5E8, /* U+7828 */ 0xB362, 0xEDC9, 0xB363, 0xB364, 0xEDC7, 0xEDBE, 0xB365, 0xB366, /* U+7830 */ 0xC5E9, 0xB367, 0xB368, 0xB369, 0xC6C6, 0xB36A, 0xB36B, 0xC9E9, /* U+7838 */ 0xD4D2, 0xEDC1, 0xEDC2, 0xEDC3, 0xEDC5, 0xB36C, 0xC0F9, 0xB36D, /* U+7840 */ 0xB4A1, 0xB36E, 0xB36F, 0xB370, 0xB371, 0xB9E8, 0xB372, 0xEDD0, /* U+7848 */ 0xB373, 0xB374, 0xB375, 0xB376, 0xEDD1, 0xB377, 0xEDCA, 0xB378, /* U+7850 */ 0xEDCF, 0xB379, 0xCEF8, 0xB37A, 0xB37B, 0xCBB6, 0xEDCC, 0xEDCD, /* U+7858 */ 0xB37C, 0xB37D, 0xB37E, 0xB380, 0xB381, 0xCFF5, 0xB382, 0xB383, /* U+7860 */ 0xB384, 0xB385, 0xB386, 0xB387, 0xB388, 0xB389, 0xB38A, 0xB38B, /* U+7868 */ 0xB38C, 0xB38D, 0xEDD2, 0xC1F2, 0xD3B2, 0xEDCB, 0xC8B7, 0xB38E, /* U+7870 */ 0xB38F, 0xB390, 0xB391, 0xB392, 0xB393, 0xB394, 0xB395, 0xBCEF, /* U+7878 */ 0xB396, 0xB397, 0xB398, 0xB399, 0xC5F0, 0xB39A, 0xB39B, 0xB39C, /* U+7880 */ 0xB39D, 0xB39E, 0xB39F, 0xB3A0, 0xB440, 0xB441, 0xB442, 0xEDD6, /* U+7888 */ 0xB443, 0xB5EF, 0xB444, 0xB445, 0xC2B5, 0xB0AD, 0xCBE9, 0xB446, /* U+7890 */ 0xB447, 0xB1AE, 0xB448, 0xEDD4, 0xB449, 0xB44A, 0xB44B, 0xCDEB, /* U+7898 */ 0xB5E2, 0xB44C, 0xEDD5, 0xEDD3, 0xEDD7, 0xB44D, 0xB44E, 0xB5FA, /* U+78A0 */ 0xB44F, 0xEDD8, 0xB450, 0xEDD9, 0xB451, 0xEDDC, 0xB452, 0xB1CC, /* U+78A8 */ 0xB453, 0xB454, 0xB455, 0xB456, 0xB457, 0xB458, 0xB459, 0xB45A, /* U+78B0 */ 0xC5F6, 0xBCEE, 0xEDDA, 0xCCBC, 0xB2EA, 0xB45B, 0xB45C, 0xB45D, /* U+78B8 */ 0xB45E, 0xEDDB, 0xB45F, 0xB460, 0xB461, 0xB462, 0xC4EB, 0xB463, /* U+78C0 */ 0xB464, 0xB4C5, 0xB465, 0xB466, 0xB467, 0xB0F5, 0xB468, 0xB469, /* U+78C8 */ 0xB46A, 0xEDDF, 0xC0DA, 0xB4E8, 0xB46B, 0xB46C, 0xB46D, 0xB46E, /* U+78D0 */ 0xC5CD, 0xB46F, 0xB470, 0xB471, 0xEDDD, 0xBFC4, 0xB472, 0xB473, /* U+78D8 */ 0xB474, 0xEDDE, 0xB475, 0xB476, 0xB477, 0xB478, 0xB479, 0xB47A, /* U+78E0 */ 0xB47B, 0xB47C, 0xB47D, 0xB47E, 0xB480, 0xB481, 0xB482, 0xB483, /* U+78E8 */ 0xC4A5, 0xB484, 0xB485, 0xB486, 0xEDE0, 0xB487, 0xB488, 0xB489, /* U+78F0 */ 0xB48A, 0xB48B, 0xEDE1, 0xB48C, 0xEDE3, 0xB48D, 0xB48E, 0xC1D7, /* U+78F8 */ 0xB48F, 0xB490, 0xBBC7, 0xB491, 0xB492, 0xB493, 0xB494, 0xB495, /* U+7900 */ 0xB496, 0xBDB8, 0xB497, 0xB498, 0xB499, 0xEDE2, 0xB49A, 0xB49B, /* U+7908 */ 0xB49C, 0xB49D, 0xB49E, 0xB49F, 0xB4A0, 0xB540, 0xB541, 0xB542, /* U+7910 */ 0xB543, 0xB544, 0xB545, 0xEDE4, 0xB546, 0xB547, 0xB548, 0xB549, /* U+7918 */ 0xB54A, 0xB54B, 0xB54C, 0xB54D, 0xB54E, 0xB54F, 0xEDE6, 0xB550, /* U+7920 */ 0xB551, 0xB552, 0xB553, 0xB554, 0xEDE5, 0xB555, 0xB556, 0xB557, /* U+7928 */ 0xB558, 0xB559, 0xB55A, 0xB55B, 0xB55C, 0xB55D, 0xB55E, 0xB55F, /* U+7930 */ 0xB560, 0xB561, 0xB562, 0xB563, 0xEDE7, 0xB564, 0xB565, 0xB566, /* U+7938 */ 0xB567, 0xB568, 0xCABE, 0xECEA, 0xC0F1, 0xB569, 0xC9E7, 0xB56A, /* U+7940 */ 0xECEB, 0xC6EE, 0xB56B, 0xB56C, 0xB56D, 0xB56E, 0xECEC, 0xB56F, /* U+7948 */ 0xC6ED, 0xECED, 0xB570, 0xB571, 0xB572, 0xB573, 0xB574, 0xB575, /* U+7950 */ 0xB576, 0xB577, 0xB578, 0xECF0, 0xB579, 0xB57A, 0xD7E6, 0xECF3, /* U+7958 */ 0xB57B, 0xB57C, 0xECF1, 0xECEE, 0xECEF, 0xD7A3, 0xC9F1, 0xCBEE, /* U+7960 */ 0xECF4, 0xB57D, 0xECF2, 0xB57E, 0xB580, 0xCFE9, 0xB581, 0xECF6, /* U+7968 */ 0xC6B1, 0xB582, 0xB583, 0xB584, 0xB585, 0xBCC0, 0xB586, 0xECF5, /* U+7970 */ 0xB587, 0xB588, 0xB589, 0xB58A, 0xB58B, 0xB58C, 0xB58D, 0xB5BB, /* U+7978 */ 0xBBF6, 0xB58E, 0xECF7, 0xB58F, 0xB590, 0xB591, 0xB592, 0xB593, /* U+7980 */ 0xD9F7, 0xBDFB, 0xB594, 0xB595, 0xC2BB, 0xECF8, 0xB596, 0xB597, /* U+7988 */ 0xB598, 0xB599, 0xECF9, 0xB59A, 0xB59B, 0xB59C, 0xB59D, 0xB8A3, /* U+7990 */ 0xB59E, 0xB59F, 0xB5A0, 0xB640, 0xB641, 0xB642, 0xB643, 0xB644, /* U+7998 */ 0xB645, 0xB646, 0xECFA, 0xB647, 0xB648, 0xB649, 0xB64A, 0xB64B, /* U+79A0 */ 0xB64C, 0xB64D, 0xB64E, 0xB64F, 0xB650, 0xB651, 0xB652, 0xECFB, /* U+79A8 */ 0xB653, 0xB654, 0xB655, 0xB656, 0xB657, 0xB658, 0xB659, 0xB65A, /* U+79B0 */ 0xB65B, 0xB65C, 0xB65D, 0xECFC, 0xB65E, 0xB65F, 0xB660, 0xB661, /* U+79B8 */ 0xB662, 0xD3ED, 0xD8AE, 0xC0EB, 0xB663, 0xC7DD, 0xBACC, 0xB664, /* U+79C0 */ 0xD0E3, 0xCBBD, 0xB665, 0xCDBA, 0xB666, 0xB667, 0xB8D1, 0xB668, /* U+79C8 */ 0xB669, 0xB1FC, 0xB66A, 0xC7EF, 0xB66B, 0xD6D6, 0xB66C, 0xB66D, /* U+79D0 */ 0xB66E, 0xBFC6, 0xC3EB, 0xB66F, 0xB670, 0xEFF5, 0xB671, 0xB672, /* U+79D8 */ 0xC3D8, 0xB673, 0xB674, 0xB675, 0xB676, 0xB677, 0xB678, 0xD7E2, /* U+79E0 */ 0xB679, 0xB67A, 0xB67B, 0xEFF7, 0xB3D3, 0xB67C, 0xC7D8, 0xD1ED, /* U+79E8 */ 0xB67D, 0xD6C8, 0xB67E, 0xEFF8, 0xB680, 0xEFF6, 0xB681, 0xBBFD, /* U+79F0 */ 0xB3C6, 0xB682, 0xB683, 0xB684, 0xB685, 0xB686, 0xB687, 0xB688, /* U+79F8 */ 0xBDD5, 0xB689, 0xB68A, 0xD2C6, 0xB68B, 0xBBE0, 0xB68C, 0xB68D, /* U+7A00 */ 0xCFA1, 0xB68E, 0xEFFC, 0xEFFB, 0xB68F, 0xB690, 0xEFF9, 0xB691, /* U+7A08 */ 0xB692, 0xB693, 0xB694, 0xB3CC, 0xB695, 0xC9D4, 0xCBB0, 0xB696, /* U+7A10 */ 0xB697, 0xB698, 0xB699, 0xB69A, 0xEFFE, 0xB69B, 0xB69C, 0xB0DE, /* U+7A18 */ 0xB69D, 0xB69E, 0xD6C9, 0xB69F, 0xB6A0, 0xB740, 0xEFFD, 0xB741, /* U+7A20 */ 0xB3ED, 0xB742, 0xB743, 0xF6D5, 0xB744, 0xB745, 0xB746, 0xB747, /* U+7A28 */ 0xB748, 0xB749, 0xB74A, 0xB74B, 0xB74C, 0xB74D, 0xB74E, 0xB74F, /* U+7A30 */ 0xB750, 0xB751, 0xB752, 0xCEC8, 0xB753, 0xB754, 0xB755, 0xF0A2, /* U+7A38 */ 0xB756, 0xF0A1, 0xB757, 0xB5BE, 0xBCDA, 0xBBFC, 0xB758, 0xB8E5, /* U+7A40 */ 0xB759, 0xB75A, 0xB75B, 0xB75C, 0xB75D, 0xB75E, 0xC4C2, 0xB75F, /* U+7A48 */ 0xB760, 0xB761, 0xB762, 0xB763, 0xB764, 0xB765, 0xB766, 0xB767, /* U+7A50 */ 0xB768, 0xF0A3, 0xB769, 0xB76A, 0xB76B, 0xB76C, 0xB76D, 0xCBEB, /* U+7A58 */ 0xB76E, 0xB76F, 0xB770, 0xB771, 0xB772, 0xB773, 0xB774, 0xB775, /* U+7A60 */ 0xB776, 0xB777, 0xB778, 0xB779, 0xB77A, 0xB77B, 0xB77C, 0xB77D, /* U+7A68 */ 0xB77E, 0xB780, 0xB781, 0xB782, 0xB783, 0xB784, 0xB785, 0xB786, /* U+7A70 */ 0xF0A6, 0xB787, 0xB788, 0xB789, 0xD1A8, 0xB78A, 0xBEBF, 0xC7EE, /* U+7A78 */ 0xF1B6, 0xF1B7, 0xBFD5, 0xB78B, 0xB78C, 0xB78D, 0xB78E, 0xB4A9, /* U+7A80 */ 0xF1B8, 0xCDBB, 0xB78F, 0xC7D4, 0xD5AD, 0xB790, 0xF1B9, 0xB791, /* U+7A88 */ 0xF1BA, 0xB792, 0xB793, 0xB794, 0xB795, 0xC7CF, 0xB796, 0xB797, /* U+7A90 */ 0xB798, 0xD2A4, 0xD6CF, 0xB799, 0xB79A, 0xF1BB, 0xBDD1, 0xB4B0, /* U+7A98 */ 0xBEBD, 0xB79B, 0xB79C, 0xB79D, 0xB4DC, 0xCED1, 0xB79E, 0xBFDF, /* U+7AA0 */ 0xF1BD, 0xB79F, 0xB7A0, 0xB840, 0xB841, 0xBFFA, 0xF1BC, 0xB842, /* U+7AA8 */ 0xF1BF, 0xB843, 0xB844, 0xB845, 0xF1BE, 0xF1C0, 0xB846, 0xB847, /* U+7AB0 */ 0xB848, 0xB849, 0xB84A, 0xF1C1, 0xB84B, 0xB84C, 0xB84D, 0xB84E, /* U+7AB8 */ 0xB84F, 0xB850, 0xB851, 0xB852, 0xB853, 0xB854, 0xB855, 0xC1FE, /* U+7AC0 */ 0xB856, 0xB857, 0xB858, 0xB859, 0xB85A, 0xB85B, 0xB85C, 0xB85D, /* U+7AC8 */ 0xB85E, 0xB85F, 0xB860, 0xC1A2, 0xB861, 0xB862, 0xB863, 0xB864, /* U+7AD0 */ 0xB865, 0xB866, 0xB867, 0xB868, 0xB869, 0xB86A, 0xCAFA, 0xB86B, /* U+7AD8 */ 0xB86C, 0xD5BE, 0xB86D, 0xB86E, 0xB86F, 0xB870, 0xBEBA, 0xBEB9, /* U+7AE0 */ 0xD5C2, 0xB871, 0xB872, 0xBFA2, 0xB873, 0xCDAF, 0xF1B5, 0xB874, /* U+7AE8 */ 0xB875, 0xB876, 0xB877, 0xB878, 0xB879, 0xBDDF, 0xB87A, 0xB6CB, /* U+7AF0 */ 0xB87B, 0xB87C, 0xB87D, 0xB87E, 0xB880, 0xB881, 0xB882, 0xB883, /* U+7AF8 */ 0xB884, 0xD6F1, 0xF3C3, 0xB885, 0xB886, 0xF3C4, 0xB887, 0xB8CD, /* U+7B00 */ 0xB888, 0xB889, 0xB88A, 0xF3C6, 0xF3C7, 0xB88B, 0xB0CA, 0xB88C, /* U+7B08 */ 0xF3C5, 0xB88D, 0xF3C9, 0xCBF1, 0xB88E, 0xB88F, 0xB890, 0xF3CB, /* U+7B10 */ 0xB891, 0xD0A6, 0xB892, 0xB893, 0xB1CA, 0xF3C8, 0xB894, 0xB895, /* U+7B18 */ 0xB896, 0xF3CF, 0xB897, 0xB5D1, 0xB898, 0xB899, 0xF3D7, 0xB89A, /* U+7B20 */ 0xF3D2, 0xB89B, 0xB89C, 0xB89D, 0xF3D4, 0xF3D3, 0xB7FB, 0xB89E, /* U+7B28 */ 0xB1BF, 0xB89F, 0xF3CE, 0xF3CA, 0xB5DA, 0xB8A0, 0xF3D0, 0xB940, /* U+7B30 */ 0xB941, 0xF3D1, 0xB942, 0xF3D5, 0xB943, 0xB944, 0xB945, 0xB946, /* U+7B38 */ 0xF3CD, 0xB947, 0xBCE3, 0xB948, 0xC1FD, 0xB949, 0xF3D6, 0xB94A, /* U+7B40 */ 0xB94B, 0xB94C, 0xB94D, 0xB94E, 0xB94F, 0xF3DA, 0xB950, 0xF3CC, /* U+7B48 */ 0xB951, 0xB5C8, 0xB952, 0xBDEE, 0xF3DC, 0xB953, 0xB954, 0xB7A4, /* U+7B50 */ 0xBFF0, 0xD6FE, 0xCDB2, 0xB955, 0xB4F0, 0xB956, 0xB2DF, 0xB957, /* U+7B58 */ 0xF3D8, 0xB958, 0xF3D9, 0xC9B8, 0xB959, 0xF3DD, 0xB95A, 0xB95B, /* U+7B60 */ 0xF3DE, 0xB95C, 0xF3E1, 0xB95D, 0xB95E, 0xB95F, 0xB960, 0xB961, /* U+7B68 */ 0xB962, 0xB963, 0xB964, 0xB965, 0xB966, 0xB967, 0xF3DF, 0xB968, /* U+7B70 */ 0xB969, 0xF3E3, 0xF3E2, 0xB96A, 0xB96B, 0xF3DB, 0xB96C, 0xBFEA, /* U+7B78 */ 0xB96D, 0xB3EF, 0xB96E, 0xF3E0, 0xB96F, 0xB970, 0xC7A9, 0xB971, /* U+7B80 */ 0xBCF2, 0xB972, 0xB973, 0xB974, 0xB975, 0xF3EB, 0xB976, 0xB977, /* U+7B88 */ 0xB978, 0xB979, 0xB97A, 0xB97B, 0xB97C, 0xB9BF, 0xB97D, 0xB97E, /* U+7B90 */ 0xF3E4, 0xB980, 0xB981, 0xB982, 0xB2AD, 0xBBFE, 0xB983, 0xCBE3, /* U+7B98 */ 0xB984, 0xB985, 0xB986, 0xB987, 0xF3ED, 0xF3E9, 0xB988, 0xB989, /* U+7BA0 */ 0xB98A, 0xB9DC, 0xF3EE, 0xB98B, 0xB98C, 0xB98D, 0xF3E5, 0xF3E6, /* U+7BA8 */ 0xF3EA, 0xC2E1, 0xF3EC, 0xF3EF, 0xF3E8, 0xBCFD, 0xB98E, 0xB98F, /* U+7BB0 */ 0xB990, 0xCFE4, 0xB991, 0xB992, 0xF3F0, 0xB993, 0xB994, 0xB995, /* U+7BB8 */ 0xF3E7, 0xB996, 0xB997, 0xB998, 0xB999, 0xB99A, 0xB99B, 0xB99C, /* U+7BC0 */ 0xB99D, 0xF3F2, 0xB99E, 0xB99F, 0xB9A0, 0xBA40, 0xD7AD, 0xC6AA, /* U+7BC8 */ 0xBA41, 0xBA42, 0xBA43, 0xBA44, 0xF3F3, 0xBA45, 0xBA46, 0xBA47, /* U+7BD0 */ 0xBA48, 0xF3F1, 0xBA49, 0xC2A8, 0xBA4A, 0xBA4B, 0xBA4C, 0xBA4D, /* U+7BD8 */ 0xBA4E, 0xB8DD, 0xF3F5, 0xBA4F, 0xBA50, 0xF3F4, 0xBA51, 0xBA52, /* U+7BE0 */ 0xBA53, 0xB4DB, 0xBA54, 0xBA55, 0xBA56, 0xF3F6, 0xF3F7, 0xBA57, /* U+7BE8 */ 0xBA58, 0xBA59, 0xF3F8, 0xBA5A, 0xBA5B, 0xBA5C, 0xC0BA, 0xBA5D, /* U+7BF0 */ 0xBA5E, 0xC0E9, 0xBA5F, 0xBA60, 0xBA61, 0xBA62, 0xBA63, 0xC5F1, /* U+7BF8 */ 0xBA64, 0xBA65, 0xBA66, 0xBA67, 0xF3FB, 0xBA68, 0xF3FA, 0xBA69, /* U+7C00 */ 0xBA6A, 0xBA6B, 0xBA6C, 0xBA6D, 0xBA6E, 0xBA6F, 0xBA70, 0xB4D8, /* U+7C08 */ 0xBA71, 0xBA72, 0xBA73, 0xF3FE, 0xF3F9, 0xBA74, 0xBA75, 0xF3FC, /* U+7C10 */ 0xBA76, 0xBA77, 0xBA78, 0xBA79, 0xBA7A, 0xBA7B, 0xF3FD, 0xBA7C, /* U+7C18 */ 0xBA7D, 0xBA7E, 0xBA80, 0xBA81, 0xBA82, 0xBA83, 0xBA84, 0xF4A1, /* U+7C20 */ 0xBA85, 0xBA86, 0xBA87, 0xBA88, 0xBA89, 0xBA8A, 0xF4A3, 0xBBC9, /* U+7C28 */ 0xBA8B, 0xBA8C, 0xF4A2, 0xBA8D, 0xBA8E, 0xBA8F, 0xBA90, 0xBA91, /* U+7C30 */ 0xBA92, 0xBA93, 0xBA94, 0xBA95, 0xBA96, 0xBA97, 0xBA98, 0xBA99, /* U+7C38 */ 0xF4A4, 0xBA9A, 0xBA9B, 0xBA9C, 0xBA9D, 0xBA9E, 0xBA9F, 0xB2BE, /* U+7C40 */ 0xF4A6, 0xF4A5, 0xBAA0, 0xBB40, 0xBB41, 0xBB42, 0xBB43, 0xBB44, /* U+7C48 */ 0xBB45, 0xBB46, 0xBB47, 0xBB48, 0xBB49, 0xBCAE, 0xBB4A, 0xBB4B, /* U+7C50 */ 0xBB4C, 0xBB4D, 0xBB4E, 0xBB4F, 0xBB50, 0xBB51, 0xBB52, 0xBB53, /* U+7C58 */ 0xBB54, 0xBB55, 0xBB56, 0xBB57, 0xBB58, 0xBB59, 0xBB5A, 0xBB5B, /* U+7C60 */ 0xBB5C, 0xBB5D, 0xBB5E, 0xBB5F, 0xBB60, 0xBB61, 0xBB62, 0xBB63, /* U+7C68 */ 0xBB64, 0xBB65, 0xBB66, 0xBB67, 0xBB68, 0xBB69, 0xBB6A, 0xBB6B, /* U+7C70 */ 0xBB6C, 0xBB6D, 0xBB6E, 0xC3D7, 0xD9E1, 0xBB6F, 0xBB70, 0xBB71, /* U+7C78 */ 0xBB72, 0xBB73, 0xBB74, 0xC0E0, 0xF4CC, 0xD7D1, 0xBB75, 0xBB76, /* U+7C80 */ 0xBB77, 0xBB78, 0xBB79, 0xBB7A, 0xBB7B, 0xBB7C, 0xBB7D, 0xBB7E, /* U+7C88 */ 0xBB80, 0xB7DB, 0xBB81, 0xBB82, 0xBB83, 0xBB84, 0xBB85, 0xBB86, /* U+7C90 */ 0xBB87, 0xF4CE, 0xC1A3, 0xBB88, 0xBB89, 0xC6C9, 0xBB8A, 0xB4D6, /* U+7C98 */ 0xD5B3, 0xBB8B, 0xBB8C, 0xBB8D, 0xF4D0, 0xF4CF, 0xF4D1, 0xCBDA, /* U+7CA0 */ 0xBB8E, 0xBB8F, 0xF4D2, 0xBB90, 0xD4C1, 0xD6E0, 0xBB91, 0xBB92, /* U+7CA8 */ 0xBB93, 0xBB94, 0xB7E0, 0xBB95, 0xBB96, 0xBB97, 0xC1B8, 0xBB98, /* U+7CB0 */ 0xBB99, 0xC1BB, 0xF4D3, 0xBEAC, 0xBB9A, 0xBB9B, 0xBB9C, 0xBB9D, /* U+7CB8 */ 0xBB9E, 0xB4E2, 0xBB9F, 0xBBA0, 0xF4D4, 0xF4D5, 0xBEAB, 0xBC40, /* U+7CC0 */ 0xBC41, 0xF4D6, 0xBC42, 0xBC43, 0xBC44, 0xF4DB, 0xBC45, 0xF4D7, /* U+7CC8 */ 0xF4DA, 0xBC46, 0xBAFD, 0xBC47, 0xF4D8, 0xF4D9, 0xBC48, 0xBC49, /* U+7CD0 */ 0xBC4A, 0xBC4B, 0xBC4C, 0xBC4D, 0xBC4E, 0xB8E2, 0xCCC7, 0xF4DC, /* U+7CD8 */ 0xBC4F, 0xB2DA, 0xBC50, 0xBC51, 0xC3D3, 0xBC52, 0xBC53, 0xD4E3, /* U+7CE0 */ 0xBFB7, 0xBC54, 0xBC55, 0xBC56, 0xBC57, 0xBC58, 0xBC59, 0xBC5A, /* U+7CE8 */ 0xF4DD, 0xBC5B, 0xBC5C, 0xBC5D, 0xBC5E, 0xBC5F, 0xBC60, 0xC5B4, /* U+7CF0 */ 0xBC61, 0xBC62, 0xBC63, 0xBC64, 0xBC65, 0xBC66, 0xBC67, 0xBC68, /* U+7CF8 */ 0xF4E9, 0xBC69, 0xBC6A, 0xCFB5, 0xBC6B, 0xBC6C, 0xBC6D, 0xBC6E, /* U+7D00 */ 0xBC6F, 0xBC70, 0xBC71, 0xBC72, 0xBC73, 0xBC74, 0xBC75, 0xBC76, /* U+7D08 */ 0xBC77, 0xBC78, 0xCEC9, 0xBC79, 0xBC7A, 0xBC7B, 0xBC7C, 0xBC7D, /* U+7D10 */ 0xBC7E, 0xBC80, 0xBC81, 0xBC82, 0xBC83, 0xBC84, 0xBC85, 0xBC86, /* U+7D18 */ 0xBC87, 0xBC88, 0xBC89, 0xBC8A, 0xBC8B, 0xBC8C, 0xBC8D, 0xBC8E, /* U+7D20 */ 0xCBD8, 0xBC8F, 0xCBF7, 0xBC90, 0xBC91, 0xBC92, 0xBC93, 0xBDF4, /* U+7D28 */ 0xBC94, 0xBC95, 0xBC96, 0xD7CF, 0xBC97, 0xBC98, 0xBC99, 0xC0DB, /* U+7D30 */ 0xBC9A, 0xBC9B, 0xBC9C, 0xBC9D, 0xBC9E, 0xBC9F, 0xBCA0, 0xBD40, /* U+7D38 */ 0xBD41, 0xBD42, 0xBD43, 0xBD44, 0xBD45, 0xBD46, 0xBD47, 0xBD48, /* U+7D40 */ 0xBD49, 0xBD4A, 0xBD4B, 0xBD4C, 0xBD4D, 0xBD4E, 0xBD4F, 0xBD50, /* U+7D48 */ 0xBD51, 0xBD52, 0xBD53, 0xBD54, 0xBD55, 0xBD56, 0xBD57, 0xBD58, /* U+7D50 */ 0xBD59, 0xBD5A, 0xBD5B, 0xBD5C, 0xBD5D, 0xBD5E, 0xBD5F, 0xBD60, /* U+7D58 */ 0xBD61, 0xBD62, 0xBD63, 0xBD64, 0xBD65, 0xBD66, 0xBD67, 0xBD68, /* U+7D60 */ 0xBD69, 0xBD6A, 0xBD6B, 0xBD6C, 0xBD6D, 0xBD6E, 0xBD6F, 0xBD70, /* U+7D68 */ 0xBD71, 0xBD72, 0xBD73, 0xBD74, 0xBD75, 0xBD76, 0xD0F5, 0xBD77, /* U+7D70 */ 0xBD78, 0xBD79, 0xBD7A, 0xBD7B, 0xBD7C, 0xBD7D, 0xBD7E, 0xF4EA, /* U+7D78 */ 0xBD80, 0xBD81, 0xBD82, 0xBD83, 0xBD84, 0xBD85, 0xBD86, 0xBD87, /* U+7D80 */ 0xBD88, 0xBD89, 0xBD8A, 0xBD8B, 0xBD8C, 0xBD8D, 0xBD8E, 0xBD8F, /* U+7D88 */ 0xBD90, 0xBD91, 0xBD92, 0xBD93, 0xBD94, 0xBD95, 0xBD96, 0xBD97, /* U+7D90 */ 0xBD98, 0xBD99, 0xBD9A, 0xBD9B, 0xBD9C, 0xBD9D, 0xBD9E, 0xBD9F, /* U+7D98 */ 0xBDA0, 0xBE40, 0xBE41, 0xBE42, 0xBE43, 0xBE44, 0xBE45, 0xBE46, /* U+7DA0 */ 0xBE47, 0xBE48, 0xBE49, 0xBE4A, 0xBE4B, 0xBE4C, 0xF4EB, 0xBE4D, /* U+7DA8 */ 0xBE4E, 0xBE4F, 0xBE50, 0xBE51, 0xBE52, 0xBE53, 0xF4EC, 0xBE54, /* U+7DB0 */ 0xBE55, 0xBE56, 0xBE57, 0xBE58, 0xBE59, 0xBE5A, 0xBE5B, 0xBE5C, /* U+7DB8 */ 0xBE5D, 0xBE5E, 0xBE5F, 0xBE60, 0xBE61, 0xBE62, 0xBE63, 0xBE64, /* U+7DC0 */ 0xBE65, 0xBE66, 0xBE67, 0xBE68, 0xBE69, 0xBE6A, 0xBE6B, 0xBE6C, /* U+7DC8 */ 0xBE6D, 0xBE6E, 0xBE6F, 0xBE70, 0xBE71, 0xBE72, 0xBE73, 0xBE74, /* U+7DD0 */ 0xBE75, 0xBE76, 0xBE77, 0xBE78, 0xBE79, 0xBE7A, 0xBE7B, 0xBE7C, /* U+7DD8 */ 0xBE7D, 0xBE7E, 0xBE80, 0xBE81, 0xBE82, 0xBE83, 0xBE84, 0xBE85, /* U+7DE0 */ 0xBE86, 0xBE87, 0xBE88, 0xBE89, 0xBE8A, 0xBE8B, 0xBE8C, 0xBE8D, /* U+7DE8 */ 0xBE8E, 0xBE8F, 0xBE90, 0xBE91, 0xBE92, 0xBE93, 0xBE94, 0xBE95, /* U+7DF0 */ 0xBE96, 0xBE97, 0xBE98, 0xBE99, 0xBE9A, 0xBE9B, 0xBE9C, 0xBE9D, /* U+7DF8 */ 0xBE9E, 0xBE9F, 0xBEA0, 0xBF40, 0xBF41, 0xBF42, 0xBF43, 0xBF44, /* U+7E00 */ 0xBF45, 0xBF46, 0xBF47, 0xBF48, 0xBF49, 0xBF4A, 0xBF4B, 0xBF4C, /* U+7E08 */ 0xBF4D, 0xBF4E, 0xBF4F, 0xBF50, 0xBF51, 0xBF52, 0xBF53, 0xBF54, /* U+7E10 */ 0xBF55, 0xBF56, 0xBF57, 0xBF58, 0xBF59, 0xBF5A, 0xBF5B, 0xBF5C, /* U+7E18 */ 0xBF5D, 0xBF5E, 0xBF5F, 0xBF60, 0xBF61, 0xBF62, 0xBF63, 0xBF64, /* U+7E20 */ 0xBF65, 0xBF66, 0xBF67, 0xBF68, 0xBF69, 0xBF6A, 0xBF6B, 0xBF6C, /* U+7E28 */ 0xBF6D, 0xBF6E, 0xBF6F, 0xBF70, 0xBF71, 0xBF72, 0xBF73, 0xBF74, /* U+7E30 */ 0xBF75, 0xBF76, 0xBF77, 0xBF78, 0xBF79, 0xBF7A, 0xBF7B, 0xBF7C, /* U+7E38 */ 0xBF7D, 0xBF7E, 0xBF80, 0xF7E3, 0xBF81, 0xBF82, 0xBF83, 0xBF84, /* U+7E40 */ 0xBF85, 0xB7B1, 0xBF86, 0xBF87, 0xBF88, 0xBF89, 0xBF8A, 0xF4ED, /* U+7E48 */ 0xBF8B, 0xBF8C, 0xBF8D, 0xBF8E, 0xBF8F, 0xBF90, 0xBF91, 0xBF92, /* U+7E50 */ 0xBF93, 0xBF94, 0xBF95, 0xBF96, 0xBF97, 0xBF98, 0xBF99, 0xBF9A, /* U+7E58 */ 0xBF9B, 0xBF9C, 0xBF9D, 0xBF9E, 0xBF9F, 0xBFA0, 0xC040, 0xC041, /* U+7E60 */ 0xC042, 0xC043, 0xC044, 0xC045, 0xC046, 0xC047, 0xC048, 0xC049, /* U+7E68 */ 0xC04A, 0xC04B, 0xC04C, 0xC04D, 0xC04E, 0xC04F, 0xC050, 0xC051, /* U+7E70 */ 0xC052, 0xC053, 0xC054, 0xC055, 0xC056, 0xC057, 0xC058, 0xC059, /* U+7E78 */ 0xC05A, 0xC05B, 0xC05C, 0xC05D, 0xC05E, 0xC05F, 0xC060, 0xC061, /* U+7E80 */ 0xC062, 0xC063, 0xD7EB, 0xC064, 0xC065, 0xC066, 0xC067, 0xC068, /* U+7E88 */ 0xC069, 0xC06A, 0xC06B, 0xC06C, 0xC06D, 0xC06E, 0xC06F, 0xC070, /* U+7E90 */ 0xC071, 0xC072, 0xC073, 0xC074, 0xC075, 0xC076, 0xC077, 0xC078, /* U+7E98 */ 0xC079, 0xC07A, 0xC07B, 0xF4EE, 0xC07C, 0xC07D, 0xC07E, 0xE6F9, /* U+7EA0 */ 0xBEC0, 0xE6FA, 0xBAEC, 0xE6FB, 0xCFCB, 0xE6FC, 0xD4BC, 0xBCB6, /* U+7EA8 */ 0xE6FD, 0xE6FE, 0xBCCD, 0xC8D2, 0xCEB3, 0xE7A1, 0xC080, 0xB4BF, /* U+7EB0 */ 0xE7A2, 0xC9B4, 0xB8D9, 0xC4C9, 0xC081, 0xD7DD, 0xC2DA, 0xB7D7, /* U+7EB8 */ 0xD6BD, 0xCEC6, 0xB7C4, 0xC082, 0xC083, 0xC5A6, 0xE7A3, 0xCFDF, /* U+7EC0 */ 0xE7A4, 0xE7A5, 0xE7A6, 0xC1B7, 0xD7E9, 0xC9F0, 0xCFB8, 0xD6AF, /* U+7EC8 */ 0xD6D5, 0xE7A7, 0xB0ED, 0xE7A8, 0xE7A9, 0xC9DC, 0xD2EF, 0xBEAD, /* U+7ED0 */ 0xE7AA, 0xB0F3, 0xC8DE, 0xBDE1, 0xE7AB, 0xC8C6, 0xC084, 0xE7AC, /* U+7ED8 */ 0xBBE6, 0xB8F8, 0xD1A4, 0xE7AD, 0xC2E7, 0xBEF8, 0xBDCA, 0xCDB3, /* U+7EE0 */ 0xE7AE, 0xE7AF, 0xBEEE, 0xD0E5, 0xC085, 0xCBE7, 0xCCD0, 0xBCCC, /* U+7EE8 */ 0xE7B0, 0xBCA8, 0xD0F7, 0xE7B1, 0xC086, 0xD0F8, 0xE7B2, 0xE7B3, /* U+7EF0 */ 0xB4C2, 0xE7B4, 0xE7B5, 0xC9FE, 0xCEAC, 0xC3E0, 0xE7B7, 0xB1C1, /* U+7EF8 */ 0xB3F1, 0xC087, 0xE7B8, 0xE7B9, 0xD7DB, 0xD5C0, 0xE7BA, 0xC2CC, /* U+7F00 */ 0xD7BA, 0xE7BB, 0xE7BC, 0xE7BD, 0xBCEA, 0xC3E5, 0xC0C2, 0xE7BE, /* U+7F08 */ 0xE7BF, 0xBCA9, 0xC088, 0xE7C0, 0xE7C1, 0xE7B6, 0xB6D0, 0xE7C2, /* U+7F10 */ 0xC089, 0xE7C3, 0xE7C4, 0xBBBA, 0xB5DE, 0xC2C6, 0xB1E0, 0xE7C5, /* U+7F18 */ 0xD4B5, 0xE7C6, 0xB8BF, 0xE7C8, 0xE7C7, 0xB7EC, 0xC08A, 0xE7C9, /* U+7F20 */ 0xB2F8, 0xE7CA, 0xE7CB, 0xE7CC, 0xE7CD, 0xE7CE, 0xE7CF, 0xE7D0, /* U+7F28 */ 0xD3A7, 0xCBF5, 0xE7D1, 0xE7D2, 0xE7D3, 0xE7D4, 0xC9C9, 0xE7D5, /* U+7F30 */ 0xE7D6, 0xE7D7, 0xE7D8, 0xE7D9, 0xBDC9, 0xE7DA, 0xF3BE, 0xC08B, /* U+7F38 */ 0xB8D7, 0xC08C, 0xC8B1, 0xC08D, 0xC08E, 0xC08F, 0xC090, 0xC091, /* U+7F40 */ 0xC092, 0xC093, 0xF3BF, 0xC094, 0xF3C0, 0xF3C1, 0xC095, 0xC096, /* U+7F48 */ 0xC097, 0xC098, 0xC099, 0xC09A, 0xC09B, 0xC09C, 0xC09D, 0xC09E, /* U+7F50 */ 0xB9DE, 0xCDF8, 0xC09F, 0xC0A0, 0xD8E8, 0xBAB1, 0xC140, 0xC2DE, /* U+7F58 */ 0xEEB7, 0xC141, 0xB7A3, 0xC142, 0xC143, 0xC144, 0xC145, 0xEEB9, /* U+7F60 */ 0xC146, 0xEEB8, 0xB0D5, 0xC147, 0xC148, 0xC149, 0xC14A, 0xC14B, /* U+7F68 */ 0xEEBB, 0xD5D6, 0xD7EF, 0xC14C, 0xC14D, 0xC14E, 0xD6C3, 0xC14F, /* U+7F70 */ 0xC150, 0xEEBD, 0xCAF0, 0xC151, 0xEEBC, 0xC152, 0xC153, 0xC154, /* U+7F78 */ 0xC155, 0xEEBE, 0xC156, 0xC157, 0xC158, 0xC159, 0xEEC0, 0xC15A, /* U+7F80 */ 0xC15B, 0xEEBF, 0xC15C, 0xC15D, 0xC15E, 0xC15F, 0xC160, 0xC161, /* U+7F88 */ 0xC162, 0xC163, 0xD1F2, 0xC164, 0xC7BC, 0xC165, 0xC3C0, 0xC166, /* U+7F90 */ 0xC167, 0xC168, 0xC169, 0xC16A, 0xB8E1, 0xC16B, 0xC16C, 0xC16D, /* U+7F98 */ 0xC16E, 0xC16F, 0xC1E7, 0xC170, 0xC171, 0xF4C6, 0xD0DF, 0xF4C7, /* U+7FA0 */ 0xC172, 0xCFDB, 0xC173, 0xC174, 0xC8BA, 0xC175, 0xC176, 0xF4C8, /* U+7FA8 */ 0xC177, 0xC178, 0xC179, 0xC17A, 0xC17B, 0xC17C, 0xC17D, 0xF4C9, /* U+7FB0 */ 0xF4CA, 0xC17E, 0xF4CB, 0xC180, 0xC181, 0xC182, 0xC183, 0xC184, /* U+7FB8 */ 0xD9FA, 0xB8FE, 0xC185, 0xC186, 0xE5F1, 0xD3F0, 0xC187, 0xF4E0, /* U+7FC0 */ 0xC188, 0xCECC, 0xC189, 0xC18A, 0xC18B, 0xB3E1, 0xC18C, 0xC18D, /* U+7FC8 */ 0xC18E, 0xC18F, 0xF1B4, 0xC190, 0xD2EE, 0xC191, 0xF4E1, 0xC192, /* U+7FD0 */ 0xC193, 0xC194, 0xC195, 0xC196, 0xCFE8, 0xF4E2, 0xC197, 0xC198, /* U+7FD8 */ 0xC7CC, 0xC199, 0xC19A, 0xC19B, 0xC19C, 0xC19D, 0xC19E, 0xB5D4, /* U+7FE0 */ 0xB4E4, 0xF4E4, 0xC19F, 0xC1A0, 0xC240, 0xF4E3, 0xF4E5, 0xC241, /* U+7FE8 */ 0xC242, 0xF4E6, 0xC243, 0xC244, 0xC245, 0xC246, 0xF4E7, 0xC247, /* U+7FF0 */ 0xBAB2, 0xB0BF, 0xC248, 0xF4E8, 0xC249, 0xC24A, 0xC24B, 0xC24C, /* U+7FF8 */ 0xC24D, 0xC24E, 0xC24F, 0xB7AD, 0xD2ED, 0xC250, 0xC251, 0xC252, /* U+8000 */ 0xD2AB, 0xC0CF, 0xC253, 0xBFBC, 0xEBA3, 0xD5DF, 0xEAC8, 0xC254, /* U+8008 */ 0xC255, 0xC256, 0xC257, 0xF1F3, 0xB6F8, 0xCBA3, 0xC258, 0xC259, /* U+8010 */ 0xC4CD, 0xC25A, 0xF1E7, 0xC25B, 0xF1E8, 0xB8FB, 0xF1E9, 0xBAC4, /* U+8018 */ 0xD4C5, 0xB0D2, 0xC25C, 0xC25D, 0xF1EA, 0xC25E, 0xC25F, 0xC260, /* U+8020 */ 0xF1EB, 0xC261, 0xF1EC, 0xC262, 0xC263, 0xF1ED, 0xF1EE, 0xF1EF, /* U+8028 */ 0xF1F1, 0xF1F0, 0xC5D5, 0xC264, 0xC265, 0xC266, 0xC267, 0xC268, /* U+8030 */ 0xC269, 0xF1F2, 0xC26A, 0xB6FA, 0xC26B, 0xF1F4, 0xD2AE, 0xDEC7, /* U+8038 */ 0xCBCA, 0xC26C, 0xC26D, 0xB3DC, 0xC26E, 0xB5A2, 0xC26F, 0xB9A2, /* U+8040 */ 0xC270, 0xC271, 0xC4F4, 0xF1F5, 0xC272, 0xC273, 0xF1F6, 0xC274, /* U+8048 */ 0xC275, 0xC276, 0xC1C4, 0xC1FB, 0xD6B0, 0xF1F7, 0xC277, 0xC278, /* U+8050 */ 0xC279, 0xC27A, 0xF1F8, 0xC27B, 0xC1AA, 0xC27C, 0xC27D, 0xC27E, /* U+8058 */ 0xC6B8, 0xC280, 0xBEDB, 0xC281, 0xC282, 0xC283, 0xC284, 0xC285, /* U+8060 */ 0xC286, 0xC287, 0xC288, 0xC289, 0xC28A, 0xC28B, 0xC28C, 0xC28D, /* U+8068 */ 0xC28E, 0xF1F9, 0xB4CF, 0xC28F, 0xC290, 0xC291, 0xC292, 0xC293, /* U+8070 */ 0xC294, 0xF1FA, 0xC295, 0xC296, 0xC297, 0xC298, 0xC299, 0xC29A, /* U+8078 */ 0xC29B, 0xC29C, 0xC29D, 0xC29E, 0xC29F, 0xC2A0, 0xC340, 0xEDB2, /* U+8080 */ 0xEDB1, 0xC341, 0xC342, 0xCBE0, 0xD2DE, 0xC343, 0xCBC1, 0xD5D8, /* U+8088 */ 0xC344, 0xC8E2, 0xC345, 0xC0DF, 0xBCA1, 0xC346, 0xC347, 0xC348, /* U+8090 */ 0xC349, 0xC34A, 0xC34B, 0xEBC1, 0xC34C, 0xC34D, 0xD0A4, 0xC34E, /* U+8098 */ 0xD6E2, 0xC34F, 0xB6C7, 0xB8D8, 0xEBC0, 0xB8CE, 0xC350, 0xEBBF, /* U+80A0 */ 0xB3A6, 0xB9C9, 0xD6AB, 0xC351, 0xB7F4, 0xB7CA, 0xC352, 0xC353, /* U+80A8 */ 0xC354, 0xBCE7, 0xB7BE, 0xEBC6, 0xC355, 0xEBC7, 0xB0B9, 0xBFCF, /* U+80B0 */ 0xC356, 0xEBC5, 0xD3FD, 0xC357, 0xEBC8, 0xC358, 0xC359, 0xEBC9, /* U+80B8 */ 0xC35A, 0xC35B, 0xB7CE, 0xC35C, 0xEBC2, 0xEBC4, 0xC9F6, 0xD6D7, /* U+80C0 */ 0xD5CD, 0xD0B2, 0xEBCF, 0xCEB8, 0xEBD0, 0xC35D, 0xB5A8, 0xC35E, /* U+80C8 */ 0xC35F, 0xC360, 0xC361, 0xC362, 0xB1B3, 0xEBD2, 0xCCA5, 0xC363, /* U+80D0 */ 0xC364, 0xC365, 0xC366, 0xC367, 0xC368, 0xC369, 0xC5D6, 0xEBD3, /* U+80D8 */ 0xC36A, 0xEBD1, 0xC5DF, 0xEBCE, 0xCAA4, 0xEBD5, 0xB0FB, 0xC36B, /* U+80E0 */ 0xC36C, 0xBAFA, 0xC36D, 0xC36E, 0xD8B7, 0xF1E3, 0xC36F, 0xEBCA, /* U+80E8 */ 0xEBCB, 0xEBCC, 0xEBCD, 0xEBD6, 0xE6C0, 0xEBD9, 0xC370, 0xBFE8, /* U+80F0 */ 0xD2C8, 0xEBD7, 0xEBDC, 0xB8EC, 0xEBD8, 0xC371, 0xBDBA, 0xC372, /* U+80F8 */ 0xD0D8, 0xC373, 0xB0B7, 0xC374, 0xEBDD, 0xC4DC, 0xC375, 0xC376, /* U+8100 */ 0xC377, 0xC378, 0xD6AC, 0xC379, 0xC37A, 0xC37B, 0xB4E0, 0xC37C, /* U+8108 */ 0xC37D, 0xC2F6, 0xBCB9, 0xC37E, 0xC380, 0xEBDA, 0xEBDB, 0xD4E0, /* U+8110 */ 0xC6EA, 0xC4D4, 0xEBDF, 0xC5A7, 0xD9F5, 0xC381, 0xB2B1, 0xC382, /* U+8118 */ 0xEBE4, 0xC383, 0xBDC5, 0xC384, 0xC385, 0xC386, 0xEBE2, 0xC387, /* U+8120 */ 0xC388, 0xC389, 0xC38A, 0xC38B, 0xC38C, 0xC38D, 0xC38E, 0xC38F, /* U+8128 */ 0xC390, 0xC391, 0xC392, 0xC393, 0xEBE3, 0xC394, 0xC395, 0xB8AC, /* U+8130 */ 0xC396, 0xCDD1, 0xEBE5, 0xC397, 0xC398, 0xC399, 0xEBE1, 0xC39A, /* U+8138 */ 0xC1B3, 0xC39B, 0xC39C, 0xC39D, 0xC39E, 0xC39F, 0xC6A2, 0xC3A0, /* U+8140 */ 0xC440, 0xC441, 0xC442, 0xC443, 0xC444, 0xC445, 0xCCF3, 0xC446, /* U+8148 */ 0xEBE6, 0xC447, 0xC0B0, 0xD2B8, 0xEBE7, 0xC448, 0xC449, 0xC44A, /* U+8150 */ 0xB8AF, 0xB8AD, 0xC44B, 0xEBE8, 0xC7BB, 0xCDF3, 0xC44C, 0xC44D, /* U+8158 */ 0xC44E, 0xEBEA, 0xEBEB, 0xC44F, 0xC450, 0xC451, 0xC452, 0xC453, /* U+8160 */ 0xEBED, 0xC454, 0xC455, 0xC456, 0xC457, 0xD0C8, 0xC458, 0xEBF2, /* U+8168 */ 0xC459, 0xEBEE, 0xC45A, 0xC45B, 0xC45C, 0xEBF1, 0xC8F9, 0xC45D, /* U+8170 */ 0xD1FC, 0xEBEC, 0xC45E, 0xC45F, 0xEBE9, 0xC460, 0xC461, 0xC462, /* U+8178 */ 0xC463, 0xB8B9, 0xCFD9, 0xC4E5, 0xEBEF, 0xEBF0, 0xCCDA, 0xCDC8, /* U+8180 */ 0xB0F2, 0xC464, 0xEBF6, 0xC465, 0xC466, 0xC467, 0xC468, 0xC469, /* U+8188 */ 0xEBF5, 0xC46A, 0xB2B2, 0xC46B, 0xC46C, 0xC46D, 0xC46E, 0xB8E0, /* U+8190 */ 0xC46F, 0xEBF7, 0xC470, 0xC471, 0xC472, 0xC473, 0xC474, 0xC475, /* U+8198 */ 0xB1EC, 0xC476, 0xC477, 0xCCC5, 0xC4A4, 0xCFA5, 0xC478, 0xC479, /* U+81A0 */ 0xC47A, 0xC47B, 0xC47C, 0xEBF9, 0xC47D, 0xC47E, 0xECA2, 0xC480, /* U+81A8 */ 0xC5F2, 0xC481, 0xEBFA, 0xC482, 0xC483, 0xC484, 0xC485, 0xC486, /* U+81B0 */ 0xC487, 0xC488, 0xC489, 0xC9C5, 0xC48A, 0xC48B, 0xC48C, 0xC48D, /* U+81B8 */ 0xC48E, 0xC48F, 0xE2DF, 0xEBFE, 0xC490, 0xC491, 0xC492, 0xC493, /* U+81C0 */ 0xCDCE, 0xECA1, 0xB1DB, 0xD3B7, 0xC494, 0xC495, 0xD2DC, 0xC496, /* U+81C8 */ 0xC497, 0xC498, 0xEBFD, 0xC499, 0xEBFB, 0xC49A, 0xC49B, 0xC49C, /* U+81D0 */ 0xC49D, 0xC49E, 0xC49F, 0xC4A0, 0xC540, 0xC541, 0xC542, 0xC543, /* U+81D8 */ 0xC544, 0xC545, 0xC546, 0xC547, 0xC548, 0xC549, 0xC54A, 0xC54B, /* U+81E0 */ 0xC54C, 0xC54D, 0xC54E, 0xB3BC, 0xC54F, 0xC550, 0xC551, 0xEAB0, /* U+81E8 */ 0xC552, 0xC553, 0xD7D4, 0xC554, 0xF4AB, 0xB3F4, 0xC555, 0xC556, /* U+81F0 */ 0xC557, 0xC558, 0xC559, 0xD6C1, 0xD6C2, 0xC55A, 0xC55B, 0xC55C, /* U+81F8 */ 0xC55D, 0xC55E, 0xC55F, 0xD5E9, 0xBECA, 0xC560, 0xF4A7, 0xC561, /* U+8200 */ 0xD2A8, 0xF4A8, 0xF4A9, 0xC562, 0xF4AA, 0xBECB, 0xD3DF, 0xC563, /* U+8208 */ 0xC564, 0xC565, 0xC566, 0xC567, 0xC9E0, 0xC9E1, 0xC568, 0xC569, /* U+8210 */ 0xF3C2, 0xC56A, 0xCAE6, 0xC56B, 0xCCF2, 0xC56C, 0xC56D, 0xC56E, /* U+8218 */ 0xC56F, 0xC570, 0xC571, 0xE2B6, 0xCBB4, 0xC572, 0xCEE8, 0xD6DB, /* U+8220 */ 0xC573, 0xF4AD, 0xF4AE, 0xF4AF, 0xC574, 0xC575, 0xC576, 0xC577, /* U+8228 */ 0xF4B2, 0xC578, 0xBABD, 0xF4B3, 0xB0E3, 0xF4B0, 0xC579, 0xF4B1, /* U+8230 */ 0xBDA2, 0xB2D5, 0xC57A, 0xF4B6, 0xF4B7, 0xB6E6, 0xB2B0, 0xCFCF, /* U+8238 */ 0xF4B4, 0xB4AC, 0xC57B, 0xF4B5, 0xC57C, 0xC57D, 0xF4B8, 0xC57E, /* U+8240 */ 0xC580, 0xC581, 0xC582, 0xC583, 0xF4B9, 0xC584, 0xC585, 0xCDA7, /* U+8248 */ 0xC586, 0xF4BA, 0xC587, 0xF4BB, 0xC588, 0xC589, 0xC58A, 0xF4BC, /* U+8250 */ 0xC58B, 0xC58C, 0xC58D, 0xC58E, 0xC58F, 0xC590, 0xC591, 0xC592, /* U+8258 */ 0xCBD2, 0xC593, 0xF4BD, 0xC594, 0xC595, 0xC596, 0xC597, 0xF4BE, /* U+8260 */ 0xC598, 0xC599, 0xC59A, 0xC59B, 0xC59C, 0xC59D, 0xC59E, 0xC59F, /* U+8268 */ 0xF4BF, 0xC5A0, 0xC640, 0xC641, 0xC642, 0xC643, 0xF4DE, 0xC1BC, /* U+8270 */ 0xBCE8, 0xC644, 0xC9AB, 0xD1DE, 0xE5F5, 0xC645, 0xC646, 0xC647, /* U+8278 */ 0xC648, 0xDCB3, 0xD2D5, 0xC649, 0xC64A, 0xDCB4, 0xB0AC, 0xDCB5, /* U+8280 */ 0xC64B, 0xC64C, 0xBDDA, 0xC64D, 0xDCB9, 0xC64E, 0xC64F, 0xC650, /* U+8288 */ 0xD8C2, 0xC651, 0xDCB7, 0xD3F3, 0xC652, 0xC9D6, 0xDCBA, 0xDCB6, /* U+8290 */ 0xC653, 0xDCBB, 0xC3A2, 0xC654, 0xC655, 0xC656, 0xC657, 0xDCBC, /* U+8298 */ 0xDCC5, 0xDCBD, 0xC658, 0xC659, 0xCEDF, 0xD6A5, 0xC65A, 0xDCCF, /* U+82A0 */ 0xC65B, 0xDCCD, 0xC65C, 0xC65D, 0xDCD2, 0xBDE6, 0xC2AB, 0xC65E, /* U+82A8 */ 0xDCB8, 0xDCCB, 0xDCCE, 0xDCBE, 0xB7D2, 0xB0C5, 0xDCC7, 0xD0BE, /* U+82B0 */ 0xDCC1, 0xBBA8, 0xC65F, 0xB7BC, 0xDCCC, 0xC660, 0xC661, 0xDCC6, /* U+82B8 */ 0xDCBF, 0xC7DB, 0xC662, 0xC663, 0xC664, 0xD1BF, 0xDCC0, 0xC665, /* U+82C0 */ 0xC666, 0xDCCA, 0xC667, 0xC668, 0xDCD0, 0xC669, 0xC66A, 0xCEAD, /* U+82C8 */ 0xDCC2, 0xC66B, 0xDCC3, 0xDCC8, 0xDCC9, 0xB2D4, 0xDCD1, 0xCBD5, /* U+82D0 */ 0xC66C, 0xD4B7, 0xDCDB, 0xDCDF, 0xCCA6, 0xDCE6, 0xC66D, 0xC3E7, /* U+82D8 */ 0xDCDC, 0xC66E, 0xC66F, 0xBFC1, 0xDCD9, 0xC670, 0xB0FA, 0xB9B6, /* U+82E0 */ 0xDCE5, 0xDCD3, 0xC671, 0xDCC4, 0xDCD6, 0xC8F4, 0xBFE0, 0xC672, /* U+82E8 */ 0xC673, 0xC674, 0xC675, 0xC9BB, 0xC676, 0xC677, 0xC678, 0xB1BD, /* U+82F0 */ 0xC679, 0xD3A2, 0xC67A, 0xC67B, 0xDCDA, 0xC67C, 0xC67D, 0xDCD5, /* U+82F8 */ 0xC67E, 0xC6BB, 0xC680, 0xDCDE, 0xC681, 0xC682, 0xC683, 0xC684, /* U+8300 */ 0xC685, 0xD7C2, 0xC3AF, 0xB7B6, 0xC7D1, 0xC3A9, 0xDCE2, 0xDCD8, /* U+8308 */ 0xDCEB, 0xDCD4, 0xC686, 0xC687, 0xDCDD, 0xC688, 0xBEA5, 0xDCD7, /* U+8310 */ 0xC689, 0xDCE0, 0xC68A, 0xC68B, 0xDCE3, 0xDCE4, 0xC68C, 0xDCF8, /* U+8318 */ 0xC68D, 0xC68E, 0xDCE1, 0xDDA2, 0xDCE7, 0xC68F, 0xC690, 0xC691, /* U+8320 */ 0xC692, 0xC693, 0xC694, 0xC695, 0xC696, 0xC697, 0xC698, 0xBCEB, /* U+8328 */ 0xB4C4, 0xC699, 0xC69A, 0xC3A3, 0xB2E7, 0xDCFA, 0xC69B, 0xDCF2, /* U+8330 */ 0xC69C, 0xDCEF, 0xC69D, 0xDCFC, 0xDCEE, 0xD2F0, 0xB2E8, 0xC69E, /* U+8338 */ 0xC8D7, 0xC8E3, 0xDCFB, 0xC69F, 0xDCED, 0xC6A0, 0xC740, 0xC741, /* U+8340 */ 0xDCF7, 0xC742, 0xC743, 0xDCF5, 0xC744, 0xC745, 0xBEA3, 0xDCF4, /* U+8348 */ 0xC746, 0xB2DD, 0xC747, 0xC748, 0xC749, 0xC74A, 0xC74B, 0xDCF3, /* U+8350 */ 0xBCF6, 0xDCE8, 0xBBC4, 0xC74C, 0xC0F3, 0xC74D, 0xC74E, 0xC74F, /* U+8358 */ 0xC750, 0xC751, 0xBCD4, 0xDCE9, 0xDCEA, 0xC752, 0xDCF1, 0xDCF6, /* U+8360 */ 0xDCF9, 0xB5B4, 0xC753, 0xC8D9, 0xBBE7, 0xDCFE, 0xDCFD, 0xD3AB, /* U+8368 */ 0xDDA1, 0xDDA3, 0xDDA5, 0xD2F1, 0xDDA4, 0xDDA6, 0xDDA7, 0xD2A9, /* U+8370 */ 0xC754, 0xC755, 0xC756, 0xC757, 0xC758, 0xC759, 0xC75A, 0xBAC9, /* U+8378 */ 0xDDA9, 0xC75B, 0xC75C, 0xDDB6, 0xDDB1, 0xDDB4, 0xC75D, 0xC75E, /* U+8380 */ 0xC75F, 0xC760, 0xC761, 0xC762, 0xC763, 0xDDB0, 0xC6CE, 0xC764, /* U+8388 */ 0xC765, 0xC0F2, 0xC766, 0xC767, 0xC768, 0xC769, 0xC9AF, 0xC76A, /* U+8390 */ 0xC76B, 0xC76C, 0xDCEC, 0xDDAE, 0xC76D, 0xC76E, 0xC76F, 0xC770, /* U+8398 */ 0xDDB7, 0xC771, 0xC772, 0xDCF0, 0xDDAF, 0xC773, 0xDDB8, 0xC774, /* U+83A0 */ 0xDDAC, 0xC775, 0xC776, 0xC777, 0xC778, 0xC779, 0xC77A, 0xC77B, /* U+83A8 */ 0xDDB9, 0xDDB3, 0xDDAD, 0xC4AA, 0xC77C, 0xC77D, 0xC77E, 0xC780, /* U+83B0 */ 0xDDA8, 0xC0B3, 0xC1AB, 0xDDAA, 0xDDAB, 0xC781, 0xDDB2, 0xBBF1, /* U+83B8 */ 0xDDB5, 0xD3A8, 0xDDBA, 0xC782, 0xDDBB, 0xC3A7, 0xC783, 0xC784, /* U+83C0 */ 0xDDD2, 0xDDBC, 0xC785, 0xC786, 0xC787, 0xDDD1, 0xC788, 0xB9BD, /* U+83C8 */ 0xC789, 0xC78A, 0xBED5, 0xC78B, 0xBEFA, 0xC78C, 0xC78D, 0xBACA, /* U+83D0 */ 0xC78E, 0xC78F, 0xC790, 0xC791, 0xDDCA, 0xC792, 0xDDC5, 0xC793, /* U+83D8 */ 0xDDBF, 0xC794, 0xC795, 0xC796, 0xB2CB, 0xDDC3, 0xC797, 0xDDCB, /* U+83E0 */ 0xB2A4, 0xDDD5, 0xC798, 0xC799, 0xC79A, 0xDDBE, 0xC79B, 0xC79C, /* U+83E8 */ 0xC79D, 0xC6D0, 0xDDD0, 0xC79E, 0xC79F, 0xC7A0, 0xC840, 0xC841, /* U+83F0 */ 0xDDD4, 0xC1E2, 0xB7C6, 0xC842, 0xC843, 0xC844, 0xC845, 0xC846, /* U+83F8 */ 0xDDCE, 0xDDCF, 0xC847, 0xC848, 0xC849, 0xDDC4, 0xC84A, 0xC84B, /* U+8400 */ 0xC84C, 0xDDBD, 0xC84D, 0xDDCD, 0xCCD1, 0xC84E, 0xDDC9, 0xC84F, /* U+8408 */ 0xC850, 0xC851, 0xC852, 0xDDC2, 0xC3C8, 0xC6BC, 0xCEAE, 0xDDCC, /* U+8410 */ 0xC853, 0xDDC8, 0xC854, 0xC855, 0xC856, 0xC857, 0xC858, 0xC859, /* U+8418 */ 0xDDC1, 0xC85A, 0xC85B, 0xC85C, 0xDDC6, 0xC2DC, 0xC85D, 0xC85E, /* U+8420 */ 0xC85F, 0xC860, 0xC861, 0xC862, 0xD3A9, 0xD3AA, 0xDDD3, 0xCFF4, /* U+8428 */ 0xC8F8, 0xC863, 0xC864, 0xC865, 0xC866, 0xC867, 0xC868, 0xC869, /* U+8430 */ 0xC86A, 0xDDE6, 0xC86B, 0xC86C, 0xC86D, 0xC86E, 0xC86F, 0xC870, /* U+8438 */ 0xDDC7, 0xC871, 0xC872, 0xC873, 0xDDE0, 0xC2E4, 0xC874, 0xC875, /* U+8440 */ 0xC876, 0xC877, 0xC878, 0xC879, 0xC87A, 0xC87B, 0xDDE1, 0xC87C, /* U+8448 */ 0xC87D, 0xC87E, 0xC880, 0xC881, 0xC882, 0xC883, 0xC884, 0xC885, /* U+8450 */ 0xC886, 0xDDD7, 0xC887, 0xC888, 0xC889, 0xC88A, 0xC88B, 0xD6F8, /* U+8458 */ 0xC88C, 0xDDD9, 0xDDD8, 0xB8F0, 0xDDD6, 0xC88D, 0xC88E, 0xC88F, /* U+8460 */ 0xC890, 0xC6CF, 0xC891, 0xB6AD, 0xC892, 0xC893, 0xC894, 0xC895, /* U+8468 */ 0xC896, 0xDDE2, 0xC897, 0xBAF9, 0xD4E1, 0xDDE7, 0xC898, 0xC899, /* U+8470 */ 0xC89A, 0xB4D0, 0xC89B, 0xDDDA, 0xC89C, 0xBFFB, 0xDDE3, 0xC89D, /* U+8478 */ 0xDDDF, 0xC89E, 0xDDDD, 0xC89F, 0xC8A0, 0xC940, 0xC941, 0xC942, /* U+8480 */ 0xC943, 0xC944, 0xB5D9, 0xC945, 0xC946, 0xC947, 0xC948, 0xDDDB, /* U+8488 */ 0xDDDC, 0xDDDE, 0xC949, 0xBDAF, 0xDDE4, 0xC94A, 0xDDE5, 0xC94B, /* U+8490 */ 0xC94C, 0xC94D, 0xC94E, 0xC94F, 0xC950, 0xC951, 0xC952, 0xDDF5, /* U+8498 */ 0xC953, 0xC3C9, 0xC954, 0xC955, 0xCBE2, 0xC956, 0xC957, 0xC958, /* U+84A0 */ 0xC959, 0xDDF2, 0xC95A, 0xC95B, 0xC95C, 0xC95D, 0xC95E, 0xC95F, /* U+84A8 */ 0xC960, 0xC961, 0xC962, 0xC963, 0xC964, 0xC965, 0xC966, 0xD8E1, /* U+84B0 */ 0xC967, 0xC968, 0xC6D1, 0xC969, 0xDDF4, 0xC96A, 0xC96B, 0xC96C, /* U+84B8 */ 0xD5F4, 0xDDF3, 0xDDF0, 0xC96D, 0xC96E, 0xDDEC, 0xC96F, 0xDDEF, /* U+84C0 */ 0xC970, 0xDDE8, 0xC971, 0xC972, 0xD0EE, 0xC973, 0xC974, 0xC975, /* U+84C8 */ 0xC976, 0xC8D8, 0xDDEE, 0xC977, 0xC978, 0xDDE9, 0xC979, 0xC97A, /* U+84D0 */ 0xDDEA, 0xCBF2, 0xC97B, 0xDDED, 0xC97C, 0xC97D, 0xB1CD, 0xC97E, /* U+84D8 */ 0xC980, 0xC981, 0xC982, 0xC983, 0xC984, 0xC0B6, 0xC985, 0xBCBB, /* U+84E0 */ 0xDDF1, 0xC986, 0xC987, 0xDDF7, 0xC988, 0xDDF6, 0xDDEB, 0xC989, /* U+84E8 */ 0xC98A, 0xC98B, 0xC98C, 0xC98D, 0xC5EE, 0xC98E, 0xC98F, 0xC990, /* U+84F0 */ 0xDDFB, 0xC991, 0xC992, 0xC993, 0xC994, 0xC995, 0xC996, 0xC997, /* U+84F8 */ 0xC998, 0xC999, 0xC99A, 0xC99B, 0xDEA4, 0xC99C, 0xC99D, 0xDEA3, /* U+8500 */ 0xC99E, 0xC99F, 0xC9A0, 0xCA40, 0xCA41, 0xCA42, 0xCA43, 0xCA44, /* U+8508 */ 0xCA45, 0xCA46, 0xCA47, 0xCA48, 0xDDF8, 0xCA49, 0xCA4A, 0xCA4B, /* U+8510 */ 0xCA4C, 0xC3EF, 0xCA4D, 0xC2FB, 0xCA4E, 0xCA4F, 0xCA50, 0xD5E1, /* U+8518 */ 0xCA51, 0xCA52, 0xCEB5, 0xCA53, 0xCA54, 0xCA55, 0xCA56, 0xDDFD, /* U+8520 */ 0xCA57, 0xB2CC, 0xCA58, 0xCA59, 0xCA5A, 0xCA5B, 0xCA5C, 0xCA5D, /* U+8528 */ 0xCA5E, 0xCA5F, 0xCA60, 0xC4E8, 0xCADF, 0xCA61, 0xCA62, 0xCA63, /* U+8530 */ 0xCA64, 0xCA65, 0xCA66, 0xCA67, 0xCA68, 0xCA69, 0xCA6A, 0xC7BE, /* U+8538 */ 0xDDFA, 0xDDFC, 0xDDFE, 0xDEA2, 0xB0AA, 0xB1CE, 0xCA6B, 0xCA6C, /* U+8540 */ 0xCA6D, 0xCA6E, 0xCA6F, 0xDEAC, 0xCA70, 0xCA71, 0xCA72, 0xCA73, /* U+8548 */ 0xDEA6, 0xBDB6, 0xC8EF, 0xCA74, 0xCA75, 0xCA76, 0xCA77, 0xCA78, /* U+8550 */ 0xCA79, 0xCA7A, 0xCA7B, 0xCA7C, 0xCA7D, 0xCA7E, 0xDEA1, 0xCA80, /* U+8558 */ 0xCA81, 0xDEA5, 0xCA82, 0xCA83, 0xCA84, 0xCA85, 0xDEA9, 0xCA86, /* U+8560 */ 0xCA87, 0xCA88, 0xCA89, 0xCA8A, 0xDEA8, 0xCA8B, 0xCA8C, 0xCA8D, /* U+8568 */ 0xDEA7, 0xCA8E, 0xCA8F, 0xCA90, 0xCA91, 0xCA92, 0xCA93, 0xCA94, /* U+8570 */ 0xCA95, 0xCA96, 0xDEAD, 0xCA97, 0xD4CC, 0xCA98, 0xCA99, 0xCA9A, /* U+8578 */ 0xCA9B, 0xDEB3, 0xDEAA, 0xDEAE, 0xCA9C, 0xCA9D, 0xC0D9, 0xCA9E, /* U+8580 */ 0xCA9F, 0xCAA0, 0xCB40, 0xCB41, 0xB1A1, 0xDEB6, 0xCB42, 0xDEB1, /* U+8588 */ 0xCB43, 0xCB44, 0xCB45, 0xCB46, 0xCB47, 0xCB48, 0xCB49, 0xDEB2, /* U+8590 */ 0xCB4A, 0xCB4B, 0xCB4C, 0xCB4D, 0xCB4E, 0xCB4F, 0xCB50, 0xCB51, /* U+8598 */ 0xCB52, 0xCB53, 0xCB54, 0xD1A6, 0xDEB5, 0xCB55, 0xCB56, 0xCB57, /* U+85A0 */ 0xCB58, 0xCB59, 0xCB5A, 0xCB5B, 0xDEAF, 0xCB5C, 0xCB5D, 0xCB5E, /* U+85A8 */ 0xDEB0, 0xCB5F, 0xD0BD, 0xCB60, 0xCB61, 0xCB62, 0xDEB4, 0xCAED, /* U+85B0 */ 0xDEB9, 0xCB63, 0xCB64, 0xCB65, 0xCB66, 0xCB67, 0xCB68, 0xDEB8, /* U+85B8 */ 0xCB69, 0xDEB7, 0xCB6A, 0xCB6B, 0xCB6C, 0xCB6D, 0xCB6E, 0xCB6F, /* U+85C0 */ 0xCB70, 0xDEBB, 0xCB71, 0xCB72, 0xCB73, 0xCB74, 0xCB75, 0xCB76, /* U+85C8 */ 0xCB77, 0xBDE5, 0xCB78, 0xCB79, 0xCB7A, 0xCB7B, 0xCB7C, 0xB2D8, /* U+85D0 */ 0xC3EA, 0xCB7D, 0xCB7E, 0xDEBA, 0xCB80, 0xC5BA, 0xCB81, 0xCB82, /* U+85D8 */ 0xCB83, 0xCB84, 0xCB85, 0xCB86, 0xDEBC, 0xCB87, 0xCB88, 0xCB89, /* U+85E0 */ 0xCB8A, 0xCB8B, 0xCB8C, 0xCB8D, 0xCCD9, 0xCB8E, 0xCB8F, 0xCB90, /* U+85E8 */ 0xCB91, 0xB7AA, 0xCB92, 0xCB93, 0xCB94, 0xCB95, 0xCB96, 0xCB97, /* U+85F0 */ 0xCB98, 0xCB99, 0xCB9A, 0xCB9B, 0xCB9C, 0xCB9D, 0xCB9E, 0xCB9F, /* U+85F8 */ 0xCBA0, 0xCC40, 0xCC41, 0xD4E5, 0xCC42, 0xCC43, 0xCC44, 0xDEBD, /* U+8600 */ 0xCC45, 0xCC46, 0xCC47, 0xCC48, 0xCC49, 0xDEBF, 0xCC4A, 0xCC4B, /* U+8608 */ 0xCC4C, 0xCC4D, 0xCC4E, 0xCC4F, 0xCC50, 0xCC51, 0xCC52, 0xCC53, /* U+8610 */ 0xCC54, 0xC4A2, 0xCC55, 0xCC56, 0xCC57, 0xCC58, 0xDEC1, 0xCC59, /* U+8618 */ 0xCC5A, 0xCC5B, 0xCC5C, 0xCC5D, 0xCC5E, 0xCC5F, 0xCC60, 0xCC61, /* U+8620 */ 0xCC62, 0xCC63, 0xCC64, 0xCC65, 0xCC66, 0xCC67, 0xCC68, 0xDEBE, /* U+8628 */ 0xCC69, 0xDEC0, 0xCC6A, 0xCC6B, 0xCC6C, 0xCC6D, 0xCC6E, 0xCC6F, /* U+8630 */ 0xCC70, 0xCC71, 0xCC72, 0xCC73, 0xCC74, 0xCC75, 0xCC76, 0xCC77, /* U+8638 */ 0xD5BA, 0xCC78, 0xCC79, 0xCC7A, 0xDEC2, 0xCC7B, 0xCC7C, 0xCC7D, /* U+8640 */ 0xCC7E, 0xCC80, 0xCC81, 0xCC82, 0xCC83, 0xCC84, 0xCC85, 0xCC86, /* U+8648 */ 0xCC87, 0xCC88, 0xCC89, 0xCC8A, 0xCC8B, 0xF2AE, 0xBBA2, 0xC2B2, /* U+8650 */ 0xC5B0, 0xC2C7, 0xCC8C, 0xCC8D, 0xF2AF, 0xCC8E, 0xCC8F, 0xCC90, /* U+8658 */ 0xCC91, 0xCC92, 0xD0E9, 0xCC93, 0xCC94, 0xCC95, 0xD3DD, 0xCC96, /* U+8660 */ 0xCC97, 0xCC98, 0xEBBD, 0xCC99, 0xCC9A, 0xCC9B, 0xCC9C, 0xCC9D, /* U+8668 */ 0xCC9E, 0xCC9F, 0xCCA0, 0xB3E6, 0xF2B0, 0xCD40, 0xF2B1, 0xCD41, /* U+8670 */ 0xCD42, 0xCAAD, 0xCD43, 0xCD44, 0xCD45, 0xCD46, 0xCD47, 0xCD48, /* U+8678 */ 0xCD49, 0xBAE7, 0xF2B3, 0xF2B5, 0xF2B4, 0xCBE4, 0xCFBA, 0xF2B2, /* U+8680 */ 0xCAB4, 0xD2CF, 0xC2EC, 0xCD4A, 0xCD4B, 0xCD4C, 0xCD4D, 0xCD4E, /* U+8688 */ 0xCD4F, 0xCD50, 0xCEC3, 0xF2B8, 0xB0F6, 0xF2B7, 0xCD51, 0xCD52, /* U+8690 */ 0xCD53, 0xCD54, 0xCD55, 0xF2BE, 0xCD56, 0xB2CF, 0xCD57, 0xCD58, /* U+8698 */ 0xCD59, 0xCD5A, 0xCD5B, 0xCD5C, 0xD1C1, 0xF2BA, 0xCD5D, 0xCD5E, /* U+86A0 */ 0xCD5F, 0xCD60, 0xCD61, 0xF2BC, 0xD4E9, 0xCD62, 0xCD63, 0xF2BB, /* U+86A8 */ 0xF2B6, 0xF2BF, 0xF2BD, 0xCD64, 0xF2B9, 0xCD65, 0xCD66, 0xF2C7, /* U+86B0 */ 0xF2C4, 0xF2C6, 0xCD67, 0xCD68, 0xF2CA, 0xF2C2, 0xF2C0, 0xCD69, /* U+86B8 */ 0xCD6A, 0xCD6B, 0xF2C5, 0xCD6C, 0xCD6D, 0xCD6E, 0xCD6F, 0xCD70, /* U+86C0 */ 0xD6FB, 0xCD71, 0xCD72, 0xCD73, 0xF2C1, 0xCD74, 0xC7F9, 0xC9DF, /* U+86C8 */ 0xCD75, 0xF2C8, 0xB9C6, 0xB5B0, 0xCD76, 0xCD77, 0xF2C3, 0xF2C9, /* U+86D0 */ 0xF2D0, 0xF2D6, 0xCD78, 0xCD79, 0xBBD7, 0xCD7A, 0xCD7B, 0xCD7C, /* U+86D8 */ 0xF2D5, 0xCDDC, 0xCD7D, 0xD6EB, 0xCD7E, 0xCD80, 0xF2D2, 0xF2D4, /* U+86E0 */ 0xCD81, 0xCD82, 0xCD83, 0xCD84, 0xB8F2, 0xCD85, 0xCD86, 0xCD87, /* U+86E8 */ 0xCD88, 0xF2CB, 0xCD89, 0xCD8A, 0xCD8B, 0xF2CE, 0xC2F9, 0xCD8C, /* U+86F0 */ 0xD5DD, 0xF2CC, 0xF2CD, 0xF2CF, 0xF2D3, 0xCD8D, 0xCD8E, 0xCD8F, /* U+86F8 */ 0xF2D9, 0xD3BC, 0xCD90, 0xCD91, 0xCD92, 0xCD93, 0xB6EA, 0xCD94, /* U+8700 */ 0xCAF1, 0xCD95, 0xB7E4, 0xF2D7, 0xCD96, 0xCD97, 0xCD98, 0xF2D8, /* U+8708 */ 0xF2DA, 0xF2DD, 0xF2DB, 0xCD99, 0xCD9A, 0xF2DC, 0xCD9B, 0xCD9C, /* U+8710 */ 0xCD9D, 0xCD9E, 0xD1D1, 0xF2D1, 0xCD9F, 0xCDC9, 0xCDA0, 0xCECF, /* U+8718 */ 0xD6A9, 0xCE40, 0xF2E3, 0xCE41, 0xC3DB, 0xCE42, 0xF2E0, 0xCE43, /* U+8720 */ 0xCE44, 0xC0AF, 0xF2EC, 0xF2DE, 0xCE45, 0xF2E1, 0xCE46, 0xCE47, /* U+8728 */ 0xCE48, 0xF2E8, 0xCE49, 0xCE4A, 0xCE4B, 0xCE4C, 0xF2E2, 0xCE4D, /* U+8730 */ 0xCE4E, 0xF2E7, 0xCE4F, 0xCE50, 0xF2E6, 0xCE51, 0xCE52, 0xF2E9, /* U+8738 */ 0xCE53, 0xCE54, 0xCE55, 0xF2DF, 0xCE56, 0xCE57, 0xF2E4, 0xF2EA, /* U+8740 */ 0xCE58, 0xCE59, 0xCE5A, 0xCE5B, 0xCE5C, 0xCE5D, 0xCE5E, 0xD3AC, /* U+8748 */ 0xF2E5, 0xB2F5, 0xCE5F, 0xCE60, 0xF2F2, 0xCE61, 0xD0AB, 0xCE62, /* U+8750 */ 0xCE63, 0xCE64, 0xCE65, 0xF2F5, 0xCE66, 0xCE67, 0xCE68, 0xBBC8, /* U+8758 */ 0xCE69, 0xF2F9, 0xCE6A, 0xCE6B, 0xCE6C, 0xCE6D, 0xCE6E, 0xCE6F, /* U+8760 */ 0xF2F0, 0xCE70, 0xCE71, 0xF2F6, 0xF2F8, 0xF2FA, 0xCE72, 0xCE73, /* U+8768 */ 0xCE74, 0xCE75, 0xCE76, 0xCE77, 0xCE78, 0xCE79, 0xF2F3, 0xCE7A, /* U+8770 */ 0xF2F1, 0xCE7B, 0xCE7C, 0xCE7D, 0xBAFB, 0xCE7E, 0xB5FB, 0xCE80, /* U+8778 */ 0xCE81, 0xCE82, 0xCE83, 0xF2EF, 0xF2F7, 0xF2ED, 0xF2EE, 0xCE84, /* U+8780 */ 0xCE85, 0xCE86, 0xF2EB, 0xF3A6, 0xCE87, 0xF3A3, 0xCE88, 0xCE89, /* U+8788 */ 0xF3A2, 0xCE8A, 0xCE8B, 0xF2F4, 0xCE8C, 0xC8DA, 0xCE8D, 0xCE8E, /* U+8790 */ 0xCE8F, 0xCE90, 0xCE91, 0xF2FB, 0xCE92, 0xCE93, 0xCE94, 0xF3A5, /* U+8798 */ 0xCE95, 0xCE96, 0xCE97, 0xCE98, 0xCE99, 0xCE9A, 0xCE9B, 0xC3F8, /* U+87A0 */ 0xCE9C, 0xCE9D, 0xCE9E, 0xCE9F, 0xCEA0, 0xCF40, 0xCF41, 0xCF42, /* U+87A8 */ 0xF2FD, 0xCF43, 0xCF44, 0xF3A7, 0xF3A9, 0xF3A4, 0xCF45, 0xF2FC, /* U+87B0 */ 0xCF46, 0xCF47, 0xCF48, 0xF3AB, 0xCF49, 0xF3AA, 0xCF4A, 0xCF4B, /* U+87B8 */ 0xCF4C, 0xCF4D, 0xC2DD, 0xCF4E, 0xCF4F, 0xF3AE, 0xCF50, 0xCF51, /* U+87C0 */ 0xF3B0, 0xCF52, 0xCF53, 0xCF54, 0xCF55, 0xCF56, 0xF3A1, 0xCF57, /* U+87C8 */ 0xCF58, 0xCF59, 0xF3B1, 0xF3AC, 0xCF5A, 0xCF5B, 0xCF5C, 0xCF5D, /* U+87D0 */ 0xCF5E, 0xF3AF, 0xF2FE, 0xF3AD, 0xCF5F, 0xCF60, 0xCF61, 0xCF62, /* U+87D8 */ 0xCF63, 0xCF64, 0xCF65, 0xF3B2, 0xCF66, 0xCF67, 0xCF68, 0xCF69, /* U+87E0 */ 0xF3B4, 0xCF6A, 0xCF6B, 0xCF6C, 0xCF6D, 0xF3A8, 0xCF6E, 0xCF6F, /* U+87E8 */ 0xCF70, 0xCF71, 0xF3B3, 0xCF72, 0xCF73, 0xCF74, 0xF3B5, 0xCF75, /* U+87F0 */ 0xCF76, 0xCF77, 0xCF78, 0xCF79, 0xCF7A, 0xCF7B, 0xCF7C, 0xCF7D, /* U+87F8 */ 0xCF7E, 0xD0B7, 0xCF80, 0xCF81, 0xCF82, 0xCF83, 0xF3B8, 0xCF84, /* U+8800 */ 0xCF85, 0xCF86, 0xCF87, 0xD9F9, 0xCF88, 0xCF89, 0xCF8A, 0xCF8B, /* U+8808 */ 0xCF8C, 0xCF8D, 0xF3B9, 0xCF8E, 0xCF8F, 0xCF90, 0xCF91, 0xCF92, /* U+8810 */ 0xCF93, 0xCF94, 0xCF95, 0xF3B7, 0xCF96, 0xC8E4, 0xF3B6, 0xCF97, /* U+8818 */ 0xCF98, 0xCF99, 0xCF9A, 0xF3BA, 0xCF9B, 0xCF9C, 0xCF9D, 0xCF9E, /* U+8820 */ 0xCF9F, 0xF3BB, 0xB4C0, 0xCFA0, 0xD040, 0xD041, 0xD042, 0xD043, /* U+8828 */ 0xD044, 0xD045, 0xD046, 0xD047, 0xD048, 0xD049, 0xD04A, 0xD04B, /* U+8830 */ 0xD04C, 0xD04D, 0xEEC3, 0xD04E, 0xD04F, 0xD050, 0xD051, 0xD052, /* U+8838 */ 0xD053, 0xF3BC, 0xD054, 0xD055, 0xF3BD, 0xD056, 0xD057, 0xD058, /* U+8840 */ 0xD1AA, 0xD059, 0xD05A, 0xD05B, 0xF4AC, 0xD0C6, 0xD05C, 0xD05D, /* U+8848 */ 0xD05E, 0xD05F, 0xD060, 0xD061, 0xD0D0, 0xD1DC, 0xD062, 0xD063, /* U+8850 */ 0xD064, 0xD065, 0xD066, 0xD067, 0xCFCE, 0xD068, 0xD069, 0xBDD6, /* U+8858 */ 0xD06A, 0xD1C3, 0xD06B, 0xD06C, 0xD06D, 0xD06E, 0xD06F, 0xD070, /* U+8860 */ 0xD071, 0xBAE2, 0xE1E9, 0xD2C2, 0xF1C2, 0xB2B9, 0xD072, 0xD073, /* U+8868 */ 0xB1ED, 0xF1C3, 0xD074, 0xC9C0, 0xB3C4, 0xD075, 0xD9F2, 0xD076, /* U+8870 */ 0xCBA5, 0xD077, 0xF1C4, 0xD078, 0xD079, 0xD07A, 0xD07B, 0xD6D4, /* U+8878 */ 0xD07C, 0xD07D, 0xD07E, 0xD080, 0xD081, 0xF1C5, 0xF4C0, 0xF1C6, /* U+8880 */ 0xD082, 0xD4AC, 0xF1C7, 0xD083, 0xB0C0, 0xF4C1, 0xD084, 0xD085, /* U+8888 */ 0xF4C2, 0xD086, 0xD087, 0xB4FC, 0xD088, 0xC5DB, 0xD089, 0xD08A, /* U+8890 */ 0xD08B, 0xD08C, 0xCCBB, 0xD08D, 0xD08E, 0xD08F, 0xD0E4, 0xD090, /* U+8898 */ 0xD091, 0xD092, 0xD093, 0xD094, 0xCDE0, 0xD095, 0xD096, 0xD097, /* U+88A0 */ 0xD098, 0xD099, 0xF1C8, 0xD09A, 0xD9F3, 0xD09B, 0xD09C, 0xD09D, /* U+88A8 */ 0xD09E, 0xD09F, 0xD0A0, 0xB1BB, 0xD140, 0xCFAE, 0xD141, 0xD142, /* U+88B0 */ 0xD143, 0xB8A4, 0xD144, 0xD145, 0xD146, 0xD147, 0xD148, 0xF1CA, /* U+88B8 */ 0xD149, 0xD14A, 0xD14B, 0xD14C, 0xF1CB, 0xD14D, 0xD14E, 0xD14F, /* U+88C0 */ 0xD150, 0xB2C3, 0xC1D1, 0xD151, 0xD152, 0xD7B0, 0xF1C9, 0xD153, /* U+88C8 */ 0xD154, 0xF1CC, 0xD155, 0xD156, 0xD157, 0xD158, 0xF1CE, 0xD159, /* U+88D0 */ 0xD15A, 0xD15B, 0xD9F6, 0xD15C, 0xD2E1, 0xD4A3, 0xD15D, 0xD15E, /* U+88D8 */ 0xF4C3, 0xC8B9, 0xD15F, 0xD160, 0xD161, 0xD162, 0xD163, 0xF4C4, /* U+88E0 */ 0xD164, 0xD165, 0xF1CD, 0xF1CF, 0xBFE3, 0xF1D0, 0xD166, 0xD167, /* U+88E8 */ 0xF1D4, 0xD168, 0xD169, 0xD16A, 0xD16B, 0xD16C, 0xD16D, 0xD16E, /* U+88F0 */ 0xF1D6, 0xF1D1, 0xD16F, 0xC9D1, 0xC5E1, 0xD170, 0xD171, 0xD172, /* U+88F8 */ 0xC2E3, 0xB9FC, 0xD173, 0xD174, 0xF1D3, 0xD175, 0xF1D5, 0xD176, /* U+8900 */ 0xD177, 0xD178, 0xB9D3, 0xD179, 0xD17A, 0xD17B, 0xD17C, 0xD17D, /* U+8908 */ 0xD17E, 0xD180, 0xF1DB, 0xD181, 0xD182, 0xD183, 0xD184, 0xD185, /* U+8910 */ 0xBAD6, 0xD186, 0xB0FD, 0xF1D9, 0xD187, 0xD188, 0xD189, 0xD18A, /* U+8918 */ 0xD18B, 0xF1D8, 0xF1D2, 0xF1DA, 0xD18C, 0xD18D, 0xD18E, 0xD18F, /* U+8920 */ 0xD190, 0xF1D7, 0xD191, 0xD192, 0xD193, 0xC8EC, 0xD194, 0xD195, /* U+8928 */ 0xD196, 0xD197, 0xCDCA, 0xF1DD, 0xD198, 0xD199, 0xD19A, 0xD19B, /* U+8930 */ 0xE5BD, 0xD19C, 0xD19D, 0xD19E, 0xF1DC, 0xD19F, 0xF1DE, 0xD1A0, /* U+8938 */ 0xD240, 0xD241, 0xD242, 0xD243, 0xD244, 0xD245, 0xD246, 0xD247, /* U+8940 */ 0xD248, 0xF1DF, 0xD249, 0xD24A, 0xCFE5, 0xD24B, 0xD24C, 0xD24D, /* U+8948 */ 0xD24E, 0xD24F, 0xD250, 0xD251, 0xD252, 0xD253, 0xD254, 0xD255, /* U+8950 */ 0xD256, 0xD257, 0xD258, 0xD259, 0xD25A, 0xD25B, 0xD25C, 0xD25D, /* U+8958 */ 0xD25E, 0xD25F, 0xD260, 0xD261, 0xD262, 0xD263, 0xF4C5, 0xBDF3, /* U+8960 */ 0xD264, 0xD265, 0xD266, 0xD267, 0xD268, 0xD269, 0xF1E0, 0xD26A, /* U+8968 */ 0xD26B, 0xD26C, 0xD26D, 0xD26E, 0xD26F, 0xD270, 0xD271, 0xD272, /* U+8970 */ 0xD273, 0xD274, 0xD275, 0xD276, 0xD277, 0xD278, 0xD279, 0xD27A, /* U+8978 */ 0xD27B, 0xD27C, 0xD27D, 0xF1E1, 0xD27E, 0xD280, 0xD281, 0xCEF7, /* U+8980 */ 0xD282, 0xD2AA, 0xD283, 0xF1FB, 0xD284, 0xD285, 0xB8B2, 0xD286, /* U+8988 */ 0xD287, 0xD288, 0xD289, 0xD28A, 0xD28B, 0xD28C, 0xD28D, 0xD28E, /* U+8990 */ 0xD28F, 0xD290, 0xD291, 0xD292, 0xD293, 0xD294, 0xD295, 0xD296, /* U+8998 */ 0xD297, 0xD298, 0xD299, 0xD29A, 0xD29B, 0xD29C, 0xD29D, 0xD29E, /* U+89A0 */ 0xD29F, 0xD2A0, 0xD340, 0xD341, 0xD342, 0xD343, 0xD344, 0xD345, /* U+89A8 */ 0xD346, 0xD347, 0xD348, 0xD349, 0xD34A, 0xD34B, 0xD34C, 0xD34D, /* U+89B0 */ 0xD34E, 0xD34F, 0xD350, 0xD351, 0xD352, 0xD353, 0xD354, 0xD355, /* U+89B8 */ 0xD356, 0xD357, 0xD358, 0xD359, 0xD35A, 0xD35B, 0xD35C, 0xD35D, /* U+89C0 */ 0xD35E, 0xBCFB, 0xB9DB, 0xD35F, 0xB9E6, 0xC3D9, 0xCAD3, 0xEAE8, /* U+89C8 */ 0xC0C0, 0xBEF5, 0xEAE9, 0xEAEA, 0xEAEB, 0xD360, 0xEAEC, 0xEAED, /* U+89D0 */ 0xEAEE, 0xEAEF, 0xBDC7, 0xD361, 0xD362, 0xD363, 0xF5FB, 0xD364, /* U+89D8 */ 0xD365, 0xD366, 0xF5FD, 0xD367, 0xF5FE, 0xD368, 0xF5FC, 0xD369, /* U+89E0 */ 0xD36A, 0xD36B, 0xD36C, 0xBDE2, 0xD36D, 0xF6A1, 0xB4A5, 0xD36E, /* U+89E8 */ 0xD36F, 0xD370, 0xD371, 0xF6A2, 0xD372, 0xD373, 0xD374, 0xF6A3, /* U+89F0 */ 0xD375, 0xD376, 0xD377, 0xECB2, 0xD378, 0xD379, 0xD37A, 0xD37B, /* U+89F8 */ 0xD37C, 0xD37D, 0xD37E, 0xD380, 0xD381, 0xD382, 0xD383, 0xD384, /* U+8A00 */ 0xD1D4, 0xD385, 0xD386, 0xD387, 0xD388, 0xD389, 0xD38A, 0xD9EA, /* U+8A08 */ 0xD38B, 0xD38C, 0xD38D, 0xD38E, 0xD38F, 0xD390, 0xD391, 0xD392, /* U+8A10 */ 0xD393, 0xD394, 0xD395, 0xD396, 0xD397, 0xD398, 0xD399, 0xD39A, /* U+8A18 */ 0xD39B, 0xD39C, 0xD39D, 0xD39E, 0xD39F, 0xD3A0, 0xD440, 0xD441, /* U+8A20 */ 0xD442, 0xD443, 0xD444, 0xD445, 0xD446, 0xD447, 0xD448, 0xD449, /* U+8A28 */ 0xD44A, 0xD44B, 0xD44C, 0xD44D, 0xD44E, 0xD44F, 0xD450, 0xD451, /* U+8A30 */ 0xD452, 0xD453, 0xD454, 0xD455, 0xD456, 0xD457, 0xD458, 0xD459, /* U+8A38 */ 0xD45A, 0xD45B, 0xD45C, 0xD45D, 0xD45E, 0xD45F, 0xF6A4, 0xD460, /* U+8A40 */ 0xD461, 0xD462, 0xD463, 0xD464, 0xD465, 0xD466, 0xD467, 0xD468, /* U+8A48 */ 0xEEBA, 0xD469, 0xD46A, 0xD46B, 0xD46C, 0xD46D, 0xD46E, 0xD46F, /* U+8A50 */ 0xD470, 0xD471, 0xD472, 0xD473, 0xD474, 0xD475, 0xD476, 0xD477, /* U+8A58 */ 0xD478, 0xD479, 0xD47A, 0xD47B, 0xD47C, 0xD47D, 0xD47E, 0xD480, /* U+8A60 */ 0xD481, 0xD482, 0xD483, 0xD484, 0xD485, 0xD486, 0xD487, 0xD488, /* U+8A68 */ 0xD489, 0xD48A, 0xD48B, 0xD48C, 0xD48D, 0xD48E, 0xD48F, 0xD490, /* U+8A70 */ 0xD491, 0xD492, 0xD493, 0xD494, 0xD495, 0xD496, 0xD497, 0xD498, /* U+8A78 */ 0xD499, 0xD5B2, 0xD49A, 0xD49B, 0xD49C, 0xD49D, 0xD49E, 0xD49F, /* U+8A80 */ 0xD4A0, 0xD540, 0xD541, 0xD542, 0xD543, 0xD544, 0xD545, 0xD546, /* U+8A88 */ 0xD547, 0xD3FE, 0xCCDC, 0xD548, 0xD549, 0xD54A, 0xD54B, 0xD54C, /* U+8A90 */ 0xD54D, 0xD54E, 0xD54F, 0xCAC4, 0xD550, 0xD551, 0xD552, 0xD553, /* U+8A98 */ 0xD554, 0xD555, 0xD556, 0xD557, 0xD558, 0xD559, 0xD55A, 0xD55B, /* U+8AA0 */ 0xD55C, 0xD55D, 0xD55E, 0xD55F, 0xD560, 0xD561, 0xD562, 0xD563, /* U+8AA8 */ 0xD564, 0xD565, 0xD566, 0xD567, 0xD568, 0xD569, 0xD56A, 0xD56B, /* U+8AB0 */ 0xD56C, 0xD56D, 0xD56E, 0xD56F, 0xD570, 0xD571, 0xD572, 0xD573, /* U+8AB8 */ 0xD574, 0xD575, 0xD576, 0xD577, 0xD578, 0xD579, 0xD57A, 0xD57B, /* U+8AC0 */ 0xD57C, 0xD57D, 0xD57E, 0xD580, 0xD581, 0xD582, 0xD583, 0xD584, /* U+8AC8 */ 0xD585, 0xD586, 0xD587, 0xD588, 0xD589, 0xD58A, 0xD58B, 0xD58C, /* U+8AD0 */ 0xD58D, 0xD58E, 0xD58F, 0xD590, 0xD591, 0xD592, 0xD593, 0xD594, /* U+8AD8 */ 0xD595, 0xD596, 0xD597, 0xD598, 0xD599, 0xD59A, 0xD59B, 0xD59C, /* U+8AE0 */ 0xD59D, 0xD59E, 0xD59F, 0xD5A0, 0xD640, 0xD641, 0xD642, 0xD643, /* U+8AE8 */ 0xD644, 0xD645, 0xD646, 0xD647, 0xD648, 0xD649, 0xD64A, 0xD64B, /* U+8AF0 */ 0xD64C, 0xD64D, 0xD64E, 0xD64F, 0xD650, 0xD651, 0xD652, 0xD653, /* U+8AF8 */ 0xD654, 0xD655, 0xD656, 0xD657, 0xD658, 0xD659, 0xD65A, 0xD65B, /* U+8B00 */ 0xD65C, 0xD65D, 0xD65E, 0xD65F, 0xD660, 0xD661, 0xD662, 0xE5C0, /* U+8B08 */ 0xD663, 0xD664, 0xD665, 0xD666, 0xD667, 0xD668, 0xD669, 0xD66A, /* U+8B10 */ 0xD66B, 0xD66C, 0xD66D, 0xD66E, 0xD66F, 0xD670, 0xD671, 0xD672, /* U+8B18 */ 0xD673, 0xD674, 0xD675, 0xD676, 0xD677, 0xD678, 0xD679, 0xD67A, /* U+8B20 */ 0xD67B, 0xD67C, 0xD67D, 0xD67E, 0xD680, 0xD681, 0xF6A5, 0xD682, /* U+8B28 */ 0xD683, 0xD684, 0xD685, 0xD686, 0xD687, 0xD688, 0xD689, 0xD68A, /* U+8B30 */ 0xD68B, 0xD68C, 0xD68D, 0xD68E, 0xD68F, 0xD690, 0xD691, 0xD692, /* U+8B38 */ 0xD693, 0xD694, 0xD695, 0xD696, 0xD697, 0xD698, 0xD699, 0xD69A, /* U+8B40 */ 0xD69B, 0xD69C, 0xD69D, 0xD69E, 0xD69F, 0xD6A0, 0xD740, 0xD741, /* U+8B48 */ 0xD742, 0xD743, 0xD744, 0xD745, 0xD746, 0xD747, 0xD748, 0xD749, /* U+8B50 */ 0xD74A, 0xD74B, 0xD74C, 0xD74D, 0xD74E, 0xD74F, 0xD750, 0xD751, /* U+8B58 */ 0xD752, 0xD753, 0xD754, 0xD755, 0xD756, 0xD757, 0xD758, 0xD759, /* U+8B60 */ 0xD75A, 0xD75B, 0xD75C, 0xD75D, 0xD75E, 0xD75F, 0xBEAF, 0xD760, /* U+8B68 */ 0xD761, 0xD762, 0xD763, 0xD764, 0xC6A9, 0xD765, 0xD766, 0xD767, /* U+8B70 */ 0xD768, 0xD769, 0xD76A, 0xD76B, 0xD76C, 0xD76D, 0xD76E, 0xD76F, /* U+8B78 */ 0xD770, 0xD771, 0xD772, 0xD773, 0xD774, 0xD775, 0xD776, 0xD777, /* U+8B80 */ 0xD778, 0xD779, 0xD77A, 0xD77B, 0xD77C, 0xD77D, 0xD77E, 0xD780, /* U+8B88 */ 0xD781, 0xD782, 0xD783, 0xD784, 0xD785, 0xD786, 0xD787, 0xD788, /* U+8B90 */ 0xD789, 0xD78A, 0xD78B, 0xD78C, 0xD78D, 0xD78E, 0xD78F, 0xD790, /* U+8B98 */ 0xD791, 0xD792, 0xD793, 0xD794, 0xD795, 0xD796, 0xD797, 0xD798, /* U+8BA0 */ 0xDAA5, 0xBCC6, 0xB6A9, 0xB8BC, 0xC8CF, 0xBCA5, 0xDAA6, 0xDAA7, /* U+8BA8 */ 0xCCD6, 0xC8C3, 0xDAA8, 0xC6FD, 0xD799, 0xD1B5, 0xD2E9, 0xD1B6, /* U+8BB0 */ 0xBCC7, 0xD79A, 0xBDB2, 0xBBE4, 0xDAA9, 0xDAAA, 0xD1C8, 0xDAAB, /* U+8BB8 */ 0xD0ED, 0xB6EF, 0xC2DB, 0xD79B, 0xCBCF, 0xB7ED, 0xC9E8, 0xB7C3, /* U+8BC0 */ 0xBEF7, 0xD6A4, 0xDAAC, 0xDAAD, 0xC6C0, 0xD7E7, 0xCAB6, 0xD79C, /* U+8BC8 */ 0xD5A9, 0xCBDF, 0xD5EF, 0xDAAE, 0xD6DF, 0xB4CA, 0xDAB0, 0xDAAF, /* U+8BD0 */ 0xD79D, 0xD2EB, 0xDAB1, 0xDAB2, 0xDAB3, 0xCAD4, 0xDAB4, 0xCAAB, /* U+8BD8 */ 0xDAB5, 0xDAB6, 0xB3CF, 0xD6EF, 0xDAB7, 0xBBB0, 0xB5AE, 0xDAB8, /* U+8BE0 */ 0xDAB9, 0xB9EE, 0xD1AF, 0xD2E8, 0xDABA, 0xB8C3, 0xCFEA, 0xB2EF, /* U+8BE8 */ 0xDABB, 0xDABC, 0xD79E, 0xBDEB, 0xCEDC, 0xD3EF, 0xDABD, 0xCEF3, /* U+8BF0 */ 0xDABE, 0xD3D5, 0xBBE5, 0xDABF, 0xCBB5, 0xCBD0, 0xDAC0, 0xC7EB, /* U+8BF8 */ 0xD6EE, 0xDAC1, 0xC5B5, 0xB6C1, 0xDAC2, 0xB7CC, 0xBFCE, 0xDAC3, /* U+8C00 */ 0xDAC4, 0xCBAD, 0xDAC5, 0xB5F7, 0xDAC6, 0xC1C2, 0xD7BB, 0xDAC7, /* U+8C08 */ 0xCCB8, 0xD79F, 0xD2EA, 0xC4B1, 0xDAC8, 0xB5FD, 0xBBD1, 0xDAC9, /* U+8C10 */ 0xD0B3, 0xDACA, 0xDACB, 0xCEBD, 0xDACC, 0xDACD, 0xDACE, 0xB2F7, /* U+8C18 */ 0xDAD1, 0xDACF, 0xD1E8, 0xDAD0, 0xC3D5, 0xDAD2, 0xD7A0, 0xDAD3, /* U+8C20 */ 0xDAD4, 0xDAD5, 0xD0BB, 0xD2A5, 0xB0F9, 0xDAD6, 0xC7AB, 0xDAD7, /* U+8C28 */ 0xBDF7, 0xC3A1, 0xDAD8, 0xDAD9, 0xC3FD, 0xCCB7, 0xDADA, 0xDADB, /* U+8C30 */ 0xC0BE, 0xC6D7, 0xDADC, 0xDADD, 0xC7B4, 0xDADE, 0xDADF, 0xB9C8, /* U+8C38 */ 0xD840, 0xD841, 0xD842, 0xD843, 0xD844, 0xD845, 0xD846, 0xD847, /* U+8C40 */ 0xD848, 0xBBED, 0xD849, 0xD84A, 0xD84B, 0xD84C, 0xB6B9, 0xF4F8, /* U+8C48 */ 0xD84D, 0xF4F9, 0xD84E, 0xD84F, 0xCDE3, 0xD850, 0xD851, 0xD852, /* U+8C50 */ 0xD853, 0xD854, 0xD855, 0xD856, 0xD857, 0xF5B9, 0xD858, 0xD859, /* U+8C58 */ 0xD85A, 0xD85B, 0xEBE0, 0xD85C, 0xD85D, 0xD85E, 0xD85F, 0xD860, /* U+8C60 */ 0xD861, 0xCFF3, 0xBBBF, 0xD862, 0xD863, 0xD864, 0xD865, 0xD866, /* U+8C68 */ 0xD867, 0xD868, 0xBAC0, 0xD4A5, 0xD869, 0xD86A, 0xD86B, 0xD86C, /* U+8C70 */ 0xD86D, 0xD86E, 0xD86F, 0xE1D9, 0xD870, 0xD871, 0xD872, 0xD873, /* U+8C78 */ 0xF5F4, 0xB1AA, 0xB2F2, 0xD874, 0xD875, 0xD876, 0xD877, 0xD878, /* U+8C80 */ 0xD879, 0xD87A, 0xF5F5, 0xD87B, 0xD87C, 0xF5F7, 0xD87D, 0xD87E, /* U+8C88 */ 0xD880, 0xBAD1, 0xF5F6, 0xD881, 0xC3B2, 0xD882, 0xD883, 0xD884, /* U+8C90 */ 0xD885, 0xD886, 0xD887, 0xD888, 0xF5F9, 0xD889, 0xD88A, 0xD88B, /* U+8C98 */ 0xF5F8, 0xD88C, 0xD88D, 0xD88E, 0xD88F, 0xD890, 0xD891, 0xD892, /* U+8CA0 */ 0xD893, 0xD894, 0xD895, 0xD896, 0xD897, 0xD898, 0xD899, 0xD89A, /* U+8CA8 */ 0xD89B, 0xD89C, 0xD89D, 0xD89E, 0xD89F, 0xD8A0, 0xD940, 0xD941, /* U+8CB0 */ 0xD942, 0xD943, 0xD944, 0xD945, 0xD946, 0xD947, 0xD948, 0xD949, /* U+8CB8 */ 0xD94A, 0xD94B, 0xD94C, 0xD94D, 0xD94E, 0xD94F, 0xD950, 0xD951, /* U+8CC0 */ 0xD952, 0xD953, 0xD954, 0xD955, 0xD956, 0xD957, 0xD958, 0xD959, /* U+8CC8 */ 0xD95A, 0xD95B, 0xD95C, 0xD95D, 0xD95E, 0xD95F, 0xD960, 0xD961, /* U+8CD0 */ 0xD962, 0xD963, 0xD964, 0xD965, 0xD966, 0xD967, 0xD968, 0xD969, /* U+8CD8 */ 0xD96A, 0xD96B, 0xD96C, 0xD96D, 0xD96E, 0xD96F, 0xD970, 0xD971, /* U+8CE0 */ 0xD972, 0xD973, 0xD974, 0xD975, 0xD976, 0xD977, 0xD978, 0xD979, /* U+8CE8 */ 0xD97A, 0xD97B, 0xD97C, 0xD97D, 0xD97E, 0xD980, 0xD981, 0xD982, /* U+8CF0 */ 0xD983, 0xD984, 0xD985, 0xD986, 0xD987, 0xD988, 0xD989, 0xD98A, /* U+8CF8 */ 0xD98B, 0xD98C, 0xD98D, 0xD98E, 0xD98F, 0xD990, 0xD991, 0xD992, /* U+8D00 */ 0xD993, 0xD994, 0xD995, 0xD996, 0xD997, 0xD998, 0xD999, 0xD99A, /* U+8D08 */ 0xD99B, 0xD99C, 0xD99D, 0xD99E, 0xD99F, 0xD9A0, 0xDA40, 0xDA41, /* U+8D10 */ 0xDA42, 0xDA43, 0xDA44, 0xDA45, 0xDA46, 0xDA47, 0xDA48, 0xDA49, /* U+8D18 */ 0xDA4A, 0xDA4B, 0xDA4C, 0xDA4D, 0xDA4E, 0xB1B4, 0xD5EA, 0xB8BA, /* U+8D20 */ 0xDA4F, 0xB9B1, 0xB2C6, 0xD4F0, 0xCFCD, 0xB0DC, 0xD5CB, 0xBBF5, /* U+8D28 */ 0xD6CA, 0xB7B7, 0xCCB0, 0xC6B6, 0xB1E1, 0xB9BA, 0xD6FC, 0xB9E1, /* U+8D30 */ 0xB7A1, 0xBCFA, 0xEADA, 0xEADB, 0xCCF9, 0xB9F3, 0xEADC, 0xB4FB, /* U+8D38 */ 0xC3B3, 0xB7D1, 0xBAD8, 0xEADD, 0xD4F4, 0xEADE, 0xBCD6, 0xBBDF, /* U+8D40 */ 0xEADF, 0xC1DE, 0xC2B8, 0xD4DF, 0xD7CA, 0xEAE0, 0xEAE1, 0xEAE4, /* U+8D48 */ 0xEAE2, 0xEAE3, 0xC9DE, 0xB8B3, 0xB6C4, 0xEAE5, 0xCAEA, 0xC9CD, /* U+8D50 */ 0xB4CD, 0xDA50, 0xDA51, 0xE2D9, 0xC5E2, 0xEAE6, 0xC0B5, 0xDA52, /* U+8D58 */ 0xD7B8, 0xEAE7, 0xD7AC, 0xC8FC, 0xD8D3, 0xD8CD, 0xD4DE, 0xDA53, /* U+8D60 */ 0xD4F9, 0xC9C4, 0xD3AE, 0xB8D3, 0xB3E0, 0xDA54, 0xC9E2, 0xF4F6, /* U+8D68 */ 0xDA55, 0xDA56, 0xDA57, 0xBAD5, 0xDA58, 0xF4F7, 0xDA59, 0xDA5A, /* U+8D70 */ 0xD7DF, 0xDA5B, 0xDA5C, 0xF4F1, 0xB8B0, 0xD5D4, 0xB8CF, 0xC6F0, /* U+8D78 */ 0xDA5D, 0xDA5E, 0xDA5F, 0xDA60, 0xDA61, 0xDA62, 0xDA63, 0xDA64, /* U+8D80 */ 0xDA65, 0xB3C3, 0xDA66, 0xDA67, 0xF4F2, 0xB3AC, 0xDA68, 0xDA69, /* U+8D88 */ 0xDA6A, 0xDA6B, 0xD4BD, 0xC7F7, 0xDA6C, 0xDA6D, 0xDA6E, 0xDA6F, /* U+8D90 */ 0xDA70, 0xF4F4, 0xDA71, 0xDA72, 0xF4F3, 0xDA73, 0xDA74, 0xDA75, /* U+8D98 */ 0xDA76, 0xDA77, 0xDA78, 0xDA79, 0xDA7A, 0xDA7B, 0xDA7C, 0xCCCB, /* U+8DA0 */ 0xDA7D, 0xDA7E, 0xDA80, 0xC8A4, 0xDA81, 0xDA82, 0xDA83, 0xDA84, /* U+8DA8 */ 0xDA85, 0xDA86, 0xDA87, 0xDA88, 0xDA89, 0xDA8A, 0xDA8B, 0xDA8C, /* U+8DB0 */ 0xDA8D, 0xF4F5, 0xDA8E, 0xD7E3, 0xC5BF, 0xF5C0, 0xDA8F, 0xDA90, /* U+8DB8 */ 0xF5BB, 0xDA91, 0xF5C3, 0xDA92, 0xF5C2, 0xDA93, 0xD6BA, 0xF5C1, /* U+8DC0 */ 0xDA94, 0xDA95, 0xDA96, 0xD4BE, 0xF5C4, 0xDA97, 0xF5CC, 0xDA98, /* U+8DC8 */ 0xDA99, 0xDA9A, 0xDA9B, 0xB0CF, 0xB5F8, 0xDA9C, 0xF5C9, 0xF5CA, /* U+8DD0 */ 0xDA9D, 0xC5DC, 0xDA9E, 0xDA9F, 0xDAA0, 0xDB40, 0xF5C5, 0xF5C6, /* U+8DD8 */ 0xDB41, 0xDB42, 0xF5C7, 0xF5CB, 0xDB43, 0xBEE0, 0xF5C8, 0xB8FA, /* U+8DE0 */ 0xDB44, 0xDB45, 0xDB46, 0xF5D0, 0xF5D3, 0xDB47, 0xDB48, 0xDB49, /* U+8DE8 */ 0xBFE7, 0xDB4A, 0xB9F2, 0xF5BC, 0xF5CD, 0xDB4B, 0xDB4C, 0xC2B7, /* U+8DF0 */ 0xDB4D, 0xDB4E, 0xDB4F, 0xCCF8, 0xDB50, 0xBCF9, 0xDB51, 0xF5CE, /* U+8DF8 */ 0xF5CF, 0xF5D1, 0xB6E5, 0xF5D2, 0xDB52, 0xF5D5, 0xDB53, 0xDB54, /* U+8E00 */ 0xDB55, 0xDB56, 0xDB57, 0xDB58, 0xDB59, 0xF5BD, 0xDB5A, 0xDB5B, /* U+8E08 */ 0xDB5C, 0xF5D4, 0xD3BB, 0xDB5D, 0xB3EC, 0xDB5E, 0xDB5F, 0xCCA4, /* U+8E10 */ 0xDB60, 0xDB61, 0xDB62, 0xDB63, 0xF5D6, 0xDB64, 0xDB65, 0xDB66, /* U+8E18 */ 0xDB67, 0xDB68, 0xDB69, 0xDB6A, 0xDB6B, 0xF5D7, 0xBEE1, 0xF5D8, /* U+8E20 */ 0xDB6C, 0xDB6D, 0xCCDF, 0xF5DB, 0xDB6E, 0xDB6F, 0xDB70, 0xDB71, /* U+8E28 */ 0xDB72, 0xB2C8, 0xD7D9, 0xDB73, 0xF5D9, 0xDB74, 0xF5DA, 0xF5DC, /* U+8E30 */ 0xDB75, 0xF5E2, 0xDB76, 0xDB77, 0xDB78, 0xF5E0, 0xDB79, 0xDB7A, /* U+8E38 */ 0xDB7B, 0xF5DF, 0xF5DD, 0xDB7C, 0xDB7D, 0xF5E1, 0xDB7E, 0xDB80, /* U+8E40 */ 0xF5DE, 0xF5E4, 0xF5E5, 0xDB81, 0xCCE3, 0xDB82, 0xDB83, 0xE5BF, /* U+8E48 */ 0xB5B8, 0xF5E3, 0xF5E8, 0xCCA3, 0xDB84, 0xDB85, 0xDB86, 0xDB87, /* U+8E50 */ 0xDB88, 0xF5E6, 0xF5E7, 0xDB89, 0xDB8A, 0xDB8B, 0xDB8C, 0xDB8D, /* U+8E58 */ 0xDB8E, 0xF5BE, 0xDB8F, 0xDB90, 0xDB91, 0xDB92, 0xDB93, 0xDB94, /* U+8E60 */ 0xDB95, 0xDB96, 0xDB97, 0xDB98, 0xDB99, 0xDB9A, 0xB1C4, 0xDB9B, /* U+8E68 */ 0xDB9C, 0xF5BF, 0xDB9D, 0xDB9E, 0xB5C5, 0xB2E4, 0xDB9F, 0xF5EC, /* U+8E70 */ 0xF5E9, 0xDBA0, 0xB6D7, 0xDC40, 0xF5ED, 0xDC41, 0xF5EA, 0xDC42, /* U+8E78 */ 0xDC43, 0xDC44, 0xDC45, 0xDC46, 0xF5EB, 0xDC47, 0xDC48, 0xB4DA, /* U+8E80 */ 0xDC49, 0xD4EA, 0xDC4A, 0xDC4B, 0xDC4C, 0xF5EE, 0xDC4D, 0xB3F9, /* U+8E88 */ 0xDC4E, 0xDC4F, 0xDC50, 0xDC51, 0xDC52, 0xDC53, 0xDC54, 0xF5EF, /* U+8E90 */ 0xF5F1, 0xDC55, 0xDC56, 0xDC57, 0xF5F0, 0xDC58, 0xDC59, 0xDC5A, /* U+8E98 */ 0xDC5B, 0xDC5C, 0xDC5D, 0xDC5E, 0xF5F2, 0xDC5F, 0xF5F3, 0xDC60, /* U+8EA0 */ 0xDC61, 0xDC62, 0xDC63, 0xDC64, 0xDC65, 0xDC66, 0xDC67, 0xDC68, /* U+8EA8 */ 0xDC69, 0xDC6A, 0xDC6B, 0xC9ED, 0xB9AA, 0xDC6C, 0xDC6D, 0xC7FB, /* U+8EB0 */ 0xDC6E, 0xDC6F, 0xB6E3, 0xDC70, 0xDC71, 0xDC72, 0xDC73, 0xDC74, /* U+8EB8 */ 0xDC75, 0xDC76, 0xCCC9, 0xDC77, 0xDC78, 0xDC79, 0xDC7A, 0xDC7B, /* U+8EC0 */ 0xDC7C, 0xDC7D, 0xDC7E, 0xDC80, 0xDC81, 0xDC82, 0xDC83, 0xDC84, /* U+8EC8 */ 0xDC85, 0xDC86, 0xDC87, 0xDC88, 0xDC89, 0xDC8A, 0xEAA6, 0xDC8B, /* U+8ED0 */ 0xDC8C, 0xDC8D, 0xDC8E, 0xDC8F, 0xDC90, 0xDC91, 0xDC92, 0xDC93, /* U+8ED8 */ 0xDC94, 0xDC95, 0xDC96, 0xDC97, 0xDC98, 0xDC99, 0xDC9A, 0xDC9B, /* U+8EE0 */ 0xDC9C, 0xDC9D, 0xDC9E, 0xDC9F, 0xDCA0, 0xDD40, 0xDD41, 0xDD42, /* U+8EE8 */ 0xDD43, 0xDD44, 0xDD45, 0xDD46, 0xDD47, 0xDD48, 0xDD49, 0xDD4A, /* U+8EF0 */ 0xDD4B, 0xDD4C, 0xDD4D, 0xDD4E, 0xDD4F, 0xDD50, 0xDD51, 0xDD52, /* U+8EF8 */ 0xDD53, 0xDD54, 0xDD55, 0xDD56, 0xDD57, 0xDD58, 0xDD59, 0xDD5A, /* U+8F00 */ 0xDD5B, 0xDD5C, 0xDD5D, 0xDD5E, 0xDD5F, 0xDD60, 0xDD61, 0xDD62, /* U+8F08 */ 0xDD63, 0xDD64, 0xDD65, 0xDD66, 0xDD67, 0xDD68, 0xDD69, 0xDD6A, /* U+8F10 */ 0xDD6B, 0xDD6C, 0xDD6D, 0xDD6E, 0xDD6F, 0xDD70, 0xDD71, 0xDD72, /* U+8F18 */ 0xDD73, 0xDD74, 0xDD75, 0xDD76, 0xDD77, 0xDD78, 0xDD79, 0xDD7A, /* U+8F20 */ 0xDD7B, 0xDD7C, 0xDD7D, 0xDD7E, 0xDD80, 0xDD81, 0xDD82, 0xDD83, /* U+8F28 */ 0xDD84, 0xDD85, 0xDD86, 0xDD87, 0xDD88, 0xDD89, 0xDD8A, 0xDD8B, /* U+8F30 */ 0xDD8C, 0xDD8D, 0xDD8E, 0xDD8F, 0xDD90, 0xDD91, 0xDD92, 0xDD93, /* U+8F38 */ 0xDD94, 0xDD95, 0xDD96, 0xDD97, 0xDD98, 0xDD99, 0xDD9A, 0xDD9B, /* U+8F40 */ 0xDD9C, 0xDD9D, 0xDD9E, 0xDD9F, 0xDDA0, 0xDE40, 0xDE41, 0xDE42, /* U+8F48 */ 0xDE43, 0xDE44, 0xDE45, 0xDE46, 0xDE47, 0xDE48, 0xDE49, 0xDE4A, /* U+8F50 */ 0xDE4B, 0xDE4C, 0xDE4D, 0xDE4E, 0xDE4F, 0xDE50, 0xDE51, 0xDE52, /* U+8F58 */ 0xDE53, 0xDE54, 0xDE55, 0xDE56, 0xDE57, 0xDE58, 0xDE59, 0xDE5A, /* U+8F60 */ 0xDE5B, 0xDE5C, 0xDE5D, 0xDE5E, 0xDE5F, 0xDE60, 0xB3B5, 0xD4FE, /* U+8F68 */ 0xB9EC, 0xD0F9, 0xDE61, 0xE9ED, 0xD7AA, 0xE9EE, 0xC2D6, 0xC8ED, /* U+8F70 */ 0xBAE4, 0xE9EF, 0xE9F0, 0xE9F1, 0xD6E1, 0xE9F2, 0xE9F3, 0xE9F5, /* U+8F78 */ 0xE9F4, 0xE9F6, 0xE9F7, 0xC7E1, 0xE9F8, 0xD4D8, 0xE9F9, 0xBDCE, /* U+8F80 */ 0xDE62, 0xE9FA, 0xE9FB, 0xBDCF, 0xE9FC, 0xB8A8, 0xC1BE, 0xE9FD, /* U+8F88 */ 0xB1B2, 0xBBD4, 0xB9F5, 0xE9FE, 0xDE63, 0xEAA1, 0xEAA2, 0xEAA3, /* U+8F90 */ 0xB7F8, 0xBCAD, 0xDE64, 0xCAE4, 0xE0CE, 0xD4AF, 0xCFBD, 0xD5B7, /* U+8F98 */ 0xEAA4, 0xD5DE, 0xEAA5, 0xD0C1, 0xB9BC, 0xDE65, 0xB4C7, 0xB1D9, /* U+8FA0 */ 0xDE66, 0xDE67, 0xDE68, 0xC0B1, 0xDE69, 0xDE6A, 0xDE6B, 0xDE6C, /* U+8FA8 */ 0xB1E6, 0xB1E7, 0xDE6D, 0xB1E8, 0xDE6E, 0xDE6F, 0xDE70, 0xDE71, /* U+8FB0 */ 0xB3BD, 0xC8E8, 0xDE72, 0xDE73, 0xDE74, 0xDE75, 0xE5C1, 0xDE76, /* U+8FB8 */ 0xDE77, 0xB1DF, 0xDE78, 0xDE79, 0xDE7A, 0xC1C9, 0xB4EF, 0xDE7B, /* U+8FC0 */ 0xDE7C, 0xC7A8, 0xD3D8, 0xDE7D, 0xC6F9, 0xD1B8, 0xDE7E, 0xB9FD, /* U+8FC8 */ 0xC2F5, 0xDE80, 0xDE81, 0xDE82, 0xDE83, 0xDE84, 0xD3AD, 0xDE85, /* U+8FD0 */ 0xD4CB, 0xBDFC, 0xDE86, 0xE5C2, 0xB7B5, 0xE5C3, 0xDE87, 0xDE88, /* U+8FD8 */ 0xBBB9, 0xD5E2, 0xDE89, 0xBDF8, 0xD4B6, 0xCEA5, 0xC1AC, 0xB3D9, /* U+8FE0 */ 0xDE8A, 0xDE8B, 0xCCF6, 0xDE8C, 0xE5C6, 0xE5C4, 0xE5C8, 0xDE8D, /* U+8FE8 */ 0xE5CA, 0xE5C7, 0xB5CF, 0xC6C8, 0xDE8E, 0xB5FC, 0xE5C5, 0xDE8F, /* U+8FF0 */ 0xCAF6, 0xDE90, 0xDE91, 0xE5C9, 0xDE92, 0xDE93, 0xDE94, 0xC3D4, /* U+8FF8 */ 0xB1C5, 0xBCA3, 0xDE95, 0xDE96, 0xDE97, 0xD7B7, 0xDE98, 0xDE99, /* U+9000 */ 0xCDCB, 0xCBCD, 0xCACA, 0xCCD3, 0xE5CC, 0xE5CB, 0xC4E6, 0xDE9A, /* U+9008 */ 0xDE9B, 0xD1A1, 0xD1B7, 0xE5CD, 0xDE9C, 0xE5D0, 0xDE9D, 0xCDB8, /* U+9010 */ 0xD6F0, 0xE5CF, 0xB5DD, 0xDE9E, 0xCDBE, 0xDE9F, 0xE5D1, 0xB6BA, /* U+9018 */ 0xDEA0, 0xDF40, 0xCDA8, 0xB9E4, 0xDF41, 0xCAC5, 0xB3D1, 0xCBD9, /* U+9020 */ 0xD4EC, 0xE5D2, 0xB7EA, 0xDF42, 0xDF43, 0xDF44, 0xE5CE, 0xDF45, /* U+9028 */ 0xDF46, 0xDF47, 0xDF48, 0xDF49, 0xDF4A, 0xE5D5, 0xB4FE, 0xE5D6, /* U+9030 */ 0xDF4B, 0xDF4C, 0xDF4D, 0xDF4E, 0xDF4F, 0xE5D3, 0xE5D4, 0xDF50, /* U+9038 */ 0xD2DD, 0xDF51, 0xDF52, 0xC2DF, 0xB1C6, 0xDF53, 0xD3E2, 0xDF54, /* U+9040 */ 0xDF55, 0xB6DD, 0xCBEC, 0xDF56, 0xE5D7, 0xDF57, 0xDF58, 0xD3F6, /* U+9048 */ 0xDF59, 0xDF5A, 0xDF5B, 0xDF5C, 0xDF5D, 0xB1E9, 0xDF5E, 0xB6F4, /* U+9050 */ 0xE5DA, 0xE5D8, 0xE5D9, 0xB5C0, 0xDF5F, 0xDF60, 0xDF61, 0xD2C5, /* U+9058 */ 0xE5DC, 0xDF62, 0xDF63, 0xE5DE, 0xDF64, 0xDF65, 0xDF66, 0xDF67, /* U+9060 */ 0xDF68, 0xDF69, 0xE5DD, 0xC7B2, 0xDF6A, 0xD2A3, 0xDF6B, 0xDF6C, /* U+9068 */ 0xE5DB, 0xDF6D, 0xDF6E, 0xDF6F, 0xDF70, 0xD4E2, 0xD5DA, 0xDF71, /* U+9070 */ 0xDF72, 0xDF73, 0xDF74, 0xDF75, 0xE5E0, 0xD7F1, 0xDF76, 0xDF77, /* U+9078 */ 0xDF78, 0xDF79, 0xDF7A, 0xDF7B, 0xDF7C, 0xE5E1, 0xDF7D, 0xB1DC, /* U+9080 */ 0xD1FB, 0xDF7E, 0xE5E2, 0xE5E4, 0xDF80, 0xDF81, 0xDF82, 0xDF83, /* U+9088 */ 0xE5E3, 0xDF84, 0xDF85, 0xE5E5, 0xDF86, 0xDF87, 0xDF88, 0xDF89, /* U+9090 */ 0xDF8A, 0xD2D8, 0xDF8B, 0xB5CB, 0xDF8C, 0xE7DF, 0xDF8D, 0xDAF5, /* U+9098 */ 0xDF8E, 0xDAF8, 0xDF8F, 0xDAF6, 0xDF90, 0xDAF7, 0xDF91, 0xDF92, /* U+90A0 */ 0xDF93, 0xDAFA, 0xD0CF, 0xC4C7, 0xDF94, 0xDF95, 0xB0EE, 0xDF96, /* U+90A8 */ 0xDF97, 0xDF98, 0xD0B0, 0xDF99, 0xDAF9, 0xDF9A, 0xD3CA, 0xBAAA, /* U+90B0 */ 0xDBA2, 0xC7F1, 0xDF9B, 0xDAFC, 0xDAFB, 0xC9DB, 0xDAFD, 0xDF9C, /* U+90B8 */ 0xDBA1, 0xD7DE, 0xDAFE, 0xC1DA, 0xDF9D, 0xDF9E, 0xDBA5, 0xDF9F, /* U+90C0 */ 0xDFA0, 0xD3F4, 0xE040, 0xE041, 0xDBA7, 0xDBA4, 0xE042, 0xDBA8, /* U+90C8 */ 0xE043, 0xE044, 0xBDBC, 0xE045, 0xE046, 0xE047, 0xC0C9, 0xDBA3, /* U+90D0 */ 0xDBA6, 0xD6A3, 0xE048, 0xDBA9, 0xE049, 0xE04A, 0xE04B, 0xDBAD, /* U+90D8 */ 0xE04C, 0xE04D, 0xE04E, 0xDBAE, 0xDBAC, 0xBAC2, 0xE04F, 0xE050, /* U+90E0 */ 0xE051, 0xBFA4, 0xDBAB, 0xE052, 0xE053, 0xE054, 0xDBAA, 0xD4C7, /* U+90E8 */ 0xB2BF, 0xE055, 0xE056, 0xDBAF, 0xE057, 0xB9F9, 0xE058, 0xDBB0, /* U+90F0 */ 0xE059, 0xE05A, 0xE05B, 0xE05C, 0xB3BB, 0xE05D, 0xE05E, 0xE05F, /* U+90F8 */ 0xB5A6, 0xE060, 0xE061, 0xE062, 0xE063, 0xB6BC, 0xDBB1, 0xE064, /* U+9100 */ 0xE065, 0xE066, 0xB6F5, 0xE067, 0xDBB2, 0xE068, 0xE069, 0xE06A, /* U+9108 */ 0xE06B, 0xE06C, 0xE06D, 0xE06E, 0xE06F, 0xE070, 0xE071, 0xE072, /* U+9110 */ 0xE073, 0xE074, 0xE075, 0xE076, 0xE077, 0xE078, 0xE079, 0xE07A, /* U+9118 */ 0xE07B, 0xB1C9, 0xE07C, 0xE07D, 0xE07E, 0xE080, 0xDBB4, 0xE081, /* U+9120 */ 0xE082, 0xE083, 0xDBB3, 0xDBB5, 0xE084, 0xE085, 0xE086, 0xE087, /* U+9128 */ 0xE088, 0xE089, 0xE08A, 0xE08B, 0xE08C, 0xE08D, 0xE08E, 0xDBB7, /* U+9130 */ 0xE08F, 0xDBB6, 0xE090, 0xE091, 0xE092, 0xE093, 0xE094, 0xE095, /* U+9138 */ 0xE096, 0xDBB8, 0xE097, 0xE098, 0xE099, 0xE09A, 0xE09B, 0xE09C, /* U+9140 */ 0xE09D, 0xE09E, 0xE09F, 0xDBB9, 0xE0A0, 0xE140, 0xDBBA, 0xE141, /* U+9148 */ 0xE142, 0xD3CF, 0xF4FA, 0xC7F5, 0xD7C3, 0xC5E4, 0xF4FC, 0xF4FD, /* U+9150 */ 0xF4FB, 0xE143, 0xBEC6, 0xE144, 0xE145, 0xE146, 0xE147, 0xD0EF, /* U+9158 */ 0xE148, 0xE149, 0xB7D3, 0xE14A, 0xE14B, 0xD4CD, 0xCCAA, 0xE14C, /* U+9160 */ 0xE14D, 0xF5A2, 0xF5A1, 0xBAA8, 0xF4FE, 0xCBD6, 0xE14E, 0xE14F, /* U+9168 */ 0xE150, 0xF5A4, 0xC0D2, 0xE151, 0xB3EA, 0xE152, 0xCDAA, 0xF5A5, /* U+9170 */ 0xF5A3, 0xBDB4, 0xF5A8, 0xE153, 0xF5A9, 0xBDCD, 0xC3B8, 0xBFE1, /* U+9178 */ 0xCBE1, 0xF5AA, 0xE154, 0xE155, 0xE156, 0xF5A6, 0xF5A7, 0xC4F0, /* U+9180 */ 0xE157, 0xE158, 0xE159, 0xE15A, 0xE15B, 0xF5AC, 0xE15C, 0xB4BC, /* U+9188 */ 0xE15D, 0xD7ED, 0xE15E, 0xB4D7, 0xF5AB, 0xF5AE, 0xE15F, 0xE160, /* U+9190 */ 0xF5AD, 0xF5AF, 0xD0D1, 0xE161, 0xE162, 0xE163, 0xE164, 0xE165, /* U+9198 */ 0xE166, 0xE167, 0xC3D1, 0xC8A9, 0xE168, 0xE169, 0xE16A, 0xE16B, /* U+91A0 */ 0xE16C, 0xE16D, 0xF5B0, 0xF5B1, 0xE16E, 0xE16F, 0xE170, 0xE171, /* U+91A8 */ 0xE172, 0xE173, 0xF5B2, 0xE174, 0xE175, 0xF5B3, 0xF5B4, 0xF5B5, /* U+91B0 */ 0xE176, 0xE177, 0xE178, 0xE179, 0xF5B7, 0xF5B6, 0xE17A, 0xE17B, /* U+91B8 */ 0xE17C, 0xE17D, 0xF5B8, 0xE17E, 0xE180, 0xE181, 0xE182, 0xE183, /* U+91C0 */ 0xE184, 0xE185, 0xE186, 0xE187, 0xE188, 0xE189, 0xE18A, 0xB2C9, /* U+91C8 */ 0xE18B, 0xD3D4, 0xCACD, 0xE18C, 0xC0EF, 0xD6D8, 0xD2B0, 0xC1BF, /* U+91D0 */ 0xE18D, 0xBDF0, 0xE18E, 0xE18F, 0xE190, 0xE191, 0xE192, 0xE193, /* U+91D8 */ 0xE194, 0xE195, 0xE196, 0xE197, 0xB8AA, 0xE198, 0xE199, 0xE19A, /* U+91E0 */ 0xE19B, 0xE19C, 0xE19D, 0xE19E, 0xE19F, 0xE1A0, 0xE240, 0xE241, /* U+91E8 */ 0xE242, 0xE243, 0xE244, 0xE245, 0xE246, 0xE247, 0xE248, 0xE249, /* U+91F0 */ 0xE24A, 0xE24B, 0xE24C, 0xE24D, 0xE24E, 0xE24F, 0xE250, 0xE251, /* U+91F8 */ 0xE252, 0xE253, 0xE254, 0xE255, 0xE256, 0xE257, 0xE258, 0xE259, /* U+9200 */ 0xE25A, 0xE25B, 0xE25C, 0xE25D, 0xE25E, 0xE25F, 0xE260, 0xE261, /* U+9208 */ 0xE262, 0xE263, 0xE264, 0xE265, 0xE266, 0xE267, 0xE268, 0xE269, /* U+9210 */ 0xE26A, 0xE26B, 0xE26C, 0xE26D, 0xE26E, 0xE26F, 0xE270, 0xE271, /* U+9218 */ 0xE272, 0xE273, 0xE274, 0xE275, 0xE276, 0xE277, 0xE278, 0xE279, /* U+9220 */ 0xE27A, 0xE27B, 0xE27C, 0xE27D, 0xE27E, 0xE280, 0xE281, 0xE282, /* U+9228 */ 0xE283, 0xE284, 0xE285, 0xE286, 0xE287, 0xE288, 0xE289, 0xE28A, /* U+9230 */ 0xE28B, 0xE28C, 0xE28D, 0xE28E, 0xE28F, 0xE290, 0xE291, 0xE292, /* U+9238 */ 0xE293, 0xE294, 0xE295, 0xE296, 0xE297, 0xE298, 0xE299, 0xE29A, /* U+9240 */ 0xE29B, 0xE29C, 0xE29D, 0xE29E, 0xE29F, 0xE2A0, 0xE340, 0xE341, /* U+9248 */ 0xE342, 0xE343, 0xE344, 0xE345, 0xE346, 0xE347, 0xE348, 0xE349, /* U+9250 */ 0xE34A, 0xE34B, 0xE34C, 0xE34D, 0xE34E, 0xE34F, 0xE350, 0xE351, /* U+9258 */ 0xE352, 0xE353, 0xE354, 0xE355, 0xE356, 0xE357, 0xE358, 0xE359, /* U+9260 */ 0xE35A, 0xE35B, 0xE35C, 0xE35D, 0xE35E, 0xE35F, 0xE360, 0xE361, /* U+9268 */ 0xE362, 0xE363, 0xE364, 0xE365, 0xE366, 0xE367, 0xE368, 0xE369, /* U+9270 */ 0xE36A, 0xE36B, 0xE36C, 0xE36D, 0xBCF8, 0xE36E, 0xE36F, 0xE370, /* U+9278 */ 0xE371, 0xE372, 0xE373, 0xE374, 0xE375, 0xE376, 0xE377, 0xE378, /* U+9280 */ 0xE379, 0xE37A, 0xE37B, 0xE37C, 0xE37D, 0xE37E, 0xE380, 0xE381, /* U+9288 */ 0xE382, 0xE383, 0xE384, 0xE385, 0xE386, 0xE387, 0xF6C6, 0xE388, /* U+9290 */ 0xE389, 0xE38A, 0xE38B, 0xE38C, 0xE38D, 0xE38E, 0xE38F, 0xE390, /* U+9298 */ 0xE391, 0xE392, 0xE393, 0xE394, 0xE395, 0xE396, 0xE397, 0xE398, /* U+92A0 */ 0xE399, 0xE39A, 0xE39B, 0xE39C, 0xE39D, 0xE39E, 0xE39F, 0xE3A0, /* U+92A8 */ 0xE440, 0xE441, 0xE442, 0xE443, 0xE444, 0xE445, 0xF6C7, 0xE446, /* U+92B0 */ 0xE447, 0xE448, 0xE449, 0xE44A, 0xE44B, 0xE44C, 0xE44D, 0xE44E, /* U+92B8 */ 0xE44F, 0xE450, 0xE451, 0xE452, 0xE453, 0xE454, 0xE455, 0xE456, /* U+92C0 */ 0xE457, 0xE458, 0xE459, 0xE45A, 0xE45B, 0xE45C, 0xE45D, 0xE45E, /* U+92C8 */ 0xF6C8, 0xE45F, 0xE460, 0xE461, 0xE462, 0xE463, 0xE464, 0xE465, /* U+92D0 */ 0xE466, 0xE467, 0xE468, 0xE469, 0xE46A, 0xE46B, 0xE46C, 0xE46D, /* U+92D8 */ 0xE46E, 0xE46F, 0xE470, 0xE471, 0xE472, 0xE473, 0xE474, 0xE475, /* U+92E0 */ 0xE476, 0xE477, 0xE478, 0xE479, 0xE47A, 0xE47B, 0xE47C, 0xE47D, /* U+92E8 */ 0xE47E, 0xE480, 0xE481, 0xE482, 0xE483, 0xE484, 0xE485, 0xE486, /* U+92F0 */ 0xE487, 0xE488, 0xE489, 0xE48A, 0xE48B, 0xE48C, 0xE48D, 0xE48E, /* U+92F8 */ 0xE48F, 0xE490, 0xE491, 0xE492, 0xE493, 0xE494, 0xE495, 0xE496, /* U+9300 */ 0xE497, 0xE498, 0xE499, 0xE49A, 0xE49B, 0xE49C, 0xE49D, 0xE49E, /* U+9308 */ 0xE49F, 0xE4A0, 0xE540, 0xE541, 0xE542, 0xE543, 0xE544, 0xE545, /* U+9310 */ 0xE546, 0xE547, 0xE548, 0xE549, 0xE54A, 0xE54B, 0xE54C, 0xE54D, /* U+9318 */ 0xE54E, 0xE54F, 0xE550, 0xE551, 0xE552, 0xE553, 0xE554, 0xE555, /* U+9320 */ 0xE556, 0xE557, 0xE558, 0xE559, 0xE55A, 0xE55B, 0xE55C, 0xE55D, /* U+9328 */ 0xE55E, 0xE55F, 0xE560, 0xE561, 0xE562, 0xE563, 0xE564, 0xE565, /* U+9330 */ 0xE566, 0xE567, 0xE568, 0xE569, 0xE56A, 0xE56B, 0xE56C, 0xE56D, /* U+9338 */ 0xE56E, 0xE56F, 0xE570, 0xE571, 0xE572, 0xE573, 0xF6C9, 0xE574, /* U+9340 */ 0xE575, 0xE576, 0xE577, 0xE578, 0xE579, 0xE57A, 0xE57B, 0xE57C, /* U+9348 */ 0xE57D, 0xE57E, 0xE580, 0xE581, 0xE582, 0xE583, 0xE584, 0xE585, /* U+9350 */ 0xE586, 0xE587, 0xE588, 0xE589, 0xE58A, 0xE58B, 0xE58C, 0xE58D, /* U+9358 */ 0xE58E, 0xE58F, 0xE590, 0xE591, 0xE592, 0xE593, 0xE594, 0xE595, /* U+9360 */ 0xE596, 0xE597, 0xE598, 0xE599, 0xE59A, 0xE59B, 0xE59C, 0xE59D, /* U+9368 */ 0xE59E, 0xE59F, 0xF6CA, 0xE5A0, 0xE640, 0xE641, 0xE642, 0xE643, /* U+9370 */ 0xE644, 0xE645, 0xE646, 0xE647, 0xE648, 0xE649, 0xE64A, 0xE64B, /* U+9378 */ 0xE64C, 0xE64D, 0xE64E, 0xE64F, 0xE650, 0xE651, 0xE652, 0xE653, /* U+9380 */ 0xE654, 0xE655, 0xE656, 0xE657, 0xE658, 0xE659, 0xE65A, 0xE65B, /* U+9388 */ 0xE65C, 0xE65D, 0xE65E, 0xE65F, 0xE660, 0xE661, 0xE662, 0xF6CC, /* U+9390 */ 0xE663, 0xE664, 0xE665, 0xE666, 0xE667, 0xE668, 0xE669, 0xE66A, /* U+9398 */ 0xE66B, 0xE66C, 0xE66D, 0xE66E, 0xE66F, 0xE670, 0xE671, 0xE672, /* U+93A0 */ 0xE673, 0xE674, 0xE675, 0xE676, 0xE677, 0xE678, 0xE679, 0xE67A, /* U+93A8 */ 0xE67B, 0xE67C, 0xE67D, 0xE67E, 0xE680, 0xE681, 0xE682, 0xE683, /* U+93B0 */ 0xE684, 0xE685, 0xE686, 0xE687, 0xE688, 0xE689, 0xE68A, 0xE68B, /* U+93B8 */ 0xE68C, 0xE68D, 0xE68E, 0xE68F, 0xE690, 0xE691, 0xE692, 0xE693, /* U+93C0 */ 0xE694, 0xE695, 0xE696, 0xE697, 0xE698, 0xE699, 0xE69A, 0xE69B, /* U+93C8 */ 0xE69C, 0xE69D, 0xF6CB, 0xE69E, 0xE69F, 0xE6A0, 0xE740, 0xE741, /* U+93D0 */ 0xE742, 0xE743, 0xE744, 0xE745, 0xE746, 0xE747, 0xF7E9, 0xE748, /* U+93D8 */ 0xE749, 0xE74A, 0xE74B, 0xE74C, 0xE74D, 0xE74E, 0xE74F, 0xE750, /* U+93E0 */ 0xE751, 0xE752, 0xE753, 0xE754, 0xE755, 0xE756, 0xE757, 0xE758, /* U+93E8 */ 0xE759, 0xE75A, 0xE75B, 0xE75C, 0xE75D, 0xE75E, 0xE75F, 0xE760, /* U+93F0 */ 0xE761, 0xE762, 0xE763, 0xE764, 0xE765, 0xE766, 0xE767, 0xE768, /* U+93F8 */ 0xE769, 0xE76A, 0xE76B, 0xE76C, 0xE76D, 0xE76E, 0xE76F, 0xE770, /* U+9400 */ 0xE771, 0xE772, 0xE773, 0xE774, 0xE775, 0xE776, 0xE777, 0xE778, /* U+9408 */ 0xE779, 0xE77A, 0xE77B, 0xE77C, 0xE77D, 0xE77E, 0xE780, 0xE781, /* U+9410 */ 0xE782, 0xE783, 0xE784, 0xE785, 0xE786, 0xE787, 0xE788, 0xE789, /* U+9418 */ 0xE78A, 0xE78B, 0xE78C, 0xE78D, 0xE78E, 0xE78F, 0xE790, 0xE791, /* U+9420 */ 0xE792, 0xE793, 0xE794, 0xE795, 0xE796, 0xE797, 0xE798, 0xE799, /* U+9428 */ 0xE79A, 0xE79B, 0xE79C, 0xE79D, 0xE79E, 0xE79F, 0xE7A0, 0xE840, /* U+9430 */ 0xE841, 0xE842, 0xE843, 0xE844, 0xE845, 0xE846, 0xE847, 0xE848, /* U+9438 */ 0xE849, 0xE84A, 0xE84B, 0xE84C, 0xE84D, 0xE84E, 0xF6CD, 0xE84F, /* U+9440 */ 0xE850, 0xE851, 0xE852, 0xE853, 0xE854, 0xE855, 0xE856, 0xE857, /* U+9448 */ 0xE858, 0xE859, 0xE85A, 0xE85B, 0xE85C, 0xE85D, 0xE85E, 0xE85F, /* U+9450 */ 0xE860, 0xE861, 0xE862, 0xE863, 0xE864, 0xE865, 0xE866, 0xE867, /* U+9458 */ 0xE868, 0xE869, 0xE86A, 0xE86B, 0xE86C, 0xE86D, 0xE86E, 0xE86F, /* U+9460 */ 0xE870, 0xE871, 0xE872, 0xE873, 0xE874, 0xE875, 0xE876, 0xE877, /* U+9468 */ 0xE878, 0xE879, 0xE87A, 0xF6CE, 0xE87B, 0xE87C, 0xE87D, 0xE87E, /* U+9470 */ 0xE880, 0xE881, 0xE882, 0xE883, 0xE884, 0xE885, 0xE886, 0xE887, /* U+9478 */ 0xE888, 0xE889, 0xE88A, 0xE88B, 0xE88C, 0xE88D, 0xE88E, 0xE88F, /* U+9480 */ 0xE890, 0xE891, 0xE892, 0xE893, 0xE894, 0xEEC4, 0xEEC5, 0xEEC6, /* U+9488 */ 0xD5EB, 0xB6A4, 0xEEC8, 0xEEC7, 0xEEC9, 0xEECA, 0xC7A5, 0xEECB, /* U+9490 */ 0xEECC, 0xE895, 0xB7B0, 0xB5F6, 0xEECD, 0xEECF, 0xE896, 0xEECE, /* U+9498 */ 0xE897, 0xB8C6, 0xEED0, 0xEED1, 0xEED2, 0xB6DB, 0xB3AE, 0xD6D3, /* U+94A0 */ 0xC4C6, 0xB1B5, 0xB8D6, 0xEED3, 0xEED4, 0xD4BF, 0xC7D5, 0xBEFB, /* U+94A8 */ 0xCED9, 0xB9B3, 0xEED6, 0xEED5, 0xEED8, 0xEED7, 0xC5A5, 0xEED9, /* U+94B0 */ 0xEEDA, 0xC7AE, 0xEEDB, 0xC7AF, 0xEEDC, 0xB2A7, 0xEEDD, 0xEEDE, /* U+94B8 */ 0xEEDF, 0xEEE0, 0xEEE1, 0xD7EA, 0xEEE2, 0xEEE3, 0xBCD8, 0xEEE4, /* U+94C0 */ 0xD3CB, 0xCCFA, 0xB2AC, 0xC1E5, 0xEEE5, 0xC7A6, 0xC3AD, 0xE898, /* U+94C8 */ 0xEEE6, 0xEEE7, 0xEEE8, 0xEEE9, 0xEEEA, 0xEEEB, 0xEEEC, 0xE899, /* U+94D0 */ 0xEEED, 0xEEEE, 0xEEEF, 0xE89A, 0xE89B, 0xEEF0, 0xEEF1, 0xEEF2, /* U+94D8 */ 0xEEF4, 0xEEF3, 0xE89C, 0xEEF5, 0xCDAD, 0xC2C1, 0xEEF6, 0xEEF7, /* U+94E0 */ 0xEEF8, 0xD5A1, 0xEEF9, 0xCFB3, 0xEEFA, 0xEEFB, 0xE89D, 0xEEFC, /* U+94E8 */ 0xEEFD, 0xEFA1, 0xEEFE, 0xEFA2, 0xB8F5, 0xC3FA, 0xEFA3, 0xEFA4, /* U+94F0 */ 0xBDC2, 0xD2BF, 0xB2F9, 0xEFA5, 0xEFA6, 0xEFA7, 0xD2F8, 0xEFA8, /* U+94F8 */ 0xD6FD, 0xEFA9, 0xC6CC, 0xE89E, 0xEFAA, 0xEFAB, 0xC1B4, 0xEFAC, /* U+9500 */ 0xCFFA, 0xCBF8, 0xEFAE, 0xEFAD, 0xB3FA, 0xB9F8, 0xEFAF, 0xEFB0, /* U+9508 */ 0xD0E2, 0xEFB1, 0xEFB2, 0xB7E6, 0xD0BF, 0xEFB3, 0xEFB4, 0xEFB5, /* U+9510 */ 0xC8F1, 0xCCE0, 0xEFB6, 0xEFB7, 0xEFB8, 0xEFB9, 0xEFBA, 0xD5E0, /* U+9518 */ 0xEFBB, 0xB4ED, 0xC3AA, 0xEFBC, 0xE89F, 0xEFBD, 0xEFBE, 0xEFBF, /* U+9520 */ 0xE8A0, 0xCEFD, 0xEFC0, 0xC2E0, 0xB4B8, 0xD7B6, 0xBDF5, 0xE940, /* U+9528 */ 0xCFC7, 0xEFC3, 0xEFC1, 0xEFC2, 0xEFC4, 0xB6A7, 0xBCFC, 0xBEE2, /* U+9530 */ 0xC3CC, 0xEFC5, 0xEFC6, 0xE941, 0xEFC7, 0xEFCF, 0xEFC8, 0xEFC9, /* U+9538 */ 0xEFCA, 0xC7C2, 0xEFF1, 0xB6CD, 0xEFCB, 0xE942, 0xEFCC, 0xEFCD, /* U+9540 */ 0xB6C6, 0xC3BE, 0xEFCE, 0xE943, 0xEFD0, 0xEFD1, 0xEFD2, 0xD5F2, /* U+9548 */ 0xE944, 0xEFD3, 0xC4F7, 0xE945, 0xEFD4, 0xC4F8, 0xEFD5, 0xEFD6, /* U+9550 */ 0xB8E4, 0xB0F7, 0xEFD7, 0xEFD8, 0xEFD9, 0xE946, 0xEFDA, 0xEFDB, /* U+9558 */ 0xEFDC, 0xEFDD, 0xE947, 0xEFDE, 0xBEB5, 0xEFE1, 0xEFDF, 0xEFE0, /* U+9560 */ 0xE948, 0xEFE2, 0xEFE3, 0xC1CD, 0xEFE4, 0xEFE5, 0xEFE6, 0xEFE7, /* U+9568 */ 0xEFE8, 0xEFE9, 0xEFEA, 0xEFEB, 0xEFEC, 0xC0D8, 0xE949, 0xEFED, /* U+9570 */ 0xC1AD, 0xEFEE, 0xEFEF, 0xEFF0, 0xE94A, 0xE94B, 0xCFE2, 0xE94C, /* U+9578 */ 0xE94D, 0xE94E, 0xE94F, 0xE950, 0xE951, 0xE952, 0xE953, 0xB3A4, /* U+9580 */ 0xE954, 0xE955, 0xE956, 0xE957, 0xE958, 0xE959, 0xE95A, 0xE95B, /* U+9588 */ 0xE95C, 0xE95D, 0xE95E, 0xE95F, 0xE960, 0xE961, 0xE962, 0xE963, /* U+9590 */ 0xE964, 0xE965, 0xE966, 0xE967, 0xE968, 0xE969, 0xE96A, 0xE96B, /* U+9598 */ 0xE96C, 0xE96D, 0xE96E, 0xE96F, 0xE970, 0xE971, 0xE972, 0xE973, /* U+95A0 */ 0xE974, 0xE975, 0xE976, 0xE977, 0xE978, 0xE979, 0xE97A, 0xE97B, /* U+95A8 */ 0xE97C, 0xE97D, 0xE97E, 0xE980, 0xE981, 0xE982, 0xE983, 0xE984, /* U+95B0 */ 0xE985, 0xE986, 0xE987, 0xE988, 0xE989, 0xE98A, 0xE98B, 0xE98C, /* U+95B8 */ 0xE98D, 0xE98E, 0xE98F, 0xE990, 0xE991, 0xE992, 0xE993, 0xE994, /* U+95C0 */ 0xE995, 0xE996, 0xE997, 0xE998, 0xE999, 0xE99A, 0xE99B, 0xE99C, /* U+95C8 */ 0xE99D, 0xE99E, 0xE99F, 0xE9A0, 0xEA40, 0xEA41, 0xEA42, 0xEA43, /* U+95D0 */ 0xEA44, 0xEA45, 0xEA46, 0xEA47, 0xEA48, 0xEA49, 0xEA4A, 0xEA4B, /* U+95D8 */ 0xEA4C, 0xEA4D, 0xEA4E, 0xEA4F, 0xEA50, 0xEA51, 0xEA52, 0xEA53, /* U+95E0 */ 0xEA54, 0xEA55, 0xEA56, 0xEA57, 0xEA58, 0xEA59, 0xEA5A, 0xEA5B, /* U+95E8 */ 0xC3C5, 0xE3C5, 0xC9C1, 0xE3C6, 0xEA5C, 0xB1D5, 0xCECA, 0xB4B3, /* U+95F0 */ 0xC8F2, 0xE3C7, 0xCFD0, 0xE3C8, 0xBCE4, 0xE3C9, 0xE3CA, 0xC3C6, /* U+95F8 */ 0xD5A2, 0xC4D6, 0xB9EB, 0xCEC5, 0xE3CB, 0xC3F6, 0xE3CC, 0xEA5D, /* U+9600 */ 0xB7A7, 0xB8F3, 0xBAD2, 0xE3CD, 0xE3CE, 0xD4C4, 0xE3CF, 0xEA5E, /* U+9608 */ 0xE3D0, 0xD1CB, 0xE3D1, 0xE3D2, 0xE3D3, 0xE3D4, 0xD1D6, 0xE3D5, /* U+9610 */ 0xB2FB, 0xC0BB, 0xE3D6, 0xEA5F, 0xC0AB, 0xE3D7, 0xE3D8, 0xE3D9, /* U+9618 */ 0xEA60, 0xE3DA, 0xE3DB, 0xEA61, 0xB8B7, 0xDAE2, 0xEA62, 0xB6D3, /* U+9620 */ 0xEA63, 0xDAE4, 0xDAE3, 0xEA64, 0xEA65, 0xEA66, 0xEA67, 0xEA68, /* U+9628 */ 0xEA69, 0xEA6A, 0xDAE6, 0xEA6B, 0xEA6C, 0xEA6D, 0xC8EE, 0xEA6E, /* U+9630 */ 0xEA6F, 0xDAE5, 0xB7C0, 0xD1F4, 0xD2F5, 0xD5F3, 0xBDD7, 0xEA70, /* U+9638 */ 0xEA71, 0xEA72, 0xEA73, 0xD7E8, 0xDAE8, 0xDAE7, 0xEA74, 0xB0A2, /* U+9640 */ 0xCDD3, 0xEA75, 0xDAE9, 0xEA76, 0xB8BD, 0xBCCA, 0xC2BD, 0xC2A4, /* U+9648 */ 0xB3C2, 0xDAEA, 0xEA77, 0xC2AA, 0xC4B0, 0xBDB5, 0xEA78, 0xEA79, /* U+9650 */ 0xCFDE, 0xEA7A, 0xEA7B, 0xEA7C, 0xDAEB, 0xC9C2, 0xEA7D, 0xEA7E, /* U+9658 */ 0xEA80, 0xEA81, 0xEA82, 0xB1DD, 0xEA83, 0xEA84, 0xEA85, 0xDAEC, /* U+9660 */ 0xEA86, 0xB6B8, 0xD4BA, 0xEA87, 0xB3FD, 0xEA88, 0xEA89, 0xDAED, /* U+9668 */ 0xD4C9, 0xCFD5, 0xC5E3, 0xEA8A, 0xDAEE, 0xEA8B, 0xEA8C, 0xEA8D, /* U+9670 */ 0xEA8E, 0xEA8F, 0xDAEF, 0xEA90, 0xDAF0, 0xC1EA, 0xCCD5, 0xCFDD, /* U+9678 */ 0xEA91, 0xEA92, 0xEA93, 0xEA94, 0xEA95, 0xEA96, 0xEA97, 0xEA98, /* U+9680 */ 0xEA99, 0xEA9A, 0xEA9B, 0xEA9C, 0xEA9D, 0xD3E7, 0xC2A1, 0xEA9E, /* U+9688 */ 0xDAF1, 0xEA9F, 0xEAA0, 0xCBE5, 0xEB40, 0xDAF2, 0xEB41, 0xCBE6, /* U+9690 */ 0xD2FE, 0xEB42, 0xEB43, 0xEB44, 0xB8F4, 0xEB45, 0xEB46, 0xDAF3, /* U+9698 */ 0xB0AF, 0xCFB6, 0xEB47, 0xEB48, 0xD5CF, 0xEB49, 0xEB4A, 0xEB4B, /* U+96A0 */ 0xEB4C, 0xEB4D, 0xEB4E, 0xEB4F, 0xEB50, 0xEB51, 0xEB52, 0xCBED, /* U+96A8 */ 0xEB53, 0xEB54, 0xEB55, 0xEB56, 0xEB57, 0xEB58, 0xEB59, 0xEB5A, /* U+96B0 */ 0xDAF4, 0xEB5B, 0xEB5C, 0xE3C4, 0xEB5D, 0xEB5E, 0xC1A5, 0xEB5F, /* U+96B8 */ 0xEB60, 0xF6BF, 0xEB61, 0xEB62, 0xF6C0, 0xF6C1, 0xC4D1, 0xEB63, /* U+96C0 */ 0xC8B8, 0xD1E3, 0xEB64, 0xEB65, 0xD0DB, 0xD1C5, 0xBCAF, 0xB9CD, /* U+96C8 */ 0xEB66, 0xEFF4, 0xEB67, 0xEB68, 0xB4C6, 0xD3BA, 0xF6C2, 0xB3FB, /* U+96D0 */ 0xEB69, 0xEB6A, 0xF6C3, 0xEB6B, 0xEB6C, 0xB5F1, 0xEB6D, 0xEB6E, /* U+96D8 */ 0xEB6F, 0xEB70, 0xEB71, 0xEB72, 0xEB73, 0xEB74, 0xEB75, 0xEB76, /* U+96E0 */ 0xF6C5, 0xEB77, 0xEB78, 0xEB79, 0xEB7A, 0xEB7B, 0xEB7C, 0xEB7D, /* U+96E8 */ 0xD3EA, 0xF6A7, 0xD1A9, 0xEB7E, 0xEB80, 0xEB81, 0xEB82, 0xF6A9, /* U+96F0 */ 0xEB83, 0xEB84, 0xEB85, 0xF6A8, 0xEB86, 0xEB87, 0xC1E3, 0xC0D7, /* U+96F8 */ 0xEB88, 0xB1A2, 0xEB89, 0xEB8A, 0xEB8B, 0xEB8C, 0xCEED, 0xEB8D, /* U+9700 */ 0xD0E8, 0xF6AB, 0xEB8E, 0xEB8F, 0xCFF6, 0xEB90, 0xF6AA, 0xD5F0, /* U+9708 */ 0xF6AC, 0xC3B9, 0xEB91, 0xEB92, 0xEB93, 0xBBF4, 0xF6AE, 0xF6AD, /* U+9710 */ 0xEB94, 0xEB95, 0xEB96, 0xC4DE, 0xEB97, 0xEB98, 0xC1D8, 0xEB99, /* U+9718 */ 0xEB9A, 0xEB9B, 0xEB9C, 0xEB9D, 0xCBAA, 0xEB9E, 0xCFBC, 0xEB9F, /* U+9720 */ 0xEBA0, 0xEC40, 0xEC41, 0xEC42, 0xEC43, 0xEC44, 0xEC45, 0xEC46, /* U+9728 */ 0xEC47, 0xEC48, 0xF6AF, 0xEC49, 0xEC4A, 0xF6B0, 0xEC4B, 0xEC4C, /* U+9730 */ 0xF6B1, 0xEC4D, 0xC2B6, 0xEC4E, 0xEC4F, 0xEC50, 0xEC51, 0xEC52, /* U+9738 */ 0xB0D4, 0xC5F9, 0xEC53, 0xEC54, 0xEC55, 0xEC56, 0xF6B2, 0xEC57, /* U+9740 */ 0xEC58, 0xEC59, 0xEC5A, 0xEC5B, 0xEC5C, 0xEC5D, 0xEC5E, 0xEC5F, /* U+9748 */ 0xEC60, 0xEC61, 0xEC62, 0xEC63, 0xEC64, 0xEC65, 0xEC66, 0xEC67, /* U+9750 */ 0xEC68, 0xEC69, 0xC7E0, 0xF6A6, 0xEC6A, 0xEC6B, 0xBEB8, 0xEC6C, /* U+9758 */ 0xEC6D, 0xBEB2, 0xEC6E, 0xB5E5, 0xEC6F, 0xEC70, 0xB7C7, 0xEC71, /* U+9760 */ 0xBFBF, 0xC3D2, 0xC3E6, 0xEC72, 0xEC73, 0xD8CC, 0xEC74, 0xEC75, /* U+9768 */ 0xEC76, 0xB8EF, 0xEC77, 0xEC78, 0xEC79, 0xEC7A, 0xEC7B, 0xEC7C, /* U+9770 */ 0xEC7D, 0xEC7E, 0xEC80, 0xBDF9, 0xD1A5, 0xEC81, 0xB0D0, 0xEC82, /* U+9778 */ 0xEC83, 0xEC84, 0xEC85, 0xEC86, 0xF7B0, 0xEC87, 0xEC88, 0xEC89, /* U+9780 */ 0xEC8A, 0xEC8B, 0xEC8C, 0xEC8D, 0xEC8E, 0xF7B1, 0xEC8F, 0xEC90, /* U+9788 */ 0xEC91, 0xEC92, 0xEC93, 0xD0AC, 0xEC94, 0xB0B0, 0xEC95, 0xEC96, /* U+9790 */ 0xEC97, 0xF7B2, 0xF7B3, 0xEC98, 0xF7B4, 0xEC99, 0xEC9A, 0xEC9B, /* U+9798 */ 0xC7CA, 0xEC9C, 0xEC9D, 0xEC9E, 0xEC9F, 0xECA0, 0xED40, 0xED41, /* U+97A0 */ 0xBECF, 0xED42, 0xED43, 0xF7B7, 0xED44, 0xED45, 0xED46, 0xED47, /* U+97A8 */ 0xED48, 0xED49, 0xED4A, 0xF7B6, 0xED4B, 0xB1DE, 0xED4C, 0xF7B5, /* U+97B0 */ 0xED4D, 0xED4E, 0xF7B8, 0xED4F, 0xF7B9, 0xED50, 0xED51, 0xED52, /* U+97B8 */ 0xED53, 0xED54, 0xED55, 0xED56, 0xED57, 0xED58, 0xED59, 0xED5A, /* U+97C0 */ 0xED5B, 0xED5C, 0xED5D, 0xED5E, 0xED5F, 0xED60, 0xED61, 0xED62, /* U+97C8 */ 0xED63, 0xED64, 0xED65, 0xED66, 0xED67, 0xED68, 0xED69, 0xED6A, /* U+97D0 */ 0xED6B, 0xED6C, 0xED6D, 0xED6E, 0xED6F, 0xED70, 0xED71, 0xED72, /* U+97D8 */ 0xED73, 0xED74, 0xED75, 0xED76, 0xED77, 0xED78, 0xED79, 0xED7A, /* U+97E0 */ 0xED7B, 0xED7C, 0xED7D, 0xED7E, 0xED80, 0xED81, 0xCEA4, 0xC8CD, /* U+97E8 */ 0xED82, 0xBAAB, 0xE8B8, 0xE8B9, 0xE8BA, 0xBEC2, 0xED83, 0xED84, /* U+97F0 */ 0xED85, 0xED86, 0xED87, 0xD2F4, 0xED88, 0xD4CF, 0xC9D8, 0xED89, /* U+97F8 */ 0xED8A, 0xED8B, 0xED8C, 0xED8D, 0xED8E, 0xED8F, 0xED90, 0xED91, /* U+9800 */ 0xED92, 0xED93, 0xED94, 0xED95, 0xED96, 0xED97, 0xED98, 0xED99, /* U+9808 */ 0xED9A, 0xED9B, 0xED9C, 0xED9D, 0xED9E, 0xED9F, 0xEDA0, 0xEE40, /* U+9810 */ 0xEE41, 0xEE42, 0xEE43, 0xEE44, 0xEE45, 0xEE46, 0xEE47, 0xEE48, /* U+9818 */ 0xEE49, 0xEE4A, 0xEE4B, 0xEE4C, 0xEE4D, 0xEE4E, 0xEE4F, 0xEE50, /* U+9820 */ 0xEE51, 0xEE52, 0xEE53, 0xEE54, 0xEE55, 0xEE56, 0xEE57, 0xEE58, /* U+9828 */ 0xEE59, 0xEE5A, 0xEE5B, 0xEE5C, 0xEE5D, 0xEE5E, 0xEE5F, 0xEE60, /* U+9830 */ 0xEE61, 0xEE62, 0xEE63, 0xEE64, 0xEE65, 0xEE66, 0xEE67, 0xEE68, /* U+9838 */ 0xEE69, 0xEE6A, 0xEE6B, 0xEE6C, 0xEE6D, 0xEE6E, 0xEE6F, 0xEE70, /* U+9840 */ 0xEE71, 0xEE72, 0xEE73, 0xEE74, 0xEE75, 0xEE76, 0xEE77, 0xEE78, /* U+9848 */ 0xEE79, 0xEE7A, 0xEE7B, 0xEE7C, 0xEE7D, 0xEE7E, 0xEE80, 0xEE81, /* U+9850 */ 0xEE82, 0xEE83, 0xEE84, 0xEE85, 0xEE86, 0xEE87, 0xEE88, 0xEE89, /* U+9858 */ 0xEE8A, 0xEE8B, 0xEE8C, 0xEE8D, 0xEE8E, 0xEE8F, 0xEE90, 0xEE91, /* U+9860 */ 0xEE92, 0xEE93, 0xEE94, 0xEE95, 0xEE96, 0xEE97, 0xEE98, 0xEE99, /* U+9868 */ 0xEE9A, 0xEE9B, 0xEE9C, 0xEE9D, 0xEE9E, 0xEE9F, 0xEEA0, 0xEF40, /* U+9870 */ 0xEF41, 0xEF42, 0xEF43, 0xEF44, 0xEF45, 0xD2B3, 0xB6A5, 0xC7EA, /* U+9878 */ 0xF1FC, 0xCFEE, 0xCBB3, 0xD0EB, 0xE7EF, 0xCDE7, 0xB9CB, 0xB6D9, /* U+9880 */ 0xF1FD, 0xB0E4, 0xCBCC, 0xF1FE, 0xD4A4, 0xC2AD, 0xC1EC, 0xC6C4, /* U+9888 */ 0xBEB1, 0xF2A1, 0xBCD5, 0xEF46, 0xF2A2, 0xF2A3, 0xEF47, 0xF2A4, /* U+9890 */ 0xD2C3, 0xC6B5, 0xEF48, 0xCDC7, 0xF2A5, 0xEF49, 0xD3B1, 0xBFC5, /* U+9898 */ 0xCCE2, 0xEF4A, 0xF2A6, 0xF2A7, 0xD1D5, 0xB6EE, 0xF2A8, 0xF2A9, /* U+98A0 */ 0xB5DF, 0xF2AA, 0xF2AB, 0xEF4B, 0xB2FC, 0xF2AC, 0xF2AD, 0xC8A7, /* U+98A8 */ 0xEF4C, 0xEF4D, 0xEF4E, 0xEF4F, 0xEF50, 0xEF51, 0xEF52, 0xEF53, /* U+98B0 */ 0xEF54, 0xEF55, 0xEF56, 0xEF57, 0xEF58, 0xEF59, 0xEF5A, 0xEF5B, /* U+98B8 */ 0xEF5C, 0xEF5D, 0xEF5E, 0xEF5F, 0xEF60, 0xEF61, 0xEF62, 0xEF63, /* U+98C0 */ 0xEF64, 0xEF65, 0xEF66, 0xEF67, 0xEF68, 0xEF69, 0xEF6A, 0xEF6B, /* U+98C8 */ 0xEF6C, 0xEF6D, 0xEF6E, 0xEF6F, 0xEF70, 0xEF71, 0xB7E7, 0xEF72, /* U+98D0 */ 0xEF73, 0xECA9, 0xECAA, 0xECAB, 0xEF74, 0xECAC, 0xEF75, 0xEF76, /* U+98D8 */ 0xC6AE, 0xECAD, 0xECAE, 0xEF77, 0xEF78, 0xEF79, 0xB7C9, 0xCAB3, /* U+98E0 */ 0xEF7A, 0xEF7B, 0xEF7C, 0xEF7D, 0xEF7E, 0xEF80, 0xEF81, 0xE2B8, /* U+98E8 */ 0xF7CF, 0xEF82, 0xEF83, 0xEF84, 0xEF85, 0xEF86, 0xEF87, 0xEF88, /* U+98F0 */ 0xEF89, 0xEF8A, 0xEF8B, 0xEF8C, 0xEF8D, 0xEF8E, 0xEF8F, 0xEF90, /* U+98F8 */ 0xEF91, 0xEF92, 0xEF93, 0xEF94, 0xEF95, 0xEF96, 0xEF97, 0xEF98, /* U+9900 */ 0xEF99, 0xEF9A, 0xEF9B, 0xEF9C, 0xEF9D, 0xEF9E, 0xEF9F, 0xEFA0, /* U+9908 */ 0xF040, 0xF041, 0xF042, 0xF043, 0xF044, 0xF7D0, 0xF045, 0xF046, /* U+9910 */ 0xB2CD, 0xF047, 0xF048, 0xF049, 0xF04A, 0xF04B, 0xF04C, 0xF04D, /* U+9918 */ 0xF04E, 0xF04F, 0xF050, 0xF051, 0xF052, 0xF053, 0xF054, 0xF055, /* U+9920 */ 0xF056, 0xF057, 0xF058, 0xF059, 0xF05A, 0xF05B, 0xF05C, 0xF05D, /* U+9928 */ 0xF05E, 0xF05F, 0xF060, 0xF061, 0xF062, 0xF063, 0xF7D1, 0xF064, /* U+9930 */ 0xF065, 0xF066, 0xF067, 0xF068, 0xF069, 0xF06A, 0xF06B, 0xF06C, /* U+9938 */ 0xF06D, 0xF06E, 0xF06F, 0xF070, 0xF071, 0xF072, 0xF073, 0xF074, /* U+9940 */ 0xF075, 0xF076, 0xF077, 0xF078, 0xF079, 0xF07A, 0xF07B, 0xF07C, /* U+9948 */ 0xF07D, 0xF07E, 0xF080, 0xF081, 0xF082, 0xF083, 0xF084, 0xF085, /* U+9950 */ 0xF086, 0xF087, 0xF088, 0xF089, 0xF7D3, 0xF7D2, 0xF08A, 0xF08B, /* U+9958 */ 0xF08C, 0xF08D, 0xF08E, 0xF08F, 0xF090, 0xF091, 0xF092, 0xF093, /* U+9960 */ 0xF094, 0xF095, 0xF096, 0xE2BB, 0xF097, 0xBCA2, 0xF098, 0xE2BC, /* U+9968 */ 0xE2BD, 0xE2BE, 0xE2BF, 0xE2C0, 0xE2C1, 0xB7B9, 0xD2FB, 0xBDA4, /* U+9970 */ 0xCACE, 0xB1A5, 0xCBC7, 0xF099, 0xE2C2, 0xB6FC, 0xC8C4, 0xE2C3, /* U+9978 */ 0xF09A, 0xF09B, 0xBDC8, 0xF09C, 0xB1FD, 0xE2C4, 0xF09D, 0xB6F6, /* U+9980 */ 0xE2C5, 0xC4D9, 0xF09E, 0xF09F, 0xE2C6, 0xCFDA, 0xB9DD, 0xE2C7, /* U+9988 */ 0xC0A1, 0xF0A0, 0xE2C8, 0xB2F6, 0xF140, 0xE2C9, 0xF141, 0xC1F3, /* U+9990 */ 0xE2CA, 0xE2CB, 0xC2F8, 0xE2CC, 0xE2CD, 0xE2CE, 0xCAD7, 0xD8B8, /* U+9998 */ 0xD9E5, 0xCFE3, 0xF142, 0xF143, 0xF144, 0xF145, 0xF146, 0xF147, /* U+99A0 */ 0xF148, 0xF149, 0xF14A, 0xF14B, 0xF14C, 0xF0A5, 0xF14D, 0xF14E, /* U+99A8 */ 0xDCB0, 0xF14F, 0xF150, 0xF151, 0xF152, 0xF153, 0xF154, 0xF155, /* U+99B0 */ 0xF156, 0xF157, 0xF158, 0xF159, 0xF15A, 0xF15B, 0xF15C, 0xF15D, /* U+99B8 */ 0xF15E, 0xF15F, 0xF160, 0xF161, 0xF162, 0xF163, 0xF164, 0xF165, /* U+99C0 */ 0xF166, 0xF167, 0xF168, 0xF169, 0xF16A, 0xF16B, 0xF16C, 0xF16D, /* U+99C8 */ 0xF16E, 0xF16F, 0xF170, 0xF171, 0xF172, 0xF173, 0xF174, 0xF175, /* U+99D0 */ 0xF176, 0xF177, 0xF178, 0xF179, 0xF17A, 0xF17B, 0xF17C, 0xF17D, /* U+99D8 */ 0xF17E, 0xF180, 0xF181, 0xF182, 0xF183, 0xF184, 0xF185, 0xF186, /* U+99E0 */ 0xF187, 0xF188, 0xF189, 0xF18A, 0xF18B, 0xF18C, 0xF18D, 0xF18E, /* U+99E8 */ 0xF18F, 0xF190, 0xF191, 0xF192, 0xF193, 0xF194, 0xF195, 0xF196, /* U+99F0 */ 0xF197, 0xF198, 0xF199, 0xF19A, 0xF19B, 0xF19C, 0xF19D, 0xF19E, /* U+99F8 */ 0xF19F, 0xF1A0, 0xF240, 0xF241, 0xF242, 0xF243, 0xF244, 0xF245, /* U+9A00 */ 0xF246, 0xF247, 0xF248, 0xF249, 0xF24A, 0xF24B, 0xF24C, 0xF24D, /* U+9A08 */ 0xF24E, 0xF24F, 0xF250, 0xF251, 0xF252, 0xF253, 0xF254, 0xF255, /* U+9A10 */ 0xF256, 0xF257, 0xF258, 0xF259, 0xF25A, 0xF25B, 0xF25C, 0xF25D, /* U+9A18 */ 0xF25E, 0xF25F, 0xF260, 0xF261, 0xF262, 0xF263, 0xF264, 0xF265, /* U+9A20 */ 0xF266, 0xF267, 0xF268, 0xF269, 0xF26A, 0xF26B, 0xF26C, 0xF26D, /* U+9A28 */ 0xF26E, 0xF26F, 0xF270, 0xF271, 0xF272, 0xF273, 0xF274, 0xF275, /* U+9A30 */ 0xF276, 0xF277, 0xF278, 0xF279, 0xF27A, 0xF27B, 0xF27C, 0xF27D, /* U+9A38 */ 0xF27E, 0xF280, 0xF281, 0xF282, 0xF283, 0xF284, 0xF285, 0xF286, /* U+9A40 */ 0xF287, 0xF288, 0xF289, 0xF28A, 0xF28B, 0xF28C, 0xF28D, 0xF28E, /* U+9A48 */ 0xF28F, 0xF290, 0xF291, 0xF292, 0xF293, 0xF294, 0xF295, 0xF296, /* U+9A50 */ 0xF297, 0xF298, 0xF299, 0xF29A, 0xF29B, 0xF29C, 0xF29D, 0xF29E, /* U+9A58 */ 0xF29F, 0xF2A0, 0xF340, 0xF341, 0xF342, 0xF343, 0xF344, 0xF345, /* U+9A60 */ 0xF346, 0xF347, 0xF348, 0xF349, 0xF34A, 0xF34B, 0xF34C, 0xF34D, /* U+9A68 */ 0xF34E, 0xF34F, 0xF350, 0xF351, 0xC2ED, 0xD4A6, 0xCDD4, 0xD1B1, /* U+9A70 */ 0xB3DB, 0xC7FD, 0xF352, 0xB2B5, 0xC2BF, 0xE6E0, 0xCABB, 0xE6E1, /* U+9A78 */ 0xE6E2, 0xBED4, 0xE6E3, 0xD7A4, 0xCDD5, 0xE6E5, 0xBCDD, 0xE6E4, /* U+9A80 */ 0xE6E6, 0xE6E7, 0xC2EE, 0xF353, 0xBDBE, 0xE6E8, 0xC2E6, 0xBAA7, /* U+9A88 */ 0xE6E9, 0xF354, 0xE6EA, 0xB3D2, 0xD1E9, 0xF355, 0xF356, 0xBFA5, /* U+9A90 */ 0xE6EB, 0xC6EF, 0xE6EC, 0xE6ED, 0xF357, 0xF358, 0xE6EE, 0xC6AD, /* U+9A98 */ 0xE6EF, 0xF359, 0xC9A7, 0xE6F0, 0xE6F1, 0xE6F2, 0xE5B9, 0xE6F3, /* U+9AA0 */ 0xE6F4, 0xC2E2, 0xE6F5, 0xE6F6, 0xD6E8, 0xE6F7, 0xF35A, 0xE6F8, /* U+9AA8 */ 0xB9C7, 0xF35B, 0xF35C, 0xF35D, 0xF35E, 0xF35F, 0xF360, 0xF361, /* U+9AB0 */ 0xF7BB, 0xF7BA, 0xF362, 0xF363, 0xF364, 0xF365, 0xF7BE, 0xF7BC, /* U+9AB8 */ 0xBAA1, 0xF366, 0xF7BF, 0xF367, 0xF7C0, 0xF368, 0xF369, 0xF36A, /* U+9AC0 */ 0xF7C2, 0xF7C1, 0xF7C4, 0xF36B, 0xF36C, 0xF7C3, 0xF36D, 0xF36E, /* U+9AC8 */ 0xF36F, 0xF370, 0xF371, 0xF7C5, 0xF7C6, 0xF372, 0xF373, 0xF374, /* U+9AD0 */ 0xF375, 0xF7C7, 0xF376, 0xCBE8, 0xF377, 0xF378, 0xF379, 0xF37A, /* U+9AD8 */ 0xB8DF, 0xF37B, 0xF37C, 0xF37D, 0xF37E, 0xF380, 0xF381, 0xF7D4, /* U+9AE0 */ 0xF382, 0xF7D5, 0xF383, 0xF384, 0xF385, 0xF386, 0xF7D6, 0xF387, /* U+9AE8 */ 0xF388, 0xF389, 0xF38A, 0xF7D8, 0xF38B, 0xF7DA, 0xF38C, 0xF7D7, /* U+9AF0 */ 0xF38D, 0xF38E, 0xF38F, 0xF390, 0xF391, 0xF392, 0xF393, 0xF394, /* U+9AF8 */ 0xF395, 0xF7DB, 0xF396, 0xF7D9, 0xF397, 0xF398, 0xF399, 0xF39A, /* U+9B00 */ 0xF39B, 0xF39C, 0xF39D, 0xD7D7, 0xF39E, 0xF39F, 0xF3A0, 0xF440, /* U+9B08 */ 0xF7DC, 0xF441, 0xF442, 0xF443, 0xF444, 0xF445, 0xF446, 0xF7DD, /* U+9B10 */ 0xF447, 0xF448, 0xF449, 0xF7DE, 0xF44A, 0xF44B, 0xF44C, 0xF44D, /* U+9B18 */ 0xF44E, 0xF44F, 0xF450, 0xF451, 0xF452, 0xF453, 0xF454, 0xF7DF, /* U+9B20 */ 0xF455, 0xF456, 0xF457, 0xF7E0, 0xF458, 0xF459, 0xF45A, 0xF45B, /* U+9B28 */ 0xF45C, 0xF45D, 0xF45E, 0xF45F, 0xF460, 0xF461, 0xF462, 0xDBCB, /* U+9B30 */ 0xF463, 0xF464, 0xD8AA, 0xF465, 0xF466, 0xF467, 0xF468, 0xF469, /* U+9B38 */ 0xF46A, 0xF46B, 0xF46C, 0xE5F7, 0xB9ED, 0xF46D, 0xF46E, 0xF46F, /* U+9B40 */ 0xF470, 0xBFFD, 0xBBEA, 0xF7C9, 0xC6C7, 0xF7C8, 0xF471, 0xF7CA, /* U+9B48 */ 0xF7CC, 0xF7CB, 0xF472, 0xF473, 0xF474, 0xF7CD, 0xF475, 0xCEBA, /* U+9B50 */ 0xF476, 0xF7CE, 0xF477, 0xF478, 0xC4A7, 0xF479, 0xF47A, 0xF47B, /* U+9B58 */ 0xF47C, 0xF47D, 0xF47E, 0xF480, 0xF481, 0xF482, 0xF483, 0xF484, /* U+9B60 */ 0xF485, 0xF486, 0xF487, 0xF488, 0xF489, 0xF48A, 0xF48B, 0xF48C, /* U+9B68 */ 0xF48D, 0xF48E, 0xF48F, 0xF490, 0xF491, 0xF492, 0xF493, 0xF494, /* U+9B70 */ 0xF495, 0xF496, 0xF497, 0xF498, 0xF499, 0xF49A, 0xF49B, 0xF49C, /* U+9B78 */ 0xF49D, 0xF49E, 0xF49F, 0xF4A0, 0xF540, 0xF541, 0xF542, 0xF543, /* U+9B80 */ 0xF544, 0xF545, 0xF546, 0xF547, 0xF548, 0xF549, 0xF54A, 0xF54B, /* U+9B88 */ 0xF54C, 0xF54D, 0xF54E, 0xF54F, 0xF550, 0xF551, 0xF552, 0xF553, /* U+9B90 */ 0xF554, 0xF555, 0xF556, 0xF557, 0xF558, 0xF559, 0xF55A, 0xF55B, /* U+9B98 */ 0xF55C, 0xF55D, 0xF55E, 0xF55F, 0xF560, 0xF561, 0xF562, 0xF563, /* U+9BA0 */ 0xF564, 0xF565, 0xF566, 0xF567, 0xF568, 0xF569, 0xF56A, 0xF56B, /* U+9BA8 */ 0xF56C, 0xF56D, 0xF56E, 0xF56F, 0xF570, 0xF571, 0xF572, 0xF573, /* U+9BB0 */ 0xF574, 0xF575, 0xF576, 0xF577, 0xF578, 0xF579, 0xF57A, 0xF57B, /* U+9BB8 */ 0xF57C, 0xF57D, 0xF57E, 0xF580, 0xF581, 0xF582, 0xF583, 0xF584, /* U+9BC0 */ 0xF585, 0xF586, 0xF587, 0xF588, 0xF589, 0xF58A, 0xF58B, 0xF58C, /* U+9BC8 */ 0xF58D, 0xF58E, 0xF58F, 0xF590, 0xF591, 0xF592, 0xF593, 0xF594, /* U+9BD0 */ 0xF595, 0xF596, 0xF597, 0xF598, 0xF599, 0xF59A, 0xF59B, 0xF59C, /* U+9BD8 */ 0xF59D, 0xF59E, 0xF59F, 0xF5A0, 0xF640, 0xF641, 0xF642, 0xF643, /* U+9BE0 */ 0xF644, 0xF645, 0xF646, 0xF647, 0xF648, 0xF649, 0xF64A, 0xF64B, /* U+9BE8 */ 0xF64C, 0xF64D, 0xF64E, 0xF64F, 0xF650, 0xF651, 0xF652, 0xF653, /* U+9BF0 */ 0xF654, 0xF655, 0xF656, 0xF657, 0xF658, 0xF659, 0xF65A, 0xF65B, /* U+9BF8 */ 0xF65C, 0xF65D, 0xF65E, 0xF65F, 0xF660, 0xF661, 0xF662, 0xF663, /* U+9C00 */ 0xF664, 0xF665, 0xF666, 0xF667, 0xF668, 0xF669, 0xF66A, 0xF66B, /* U+9C08 */ 0xF66C, 0xF66D, 0xF66E, 0xF66F, 0xF670, 0xF671, 0xF672, 0xF673, /* U+9C10 */ 0xF674, 0xF675, 0xF676, 0xF677, 0xF678, 0xF679, 0xF67A, 0xF67B, /* U+9C18 */ 0xF67C, 0xF67D, 0xF67E, 0xF680, 0xF681, 0xF682, 0xF683, 0xF684, /* U+9C20 */ 0xF685, 0xF686, 0xF687, 0xF688, 0xF689, 0xF68A, 0xF68B, 0xF68C, /* U+9C28 */ 0xF68D, 0xF68E, 0xF68F, 0xF690, 0xF691, 0xF692, 0xF693, 0xF694, /* U+9C30 */ 0xF695, 0xF696, 0xF697, 0xF698, 0xF699, 0xF69A, 0xF69B, 0xF69C, /* U+9C38 */ 0xF69D, 0xF69E, 0xF69F, 0xF6A0, 0xF740, 0xF741, 0xF742, 0xF743, /* U+9C40 */ 0xF744, 0xF745, 0xF746, 0xF747, 0xF748, 0xF749, 0xF74A, 0xF74B, /* U+9C48 */ 0xF74C, 0xF74D, 0xF74E, 0xF74F, 0xF750, 0xF751, 0xF752, 0xF753, /* U+9C50 */ 0xF754, 0xF755, 0xF756, 0xF757, 0xF758, 0xF759, 0xF75A, 0xF75B, /* U+9C58 */ 0xF75C, 0xF75D, 0xF75E, 0xF75F, 0xF760, 0xF761, 0xF762, 0xF763, /* U+9C60 */ 0xF764, 0xF765, 0xF766, 0xF767, 0xF768, 0xF769, 0xF76A, 0xF76B, /* U+9C68 */ 0xF76C, 0xF76D, 0xF76E, 0xF76F, 0xF770, 0xF771, 0xF772, 0xF773, /* U+9C70 */ 0xF774, 0xF775, 0xF776, 0xF777, 0xF778, 0xF779, 0xF77A, 0xF77B, /* U+9C78 */ 0xF77C, 0xF77D, 0xF77E, 0xF780, 0xD3E3, 0xF781, 0xF782, 0xF6CF, /* U+9C80 */ 0xF783, 0xC2B3, 0xF6D0, 0xF784, 0xF785, 0xF6D1, 0xF6D2, 0xF6D3, /* U+9C88 */ 0xF6D4, 0xF786, 0xF787, 0xF6D6, 0xF788, 0xB1AB, 0xF6D7, 0xF789, /* U+9C90 */ 0xF6D8, 0xF6D9, 0xF6DA, 0xF78A, 0xF6DB, 0xF6DC, 0xF78B, 0xF78C, /* U+9C98 */ 0xF78D, 0xF78E, 0xF6DD, 0xF6DE, 0xCFCA, 0xF78F, 0xF6DF, 0xF6E0, /* U+9CA0 */ 0xF6E1, 0xF6E2, 0xF6E3, 0xF6E4, 0xC0F0, 0xF6E5, 0xF6E6, 0xF6E7, /* U+9CA8 */ 0xF6E8, 0xF6E9, 0xF790, 0xF6EA, 0xF791, 0xF6EB, 0xF6EC, 0xF792, /* U+9CB0 */ 0xF6ED, 0xF6EE, 0xF6EF, 0xF6F0, 0xF6F1, 0xF6F2, 0xF6F3, 0xF6F4, /* U+9CB8 */ 0xBEA8, 0xF793, 0xF6F5, 0xF6F6, 0xF6F7, 0xF6F8, 0xF794, 0xF795, /* U+9CC0 */ 0xF796, 0xF797, 0xF798, 0xC8FA, 0xF6F9, 0xF6FA, 0xF6FB, 0xF6FC, /* U+9CC8 */ 0xF799, 0xF79A, 0xF6FD, 0xF6FE, 0xF7A1, 0xF7A2, 0xF7A3, 0xF7A4, /* U+9CD0 */ 0xF7A5, 0xF79B, 0xF79C, 0xF7A6, 0xF7A7, 0xF7A8, 0xB1EE, 0xF7A9, /* U+9CD8 */ 0xF7AA, 0xF7AB, 0xF79D, 0xF79E, 0xF7AC, 0xF7AD, 0xC1DB, 0xF7AE, /* U+9CE0 */ 0xF79F, 0xF7A0, 0xF7AF, 0xF840, 0xF841, 0xF842, 0xF843, 0xF844, /* U+9CE8 */ 0xF845, 0xF846, 0xF847, 0xF848, 0xF849, 0xF84A, 0xF84B, 0xF84C, /* U+9CF0 */ 0xF84D, 0xF84E, 0xF84F, 0xF850, 0xF851, 0xF852, 0xF853, 0xF854, /* U+9CF8 */ 0xF855, 0xF856, 0xF857, 0xF858, 0xF859, 0xF85A, 0xF85B, 0xF85C, /* U+9D00 */ 0xF85D, 0xF85E, 0xF85F, 0xF860, 0xF861, 0xF862, 0xF863, 0xF864, /* U+9D08 */ 0xF865, 0xF866, 0xF867, 0xF868, 0xF869, 0xF86A, 0xF86B, 0xF86C, /* U+9D10 */ 0xF86D, 0xF86E, 0xF86F, 0xF870, 0xF871, 0xF872, 0xF873, 0xF874, /* U+9D18 */ 0xF875, 0xF876, 0xF877, 0xF878, 0xF879, 0xF87A, 0xF87B, 0xF87C, /* U+9D20 */ 0xF87D, 0xF87E, 0xF880, 0xF881, 0xF882, 0xF883, 0xF884, 0xF885, /* U+9D28 */ 0xF886, 0xF887, 0xF888, 0xF889, 0xF88A, 0xF88B, 0xF88C, 0xF88D, /* U+9D30 */ 0xF88E, 0xF88F, 0xF890, 0xF891, 0xF892, 0xF893, 0xF894, 0xF895, /* U+9D38 */ 0xF896, 0xF897, 0xF898, 0xF899, 0xF89A, 0xF89B, 0xF89C, 0xF89D, /* U+9D40 */ 0xF89E, 0xF89F, 0xF8A0, 0xF940, 0xF941, 0xF942, 0xF943, 0xF944, /* U+9D48 */ 0xF945, 0xF946, 0xF947, 0xF948, 0xF949, 0xF94A, 0xF94B, 0xF94C, /* U+9D50 */ 0xF94D, 0xF94E, 0xF94F, 0xF950, 0xF951, 0xF952, 0xF953, 0xF954, /* U+9D58 */ 0xF955, 0xF956, 0xF957, 0xF958, 0xF959, 0xF95A, 0xF95B, 0xF95C, /* U+9D60 */ 0xF95D, 0xF95E, 0xF95F, 0xF960, 0xF961, 0xF962, 0xF963, 0xF964, /* U+9D68 */ 0xF965, 0xF966, 0xF967, 0xF968, 0xF969, 0xF96A, 0xF96B, 0xF96C, /* U+9D70 */ 0xF96D, 0xF96E, 0xF96F, 0xF970, 0xF971, 0xF972, 0xF973, 0xF974, /* U+9D78 */ 0xF975, 0xF976, 0xF977, 0xF978, 0xF979, 0xF97A, 0xF97B, 0xF97C, /* U+9D80 */ 0xF97D, 0xF97E, 0xF980, 0xF981, 0xF982, 0xF983, 0xF984, 0xF985, /* U+9D88 */ 0xF986, 0xF987, 0xF988, 0xF989, 0xF98A, 0xF98B, 0xF98C, 0xF98D, /* U+9D90 */ 0xF98E, 0xF98F, 0xF990, 0xF991, 0xF992, 0xF993, 0xF994, 0xF995, /* U+9D98 */ 0xF996, 0xF997, 0xF998, 0xF999, 0xF99A, 0xF99B, 0xF99C, 0xF99D, /* U+9DA0 */ 0xF99E, 0xF99F, 0xF9A0, 0xFA40, 0xFA41, 0xFA42, 0xFA43, 0xFA44, /* U+9DA8 */ 0xFA45, 0xFA46, 0xFA47, 0xFA48, 0xFA49, 0xFA4A, 0xFA4B, 0xFA4C, /* U+9DB0 */ 0xFA4D, 0xFA4E, 0xFA4F, 0xFA50, 0xFA51, 0xFA52, 0xFA53, 0xFA54, /* U+9DB8 */ 0xFA55, 0xFA56, 0xFA57, 0xFA58, 0xFA59, 0xFA5A, 0xFA5B, 0xFA5C, /* U+9DC0 */ 0xFA5D, 0xFA5E, 0xFA5F, 0xFA60, 0xFA61, 0xFA62, 0xFA63, 0xFA64, /* U+9DC8 */ 0xFA65, 0xFA66, 0xFA67, 0xFA68, 0xFA69, 0xFA6A, 0xFA6B, 0xFA6C, /* U+9DD0 */ 0xFA6D, 0xFA6E, 0xFA6F, 0xFA70, 0xFA71, 0xFA72, 0xFA73, 0xFA74, /* U+9DD8 */ 0xFA75, 0xFA76, 0xFA77, 0xFA78, 0xFA79, 0xFA7A, 0xFA7B, 0xFA7C, /* U+9DE0 */ 0xFA7D, 0xFA7E, 0xFA80, 0xFA81, 0xFA82, 0xFA83, 0xFA84, 0xFA85, /* U+9DE8 */ 0xFA86, 0xFA87, 0xFA88, 0xFA89, 0xFA8A, 0xFA8B, 0xFA8C, 0xFA8D, /* U+9DF0 */ 0xFA8E, 0xFA8F, 0xFA90, 0xFA91, 0xFA92, 0xFA93, 0xFA94, 0xFA95, /* U+9DF8 */ 0xFA96, 0xFA97, 0xFA98, 0xFA99, 0xFA9A, 0xFA9B, 0xFA9C, 0xFA9D, /* U+9E00 */ 0xFA9E, 0xFA9F, 0xFAA0, 0xFB40, 0xFB41, 0xFB42, 0xFB43, 0xFB44, /* U+9E08 */ 0xFB45, 0xFB46, 0xFB47, 0xFB48, 0xFB49, 0xFB4A, 0xFB4B, 0xFB4C, /* U+9E10 */ 0xFB4D, 0xFB4E, 0xFB4F, 0xFB50, 0xFB51, 0xFB52, 0xFB53, 0xFB54, /* U+9E18 */ 0xFB55, 0xFB56, 0xFB57, 0xFB58, 0xFB59, 0xFB5A, 0xFB5B, 0xC4F1, /* U+9E20 */ 0xF0AF, 0xBCA6, 0xF0B0, 0xC3F9, 0xFB5C, 0xC5B8, 0xD1BB, 0xFB5D, /* U+9E28 */ 0xF0B1, 0xF0B2, 0xF0B3, 0xF0B4, 0xF0B5, 0xD1BC, 0xFB5E, 0xD1EC, /* U+9E30 */ 0xFB5F, 0xF0B7, 0xF0B6, 0xD4A7, 0xFB60, 0xCDD2, 0xF0B8, 0xF0BA, /* U+9E38 */ 0xF0B9, 0xF0BB, 0xF0BC, 0xFB61, 0xFB62, 0xB8EB, 0xF0BD, 0xBAE8, /* U+9E40 */ 0xFB63, 0xF0BE, 0xF0BF, 0xBEE9, 0xF0C0, 0xB6EC, 0xF0C1, 0xF0C2, /* U+9E48 */ 0xF0C3, 0xF0C4, 0xC8B5, 0xF0C5, 0xF0C6, 0xFB64, 0xF0C7, 0xC5F4, /* U+9E50 */ 0xFB65, 0xF0C8, 0xFB66, 0xFB67, 0xFB68, 0xF0C9, 0xFB69, 0xF0CA, /* U+9E58 */ 0xF7BD, 0xFB6A, 0xF0CB, 0xF0CC, 0xF0CD, 0xFB6B, 0xF0CE, 0xFB6C, /* U+9E60 */ 0xFB6D, 0xFB6E, 0xFB6F, 0xF0CF, 0xBAD7, 0xFB70, 0xF0D0, 0xF0D1, /* U+9E68 */ 0xF0D2, 0xF0D3, 0xF0D4, 0xF0D5, 0xF0D6, 0xF0D8, 0xFB71, 0xFB72, /* U+9E70 */ 0xD3A5, 0xF0D7, 0xFB73, 0xF0D9, 0xFB74, 0xFB75, 0xFB76, 0xFB77, /* U+9E78 */ 0xFB78, 0xFB79, 0xFB7A, 0xFB7B, 0xFB7C, 0xFB7D, 0xF5BA, 0xC2B9, /* U+9E80 */ 0xFB7E, 0xFB80, 0xF7E4, 0xFB81, 0xFB82, 0xFB83, 0xFB84, 0xF7E5, /* U+9E88 */ 0xF7E6, 0xFB85, 0xFB86, 0xF7E7, 0xFB87, 0xFB88, 0xFB89, 0xFB8A, /* U+9E90 */ 0xFB8B, 0xFB8C, 0xF7E8, 0xC2B4, 0xFB8D, 0xFB8E, 0xFB8F, 0xFB90, /* U+9E98 */ 0xFB91, 0xFB92, 0xFB93, 0xFB94, 0xFB95, 0xF7EA, 0xFB96, 0xF7EB, /* U+9EA0 */ 0xFB97, 0xFB98, 0xFB99, 0xFB9A, 0xFB9B, 0xFB9C, 0xC2F3, 0xFB9D, /* U+9EA8 */ 0xFB9E, 0xFB9F, 0xFBA0, 0xFC40, 0xFC41, 0xFC42, 0xFC43, 0xFC44, /* U+9EB0 */ 0xFC45, 0xFC46, 0xFC47, 0xFC48, 0xF4F0, 0xFC49, 0xFC4A, 0xFC4B, /* U+9EB8 */ 0xF4EF, 0xFC4C, 0xFC4D, 0xC2E9, 0xFC4E, 0xF7E1, 0xF7E2, 0xFC4F, /* U+9EC0 */ 0xFC50, 0xFC51, 0xFC52, 0xFC53, 0xBBC6, 0xFC54, 0xFC55, 0xFC56, /* U+9EC8 */ 0xFC57, 0xD9E4, 0xFC58, 0xFC59, 0xFC5A, 0xCAF2, 0xC0E8, 0xF0A4, /* U+9ED0 */ 0xFC5B, 0xBADA, 0xFC5C, 0xFC5D, 0xC7AD, 0xFC5E, 0xFC5F, 0xFC60, /* U+9ED8 */ 0xC4AC, 0xFC61, 0xFC62, 0xF7EC, 0xF7ED, 0xF7EE, 0xFC63, 0xF7F0, /* U+9EE0 */ 0xF7EF, 0xFC64, 0xF7F1, 0xFC65, 0xFC66, 0xF7F4, 0xFC67, 0xF7F3, /* U+9EE8 */ 0xFC68, 0xF7F2, 0xF7F5, 0xFC69, 0xFC6A, 0xFC6B, 0xFC6C, 0xF7F6, /* U+9EF0 */ 0xFC6D, 0xFC6E, 0xFC6F, 0xFC70, 0xFC71, 0xFC72, 0xFC73, 0xFC74, /* U+9EF8 */ 0xFC75, 0xEDE9, 0xFC76, 0xEDEA, 0xEDEB, 0xFC77, 0xF6BC, 0xFC78, /* U+9F00 */ 0xFC79, 0xFC7A, 0xFC7B, 0xFC7C, 0xFC7D, 0xFC7E, 0xFC80, 0xFC81, /* U+9F08 */ 0xFC82, 0xFC83, 0xFC84, 0xF6BD, 0xFC85, 0xF6BE, 0xB6A6, 0xFC86, /* U+9F10 */ 0xD8BE, 0xFC87, 0xFC88, 0xB9C4, 0xFC89, 0xFC8A, 0xFC8B, 0xD8BB, /* U+9F18 */ 0xFC8C, 0xDCB1, 0xFC8D, 0xFC8E, 0xFC8F, 0xFC90, 0xFC91, 0xFC92, /* U+9F20 */ 0xCAF3, 0xFC93, 0xF7F7, 0xFC94, 0xFC95, 0xFC96, 0xFC97, 0xFC98, /* U+9F28 */ 0xFC99, 0xFC9A, 0xFC9B, 0xFC9C, 0xF7F8, 0xFC9D, 0xFC9E, 0xF7F9, /* U+9F30 */ 0xFC9F, 0xFCA0, 0xFD40, 0xFD41, 0xFD42, 0xFD43, 0xFD44, 0xF7FB, /* U+9F38 */ 0xFD45, 0xF7FA, 0xFD46, 0xB1C7, 0xFD47, 0xF7FC, 0xF7FD, 0xFD48, /* U+9F40 */ 0xFD49, 0xFD4A, 0xFD4B, 0xFD4C, 0xF7FE, 0xFD4D, 0xFD4E, 0xFD4F, /* U+9F48 */ 0xFD50, 0xFD51, 0xFD52, 0xFD53, 0xFD54, 0xFD55, 0xFD56, 0xFD57, /* U+9F50 */ 0xC6EB, 0xECB4, 0xFD58, 0xFD59, 0xFD5A, 0xFD5B, 0xFD5C, 0xFD5D, /* U+9F58 */ 0xFD5E, 0xFD5F, 0xFD60, 0xFD61, 0xFD62, 0xFD63, 0xFD64, 0xFD65, /* U+9F60 */ 0xFD66, 0xFD67, 0xFD68, 0xFD69, 0xFD6A, 0xFD6B, 0xFD6C, 0xFD6D, /* U+9F68 */ 0xFD6E, 0xFD6F, 0xFD70, 0xFD71, 0xFD72, 0xFD73, 0xFD74, 0xFD75, /* U+9F70 */ 0xFD76, 0xFD77, 0xFD78, 0xFD79, 0xFD7A, 0xFD7B, 0xFD7C, 0xFD7D, /* U+9F78 */ 0xFD7E, 0xFD80, 0xFD81, 0xFD82, 0xFD83, 0xFD84, 0xFD85, 0xB3DD, /* U+9F80 */ 0xF6B3, 0xFD86, 0xFD87, 0xF6B4, 0xC1E4, 0xF6B5, 0xF6B6, 0xF6B7, /* U+9F88 */ 0xF6B8, 0xF6B9, 0xF6BA, 0xC8A3, 0xF6BB, 0xFD88, 0xFD89, 0xFD8A, /* U+9F90 */ 0xFD8B, 0xFD8C, 0xFD8D, 0xFD8E, 0xFD8F, 0xFD90, 0xFD91, 0xFD92, /* U+9F98 */ 0xFD93, 0xC1FA, 0xB9A8, 0xEDE8, 0xFD94, 0xFD95, 0xFD96, 0xB9EA, /* U+9FA0 */ 0xD9DF, 0xFD97, 0xFD98, 0xFD99, 0xFD9A, 0xFD9B, /* Contiguous area: U+E766 .. U+E864 */ /* U+E766 */ 0xA2AB, 0xA2AC, /* U+E768 */ 0xA2AD, 0xA2AE, 0xA2AF, 0xA2B0, 0x6469, 0xA2E4, 0xA2EF, 0xA2F0, /* U+E770 */ 0xA2FD, 0xA2FE, 0xA4F4, 0xA4F5, 0xA4F6, 0xA4F7, 0xA4F8, 0xA4F9, /* U+E778 */ 0xA4FA, 0xA4FB, 0xA4FC, 0xA4FD, 0xA4FE, 0xA5F7, 0xA5F8, 0xA5F9, /* U+E780 */ 0xA5FA, 0xA5FB, 0xA5FC, 0xA5FD, 0xA5FE, 0xA6B9, 0xA6BA, 0xA6BB, /* U+E788 */ 0xA6BC, 0xA6BD, 0xA6BE, 0xA6BF, 0xA6C0, 0xA6D9, 0xA6DA, 0xA6DB, /* U+E790 */ 0xA6DC, 0xA6DD, 0xA6DE, 0xA6DF, 0xA6EC, 0xA6ED, 0xA6F3, 0xA6F6, /* U+E798 */ 0xA6F7, 0xA6F8, 0xA6F9, 0xA6FA, 0xA6FB, 0xA6FC, 0xA6FD, 0xA6FE, /* U+E7A0 */ 0xA7C2, 0xA7C3, 0xA7C4, 0xA7C5, 0xA7C6, 0xA7C7, 0xA7C8, 0xA7C9, /* U+E7A8 */ 0xA7CA, 0xA7CB, 0xA7CC, 0xA7CD, 0xA7CE, 0xA7CF, 0xA7D0, 0xA7F2, /* U+E7B0 */ 0xA7F3, 0xA7F4, 0xA7F5, 0xA7F6, 0xA7F7, 0xA7F8, 0xA7F9, 0xA7FA, /* U+E7B8 */ 0xA7FB, 0xA7FC, 0xA7FD, 0xA7FE, 0xA896, 0xA897, 0xA898, 0xA899, /* U+E7C0 */ 0xA89A, 0xA89B, 0xA89C, 0xA89D, 0xA89E, 0xA89F, 0xA8A0, 0xA8BC, /* U+E7C8 */ 0x6470, 0xA8C1, 0xA8C2, 0xA8C3, 0xA8C4, 0xA8EA, 0xA8EB, 0xA8EC, /* U+E7D0 */ 0xA8ED, 0xA8EE, 0xA8EF, 0xA8F0, 0xA8F1, 0xA8F2, 0xA8F3, 0xA8F4, /* U+E7D8 */ 0xA8F5, 0xA8F6, 0xA8F7, 0xA8F8, 0xA8F9, 0xA8FA, 0xA8FB, 0xA8FC, /* U+E7E0 */ 0xA8FD, 0xA8FE, 0xA958, 0xA95B, 0xA95D, 0xA95E, 0xA95F, 0x6471, /* U+E7E8 */ 0x6472, 0x6473, 0x6474, 0x6475, 0x6476, 0x6477, 0x6478, 0x6479, /* U+E7F0 */ 0x6480, 0x6481, 0x6482, 0x6483, 0xA997, 0xA998, 0xA999, 0xA99A, /* U+E7F8 */ 0xA99B, 0xA99C, 0xA99D, 0xA99E, 0xA99F, 0xA9A0, 0xA9A1, 0xA9A2, /* U+E800 */ 0xA9A3, 0xA9F0, 0xA9F1, 0xA9F2, 0xA9F3, 0xA9F4, 0xA9F5, 0xA9F6, /* U+E808 */ 0xA9F7, 0xA9F8, 0xA9F9, 0xA9FA, 0xA9FB, 0xA9FC, 0xA9FD, 0xA9FE, /* U+E810 */ 0xD7FA, 0xD7FB, 0xD7FC, 0xD7FD, 0xD7FE, 0x6484, 0xFE51, 0xFE52, /* U+E818 */ 0xFE53, 0x6485, 0x6486, 0x6487, 0x6488, 0x6489, 0xFE59, 0x6490, /* U+E820 */ 0x6491, 0x6492, 0x6493, 0x6494, 0x6495, 0x6496, 0xFE61, 0x6497, /* U+E828 */ 0x6498, 0x6499, 0x64A0, 0xFE66, 0xFE67, 0x64A1, 0x64A2, 0x64A3, /* U+E830 */ 0x64A4, 0xFE6C, 0xFE6D, 0x64A5, 0x64A6, 0x64A7, 0x64A8, 0x64A9, /* U+E838 */ 0x64B0, 0x64B1, 0x64B2, 0xFE76, 0x64B3, 0x64B4, 0x64B5, 0x64B6, /* U+E840 */ 0x64B7, 0x64B8, 0x64B9, 0xFE7E, 0x64C0, 0x64C1, 0x64C2, 0x64C3, /* U+E848 */ 0x64C4, 0x64C5, 0x64C6, 0x64C7, 0x64C8, 0x64C9, 0x64D0, 0x64D1, /* U+E850 */ 0x64D2, 0x64D3, 0x64D4, 0x64D5, 0xFE90, 0xFE91, 0x64D6, 0x64D7, /* U+E858 */ 0x64D8, 0x64D9, 0x64E0, 0x64E1, 0x64E2, 0x64E3, 0x64E4, 0x64E5, /* U+E860 */ 0x64E6, 0x64E7, 0x64E8, 0x64E9, 0xFEA0, /* Contiguous area: U+F92C .. U+FA29 */ /* U+F92C */ 0xFD9C, 0x7045, 0x7046, 0x7047, /* U+F930 */ 0x7048, 0x7049, 0x7050, 0x7051, 0x7052, 0x7053, 0x7054, 0x7055, /* U+F938 */ 0x7056, 0x7057, 0x7058, 0x7059, 0x7060, 0x7061, 0x7062, 0x7063, /* U+F940 */ 0x7064, 0x7065, 0x7066, 0x7067, 0x7068, 0x7069, 0x7070, 0x7071, /* U+F948 */ 0x7072, 0x7073, 0x7074, 0x7075, 0x7076, 0x7077, 0x7078, 0x7079, /* U+F950 */ 0x7080, 0x7081, 0x7082, 0x7083, 0x7084, 0x7085, 0x7086, 0x7087, /* U+F958 */ 0x7088, 0x7089, 0x7090, 0x7091, 0x7092, 0x7093, 0x7094, 0x7095, /* U+F960 */ 0x7096, 0x7097, 0x7098, 0x7099, 0x70A0, 0x70A1, 0x70A2, 0x70A3, /* U+F968 */ 0x70A4, 0x70A5, 0x70A6, 0x70A7, 0x70A8, 0x70A9, 0x70B0, 0x70B1, /* U+F970 */ 0x70B2, 0x70B3, 0x70B4, 0x70B5, 0x70B6, 0x70B7, 0x70B8, 0x70B9, /* U+F978 */ 0x70C0, 0xFD9D, 0x70C1, 0x70C2, 0x70C3, 0x70C4, 0x70C5, 0x70C6, /* U+F980 */ 0x70C7, 0x70C8, 0x70C9, 0x70D0, 0x70D1, 0x70D2, 0x70D3, 0x70D4, /* U+F988 */ 0x70D5, 0x70D6, 0x70D7, 0x70D8, 0x70D9, 0x70E0, 0x70E1, 0x70E2, /* U+F990 */ 0x70E3, 0x70E4, 0x70E5, 0x70E6, 0x70E7, 0xFD9E, 0x70E8, 0x70E9, /* U+F998 */ 0x70F0, 0x70F1, 0x70F2, 0x70F3, 0x70F4, 0x70F5, 0x70F6, 0x70F7, /* U+F9A0 */ 0x70F8, 0x70F9, 0x7100, 0x7101, 0x7102, 0x7103, 0x7104, 0x7105, /* U+F9A8 */ 0x7106, 0x7107, 0x7108, 0x7109, 0x7110, 0x7111, 0x7112, 0x7113, /* U+F9B0 */ 0x7114, 0x7115, 0x7116, 0x7117, 0x7118, 0x7119, 0x7120, 0x7121, /* U+F9B8 */ 0x7122, 0x7123, 0x7124, 0x7125, 0x7126, 0x7127, 0x7128, 0x7129, /* U+F9C0 */ 0x7130, 0x7131, 0x7132, 0x7133, 0x7134, 0x7135, 0x7136, 0x7137, /* U+F9C8 */ 0x7138, 0x7139, 0x7140, 0x7141, 0x7142, 0x7143, 0x7144, 0x7145, /* U+F9D0 */ 0x7146, 0x7147, 0x7148, 0x7149, 0x7150, 0x7151, 0x7152, 0x7153, /* U+F9D8 */ 0x7154, 0x7155, 0x7156, 0x7157, 0x7158, 0x7159, 0x7160, 0x7161, /* U+F9E0 */ 0x7162, 0x7163, 0x7164, 0x7165, 0x7166, 0x7167, 0x7168, 0xFD9F, /* U+F9E8 */ 0x7169, 0x7170, 0x7171, 0x7172, 0x7173, 0x7174, 0x7175, 0x7176, /* U+F9F0 */ 0x7177, 0xFDA0, 0x7178, 0x7179, 0x7180, 0x7181, 0x7182, 0x7183, /* U+F9F8 */ 0x7184, 0x7185, 0x7186, 0x7187, 0x7188, 0x7189, 0x7190, 0x7191, /* U+FA00 */ 0x7192, 0x7193, 0x7194, 0x7195, 0x7196, 0x7197, 0x7198, 0x7199, /* U+FA08 */ 0x71A0, 0x71A1, 0x71A2, 0x71A3, 0xFE40, 0xFE41, 0xFE42, 0xFE43, /* U+FA10 */ 0x71A4, 0xFE44, 0x71A5, 0xFE45, 0xFE46, 0x71A6, 0x71A7, 0x71A8, /* U+FA18 */ 0xFE47, 0x71A9, 0x71B0, 0x71B1, 0x71B2, 0x71B3, 0x71B4, 0xFE48, /* U+FA20 */ 0xFE49, 0xFE4A, 0x71B5, 0xFE4B, 0xFE4C, 0x71B6, 0x71B7, 0xFE4D, /* U+FA28 */ 0xFE4E, 0xFE4F, /* Contiguous area: U+FE30 .. U+FFE5 */ /* U+FE30 */ 0xA955, 0xA6F2, 0x7848, 0xA6F4, 0xA6F5, 0xA6E0, 0xA6E1, 0xA6F0, /* U+FE38 */ 0xA6F1, 0xA6E2, 0xA6E3, 0xA6EE, 0xA6EF, 0xA6E6, 0xA6E7, 0xA6E4, /* U+FE40 */ 0xA6E5, 0xA6E8, 0xA6E9, 0xA6EA, 0xA6EB, 0x7849, 0x7850, 0x7851, /* U+FE48 */ 0x7852, 0xA968, 0xA969, 0xA96A, 0xA96B, 0xA96C, 0xA96D, 0xA96E, /* U+FE50 */ 0xA96F, 0xA970, 0xA971, 0x7853, 0xA972, 0xA973, 0xA974, 0xA975, /* U+FE58 */ 0x7854, 0xA976, 0xA977, 0xA978, 0xA979, 0xA97A, 0xA97B, 0xA97C, /* U+FE60 */ 0xA97D, 0xA97E, 0xA980, 0xA981, 0xA982, 0xA983, 0xA984, 0x7855, /* U+FE68 */ 0xA985, 0xA986, 0xA987, 0xA988, 0x7856, 0x7857, 0x7858, 0x7859, /* U+FE70 */ 0x7860, 0x7861, 0x7862, 0x7863, 0x7864, 0x7865, 0x7866, 0x7867, /* U+FE78 */ 0x7868, 0x7869, 0x7870, 0x7871, 0x7872, 0x7873, 0x7874, 0x7875, /* U+FE80 */ 0x7876, 0x7877, 0x7878, 0x7879, 0x7880, 0x7881, 0x7882, 0x7883, /* U+FE88 */ 0x7884, 0x7885, 0x7886, 0x7887, 0x7888, 0x7889, 0x7890, 0x7891, /* U+FE90 */ 0x7892, 0x7893, 0x7894, 0x7895, 0x7896, 0x7897, 0x7898, 0x7899, /* U+FE98 */ 0x78A0, 0x78A1, 0x78A2, 0x78A3, 0x78A4, 0x78A5, 0x78A6, 0x78A7, /* U+FEA0 */ 0x78A8, 0x78A9, 0x78B0, 0x78B1, 0x78B2, 0x78B3, 0x78B4, 0x78B5, /* U+FEA8 */ 0x78B6, 0x78B7, 0x78B8, 0x78B9, 0x78C0, 0x78C1, 0x78C2, 0x78C3, /* U+FEB0 */ 0x78C4, 0x78C5, 0x78C6, 0x78C7, 0x78C8, 0x78C9, 0x78D0, 0x78D1, /* U+FEB8 */ 0x78D2, 0x78D3, 0x78D4, 0x78D5, 0x78D6, 0x78D7, 0x78D8, 0x78D9, /* U+FEC0 */ 0x78E0, 0x78E1, 0x78E2, 0x78E3, 0x78E4, 0x78E5, 0x78E6, 0x78E7, /* U+FEC8 */ 0x78E8, 0x78E9, 0x78F0, 0x78F1, 0x78F2, 0x78F3, 0x78F4, 0x78F5, /* U+FED0 */ 0x78F6, 0x78F7, 0x78F8, 0x78F9, 0x7900, 0x7901, 0x7902, 0x7903, /* U+FED8 */ 0x7904, 0x7905, 0x7906, 0x7907, 0x7908, 0x7909, 0x7910, 0x7911, /* U+FEE0 */ 0x7912, 0x7913, 0x7914, 0x7915, 0x7916, 0x7917, 0x7918, 0x7919, /* U+FEE8 */ 0x7920, 0x7921, 0x7922, 0x7923, 0x7924, 0x7925, 0x7926, 0x7927, /* U+FEF0 */ 0x7928, 0x7929, 0x7930, 0x7931, 0x7932, 0x7933, 0x7934, 0x7935, /* U+FEF8 */ 0x7936, 0x7937, 0x7938, 0x7939, 0x7940, 0x7941, 0x7942, 0x7943, /* U+FF00 */ 0x7944, 0xA3A1, 0xA3A2, 0xA3A3, 0xA1E7, 0xA3A5, 0xA3A6, 0xA3A7, /* U+FF08 */ 0xA3A8, 0xA3A9, 0xA3AA, 0xA3AB, 0xA3AC, 0xA3AD, 0xA3AE, 0xA3AF, /* U+FF10 */ 0xA3B0, 0xA3B1, 0xA3B2, 0xA3B3, 0xA3B4, 0xA3B5, 0xA3B6, 0xA3B7, /* U+FF18 */ 0xA3B8, 0xA3B9, 0xA3BA, 0xA3BB, 0xA3BC, 0xA3BD, 0xA3BE, 0xA3BF, /* U+FF20 */ 0xA3C0, 0xA3C1, 0xA3C2, 0xA3C3, 0xA3C4, 0xA3C5, 0xA3C6, 0xA3C7, /* U+FF28 */ 0xA3C8, 0xA3C9, 0xA3CA, 0xA3CB, 0xA3CC, 0xA3CD, 0xA3CE, 0xA3CF, /* U+FF30 */ 0xA3D0, 0xA3D1, 0xA3D2, 0xA3D3, 0xA3D4, 0xA3D5, 0xA3D6, 0xA3D7, /* U+FF38 */ 0xA3D8, 0xA3D9, 0xA3DA, 0xA3DB, 0xA3DC, 0xA3DD, 0xA3DE, 0xA3DF, /* U+FF40 */ 0xA3E0, 0xA3E1, 0xA3E2, 0xA3E3, 0xA3E4, 0xA3E5, 0xA3E6, 0xA3E7, /* U+FF48 */ 0xA3E8, 0xA3E9, 0xA3EA, 0xA3EB, 0xA3EC, 0xA3ED, 0xA3EE, 0xA3EF, /* U+FF50 */ 0xA3F0, 0xA3F1, 0xA3F2, 0xA3F3, 0xA3F4, 0xA3F5, 0xA3F6, 0xA3F7, /* U+FF58 */ 0xA3F8, 0xA3F9, 0xA3FA, 0xA3FB, 0xA3FC, 0xA3FD, 0xA1AB, 0x7945, /* U+FF60 */ 0x7946, 0x7947, 0x7948, 0x7949, 0x7950, 0x7951, 0x7952, 0x7953, /* U+FF68 */ 0x7954, 0x7955, 0x7956, 0x7957, 0x7958, 0x7959, 0x7960, 0x7961, /* U+FF70 */ 0x7962, 0x7963, 0x7964, 0x7965, 0x7966, 0x7967, 0x7968, 0x7969, /* U+FF78 */ 0x7970, 0x7971, 0x7972, 0x7973, 0x7974, 0x7975, 0x7976, 0x7977, /* U+FF80 */ 0x7978, 0x7979, 0x7980, 0x7981, 0x7982, 0x7983, 0x7984, 0x7985, /* U+FF88 */ 0x7986, 0x7987, 0x7988, 0x7989, 0x7990, 0x7991, 0x7992, 0x7993, /* U+FF90 */ 0x7994, 0x7995, 0x7996, 0x7997, 0x7998, 0x7999, 0x79A0, 0x79A1, /* U+FF98 */ 0x79A2, 0x79A3, 0x79A4, 0x79A5, 0x79A6, 0x79A7, 0x79A8, 0x79A9, /* U+FFA0 */ 0x79B0, 0x79B1, 0x79B2, 0x79B3, 0x79B4, 0x79B5, 0x79B6, 0x79B7, /* U+FFA8 */ 0x79B8, 0x79B9, 0x79C0, 0x79C1, 0x79C2, 0x79C3, 0x79C4, 0x79C5, /* U+FFB0 */ 0x79C6, 0x79C7, 0x79C8, 0x79C9, 0x79D0, 0x79D1, 0x79D2, 0x79D3, /* U+FFB8 */ 0x79D4, 0x79D5, 0x79D6, 0x79D7, 0x79D8, 0x79D9, 0x79E0, 0x79E1, /* U+FFC0 */ 0x79E2, 0x79E3, 0x79E4, 0x79E5, 0x79E6, 0x79E7, 0x79E8, 0x79E9, /* U+FFC8 */ 0x79F0, 0x79F1, 0x79F2, 0x79F3, 0x79F4, 0x79F5, 0x79F6, 0x79F7, /* U+FFD0 */ 0x79F8, 0x79F9, 0x7A00, 0x7A01, 0x7A02, 0x7A03, 0x7A04, 0x7A05, /* U+FFD8 */ 0x7A06, 0x7A07, 0x7A08, 0x7A09, 0x7A10, 0x7A11, 0x7A12, 0x7A13, /* U+FFE0 */ 0xA1E9, 0xA1EA, 0xA956, 0xA3FE, 0xA957, 0xA3A4, }; static inline bool InRange(unsigned c, unsigned lower, unsigned upper) { return c >= lower && c <= upper; } static inline unsigned gb4lin_to_gb(unsigned gb4lin) { unsigned a, b, c, d; a = 0x81 + gb4lin / 12600; b = 0x30 + (gb4lin / 1260) % 10; c = 0x81 + (gb4lin / 10) % 126; d = 0x30 + gb4lin % 10; return ((a << 24) | (b << 16) | (c << 8) | d); } static int qt_UnicodeToGb18030(unsigned uni, uint8_t *gbchar) { /* Returns the bytesize of the GB18030 character. */ unsigned gb, gb4lin; indexTbl_t u2g; if (uni < 0x80) { *gbchar = (uint8_t)uni; return 1; } else if (uni <= 0xD7FF || InRange(uni, 0xE766, 0xFFFF)) { u2g = ucs_to_gb18030_index[uni >> 8]; if ((uint8_t)(uni & 0xFF) >= u2g.tblBegin && (uint8_t)(uni & 0xFF) <= u2g.tblEnd) { // Use mapping table (2-byte or 4-byte GB18030) unsigned tblEntry; tblEntry = ucs_to_gb18030[uni - u2g.tblOffset]; if (tblEntry > 0x8000) { // 2-byte GB18030 gb = tblEntry; } else { // 4-byte GB18030 stored in a special compact format uint8_t a, b; a = 0x81; b = 0x30 + (tblEntry >> 11); if (tblEntry >= 0x7000) { a += 3; b -= 14; } else if (tblEntry >= 0x6000) { a += 2; b -= 6; } else if (tblEntry >= 0x3000) { a += 1; b -= 6; } else if (b >= 0x31) { b += 5; } gbchar[0] = a; gbchar[1] = b; gbchar[2] = 0x81 + ((tblEntry >> 4) & 0x7F); gbchar[3] = 0x30 + (tblEntry & 0xF); return 4; } } else { // 4-byte GB18030 calculated algorithmically gb4lin = u2g.algOffset + (uni & 0xFF); // Yikes, my index table could not cover all the bases... if (InRange(uni, 0x49B8, 0x49FF)) gb4lin -= 11; gb = gb4lin_to_gb(gb4lin); } } else if (InRange(uni, 0xE000, 0xE765)) { // User-defined areas in GB18030 (2-byte) if (uni <= 0xE233) gb = 0xAAA1 + (((uni - 0xE000) / 94) << 8) + (uni - 0xE000) % 94; else if (uni <= 0xE4C5) gb = 0xF8A1 + (((uni - 0xE234) / 94) << 8) + (uni - 0xE234) % 94; else { gb = 0xA140 + (((uni - 0xE4C6) / 96) << 8) + (uni - 0xE4C6) % 96; // Skip the gap at 0x7F if ((gb & 0xFF) >= 0x7F) gb++; } } else if (InRange(uni, 0x10000, 0x10FFFF)) { // Qt 3.x does not support beyond BMP yet, but what the heck... // (U+10000 = GB+90308130) to (U+10FFFF = GB+E3329A35) gb = gb4lin_to_gb(0x1E248 + uni); } else { // Surrogate area and other undefined/reserved areas (discard) *gbchar = 0; return 0; } if (gb <= 0xFFFF) { gbchar[0] = (uint8_t)((gb >> 8) & 0xFF); gbchar[1] = (uint8_t)(gb & 0xFF); return 2; } else { gbchar[0] = (uint8_t)((gb >> 24) & 0xFF); gbchar[1] = (uint8_t)((gb >> 16) & 0xFF); gbchar[2] = (uint8_t)((gb >> 8) & 0xFF); gbchar[3] = (uint8_t)(gb & 0xFF); return 4; } } static int qt_UnicodeToGbk(unsigned uni, uint8_t *gbchar) { /* Returns the bytesize of the GBK character. */ /* Intended for improving performance of GB2312 and GBK functions. */ unsigned gb; indexTbl_t u2g; if (uni < 0x80) { *gbchar = (uint8_t)uni; return 1; } else if (uni <= 0xD7FF || InRange(uni, 0xE766, 0xFFFF)) { u2g = ucs_to_gb18030_index[uni >> 8]; if ((uint8_t)(uni & 0xFF) >= u2g.tblBegin && (uint8_t)(uni & 0xFF) <= u2g.tblEnd) { // Use mapping table (2-byte GBK or 4-byte GB18030) unsigned tblEntry; tblEntry = ucs_to_gb18030[uni - u2g.tblOffset]; if (tblEntry > 0x8000) { // GBK gb = tblEntry; } else { // 4-byte GB18030 stored in a special compact format (discard) *gbchar = 0; return 0; } } else { // 4-byte GB18030 calculated algorithmically (discard) *gbchar = 0; return 0; } } else if (InRange(uni, 0xE000, 0xE765)) { // User-defined areas in GB18030 (2-byte) if (uni <= 0xE233) gb = 0xAAA1 + (((uni - 0xE000) / 94) << 8) + (uni - 0xE000) % 94; else if (uni <= 0xE4C5) gb = 0xF8A1 + (((uni - 0xE234) / 94) << 8) + (uni - 0xE234) % 94; else { gb = 0xA140 + (((uni - 0xE4C6) / 96) << 8) + (uni - 0xE4C6) % 96; // Skip the gap at 0x7F if ((gb & 0xFF) >= 0x7F) gb++; } } else { // Surrogate area and other undefined/reserved areas (discard) *gbchar = 0; return 0; } gbchar[0] = (uint8_t)((gb >> 8) & 0xFF); gbchar[1] = (uint8_t)(gb & 0xFF); return 2; } void GBTextEncoder::EncodeGB18030(const std::wstring& str, std::string& bytes) { static const char replacement = '?'; unsigned high = 0; int invalid = 0; bytes.resize(4 * str.length() + 1); int index = 0; uint8_t buf[4]; for (size_t i = 0; i < str.length(); ++i) { unsigned ch = str[i]; int len; if (high > 0) { if (ZXing::TextUtfEncoding::IsUtf16LowSurrogate(ch)) { // valid surrogate pair ++i; unsigned u = ZXing::TextUtfEncoding::CodePointFromUtf16Surrogates(high, ch); len = qt_UnicodeToGb18030(u, buf); if (len >= 2) { for (int j = 0; j(ch); } else if (ZXing::TextUtfEncoding::IsUtf16HighSurrogate(ch)) { // surrogates area. check for correct encoding // we need at least one more character, first the high surrogate, then the low one high = ch; } else if ((len = qt_UnicodeToGb18030(ch, buf)) >= 2) { for (int j = 0; j(ch); } else if ((qt_UnicodeToGbk(ch, buf) == 2) && (buf[0] >= 0xA1) && (buf[1] >= 0xA1)) { bytes[index++] = buf[0]; bytes[index++] = buf[1]; } else { // Error bytes[index++] = replacement; //++invalid; } } bytes.resize(index); } zxing-cpp-1.0.8+ds2/core/src/textcodec/GBTextEncoder.h000066400000000000000000000033771361167020700224470ustar00rootroot00000000000000#pragma once /**************************************************************************** ** ** Copyright (C) 2015 The Qt Company Ltd. ** Contact: http://www.qt.io/licensing/ ** ** This file is part of the QtCore module of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:LGPL21$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and The Qt Company. For licensing terms ** and conditions see http://www.qt.io/terms-conditions. For further ** information use the contact form at http://www.qt.io/contact-us. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 or version 3 as published by the Free ** Software Foundation and appearing in the file LICENSE.LGPLv21 and ** LICENSE.LGPLv3 included in the packaging of this file. Please review the ** following information to ensure the GNU Lesser General Public License ** requirements will be met: https://www.gnu.org/licenses/lgpl.html and ** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** As a special exception, The Qt Company gives you certain additional ** rights. These rights are described in The Qt Company LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** $QT_END_LICENSE$ ** ****************************************************************************/ #include class GBTextEncoder { public: static void EncodeGB18030(const std::wstring& str, std::string& bytes); static void EncodeGB2312(const std::wstring& str, std::string& bytes); }; zxing-cpp-1.0.8+ds2/core/src/textcodec/JPTextDecoder.cpp000066400000000000000000004605311361167020700230100ustar00rootroot00000000000000/**************************************************************************** ** ** Copyright (C) 2015 The Qt Company Ltd. ** Contact: http://www.qt.io/licensing/ ** ** This file is part of the QtCore module of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:LGPL21$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and The Qt Company. For licensing terms ** and conditions see http://www.qt.io/terms-conditions. For further ** information use the contact form at http://www.qt.io/contact-us. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 or version 3 as published by the Free ** Software Foundation and appearing in the file LICENSE.LGPLv21 and ** LICENSE.LGPLv3 included in the packaging of this file. Please review the ** following information to ensure the GNU Lesser General Public License ** requirements will be met: https://www.gnu.org/licenses/lgpl.html and ** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** As a special exception, The Qt Company gives you certain additional ** rights. These rights are described in The Qt Company LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** $QT_END_LICENSE$ ** ****************************************************************************/ // Most of the code here was originally written by Serika Kurusugawa // a.k.a. Junji Takagi, and is included in Qt with the author's permission, // and the grateful thanks of the Qt team. #include "JPTextDecoder.h" /* * This data is derived from Unicode 1.1, * JIS X 0208 (1990) to Unicode mapping table version 0.9 . * (In addition NEC Vender Defined Char included) */ static unsigned short const jisx0208_to_unicode[] = { /* 0x2121 - 0x217e */ 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, /* 0x2221 - 0x227e */ 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, /* 0x2321 - 0x237e */ 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, 0x0000, 0x0000, 0x0000, 0x0000, /* 0x2421 - 0x247e */ 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, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0x2521 - 0x257e */ 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, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0x2621 - 0x267e */ 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, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0x2721 - 0x277e */ 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, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0x2821 - 0x287e */ 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, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 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, /* 0x2921 - 0x297e */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 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, /* 0x2a21 - 0x2a7e */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 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, /* 0x2b21 - 0x2b7e */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 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, /* 0x2c21 - 0x2c7e */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 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, /* 0x2d21 - 0x2d7e */ 0x2460, 0x2461, 0x2462, 0x2463, 0x2464, 0x2465, 0x2466, 0x2467, 0x2468, 0x2469, 0x246a, 0x246b, 0x246c, 0x246d, 0x246e, 0x246f, 0x2470, 0x2471, 0x2472, 0x2473, 0x2160, 0x2161, 0x2162, 0x2163, 0x2164, 0x2165, 0x2166, 0x2167, 0x2168, 0x2169, 0x0000, 0x3349, 0x3314, 0x3322, 0x334d, 0x3318, 0x3327, 0x3303, 0x3336, 0x3351, 0x3357, 0x330d, 0x3326, 0x3323, 0x332b, 0x334a, 0x333b, 0x339c, 0x339d, 0x339e, 0x338e, 0x338f, 0x33c4, 0x33a1, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x337b, 0x301d, 0x301f, 0x2116, 0x33cd, 0x2121, 0x32a4, 0x32a5, 0x32a6, 0x32a7, 0x32a8, 0x3231, 0x3232, 0x3239, 0x337e, 0x337d, 0x337c, 0x2252, 0x2261, 0x222b, 0x222e, 0x2211, 0x221a, 0x22a5, 0x2220, 0x221f, 0x22bf, 0x2235, 0x2229, 0x222a, 0x0000, 0x0000, /* 0x2e21 - 0x2e7e */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 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, /* 0x2f21 - 0x2f7e */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 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, /* 0x3021 - 0x307e */ 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, /* 0x3121 - 0x317e */ 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, /* 0x3221 - 0x327e */ 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, /* 0x3321 - 0x337e */ 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, /* 0x3421 - 0x347e */ 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, /* 0x3521 - 0x357e */ 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, /* 0x3621 - 0x367e */ 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, /* 0x3721 - 0x377e */ 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, /* 0x3821 - 0x387e */ 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, /* 0x3921 - 0x397e */ 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, /* 0x3a21 - 0x3a7e */ 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, /* 0x3b21 - 0x3b7e */ 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, /* 0x3c21 - 0x3c7e */ 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, /* 0x3d21 - 0x3d7e */ 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, /* 0x3e21 - 0x3e7e */ 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, /* 0x3f21 - 0x3f7e */ 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, /* 0x4021 - 0x407e */ 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, /* 0x4121 - 0x417e */ 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, /* 0x4221 - 0x427e */ 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, /* 0x4321 - 0x437e */ 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, /* 0x4421 - 0x447e */ 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, /* 0x4521 - 0x457e */ 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, /* 0x4621 - 0x467e */ 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, /* 0x4721 - 0x477e */ 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, /* 0x4821 - 0x487e */ 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, /* 0x4921 - 0x497e */ 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, /* 0x4a21 - 0x4a7e */ 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, /* 0x4b21 - 0x4b7e */ 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, /* 0x4c21 - 0x4c7e */ 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, /* 0x4d21 - 0x4d7e */ 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, /* 0x4e21 - 0x4e7e */ 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, /* 0x4f21 - 0x4f7e */ 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, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0x5021 - 0x507e */ 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, /* 0x5121 - 0x517e */ 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, /* 0x5221 - 0x527e */ 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, /* 0x5321 - 0x537e */ 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, /* 0x5421 - 0x547e */ 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, /* 0x5521 - 0x557e */ 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, /* 0x5621 - 0x567e */ 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, /* 0x5721 - 0x577e */ 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, /* 0x5821 - 0x587e */ 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, /* 0x5921 - 0x597e */ 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, /* 0x5a21 - 0x5a7e */ 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, /* 0x5b21 - 0x5b7e */ 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, /* 0x5c21 - 0x5c7e */ 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, /* 0x5d21 - 0x5d7e */ 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, /* 0x5e21 - 0x5e7e */ 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, /* 0x5f21 - 0x5f7e */ 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, /* 0x6021 - 0x607e */ 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, /* 0x6121 - 0x617e */ 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, /* 0x6221 - 0x627e */ 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, /* 0x6321 - 0x637e */ 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, /* 0x6421 - 0x647e */ 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, /* 0x6521 - 0x657e */ 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, /* 0x6621 - 0x667e */ 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, /* 0x6721 - 0x677e */ 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, /* 0x6821 - 0x687e */ 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, /* 0x6921 - 0x697e */ 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, /* 0x6a21 - 0x6a7e */ 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, /* 0x6b21 - 0x6b7e */ 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, /* 0x6c21 - 0x6c7e */ 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, /* 0x6d21 - 0x6d7e */ 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, /* 0x6e21 - 0x6e7e */ 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, /* 0x6f21 - 0x6f7e */ 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, /* 0x7021 - 0x707e */ 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, /* 0x7121 - 0x717e */ 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, /* 0x7221 - 0x727e */ 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, /* 0x7321 - 0x737e */ 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, /* 0x7421 - 0x747e */ 0x582f, 0x69c7, 0x9059, 0x7464, 0x51dc, 0x7199, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0x7521 - 0x757e */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 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, /* 0x7621 - 0x767e */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 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, /* 0x7721 - 0x777e */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 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, /* 0x7821 - 0x787e */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 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, /* 0x7921 - 0x797e */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 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, /* 0x7a21 - 0x7a7e */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 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, /* 0x7b21 - 0x7b7e */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 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, /* 0x7c21 - 0x7c7e */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 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, /* 0x7d21 - 0x7d7e */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 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, /* 0x7e21 - 0x7e7e */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 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, }; ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// /* * This data is derived from Unicode 1.1, * JIS X 0212 (1990) to Unicode mapping table version 0.9 . * (In addition IBM Vender Defined Char included) */ static unsigned short const jisx0212_to_unicode[] = { /* 0x2121 - 0x217e */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 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, /* 0x2221 - 0x227e */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x02d8, 0x02c7, 0x00b8, 0x02d9, 0x02dd, 0x00af, 0x02db, 0x02da, 0x007e, 0x0384, 0x0385, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x00a1, 0x00a6, 0x00bf, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x00ba, 0x00aa, 0x00a9, 0x00ae, 0x2122, 0x00a4, 0x2116, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0x2321 - 0x237e */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 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, /* 0x2421 - 0x247e */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 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, /* 0x2521 - 0x257e */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 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, /* 0x2621 - 0x267e */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0386, 0x0388, 0x0389, 0x038a, 0x03aa, 0x0000, 0x038c, 0x0000, 0x038e, 0x03ab, 0x0000, 0x038f, 0x0000, 0x0000, 0x0000, 0x0000, 0x03ac, 0x03ad, 0x03ae, 0x03af, 0x03ca, 0x0390, 0x03cc, 0x03c2, 0x03cd, 0x03cb, 0x03b0, 0x03ce, 0x0000, 0x0000, /* 0x2721 - 0x277e */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0402, 0x0403, 0x0404, 0x0405, 0x0406, 0x0407, 0x0408, 0x0409, 0x040a, 0x040b, 0x040c, 0x040e, 0x040f, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0452, 0x0453, 0x0454, 0x0455, 0x0456, 0x0457, 0x0458, 0x0459, 0x045a, 0x045b, 0x045c, 0x045e, 0x045f, /* 0x2821 - 0x287e */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 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, /* 0x2921 - 0x297e */ 0x00c6, 0x0110, 0x0000, 0x0126, 0x0000, 0x0132, 0x0000, 0x0141, 0x013f, 0x0000, 0x014a, 0x00d8, 0x0152, 0x0000, 0x0166, 0x00de, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x00e6, 0x0111, 0x00f0, 0x0127, 0x0131, 0x0133, 0x0138, 0x0142, 0x0140, 0x0149, 0x014b, 0x00f8, 0x0153, 0x00df, 0x0167, 0x00fe, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0x2a21 - 0x2a7e */ 0x00c1, 0x00c0, 0x00c4, 0x00c2, 0x0102, 0x01cd, 0x0100, 0x0104, 0x00c5, 0x00c3, 0x0106, 0x0108, 0x010c, 0x00c7, 0x010a, 0x010e, 0x00c9, 0x00c8, 0x00cb, 0x00ca, 0x011a, 0x0116, 0x0112, 0x0118, 0x0000, 0x011c, 0x011e, 0x0122, 0x0120, 0x0124, 0x00cd, 0x00cc, 0x00cf, 0x00ce, 0x01cf, 0x0130, 0x012a, 0x012e, 0x0128, 0x0134, 0x0136, 0x0139, 0x013d, 0x013b, 0x0143, 0x0147, 0x0145, 0x00d1, 0x00d3, 0x00d2, 0x00d6, 0x00d4, 0x01d1, 0x0150, 0x014c, 0x00d5, 0x0154, 0x0158, 0x0156, 0x015a, 0x015c, 0x0160, 0x015e, 0x0164, 0x0162, 0x00da, 0x00d9, 0x00dc, 0x00db, 0x016c, 0x01d3, 0x0170, 0x016a, 0x0172, 0x016e, 0x0168, 0x01d7, 0x01db, 0x01d9, 0x01d5, 0x0174, 0x00dd, 0x0178, 0x0176, 0x0179, 0x017d, 0x017b, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0x2b21 - 0x2b7e */ 0x00e1, 0x00e0, 0x00e4, 0x00e2, 0x0103, 0x01ce, 0x0101, 0x0105, 0x00e5, 0x00e3, 0x0107, 0x0109, 0x010d, 0x00e7, 0x010b, 0x010f, 0x00e9, 0x00e8, 0x00eb, 0x00ea, 0x011b, 0x0117, 0x0113, 0x0119, 0x01f5, 0x011d, 0x011f, 0x0000, 0x0121, 0x0125, 0x00ed, 0x00ec, 0x00ef, 0x00ee, 0x01d0, 0x0000, 0x012b, 0x012f, 0x0129, 0x0135, 0x0137, 0x013a, 0x013e, 0x013c, 0x0144, 0x0148, 0x0146, 0x00f1, 0x00f3, 0x00f2, 0x00f6, 0x00f4, 0x01d2, 0x0151, 0x014d, 0x00f5, 0x0155, 0x0159, 0x0157, 0x015b, 0x015d, 0x0161, 0x015f, 0x0165, 0x0163, 0x00fa, 0x00f9, 0x00fc, 0x00fb, 0x016d, 0x01d4, 0x0171, 0x016b, 0x0173, 0x016f, 0x0169, 0x01d8, 0x01dc, 0x01da, 0x01d6, 0x0175, 0x00fd, 0x00ff, 0x0177, 0x017a, 0x017e, 0x017c, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0x2c21 - 0x2c7e */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 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, /* 0x2d21 - 0x2d7e */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 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, /* 0x2e21 - 0x2e7e */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 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, /* 0x2f21 - 0x2f7e */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 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, /* 0x3021 - 0x307e */ 0x4e02, 0x4e04, 0x4e05, 0x4e0c, 0x4e12, 0x4e1f, 0x4e23, 0x4e24, 0x4e28, 0x4e2b, 0x4e2e, 0x4e2f, 0x4e30, 0x4e35, 0x4e40, 0x4e41, 0x4e44, 0x4e47, 0x4e51, 0x4e5a, 0x4e5c, 0x4e63, 0x4e68, 0x4e69, 0x4e74, 0x4e75, 0x4e79, 0x4e7f, 0x4e8d, 0x4e96, 0x4e97, 0x4e9d, 0x4eaf, 0x4eb9, 0x4ec3, 0x4ed0, 0x4eda, 0x4edb, 0x4ee0, 0x4ee1, 0x4ee2, 0x4ee8, 0x4eef, 0x4ef1, 0x4ef3, 0x4ef5, 0x4efd, 0x4efe, 0x4eff, 0x4f00, 0x4f02, 0x4f03, 0x4f08, 0x4f0b, 0x4f0c, 0x4f12, 0x4f15, 0x4f16, 0x4f17, 0x4f19, 0x4f2e, 0x4f31, 0x4f60, 0x4f33, 0x4f35, 0x4f37, 0x4f39, 0x4f3b, 0x4f3e, 0x4f40, 0x4f42, 0x4f48, 0x4f49, 0x4f4b, 0x4f4c, 0x4f52, 0x4f54, 0x4f56, 0x4f58, 0x4f5f, 0x4f63, 0x4f6a, 0x4f6c, 0x4f6e, 0x4f71, 0x4f77, 0x4f78, 0x4f79, 0x4f7a, 0x4f7d, 0x4f7e, 0x4f81, 0x4f82, 0x4f84, /* 0x3121 - 0x317e */ 0x4f85, 0x4f89, 0x4f8a, 0x4f8c, 0x4f8e, 0x4f90, 0x4f92, 0x4f93, 0x4f94, 0x4f97, 0x4f99, 0x4f9a, 0x4f9e, 0x4f9f, 0x4fb2, 0x4fb7, 0x4fb9, 0x4fbb, 0x4fbc, 0x4fbd, 0x4fbe, 0x4fc0, 0x4fc1, 0x4fc5, 0x4fc6, 0x4fc8, 0x4fc9, 0x4fcb, 0x4fcc, 0x4fcd, 0x4fcf, 0x4fd2, 0x4fdc, 0x4fe0, 0x4fe2, 0x4ff0, 0x4ff2, 0x4ffc, 0x4ffd, 0x4fff, 0x5000, 0x5001, 0x5004, 0x5007, 0x500a, 0x500c, 0x500e, 0x5010, 0x5013, 0x5017, 0x5018, 0x501b, 0x501c, 0x501d, 0x501e, 0x5022, 0x5027, 0x502e, 0x5030, 0x5032, 0x5033, 0x5035, 0x5040, 0x5041, 0x5042, 0x5045, 0x5046, 0x504a, 0x504c, 0x504e, 0x5051, 0x5052, 0x5053, 0x5057, 0x5059, 0x505f, 0x5060, 0x5062, 0x5063, 0x5066, 0x5067, 0x506a, 0x506d, 0x5070, 0x5071, 0x503b, 0x5081, 0x5083, 0x5084, 0x5086, 0x508a, 0x508e, 0x508f, 0x5090, /* 0x3221 - 0x327e */ 0x5092, 0x5093, 0x5094, 0x5096, 0x509b, 0x509c, 0x509e, 0x509f, 0x50a0, 0x50a1, 0x50a2, 0x50aa, 0x50af, 0x50b0, 0x50b9, 0x50ba, 0x50bd, 0x50c0, 0x50c3, 0x50c4, 0x50c7, 0x50cc, 0x50ce, 0x50d0, 0x50d3, 0x50d4, 0x50d8, 0x50dc, 0x50dd, 0x50df, 0x50e2, 0x50e4, 0x50e6, 0x50e8, 0x50e9, 0x50ef, 0x50f1, 0x50f6, 0x50fa, 0x50fe, 0x5103, 0x5106, 0x5107, 0x5108, 0x510b, 0x510c, 0x510d, 0x510e, 0x50f2, 0x5110, 0x5117, 0x5119, 0x511b, 0x511c, 0x511d, 0x511e, 0x5123, 0x5127, 0x5128, 0x512c, 0x512d, 0x512f, 0x5131, 0x5133, 0x5134, 0x5135, 0x5138, 0x5139, 0x5142, 0x514a, 0x514f, 0x5153, 0x5155, 0x5157, 0x5158, 0x515f, 0x5164, 0x5166, 0x517e, 0x5183, 0x5184, 0x518b, 0x518e, 0x5198, 0x519d, 0x51a1, 0x51a3, 0x51ad, 0x51b8, 0x51ba, 0x51bc, 0x51be, 0x51bf, 0x51c2, /* 0x3321 - 0x337e */ 0x51c8, 0x51cf, 0x51d1, 0x51d2, 0x51d3, 0x51d5, 0x51d8, 0x51de, 0x51e2, 0x51e5, 0x51ee, 0x51f2, 0x51f3, 0x51f4, 0x51f7, 0x5201, 0x5202, 0x5205, 0x5212, 0x5213, 0x5215, 0x5216, 0x5218, 0x5222, 0x5228, 0x5231, 0x5232, 0x5235, 0x523c, 0x5245, 0x5249, 0x5255, 0x5257, 0x5258, 0x525a, 0x525c, 0x525f, 0x5260, 0x5261, 0x5266, 0x526e, 0x5277, 0x5278, 0x5279, 0x5280, 0x5282, 0x5285, 0x528a, 0x528c, 0x5293, 0x5295, 0x5296, 0x5297, 0x5298, 0x529a, 0x529c, 0x52a4, 0x52a5, 0x52a6, 0x52a7, 0x52af, 0x52b0, 0x52b6, 0x52b7, 0x52b8, 0x52ba, 0x52bb, 0x52bd, 0x52c0, 0x52c4, 0x52c6, 0x52c8, 0x52cc, 0x52cf, 0x52d1, 0x52d4, 0x52d6, 0x52db, 0x52dc, 0x52e1, 0x52e5, 0x52e8, 0x52e9, 0x52ea, 0x52ec, 0x52f0, 0x52f1, 0x52f4, 0x52f6, 0x52f7, 0x5300, 0x5303, 0x530a, 0x530b, /* 0x3421 - 0x347e */ 0x530c, 0x5311, 0x5313, 0x5318, 0x531b, 0x531c, 0x531e, 0x531f, 0x5325, 0x5327, 0x5328, 0x5329, 0x532b, 0x532c, 0x532d, 0x5330, 0x5332, 0x5335, 0x533c, 0x533d, 0x533e, 0x5342, 0x534c, 0x534b, 0x5359, 0x535b, 0x5361, 0x5363, 0x5365, 0x536c, 0x536d, 0x5372, 0x5379, 0x537e, 0x5383, 0x5387, 0x5388, 0x538e, 0x5393, 0x5394, 0x5399, 0x539d, 0x53a1, 0x53a4, 0x53aa, 0x53ab, 0x53af, 0x53b2, 0x53b4, 0x53b5, 0x53b7, 0x53b8, 0x53ba, 0x53bd, 0x53c0, 0x53c5, 0x53cf, 0x53d2, 0x53d3, 0x53d5, 0x53da, 0x53dd, 0x53de, 0x53e0, 0x53e6, 0x53e7, 0x53f5, 0x5402, 0x5413, 0x541a, 0x5421, 0x5427, 0x5428, 0x542a, 0x542f, 0x5431, 0x5434, 0x5435, 0x5443, 0x5444, 0x5447, 0x544d, 0x544f, 0x545e, 0x5462, 0x5464, 0x5466, 0x5467, 0x5469, 0x546b, 0x546d, 0x546e, 0x5474, 0x547f, /* 0x3521 - 0x357e */ 0x5481, 0x5483, 0x5485, 0x5488, 0x5489, 0x548d, 0x5491, 0x5495, 0x5496, 0x549c, 0x549f, 0x54a1, 0x54a6, 0x54a7, 0x54a9, 0x54aa, 0x54ad, 0x54ae, 0x54b1, 0x54b7, 0x54b9, 0x54ba, 0x54bb, 0x54bf, 0x54c6, 0x54ca, 0x54cd, 0x54ce, 0x54e0, 0x54ea, 0x54ec, 0x54ef, 0x54f6, 0x54fc, 0x54fe, 0x54ff, 0x5500, 0x5501, 0x5505, 0x5508, 0x5509, 0x550c, 0x550d, 0x550e, 0x5515, 0x552a, 0x552b, 0x5532, 0x5535, 0x5536, 0x553b, 0x553c, 0x553d, 0x5541, 0x5547, 0x5549, 0x554a, 0x554d, 0x5550, 0x5551, 0x5558, 0x555a, 0x555b, 0x555e, 0x5560, 0x5561, 0x5564, 0x5566, 0x557f, 0x5581, 0x5582, 0x5586, 0x5588, 0x558e, 0x558f, 0x5591, 0x5592, 0x5593, 0x5594, 0x5597, 0x55a3, 0x55a4, 0x55ad, 0x55b2, 0x55bf, 0x55c1, 0x55c3, 0x55c6, 0x55c9, 0x55cb, 0x55cc, 0x55ce, 0x55d1, 0x55d2, /* 0x3621 - 0x367e */ 0x55d3, 0x55d7, 0x55d8, 0x55db, 0x55de, 0x55e2, 0x55e9, 0x55f6, 0x55ff, 0x5605, 0x5608, 0x560a, 0x560d, 0x560e, 0x560f, 0x5610, 0x5611, 0x5612, 0x5619, 0x562c, 0x5630, 0x5633, 0x5635, 0x5637, 0x5639, 0x563b, 0x563c, 0x563d, 0x563f, 0x5640, 0x5641, 0x5643, 0x5644, 0x5646, 0x5649, 0x564b, 0x564d, 0x564f, 0x5654, 0x565e, 0x5660, 0x5661, 0x5662, 0x5663, 0x5666, 0x5669, 0x566d, 0x566f, 0x5671, 0x5672, 0x5675, 0x5684, 0x5685, 0x5688, 0x568b, 0x568c, 0x5695, 0x5699, 0x569a, 0x569d, 0x569e, 0x569f, 0x56a6, 0x56a7, 0x56a8, 0x56a9, 0x56ab, 0x56ac, 0x56ad, 0x56b1, 0x56b3, 0x56b7, 0x56be, 0x56c5, 0x56c9, 0x56ca, 0x56cb, 0x56cf, 0x56d0, 0x56cc, 0x56cd, 0x56d9, 0x56dc, 0x56dd, 0x56df, 0x56e1, 0x56e4, 0x56e5, 0x56e6, 0x56e7, 0x56e8, 0x56f1, 0x56eb, 0x56ed, /* 0x3721 - 0x377e */ 0x56f6, 0x56f7, 0x5701, 0x5702, 0x5707, 0x570a, 0x570c, 0x5711, 0x5715, 0x571a, 0x571b, 0x571d, 0x5720, 0x5722, 0x5723, 0x5724, 0x5725, 0x5729, 0x572a, 0x572c, 0x572e, 0x572f, 0x5733, 0x5734, 0x573d, 0x573e, 0x573f, 0x5745, 0x5746, 0x574c, 0x574d, 0x5752, 0x5762, 0x5765, 0x5767, 0x5768, 0x576b, 0x576d, 0x576e, 0x576f, 0x5770, 0x5771, 0x5773, 0x5774, 0x5775, 0x5777, 0x5779, 0x577a, 0x577b, 0x577c, 0x577e, 0x5781, 0x5783, 0x578c, 0x5794, 0x5797, 0x5799, 0x579a, 0x579c, 0x579d, 0x579e, 0x579f, 0x57a1, 0x5795, 0x57a7, 0x57a8, 0x57a9, 0x57ac, 0x57b8, 0x57bd, 0x57c7, 0x57c8, 0x57cc, 0x57cf, 0x57d5, 0x57dd, 0x57de, 0x57e4, 0x57e6, 0x57e7, 0x57e9, 0x57ed, 0x57f0, 0x57f5, 0x57f6, 0x57f8, 0x57fd, 0x57fe, 0x57ff, 0x5803, 0x5804, 0x5808, 0x5809, 0x57e1, /* 0x3821 - 0x387e */ 0x580c, 0x580d, 0x581b, 0x581e, 0x581f, 0x5820, 0x5826, 0x5827, 0x582d, 0x5832, 0x5839, 0x583f, 0x5849, 0x584c, 0x584d, 0x584f, 0x5850, 0x5855, 0x585f, 0x5861, 0x5864, 0x5867, 0x5868, 0x5878, 0x587c, 0x587f, 0x5880, 0x5881, 0x5887, 0x5888, 0x5889, 0x588a, 0x588c, 0x588d, 0x588f, 0x5890, 0x5894, 0x5896, 0x589d, 0x58a0, 0x58a1, 0x58a2, 0x58a6, 0x58a9, 0x58b1, 0x58b2, 0x58c4, 0x58bc, 0x58c2, 0x58c8, 0x58cd, 0x58ce, 0x58d0, 0x58d2, 0x58d4, 0x58d6, 0x58da, 0x58dd, 0x58e1, 0x58e2, 0x58e9, 0x58f3, 0x5905, 0x5906, 0x590b, 0x590c, 0x5912, 0x5913, 0x5914, 0x8641, 0x591d, 0x5921, 0x5923, 0x5924, 0x5928, 0x592f, 0x5930, 0x5933, 0x5935, 0x5936, 0x593f, 0x5943, 0x5946, 0x5952, 0x5953, 0x5959, 0x595b, 0x595d, 0x595e, 0x595f, 0x5961, 0x5963, 0x596b, 0x596d, /* 0x3921 - 0x397e */ 0x596f, 0x5972, 0x5975, 0x5976, 0x5979, 0x597b, 0x597c, 0x598b, 0x598c, 0x598e, 0x5992, 0x5995, 0x5997, 0x599f, 0x59a4, 0x59a7, 0x59ad, 0x59ae, 0x59af, 0x59b0, 0x59b3, 0x59b7, 0x59ba, 0x59bc, 0x59c1, 0x59c3, 0x59c4, 0x59c8, 0x59ca, 0x59cd, 0x59d2, 0x59dd, 0x59de, 0x59df, 0x59e3, 0x59e4, 0x59e7, 0x59ee, 0x59ef, 0x59f1, 0x59f2, 0x59f4, 0x59f7, 0x5a00, 0x5a04, 0x5a0c, 0x5a0d, 0x5a0e, 0x5a12, 0x5a13, 0x5a1e, 0x5a23, 0x5a24, 0x5a27, 0x5a28, 0x5a2a, 0x5a2d, 0x5a30, 0x5a44, 0x5a45, 0x5a47, 0x5a48, 0x5a4c, 0x5a50, 0x5a55, 0x5a5e, 0x5a63, 0x5a65, 0x5a67, 0x5a6d, 0x5a77, 0x5a7a, 0x5a7b, 0x5a7e, 0x5a8b, 0x5a90, 0x5a93, 0x5a96, 0x5a99, 0x5a9c, 0x5a9e, 0x5a9f, 0x5aa0, 0x5aa2, 0x5aa7, 0x5aac, 0x5ab1, 0x5ab2, 0x5ab3, 0x5ab5, 0x5ab8, 0x5aba, 0x5abb, 0x5abf, /* 0x3a21 - 0x3a7e */ 0x5ac4, 0x5ac6, 0x5ac8, 0x5acf, 0x5ada, 0x5adc, 0x5ae0, 0x5ae5, 0x5aea, 0x5aee, 0x5af5, 0x5af6, 0x5afd, 0x5b00, 0x5b01, 0x5b08, 0x5b17, 0x5b34, 0x5b19, 0x5b1b, 0x5b1d, 0x5b21, 0x5b25, 0x5b2d, 0x5b38, 0x5b41, 0x5b4b, 0x5b4c, 0x5b52, 0x5b56, 0x5b5e, 0x5b68, 0x5b6e, 0x5b6f, 0x5b7c, 0x5b7d, 0x5b7e, 0x5b7f, 0x5b81, 0x5b84, 0x5b86, 0x5b8a, 0x5b8e, 0x5b90, 0x5b91, 0x5b93, 0x5b94, 0x5b96, 0x5ba8, 0x5ba9, 0x5bac, 0x5bad, 0x5baf, 0x5bb1, 0x5bb2, 0x5bb7, 0x5bba, 0x5bbc, 0x5bc0, 0x5bc1, 0x5bcd, 0x5bcf, 0x5bd6, 0x5bd7, 0x5bd8, 0x5bd9, 0x5bda, 0x5be0, 0x5bef, 0x5bf1, 0x5bf4, 0x5bfd, 0x5c0c, 0x5c17, 0x5c1e, 0x5c1f, 0x5c23, 0x5c26, 0x5c29, 0x5c2b, 0x5c2c, 0x5c2e, 0x5c30, 0x5c32, 0x5c35, 0x5c36, 0x5c59, 0x5c5a, 0x5c5c, 0x5c62, 0x5c63, 0x5c67, 0x5c68, 0x5c69, /* 0x3b21 - 0x3b7e */ 0x5c6d, 0x5c70, 0x5c74, 0x5c75, 0x5c7a, 0x5c7b, 0x5c7c, 0x5c7d, 0x5c87, 0x5c88, 0x5c8a, 0x5c8f, 0x5c92, 0x5c9d, 0x5c9f, 0x5ca0, 0x5ca2, 0x5ca3, 0x5ca6, 0x5caa, 0x5cb2, 0x5cb4, 0x5cb5, 0x5cba, 0x5cc9, 0x5ccb, 0x5cd2, 0x5cdd, 0x5cd7, 0x5cee, 0x5cf1, 0x5cf2, 0x5cf4, 0x5d01, 0x5d06, 0x5d0d, 0x5d12, 0x5d2b, 0x5d23, 0x5d24, 0x5d26, 0x5d27, 0x5d31, 0x5d34, 0x5d39, 0x5d3d, 0x5d3f, 0x5d42, 0x5d43, 0x5d46, 0x5d48, 0x5d55, 0x5d51, 0x5d59, 0x5d4a, 0x5d5f, 0x5d60, 0x5d61, 0x5d62, 0x5d64, 0x5d6a, 0x5d6d, 0x5d70, 0x5d79, 0x5d7a, 0x5d7e, 0x5d7f, 0x5d81, 0x5d83, 0x5d88, 0x5d8a, 0x5d92, 0x5d93, 0x5d94, 0x5d95, 0x5d99, 0x5d9b, 0x5d9f, 0x5da0, 0x5da7, 0x5dab, 0x5db0, 0x5db4, 0x5db8, 0x5db9, 0x5dc3, 0x5dc7, 0x5dcb, 0x5dd0, 0x5dce, 0x5dd8, 0x5dd9, 0x5de0, 0x5de4, /* 0x3c21 - 0x3c7e */ 0x5de9, 0x5df8, 0x5df9, 0x5e00, 0x5e07, 0x5e0d, 0x5e12, 0x5e14, 0x5e15, 0x5e18, 0x5e1f, 0x5e20, 0x5e2e, 0x5e28, 0x5e32, 0x5e35, 0x5e3e, 0x5e4b, 0x5e50, 0x5e49, 0x5e51, 0x5e56, 0x5e58, 0x5e5b, 0x5e5c, 0x5e5e, 0x5e68, 0x5e6a, 0x5e6b, 0x5e6c, 0x5e6d, 0x5e6e, 0x5e70, 0x5e80, 0x5e8b, 0x5e8e, 0x5ea2, 0x5ea4, 0x5ea5, 0x5ea8, 0x5eaa, 0x5eac, 0x5eb1, 0x5eb3, 0x5ebd, 0x5ebe, 0x5ebf, 0x5ec6, 0x5ecc, 0x5ecb, 0x5ece, 0x5ed1, 0x5ed2, 0x5ed4, 0x5ed5, 0x5edc, 0x5ede, 0x5ee5, 0x5eeb, 0x5f02, 0x5f06, 0x5f07, 0x5f08, 0x5f0e, 0x5f19, 0x5f1c, 0x5f1d, 0x5f21, 0x5f22, 0x5f23, 0x5f24, 0x5f28, 0x5f2b, 0x5f2c, 0x5f2e, 0x5f30, 0x5f34, 0x5f36, 0x5f3b, 0x5f3d, 0x5f3f, 0x5f40, 0x5f44, 0x5f45, 0x5f47, 0x5f4d, 0x5f50, 0x5f54, 0x5f58, 0x5f5b, 0x5f60, 0x5f63, 0x5f64, 0x5f67, /* 0x3d21 - 0x3d7e */ 0x5f6f, 0x5f72, 0x5f74, 0x5f75, 0x5f78, 0x5f7a, 0x5f7d, 0x5f7e, 0x5f89, 0x5f8d, 0x5f8f, 0x5f96, 0x5f9c, 0x5f9d, 0x5fa2, 0x5fa7, 0x5fab, 0x5fa4, 0x5fac, 0x5faf, 0x5fb0, 0x5fb1, 0x5fb8, 0x5fc4, 0x5fc7, 0x5fc8, 0x5fc9, 0x5fcb, 0x5fd0, 0x5fd1, 0x5fd2, 0x5fd3, 0x5fd4, 0x5fde, 0x5fe1, 0x5fe2, 0x5fe8, 0x5fe9, 0x5fea, 0x5fec, 0x5fed, 0x5fee, 0x5fef, 0x5ff2, 0x5ff3, 0x5ff6, 0x5ffa, 0x5ffc, 0x6007, 0x600a, 0x600d, 0x6013, 0x6014, 0x6017, 0x6018, 0x601a, 0x601f, 0x6024, 0x602d, 0x6033, 0x6035, 0x6040, 0x6047, 0x6048, 0x6049, 0x604c, 0x6051, 0x6054, 0x6056, 0x6057, 0x605d, 0x6061, 0x6067, 0x6071, 0x607e, 0x607f, 0x6082, 0x6086, 0x6088, 0x608a, 0x608e, 0x6091, 0x6093, 0x6095, 0x6098, 0x609d, 0x609e, 0x60a2, 0x60a4, 0x60a5, 0x60a8, 0x60b0, 0x60b1, 0x60b7, /* 0x3e21 - 0x3e7e */ 0x60bb, 0x60be, 0x60c2, 0x60c4, 0x60c8, 0x60c9, 0x60ca, 0x60cb, 0x60ce, 0x60cf, 0x60d4, 0x60d5, 0x60d9, 0x60db, 0x60dd, 0x60de, 0x60e2, 0x60e5, 0x60f2, 0x60f5, 0x60f8, 0x60fc, 0x60fd, 0x6102, 0x6107, 0x610a, 0x610c, 0x6110, 0x6111, 0x6112, 0x6113, 0x6114, 0x6116, 0x6117, 0x6119, 0x611c, 0x611e, 0x6122, 0x612a, 0x612b, 0x6130, 0x6131, 0x6135, 0x6136, 0x6137, 0x6139, 0x6141, 0x6145, 0x6146, 0x6149, 0x615e, 0x6160, 0x616c, 0x6172, 0x6178, 0x617b, 0x617c, 0x617f, 0x6180, 0x6181, 0x6183, 0x6184, 0x618b, 0x618d, 0x6192, 0x6193, 0x6197, 0x6198, 0x619c, 0x619d, 0x619f, 0x61a0, 0x61a5, 0x61a8, 0x61aa, 0x61ad, 0x61b8, 0x61b9, 0x61bc, 0x61c0, 0x61c1, 0x61c2, 0x61ce, 0x61cf, 0x61d5, 0x61dc, 0x61dd, 0x61de, 0x61df, 0x61e1, 0x61e2, 0x61e7, 0x61e9, 0x61e5, /* 0x3f21 - 0x3f7e */ 0x61ec, 0x61ed, 0x61ef, 0x6201, 0x6203, 0x6204, 0x6207, 0x6213, 0x6215, 0x621c, 0x6220, 0x6222, 0x6223, 0x6227, 0x6229, 0x622b, 0x6239, 0x623d, 0x6242, 0x6243, 0x6244, 0x6246, 0x624c, 0x6250, 0x6251, 0x6252, 0x6254, 0x6256, 0x625a, 0x625c, 0x6264, 0x626d, 0x626f, 0x6273, 0x627a, 0x627d, 0x628d, 0x628e, 0x628f, 0x6290, 0x62a6, 0x62a8, 0x62b3, 0x62b6, 0x62b7, 0x62ba, 0x62be, 0x62bf, 0x62c4, 0x62ce, 0x62d5, 0x62d6, 0x62da, 0x62ea, 0x62f2, 0x62f4, 0x62fc, 0x62fd, 0x6303, 0x6304, 0x630a, 0x630b, 0x630d, 0x6310, 0x6313, 0x6316, 0x6318, 0x6329, 0x632a, 0x632d, 0x6335, 0x6336, 0x6339, 0x633c, 0x6341, 0x6342, 0x6343, 0x6344, 0x6346, 0x634a, 0x634b, 0x634e, 0x6352, 0x6353, 0x6354, 0x6358, 0x635b, 0x6365, 0x6366, 0x636c, 0x636d, 0x6371, 0x6374, 0x6375, /* 0x4021 - 0x407e */ 0x6378, 0x637c, 0x637d, 0x637f, 0x6382, 0x6384, 0x6387, 0x638a, 0x6390, 0x6394, 0x6395, 0x6399, 0x639a, 0x639e, 0x63a4, 0x63a6, 0x63ad, 0x63ae, 0x63af, 0x63bd, 0x63c1, 0x63c5, 0x63c8, 0x63ce, 0x63d1, 0x63d3, 0x63d4, 0x63d5, 0x63dc, 0x63e0, 0x63e5, 0x63ea, 0x63ec, 0x63f2, 0x63f3, 0x63f5, 0x63f8, 0x63f9, 0x6409, 0x640a, 0x6410, 0x6412, 0x6414, 0x6418, 0x641e, 0x6420, 0x6422, 0x6424, 0x6425, 0x6429, 0x642a, 0x642f, 0x6430, 0x6435, 0x643d, 0x643f, 0x644b, 0x644f, 0x6451, 0x6452, 0x6453, 0x6454, 0x645a, 0x645b, 0x645c, 0x645d, 0x645f, 0x6460, 0x6461, 0x6463, 0x646d, 0x6473, 0x6474, 0x647b, 0x647d, 0x6485, 0x6487, 0x648f, 0x6490, 0x6491, 0x6498, 0x6499, 0x649b, 0x649d, 0x649f, 0x64a1, 0x64a3, 0x64a6, 0x64a8, 0x64ac, 0x64b3, 0x64bd, 0x64be, 0x64bf, /* 0x4121 - 0x417e */ 0x64c4, 0x64c9, 0x64ca, 0x64cb, 0x64cc, 0x64ce, 0x64d0, 0x64d1, 0x64d5, 0x64d7, 0x64e4, 0x64e5, 0x64e9, 0x64ea, 0x64ed, 0x64f0, 0x64f5, 0x64f7, 0x64fb, 0x64ff, 0x6501, 0x6504, 0x6508, 0x6509, 0x650a, 0x650f, 0x6513, 0x6514, 0x6516, 0x6519, 0x651b, 0x651e, 0x651f, 0x6522, 0x6526, 0x6529, 0x652e, 0x6531, 0x653a, 0x653c, 0x653d, 0x6543, 0x6547, 0x6549, 0x6550, 0x6552, 0x6554, 0x655f, 0x6560, 0x6567, 0x656b, 0x657a, 0x657d, 0x6581, 0x6585, 0x658a, 0x6592, 0x6595, 0x6598, 0x659d, 0x65a0, 0x65a3, 0x65a6, 0x65ae, 0x65b2, 0x65b3, 0x65b4, 0x65bf, 0x65c2, 0x65c8, 0x65c9, 0x65ce, 0x65d0, 0x65d4, 0x65d6, 0x65d8, 0x65df, 0x65f0, 0x65f2, 0x65f4, 0x65f5, 0x65f9, 0x65fe, 0x65ff, 0x6600, 0x6604, 0x6608, 0x6609, 0x660d, 0x6611, 0x6612, 0x6615, 0x6616, 0x661d, /* 0x4221 - 0x427e */ 0x661e, 0x6621, 0x6622, 0x6623, 0x6624, 0x6626, 0x6629, 0x662a, 0x662b, 0x662c, 0x662e, 0x6630, 0x6631, 0x6633, 0x6639, 0x6637, 0x6640, 0x6645, 0x6646, 0x664a, 0x664c, 0x6651, 0x664e, 0x6657, 0x6658, 0x6659, 0x665b, 0x665c, 0x6660, 0x6661, 0x66fb, 0x666a, 0x666b, 0x666c, 0x667e, 0x6673, 0x6675, 0x667f, 0x6677, 0x6678, 0x6679, 0x667b, 0x6680, 0x667c, 0x668b, 0x668c, 0x668d, 0x6690, 0x6692, 0x6699, 0x669a, 0x669b, 0x669c, 0x669f, 0x66a0, 0x66a4, 0x66ad, 0x66b1, 0x66b2, 0x66b5, 0x66bb, 0x66bf, 0x66c0, 0x66c2, 0x66c3, 0x66c8, 0x66cc, 0x66ce, 0x66cf, 0x66d4, 0x66db, 0x66df, 0x66e8, 0x66eb, 0x66ec, 0x66ee, 0x66fa, 0x6705, 0x6707, 0x670e, 0x6713, 0x6719, 0x671c, 0x6720, 0x6722, 0x6733, 0x673e, 0x6745, 0x6747, 0x6748, 0x674c, 0x6754, 0x6755, 0x675d, /* 0x4321 - 0x437e */ 0x6766, 0x676c, 0x676e, 0x6774, 0x6776, 0x677b, 0x6781, 0x6784, 0x678e, 0x678f, 0x6791, 0x6793, 0x6796, 0x6798, 0x6799, 0x679b, 0x67b0, 0x67b1, 0x67b2, 0x67b5, 0x67bb, 0x67bc, 0x67bd, 0x67f9, 0x67c0, 0x67c2, 0x67c3, 0x67c5, 0x67c8, 0x67c9, 0x67d2, 0x67d7, 0x67d9, 0x67dc, 0x67e1, 0x67e6, 0x67f0, 0x67f2, 0x67f6, 0x67f7, 0x6852, 0x6814, 0x6819, 0x681d, 0x681f, 0x6828, 0x6827, 0x682c, 0x682d, 0x682f, 0x6830, 0x6831, 0x6833, 0x683b, 0x683f, 0x6844, 0x6845, 0x684a, 0x684c, 0x6855, 0x6857, 0x6858, 0x685b, 0x686b, 0x686e, 0x686f, 0x6870, 0x6871, 0x6872, 0x6875, 0x6879, 0x687a, 0x687b, 0x687c, 0x6882, 0x6884, 0x6886, 0x6888, 0x6896, 0x6898, 0x689a, 0x689c, 0x68a1, 0x68a3, 0x68a5, 0x68a9, 0x68aa, 0x68ae, 0x68b2, 0x68bb, 0x68c5, 0x68c8, 0x68cc, 0x68cf, /* 0x4421 - 0x447e */ 0x68d0, 0x68d1, 0x68d3, 0x68d6, 0x68d9, 0x68dc, 0x68dd, 0x68e5, 0x68e8, 0x68ea, 0x68eb, 0x68ec, 0x68ed, 0x68f0, 0x68f1, 0x68f5, 0x68f6, 0x68fb, 0x68fc, 0x68fd, 0x6906, 0x6909, 0x690a, 0x6910, 0x6911, 0x6913, 0x6916, 0x6917, 0x6931, 0x6933, 0x6935, 0x6938, 0x693b, 0x6942, 0x6945, 0x6949, 0x694e, 0x6957, 0x695b, 0x6963, 0x6964, 0x6965, 0x6966, 0x6968, 0x6969, 0x696c, 0x6970, 0x6971, 0x6972, 0x697a, 0x697b, 0x697f, 0x6980, 0x698d, 0x6992, 0x6996, 0x6998, 0x69a1, 0x69a5, 0x69a6, 0x69a8, 0x69ab, 0x69ad, 0x69af, 0x69b7, 0x69b8, 0x69ba, 0x69bc, 0x69c5, 0x69c8, 0x69d1, 0x69d6, 0x69d7, 0x69e2, 0x69e5, 0x69ee, 0x69ef, 0x69f1, 0x69f3, 0x69f5, 0x69fe, 0x6a00, 0x6a01, 0x6a03, 0x6a0f, 0x6a11, 0x6a15, 0x6a1a, 0x6a1d, 0x6a20, 0x6a24, 0x6a28, 0x6a30, 0x6a32, /* 0x4521 - 0x457e */ 0x6a34, 0x6a37, 0x6a3b, 0x6a3e, 0x6a3f, 0x6a45, 0x6a46, 0x6a49, 0x6a4a, 0x6a4e, 0x6a50, 0x6a51, 0x6a52, 0x6a55, 0x6a56, 0x6a5b, 0x6a64, 0x6a67, 0x6a6a, 0x6a71, 0x6a73, 0x6a7e, 0x6a81, 0x6a83, 0x6a86, 0x6a87, 0x6a89, 0x6a8b, 0x6a91, 0x6a9b, 0x6a9d, 0x6a9e, 0x6a9f, 0x6aa5, 0x6aab, 0x6aaf, 0x6ab0, 0x6ab1, 0x6ab4, 0x6abd, 0x6abe, 0x6abf, 0x6ac6, 0x6ac9, 0x6ac8, 0x6acc, 0x6ad0, 0x6ad4, 0x6ad5, 0x6ad6, 0x6adc, 0x6add, 0x6ae4, 0x6ae7, 0x6aec, 0x6af0, 0x6af1, 0x6af2, 0x6afc, 0x6afd, 0x6b02, 0x6b03, 0x6b06, 0x6b07, 0x6b09, 0x6b0f, 0x6b10, 0x6b11, 0x6b17, 0x6b1b, 0x6b1e, 0x6b24, 0x6b28, 0x6b2b, 0x6b2c, 0x6b2f, 0x6b35, 0x6b36, 0x6b3b, 0x6b3f, 0x6b46, 0x6b4a, 0x6b4d, 0x6b52, 0x6b56, 0x6b58, 0x6b5d, 0x6b60, 0x6b67, 0x6b6b, 0x6b6e, 0x6b70, 0x6b75, 0x6b7d, /* 0x4621 - 0x467e */ 0x6b7e, 0x6b82, 0x6b85, 0x6b97, 0x6b9b, 0x6b9f, 0x6ba0, 0x6ba2, 0x6ba3, 0x6ba8, 0x6ba9, 0x6bac, 0x6bad, 0x6bae, 0x6bb0, 0x6bb8, 0x6bb9, 0x6bbd, 0x6bbe, 0x6bc3, 0x6bc4, 0x6bc9, 0x6bcc, 0x6bd6, 0x6bda, 0x6be1, 0x6be3, 0x6be6, 0x6be7, 0x6bee, 0x6bf1, 0x6bf7, 0x6bf9, 0x6bff, 0x6c02, 0x6c04, 0x6c05, 0x6c09, 0x6c0d, 0x6c0e, 0x6c10, 0x6c12, 0x6c19, 0x6c1f, 0x6c26, 0x6c27, 0x6c28, 0x6c2c, 0x6c2e, 0x6c33, 0x6c35, 0x6c36, 0x6c3a, 0x6c3b, 0x6c3f, 0x6c4a, 0x6c4b, 0x6c4d, 0x6c4f, 0x6c52, 0x6c54, 0x6c59, 0x6c5b, 0x6c5c, 0x6c6b, 0x6c6d, 0x6c6f, 0x6c74, 0x6c76, 0x6c78, 0x6c79, 0x6c7b, 0x6c85, 0x6c86, 0x6c87, 0x6c89, 0x6c94, 0x6c95, 0x6c97, 0x6c98, 0x6c9c, 0x6c9f, 0x6cb0, 0x6cb2, 0x6cb4, 0x6cc2, 0x6cc6, 0x6ccd, 0x6ccf, 0x6cd0, 0x6cd1, 0x6cd2, 0x6cd4, 0x6cd6, /* 0x4721 - 0x477e */ 0x6cda, 0x6cdc, 0x6ce0, 0x6ce7, 0x6ce9, 0x6ceb, 0x6cec, 0x6cee, 0x6cf2, 0x6cf4, 0x6d04, 0x6d07, 0x6d0a, 0x6d0e, 0x6d0f, 0x6d11, 0x6d13, 0x6d1a, 0x6d26, 0x6d27, 0x6d28, 0x6c67, 0x6d2e, 0x6d2f, 0x6d31, 0x6d39, 0x6d3c, 0x6d3f, 0x6d57, 0x6d5e, 0x6d5f, 0x6d61, 0x6d65, 0x6d67, 0x6d6f, 0x6d70, 0x6d7c, 0x6d82, 0x6d87, 0x6d91, 0x6d92, 0x6d94, 0x6d96, 0x6d97, 0x6d98, 0x6daa, 0x6dac, 0x6db4, 0x6db7, 0x6db9, 0x6dbd, 0x6dbf, 0x6dc4, 0x6dc8, 0x6dca, 0x6dce, 0x6dcf, 0x6dd6, 0x6ddb, 0x6ddd, 0x6ddf, 0x6de0, 0x6de2, 0x6de5, 0x6de9, 0x6def, 0x6df0, 0x6df4, 0x6df6, 0x6dfc, 0x6e00, 0x6e04, 0x6e1e, 0x6e22, 0x6e27, 0x6e32, 0x6e36, 0x6e39, 0x6e3b, 0x6e3c, 0x6e44, 0x6e45, 0x6e48, 0x6e49, 0x6e4b, 0x6e4f, 0x6e51, 0x6e52, 0x6e53, 0x6e54, 0x6e57, 0x6e5c, 0x6e5d, 0x6e5e, /* 0x4821 - 0x487e */ 0x6e62, 0x6e63, 0x6e68, 0x6e73, 0x6e7b, 0x6e7d, 0x6e8d, 0x6e93, 0x6e99, 0x6ea0, 0x6ea7, 0x6ead, 0x6eae, 0x6eb1, 0x6eb3, 0x6ebb, 0x6ebf, 0x6ec0, 0x6ec1, 0x6ec3, 0x6ec7, 0x6ec8, 0x6eca, 0x6ecd, 0x6ece, 0x6ecf, 0x6eeb, 0x6eed, 0x6eee, 0x6ef9, 0x6efb, 0x6efd, 0x6f04, 0x6f08, 0x6f0a, 0x6f0c, 0x6f0d, 0x6f16, 0x6f18, 0x6f1a, 0x6f1b, 0x6f26, 0x6f29, 0x6f2a, 0x6f2f, 0x6f30, 0x6f33, 0x6f36, 0x6f3b, 0x6f3c, 0x6f2d, 0x6f4f, 0x6f51, 0x6f52, 0x6f53, 0x6f57, 0x6f59, 0x6f5a, 0x6f5d, 0x6f5e, 0x6f61, 0x6f62, 0x6f68, 0x6f6c, 0x6f7d, 0x6f7e, 0x6f83, 0x6f87, 0x6f88, 0x6f8b, 0x6f8c, 0x6f8d, 0x6f90, 0x6f92, 0x6f93, 0x6f94, 0x6f96, 0x6f9a, 0x6f9f, 0x6fa0, 0x6fa5, 0x6fa6, 0x6fa7, 0x6fa8, 0x6fae, 0x6faf, 0x6fb0, 0x6fb5, 0x6fb6, 0x6fbc, 0x6fc5, 0x6fc7, 0x6fc8, 0x6fca, /* 0x4921 - 0x497e */ 0x6fda, 0x6fde, 0x6fe8, 0x6fe9, 0x6ff0, 0x6ff5, 0x6ff9, 0x6ffc, 0x6ffd, 0x7000, 0x7005, 0x7006, 0x7007, 0x700d, 0x7017, 0x7020, 0x7023, 0x702f, 0x7034, 0x7037, 0x7039, 0x703c, 0x7043, 0x7044, 0x7048, 0x7049, 0x704a, 0x704b, 0x7054, 0x7055, 0x705d, 0x705e, 0x704e, 0x7064, 0x7065, 0x706c, 0x706e, 0x7075, 0x7076, 0x707e, 0x7081, 0x7085, 0x7086, 0x7094, 0x7095, 0x7096, 0x7097, 0x7098, 0x709b, 0x70a4, 0x70ab, 0x70b0, 0x70b1, 0x70b4, 0x70b7, 0x70ca, 0x70d1, 0x70d3, 0x70d4, 0x70d5, 0x70d6, 0x70d8, 0x70dc, 0x70e4, 0x70fa, 0x7103, 0x7104, 0x7105, 0x7106, 0x7107, 0x710b, 0x710c, 0x710f, 0x711e, 0x7120, 0x712b, 0x712d, 0x712f, 0x7130, 0x7131, 0x7138, 0x7141, 0x7145, 0x7146, 0x7147, 0x714a, 0x714b, 0x7150, 0x7152, 0x7157, 0x715a, 0x715c, 0x715e, 0x7160, /* 0x4a21 - 0x4a7e */ 0x7168, 0x7179, 0x7180, 0x7185, 0x7187, 0x718c, 0x7192, 0x719a, 0x719b, 0x71a0, 0x71a2, 0x71af, 0x71b0, 0x71b2, 0x71b3, 0x71ba, 0x71bf, 0x71c0, 0x71c1, 0x71c4, 0x71cb, 0x71cc, 0x71d3, 0x71d6, 0x71d9, 0x71da, 0x71dc, 0x71f8, 0x71fe, 0x7200, 0x7207, 0x7208, 0x7209, 0x7213, 0x7217, 0x721a, 0x721d, 0x721f, 0x7224, 0x722b, 0x722f, 0x7234, 0x7238, 0x7239, 0x7241, 0x7242, 0x7243, 0x7245, 0x724e, 0x724f, 0x7250, 0x7253, 0x7255, 0x7256, 0x725a, 0x725c, 0x725e, 0x7260, 0x7263, 0x7268, 0x726b, 0x726e, 0x726f, 0x7271, 0x7277, 0x7278, 0x727b, 0x727c, 0x727f, 0x7284, 0x7289, 0x728d, 0x728e, 0x7293, 0x729b, 0x72a8, 0x72ad, 0x72ae, 0x72b1, 0x72b4, 0x72be, 0x72c1, 0x72c7, 0x72c9, 0x72cc, 0x72d5, 0x72d6, 0x72d8, 0x72df, 0x72e5, 0x72f3, 0x72f4, 0x72fa, 0x72fb, /* 0x4b21 - 0x4b7e */ 0x72fe, 0x7302, 0x7304, 0x7305, 0x7307, 0x730b, 0x730d, 0x7312, 0x7313, 0x7318, 0x7319, 0x731e, 0x7322, 0x7324, 0x7327, 0x7328, 0x732c, 0x7331, 0x7332, 0x7335, 0x733a, 0x733b, 0x733d, 0x7343, 0x734d, 0x7350, 0x7352, 0x7356, 0x7358, 0x735d, 0x735e, 0x735f, 0x7360, 0x7366, 0x7367, 0x7369, 0x736b, 0x736c, 0x736e, 0x736f, 0x7371, 0x7377, 0x7379, 0x737c, 0x7380, 0x7381, 0x7383, 0x7385, 0x7386, 0x738e, 0x7390, 0x7393, 0x7395, 0x7397, 0x7398, 0x739c, 0x739e, 0x739f, 0x73a0, 0x73a2, 0x73a5, 0x73a6, 0x73aa, 0x73ab, 0x73ad, 0x73b5, 0x73b7, 0x73b9, 0x73bc, 0x73bd, 0x73bf, 0x73c5, 0x73c6, 0x73c9, 0x73cb, 0x73cc, 0x73cf, 0x73d2, 0x73d3, 0x73d6, 0x73d9, 0x73dd, 0x73e1, 0x73e3, 0x73e6, 0x73e7, 0x73e9, 0x73f4, 0x73f5, 0x73f7, 0x73f9, 0x73fa, 0x73fb, 0x73fd, /* 0x4c21 - 0x4c7e */ 0x73ff, 0x7400, 0x7401, 0x7404, 0x7407, 0x740a, 0x7411, 0x741a, 0x741b, 0x7424, 0x7426, 0x7428, 0x7429, 0x742a, 0x742b, 0x742c, 0x742d, 0x742e, 0x742f, 0x7430, 0x7431, 0x7439, 0x7440, 0x7443, 0x7444, 0x7446, 0x7447, 0x744b, 0x744d, 0x7451, 0x7452, 0x7457, 0x745d, 0x7462, 0x7466, 0x7467, 0x7468, 0x746b, 0x746d, 0x746e, 0x7471, 0x7472, 0x7480, 0x7481, 0x7485, 0x7486, 0x7487, 0x7489, 0x748f, 0x7490, 0x7491, 0x7492, 0x7498, 0x7499, 0x749a, 0x749c, 0x749f, 0x74a0, 0x74a1, 0x74a3, 0x74a6, 0x74a8, 0x74a9, 0x74aa, 0x74ab, 0x74ae, 0x74af, 0x74b1, 0x74b2, 0x74b5, 0x74b9, 0x74bb, 0x74bf, 0x74c8, 0x74c9, 0x74cc, 0x74d0, 0x74d3, 0x74d8, 0x74da, 0x74db, 0x74de, 0x74df, 0x74e4, 0x74e8, 0x74ea, 0x74eb, 0x74ef, 0x74f4, 0x74fa, 0x74fb, 0x74fc, 0x74ff, 0x7506, /* 0x4d21 - 0x4d7e */ 0x7512, 0x7516, 0x7517, 0x7520, 0x7521, 0x7524, 0x7527, 0x7529, 0x752a, 0x752f, 0x7536, 0x7539, 0x753d, 0x753e, 0x753f, 0x7540, 0x7543, 0x7547, 0x7548, 0x754e, 0x7550, 0x7552, 0x7557, 0x755e, 0x755f, 0x7561, 0x756f, 0x7571, 0x7579, 0x757a, 0x757b, 0x757c, 0x757d, 0x757e, 0x7581, 0x7585, 0x7590, 0x7592, 0x7593, 0x7595, 0x7599, 0x759c, 0x75a2, 0x75a4, 0x75b4, 0x75ba, 0x75bf, 0x75c0, 0x75c1, 0x75c4, 0x75c6, 0x75cc, 0x75ce, 0x75cf, 0x75d7, 0x75dc, 0x75df, 0x75e0, 0x75e1, 0x75e4, 0x75e7, 0x75ec, 0x75ee, 0x75ef, 0x75f1, 0x75f9, 0x7600, 0x7602, 0x7603, 0x7604, 0x7607, 0x7608, 0x760a, 0x760c, 0x760f, 0x7612, 0x7613, 0x7615, 0x7616, 0x7619, 0x761b, 0x761c, 0x761d, 0x761e, 0x7623, 0x7625, 0x7626, 0x7629, 0x762d, 0x7632, 0x7633, 0x7635, 0x7638, 0x7639, /* 0x4e21 - 0x4e7e */ 0x763a, 0x763c, 0x764a, 0x7640, 0x7641, 0x7643, 0x7644, 0x7645, 0x7649, 0x764b, 0x7655, 0x7659, 0x765f, 0x7664, 0x7665, 0x766d, 0x766e, 0x766f, 0x7671, 0x7674, 0x7681, 0x7685, 0x768c, 0x768d, 0x7695, 0x769b, 0x769c, 0x769d, 0x769f, 0x76a0, 0x76a2, 0x76a3, 0x76a4, 0x76a5, 0x76a6, 0x76a7, 0x76a8, 0x76aa, 0x76ad, 0x76bd, 0x76c1, 0x76c5, 0x76c9, 0x76cb, 0x76cc, 0x76ce, 0x76d4, 0x76d9, 0x76e0, 0x76e6, 0x76e8, 0x76ec, 0x76f0, 0x76f1, 0x76f6, 0x76f9, 0x76fc, 0x7700, 0x7706, 0x770a, 0x770e, 0x7712, 0x7714, 0x7715, 0x7717, 0x7719, 0x771a, 0x771c, 0x7722, 0x7728, 0x772d, 0x772e, 0x772f, 0x7734, 0x7735, 0x7736, 0x7739, 0x773d, 0x773e, 0x7742, 0x7745, 0x7746, 0x774a, 0x774d, 0x774e, 0x774f, 0x7752, 0x7756, 0x7757, 0x775c, 0x775e, 0x775f, 0x7760, 0x7762, /* 0x4f21 - 0x4f7e */ 0x7764, 0x7767, 0x776a, 0x776c, 0x7770, 0x7772, 0x7773, 0x7774, 0x777a, 0x777d, 0x7780, 0x7784, 0x778c, 0x778d, 0x7794, 0x7795, 0x7796, 0x779a, 0x779f, 0x77a2, 0x77a7, 0x77aa, 0x77ae, 0x77af, 0x77b1, 0x77b5, 0x77be, 0x77c3, 0x77c9, 0x77d1, 0x77d2, 0x77d5, 0x77d9, 0x77de, 0x77df, 0x77e0, 0x77e4, 0x77e6, 0x77ea, 0x77ec, 0x77f0, 0x77f1, 0x77f4, 0x77f8, 0x77fb, 0x7805, 0x7806, 0x7809, 0x780d, 0x780e, 0x7811, 0x781d, 0x7821, 0x7822, 0x7823, 0x782d, 0x782e, 0x7830, 0x7835, 0x7837, 0x7843, 0x7844, 0x7847, 0x7848, 0x784c, 0x784e, 0x7852, 0x785c, 0x785e, 0x7860, 0x7861, 0x7863, 0x7864, 0x7868, 0x786a, 0x786e, 0x787a, 0x787e, 0x788a, 0x788f, 0x7894, 0x7898, 0x78a1, 0x789d, 0x789e, 0x789f, 0x78a4, 0x78a8, 0x78ac, 0x78ad, 0x78b0, 0x78b1, 0x78b2, 0x78b3, /* 0x5021 - 0x507e */ 0x78bb, 0x78bd, 0x78bf, 0x78c7, 0x78c8, 0x78c9, 0x78cc, 0x78ce, 0x78d2, 0x78d3, 0x78d5, 0x78d6, 0x78e4, 0x78db, 0x78df, 0x78e0, 0x78e1, 0x78e6, 0x78ea, 0x78f2, 0x78f3, 0x7900, 0x78f6, 0x78f7, 0x78fa, 0x78fb, 0x78ff, 0x7906, 0x790c, 0x7910, 0x791a, 0x791c, 0x791e, 0x791f, 0x7920, 0x7925, 0x7927, 0x7929, 0x792d, 0x7931, 0x7934, 0x7935, 0x793b, 0x793d, 0x793f, 0x7944, 0x7945, 0x7946, 0x794a, 0x794b, 0x794f, 0x7951, 0x7954, 0x7958, 0x795b, 0x795c, 0x7967, 0x7969, 0x796b, 0x7972, 0x7979, 0x797b, 0x797c, 0x797e, 0x798b, 0x798c, 0x7991, 0x7993, 0x7994, 0x7995, 0x7996, 0x7998, 0x799b, 0x799c, 0x79a1, 0x79a8, 0x79a9, 0x79ab, 0x79af, 0x79b1, 0x79b4, 0x79b8, 0x79bb, 0x79c2, 0x79c4, 0x79c7, 0x79c8, 0x79ca, 0x79cf, 0x79d4, 0x79d6, 0x79da, 0x79dd, 0x79de, /* 0x5121 - 0x517e */ 0x79e0, 0x79e2, 0x79e5, 0x79ea, 0x79eb, 0x79ed, 0x79f1, 0x79f8, 0x79fc, 0x7a02, 0x7a03, 0x7a07, 0x7a09, 0x7a0a, 0x7a0c, 0x7a11, 0x7a15, 0x7a1b, 0x7a1e, 0x7a21, 0x7a27, 0x7a2b, 0x7a2d, 0x7a2f, 0x7a30, 0x7a34, 0x7a35, 0x7a38, 0x7a39, 0x7a3a, 0x7a44, 0x7a45, 0x7a47, 0x7a48, 0x7a4c, 0x7a55, 0x7a56, 0x7a59, 0x7a5c, 0x7a5d, 0x7a5f, 0x7a60, 0x7a65, 0x7a67, 0x7a6a, 0x7a6d, 0x7a75, 0x7a78, 0x7a7e, 0x7a80, 0x7a82, 0x7a85, 0x7a86, 0x7a8a, 0x7a8b, 0x7a90, 0x7a91, 0x7a94, 0x7a9e, 0x7aa0, 0x7aa3, 0x7aac, 0x7ab3, 0x7ab5, 0x7ab9, 0x7abb, 0x7abc, 0x7ac6, 0x7ac9, 0x7acc, 0x7ace, 0x7ad1, 0x7adb, 0x7ae8, 0x7ae9, 0x7aeb, 0x7aec, 0x7af1, 0x7af4, 0x7afb, 0x7afd, 0x7afe, 0x7b07, 0x7b14, 0x7b1f, 0x7b23, 0x7b27, 0x7b29, 0x7b2a, 0x7b2b, 0x7b2d, 0x7b2e, 0x7b2f, 0x7b30, /* 0x5221 - 0x527e */ 0x7b31, 0x7b34, 0x7b3d, 0x7b3f, 0x7b40, 0x7b41, 0x7b47, 0x7b4e, 0x7b55, 0x7b60, 0x7b64, 0x7b66, 0x7b69, 0x7b6a, 0x7b6d, 0x7b6f, 0x7b72, 0x7b73, 0x7b77, 0x7b84, 0x7b89, 0x7b8e, 0x7b90, 0x7b91, 0x7b96, 0x7b9b, 0x7b9e, 0x7ba0, 0x7ba5, 0x7bac, 0x7baf, 0x7bb0, 0x7bb2, 0x7bb5, 0x7bb6, 0x7bba, 0x7bbb, 0x7bbc, 0x7bbd, 0x7bc2, 0x7bc5, 0x7bc8, 0x7bca, 0x7bd4, 0x7bd6, 0x7bd7, 0x7bd9, 0x7bda, 0x7bdb, 0x7be8, 0x7bea, 0x7bf2, 0x7bf4, 0x7bf5, 0x7bf8, 0x7bf9, 0x7bfa, 0x7bfc, 0x7bfe, 0x7c01, 0x7c02, 0x7c03, 0x7c04, 0x7c06, 0x7c09, 0x7c0b, 0x7c0c, 0x7c0e, 0x7c0f, 0x7c19, 0x7c1b, 0x7c20, 0x7c25, 0x7c26, 0x7c28, 0x7c2c, 0x7c31, 0x7c33, 0x7c34, 0x7c36, 0x7c39, 0x7c3a, 0x7c46, 0x7c4a, 0x7c55, 0x7c51, 0x7c52, 0x7c53, 0x7c59, 0x7c5a, 0x7c5b, 0x7c5c, 0x7c5d, 0x7c5e, /* 0x5321 - 0x537e */ 0x7c61, 0x7c63, 0x7c67, 0x7c69, 0x7c6d, 0x7c6e, 0x7c70, 0x7c72, 0x7c79, 0x7c7c, 0x7c7d, 0x7c86, 0x7c87, 0x7c8f, 0x7c94, 0x7c9e, 0x7ca0, 0x7ca6, 0x7cb0, 0x7cb6, 0x7cb7, 0x7cba, 0x7cbb, 0x7cbc, 0x7cbf, 0x7cc4, 0x7cc7, 0x7cc8, 0x7cc9, 0x7ccd, 0x7ccf, 0x7cd3, 0x7cd4, 0x7cd5, 0x7cd7, 0x7cd9, 0x7cda, 0x7cdd, 0x7ce6, 0x7ce9, 0x7ceb, 0x7cf5, 0x7d03, 0x7d07, 0x7d08, 0x7d09, 0x7d0f, 0x7d11, 0x7d12, 0x7d13, 0x7d16, 0x7d1d, 0x7d1e, 0x7d23, 0x7d26, 0x7d2a, 0x7d2d, 0x7d31, 0x7d3c, 0x7d3d, 0x7d3e, 0x7d40, 0x7d41, 0x7d47, 0x7d48, 0x7d4d, 0x7d51, 0x7d53, 0x7d57, 0x7d59, 0x7d5a, 0x7d5c, 0x7d5d, 0x7d65, 0x7d67, 0x7d6a, 0x7d70, 0x7d78, 0x7d7a, 0x7d7b, 0x7d7f, 0x7d81, 0x7d82, 0x7d83, 0x7d85, 0x7d86, 0x7d88, 0x7d8b, 0x7d8c, 0x7d8d, 0x7d91, 0x7d96, 0x7d97, 0x7d9d, /* 0x5421 - 0x547e */ 0x7d9e, 0x7da6, 0x7da7, 0x7daa, 0x7db3, 0x7db6, 0x7db7, 0x7db9, 0x7dc2, 0x7dc3, 0x7dc4, 0x7dc5, 0x7dc6, 0x7dcc, 0x7dcd, 0x7dce, 0x7dd7, 0x7dd9, 0x7e00, 0x7de2, 0x7de5, 0x7de6, 0x7dea, 0x7deb, 0x7ded, 0x7df1, 0x7df5, 0x7df6, 0x7df9, 0x7dfa, 0x7e08, 0x7e10, 0x7e11, 0x7e15, 0x7e17, 0x7e1c, 0x7e1d, 0x7e20, 0x7e27, 0x7e28, 0x7e2c, 0x7e2d, 0x7e2f, 0x7e33, 0x7e36, 0x7e3f, 0x7e44, 0x7e45, 0x7e47, 0x7e4e, 0x7e50, 0x7e52, 0x7e58, 0x7e5f, 0x7e61, 0x7e62, 0x7e65, 0x7e6b, 0x7e6e, 0x7e6f, 0x7e73, 0x7e78, 0x7e7e, 0x7e81, 0x7e86, 0x7e87, 0x7e8a, 0x7e8d, 0x7e91, 0x7e95, 0x7e98, 0x7e9a, 0x7e9d, 0x7e9e, 0x7f3c, 0x7f3b, 0x7f3d, 0x7f3e, 0x7f3f, 0x7f43, 0x7f44, 0x7f47, 0x7f4f, 0x7f52, 0x7f53, 0x7f5b, 0x7f5c, 0x7f5d, 0x7f61, 0x7f63, 0x7f64, 0x7f65, 0x7f66, 0x7f6d, /* 0x5521 - 0x557e */ 0x7f71, 0x7f7d, 0x7f7e, 0x7f7f, 0x7f80, 0x7f8b, 0x7f8d, 0x7f8f, 0x7f90, 0x7f91, 0x7f96, 0x7f97, 0x7f9c, 0x7fa1, 0x7fa2, 0x7fa6, 0x7faa, 0x7fad, 0x7fb4, 0x7fbc, 0x7fbf, 0x7fc0, 0x7fc3, 0x7fc8, 0x7fce, 0x7fcf, 0x7fdb, 0x7fdf, 0x7fe3, 0x7fe5, 0x7fe8, 0x7fec, 0x7fee, 0x7fef, 0x7ff2, 0x7ffa, 0x7ffd, 0x7ffe, 0x7fff, 0x8007, 0x8008, 0x800a, 0x800d, 0x800e, 0x800f, 0x8011, 0x8013, 0x8014, 0x8016, 0x801d, 0x801e, 0x801f, 0x8020, 0x8024, 0x8026, 0x802c, 0x802e, 0x8030, 0x8034, 0x8035, 0x8037, 0x8039, 0x803a, 0x803c, 0x803e, 0x8040, 0x8044, 0x8060, 0x8064, 0x8066, 0x806d, 0x8071, 0x8075, 0x8081, 0x8088, 0x808e, 0x809c, 0x809e, 0x80a6, 0x80a7, 0x80ab, 0x80b8, 0x80b9, 0x80c8, 0x80cd, 0x80cf, 0x80d2, 0x80d4, 0x80d5, 0x80d7, 0x80d8, 0x80e0, 0x80ed, 0x80ee, /* 0x5621 - 0x567e */ 0x80f0, 0x80f2, 0x80f3, 0x80f6, 0x80f9, 0x80fa, 0x80fe, 0x8103, 0x810b, 0x8116, 0x8117, 0x8118, 0x811c, 0x811e, 0x8120, 0x8124, 0x8127, 0x812c, 0x8130, 0x8135, 0x813a, 0x813c, 0x8145, 0x8147, 0x814a, 0x814c, 0x8152, 0x8157, 0x8160, 0x8161, 0x8167, 0x8168, 0x8169, 0x816d, 0x816f, 0x8177, 0x8181, 0x8190, 0x8184, 0x8185, 0x8186, 0x818b, 0x818e, 0x8196, 0x8198, 0x819b, 0x819e, 0x81a2, 0x81ae, 0x81b2, 0x81b4, 0x81bb, 0x81cb, 0x81c3, 0x81c5, 0x81ca, 0x81ce, 0x81cf, 0x81d5, 0x81d7, 0x81db, 0x81dd, 0x81de, 0x81e1, 0x81e4, 0x81eb, 0x81ec, 0x81f0, 0x81f1, 0x81f2, 0x81f5, 0x81f6, 0x81f8, 0x81f9, 0x81fd, 0x81ff, 0x8200, 0x8203, 0x820f, 0x8213, 0x8214, 0x8219, 0x821a, 0x821d, 0x8221, 0x8222, 0x8228, 0x8232, 0x8234, 0x823a, 0x8243, 0x8244, 0x8245, 0x8246, /* 0x5721 - 0x577e */ 0x824b, 0x824e, 0x824f, 0x8251, 0x8256, 0x825c, 0x8260, 0x8263, 0x8267, 0x826d, 0x8274, 0x827b, 0x827d, 0x827f, 0x8280, 0x8281, 0x8283, 0x8284, 0x8287, 0x8289, 0x828a, 0x828e, 0x8291, 0x8294, 0x8296, 0x8298, 0x829a, 0x829b, 0x82a0, 0x82a1, 0x82a3, 0x82a4, 0x82a7, 0x82a8, 0x82a9, 0x82aa, 0x82ae, 0x82b0, 0x82b2, 0x82b4, 0x82b7, 0x82ba, 0x82bc, 0x82be, 0x82bf, 0x82c6, 0x82d0, 0x82d5, 0x82da, 0x82e0, 0x82e2, 0x82e4, 0x82e8, 0x82ea, 0x82ed, 0x82ef, 0x82f6, 0x82f7, 0x82fd, 0x82fe, 0x8300, 0x8301, 0x8307, 0x8308, 0x830a, 0x830b, 0x8354, 0x831b, 0x831d, 0x831e, 0x831f, 0x8321, 0x8322, 0x832c, 0x832d, 0x832e, 0x8330, 0x8333, 0x8337, 0x833a, 0x833c, 0x833d, 0x8342, 0x8343, 0x8344, 0x8347, 0x834d, 0x834e, 0x8351, 0x8355, 0x8356, 0x8357, 0x8370, 0x8378, /* 0x5821 - 0x587e */ 0x837d, 0x837f, 0x8380, 0x8382, 0x8384, 0x8386, 0x838d, 0x8392, 0x8394, 0x8395, 0x8398, 0x8399, 0x839b, 0x839c, 0x839d, 0x83a6, 0x83a7, 0x83a9, 0x83ac, 0x83be, 0x83bf, 0x83c0, 0x83c7, 0x83c9, 0x83cf, 0x83d0, 0x83d1, 0x83d4, 0x83dd, 0x8353, 0x83e8, 0x83ea, 0x83f6, 0x83f8, 0x83f9, 0x83fc, 0x8401, 0x8406, 0x840a, 0x840f, 0x8411, 0x8415, 0x8419, 0x83ad, 0x842f, 0x8439, 0x8445, 0x8447, 0x8448, 0x844a, 0x844d, 0x844f, 0x8451, 0x8452, 0x8456, 0x8458, 0x8459, 0x845a, 0x845c, 0x8460, 0x8464, 0x8465, 0x8467, 0x846a, 0x8470, 0x8473, 0x8474, 0x8476, 0x8478, 0x847c, 0x847d, 0x8481, 0x8485, 0x8492, 0x8493, 0x8495, 0x849e, 0x84a6, 0x84a8, 0x84a9, 0x84aa, 0x84af, 0x84b1, 0x84b4, 0x84ba, 0x84bd, 0x84be, 0x84c0, 0x84c2, 0x84c7, 0x84c8, 0x84cc, 0x84cf, 0x84d3, /* 0x5921 - 0x597e */ 0x84dc, 0x84e7, 0x84ea, 0x84ef, 0x84f0, 0x84f1, 0x84f2, 0x84f7, 0x8532, 0x84fa, 0x84fb, 0x84fd, 0x8502, 0x8503, 0x8507, 0x850c, 0x850e, 0x8510, 0x851c, 0x851e, 0x8522, 0x8523, 0x8524, 0x8525, 0x8527, 0x852a, 0x852b, 0x852f, 0x8533, 0x8534, 0x8536, 0x853f, 0x8546, 0x854f, 0x8550, 0x8551, 0x8552, 0x8553, 0x8556, 0x8559, 0x855c, 0x855d, 0x855e, 0x855f, 0x8560, 0x8561, 0x8562, 0x8564, 0x856b, 0x856f, 0x8579, 0x857a, 0x857b, 0x857d, 0x857f, 0x8581, 0x8585, 0x8586, 0x8589, 0x858b, 0x858c, 0x858f, 0x8593, 0x8598, 0x859d, 0x859f, 0x85a0, 0x85a2, 0x85a5, 0x85a7, 0x85b4, 0x85b6, 0x85b7, 0x85b8, 0x85bc, 0x85bd, 0x85be, 0x85bf, 0x85c2, 0x85c7, 0x85ca, 0x85cb, 0x85ce, 0x85ad, 0x85d8, 0x85da, 0x85df, 0x85e0, 0x85e6, 0x85e8, 0x85ed, 0x85f3, 0x85f6, 0x85fc, /* 0x5a21 - 0x5a7e */ 0x85ff, 0x8600, 0x8604, 0x8605, 0x860d, 0x860e, 0x8610, 0x8611, 0x8612, 0x8618, 0x8619, 0x861b, 0x861e, 0x8621, 0x8627, 0x8629, 0x8636, 0x8638, 0x863a, 0x863c, 0x863d, 0x8640, 0x8642, 0x8646, 0x8652, 0x8653, 0x8656, 0x8657, 0x8658, 0x8659, 0x865d, 0x8660, 0x8661, 0x8662, 0x8663, 0x8664, 0x8669, 0x866c, 0x866f, 0x8675, 0x8676, 0x8677, 0x867a, 0x868d, 0x8691, 0x8696, 0x8698, 0x869a, 0x869c, 0x86a1, 0x86a6, 0x86a7, 0x86a8, 0x86ad, 0x86b1, 0x86b3, 0x86b4, 0x86b5, 0x86b7, 0x86b8, 0x86b9, 0x86bf, 0x86c0, 0x86c1, 0x86c3, 0x86c5, 0x86d1, 0x86d2, 0x86d5, 0x86d7, 0x86da, 0x86dc, 0x86e0, 0x86e3, 0x86e5, 0x86e7, 0x8688, 0x86fa, 0x86fc, 0x86fd, 0x8704, 0x8705, 0x8707, 0x870b, 0x870e, 0x870f, 0x8710, 0x8713, 0x8714, 0x8719, 0x871e, 0x871f, 0x8721, 0x8723, /* 0x5b21 - 0x5b7e */ 0x8728, 0x872e, 0x872f, 0x8731, 0x8732, 0x8739, 0x873a, 0x873c, 0x873d, 0x873e, 0x8740, 0x8743, 0x8745, 0x874d, 0x8758, 0x875d, 0x8761, 0x8764, 0x8765, 0x876f, 0x8771, 0x8772, 0x877b, 0x8783, 0x8784, 0x8785, 0x8786, 0x8787, 0x8788, 0x8789, 0x878b, 0x878c, 0x8790, 0x8793, 0x8795, 0x8797, 0x8798, 0x8799, 0x879e, 0x87a0, 0x87a3, 0x87a7, 0x87ac, 0x87ad, 0x87ae, 0x87b1, 0x87b5, 0x87be, 0x87bf, 0x87c1, 0x87c8, 0x87c9, 0x87ca, 0x87ce, 0x87d5, 0x87d6, 0x87d9, 0x87da, 0x87dc, 0x87df, 0x87e2, 0x87e3, 0x87e4, 0x87ea, 0x87eb, 0x87ed, 0x87f1, 0x87f3, 0x87f8, 0x87fa, 0x87ff, 0x8801, 0x8803, 0x8806, 0x8809, 0x880a, 0x880b, 0x8810, 0x8819, 0x8812, 0x8813, 0x8814, 0x8818, 0x881a, 0x881b, 0x881c, 0x881e, 0x881f, 0x8828, 0x882d, 0x882e, 0x8830, 0x8832, 0x8835, /* 0x5c21 - 0x5c7e */ 0x883a, 0x883c, 0x8841, 0x8843, 0x8845, 0x8848, 0x8849, 0x884a, 0x884b, 0x884e, 0x8851, 0x8855, 0x8856, 0x8858, 0x885a, 0x885c, 0x885f, 0x8860, 0x8864, 0x8869, 0x8871, 0x8879, 0x887b, 0x8880, 0x8898, 0x889a, 0x889b, 0x889c, 0x889f, 0x88a0, 0x88a8, 0x88aa, 0x88ba, 0x88bd, 0x88be, 0x88c0, 0x88ca, 0x88cb, 0x88cc, 0x88cd, 0x88ce, 0x88d1, 0x88d2, 0x88d3, 0x88db, 0x88de, 0x88e7, 0x88ef, 0x88f0, 0x88f1, 0x88f5, 0x88f7, 0x8901, 0x8906, 0x890d, 0x890e, 0x890f, 0x8915, 0x8916, 0x8918, 0x8919, 0x891a, 0x891c, 0x8920, 0x8926, 0x8927, 0x8928, 0x8930, 0x8931, 0x8932, 0x8935, 0x8939, 0x893a, 0x893e, 0x8940, 0x8942, 0x8945, 0x8946, 0x8949, 0x894f, 0x8952, 0x8957, 0x895a, 0x895b, 0x895c, 0x8961, 0x8962, 0x8963, 0x896b, 0x896e, 0x8970, 0x8973, 0x8975, 0x897a, /* 0x5d21 - 0x5d7e */ 0x897b, 0x897c, 0x897d, 0x8989, 0x898d, 0x8990, 0x8994, 0x8995, 0x899b, 0x899c, 0x899f, 0x89a0, 0x89a5, 0x89b0, 0x89b4, 0x89b5, 0x89b6, 0x89b7, 0x89bc, 0x89d4, 0x89d5, 0x89d6, 0x89d7, 0x89d8, 0x89e5, 0x89e9, 0x89eb, 0x89ed, 0x89f1, 0x89f3, 0x89f6, 0x89f9, 0x89fd, 0x89ff, 0x8a04, 0x8a05, 0x8a07, 0x8a0f, 0x8a11, 0x8a12, 0x8a14, 0x8a15, 0x8a1e, 0x8a20, 0x8a22, 0x8a24, 0x8a26, 0x8a2b, 0x8a2c, 0x8a2f, 0x8a35, 0x8a37, 0x8a3d, 0x8a3e, 0x8a40, 0x8a43, 0x8a45, 0x8a47, 0x8a49, 0x8a4d, 0x8a4e, 0x8a53, 0x8a56, 0x8a57, 0x8a58, 0x8a5c, 0x8a5d, 0x8a61, 0x8a65, 0x8a67, 0x8a75, 0x8a76, 0x8a77, 0x8a79, 0x8a7a, 0x8a7b, 0x8a7e, 0x8a7f, 0x8a80, 0x8a83, 0x8a86, 0x8a8b, 0x8a8f, 0x8a90, 0x8a92, 0x8a96, 0x8a97, 0x8a99, 0x8a9f, 0x8aa7, 0x8aa9, 0x8aae, 0x8aaf, 0x8ab3, /* 0x5e21 - 0x5e7e */ 0x8ab6, 0x8ab7, 0x8abb, 0x8abe, 0x8ac3, 0x8ac6, 0x8ac8, 0x8ac9, 0x8aca, 0x8ad1, 0x8ad3, 0x8ad4, 0x8ad5, 0x8ad7, 0x8add, 0x8adf, 0x8aec, 0x8af0, 0x8af4, 0x8af5, 0x8af6, 0x8afc, 0x8aff, 0x8b05, 0x8b06, 0x8b0b, 0x8b11, 0x8b1c, 0x8b1e, 0x8b1f, 0x8b0a, 0x8b2d, 0x8b30, 0x8b37, 0x8b3c, 0x8b42, 0x8b43, 0x8b44, 0x8b45, 0x8b46, 0x8b48, 0x8b52, 0x8b53, 0x8b54, 0x8b59, 0x8b4d, 0x8b5e, 0x8b63, 0x8b6d, 0x8b76, 0x8b78, 0x8b79, 0x8b7c, 0x8b7e, 0x8b81, 0x8b84, 0x8b85, 0x8b8b, 0x8b8d, 0x8b8f, 0x8b94, 0x8b95, 0x8b9c, 0x8b9e, 0x8b9f, 0x8c38, 0x8c39, 0x8c3d, 0x8c3e, 0x8c45, 0x8c47, 0x8c49, 0x8c4b, 0x8c4f, 0x8c51, 0x8c53, 0x8c54, 0x8c57, 0x8c58, 0x8c5b, 0x8c5d, 0x8c59, 0x8c63, 0x8c64, 0x8c66, 0x8c68, 0x8c69, 0x8c6d, 0x8c73, 0x8c75, 0x8c76, 0x8c7b, 0x8c7e, 0x8c86, /* 0x5f21 - 0x5f7e */ 0x8c87, 0x8c8b, 0x8c90, 0x8c92, 0x8c93, 0x8c99, 0x8c9b, 0x8c9c, 0x8ca4, 0x8cb9, 0x8cba, 0x8cc5, 0x8cc6, 0x8cc9, 0x8ccb, 0x8ccf, 0x8cd6, 0x8cd5, 0x8cd9, 0x8cdd, 0x8ce1, 0x8ce8, 0x8cec, 0x8cef, 0x8cf0, 0x8cf2, 0x8cf5, 0x8cf7, 0x8cf8, 0x8cfe, 0x8cff, 0x8d01, 0x8d03, 0x8d09, 0x8d12, 0x8d17, 0x8d1b, 0x8d65, 0x8d69, 0x8d6c, 0x8d6e, 0x8d7f, 0x8d82, 0x8d84, 0x8d88, 0x8d8d, 0x8d90, 0x8d91, 0x8d95, 0x8d9e, 0x8d9f, 0x8da0, 0x8da6, 0x8dab, 0x8dac, 0x8daf, 0x8db2, 0x8db5, 0x8db7, 0x8db9, 0x8dbb, 0x8dc0, 0x8dc5, 0x8dc6, 0x8dc7, 0x8dc8, 0x8dca, 0x8dce, 0x8dd1, 0x8dd4, 0x8dd5, 0x8dd7, 0x8dd9, 0x8de4, 0x8de5, 0x8de7, 0x8dec, 0x8df0, 0x8dbc, 0x8df1, 0x8df2, 0x8df4, 0x8dfd, 0x8e01, 0x8e04, 0x8e05, 0x8e06, 0x8e0b, 0x8e11, 0x8e14, 0x8e16, 0x8e20, 0x8e21, 0x8e22, /* 0x6021 - 0x607e */ 0x8e23, 0x8e26, 0x8e27, 0x8e31, 0x8e33, 0x8e36, 0x8e37, 0x8e38, 0x8e39, 0x8e3d, 0x8e40, 0x8e41, 0x8e4b, 0x8e4d, 0x8e4e, 0x8e4f, 0x8e54, 0x8e5b, 0x8e5c, 0x8e5d, 0x8e5e, 0x8e61, 0x8e62, 0x8e69, 0x8e6c, 0x8e6d, 0x8e6f, 0x8e70, 0x8e71, 0x8e79, 0x8e7a, 0x8e7b, 0x8e82, 0x8e83, 0x8e89, 0x8e90, 0x8e92, 0x8e95, 0x8e9a, 0x8e9b, 0x8e9d, 0x8e9e, 0x8ea2, 0x8ea7, 0x8ea9, 0x8ead, 0x8eae, 0x8eb3, 0x8eb5, 0x8eba, 0x8ebb, 0x8ec0, 0x8ec1, 0x8ec3, 0x8ec4, 0x8ec7, 0x8ecf, 0x8ed1, 0x8ed4, 0x8edc, 0x8ee8, 0x8eee, 0x8ef0, 0x8ef1, 0x8ef7, 0x8ef9, 0x8efa, 0x8eed, 0x8f00, 0x8f02, 0x8f07, 0x8f08, 0x8f0f, 0x8f10, 0x8f16, 0x8f17, 0x8f18, 0x8f1e, 0x8f20, 0x8f21, 0x8f23, 0x8f25, 0x8f27, 0x8f28, 0x8f2c, 0x8f2d, 0x8f2e, 0x8f34, 0x8f35, 0x8f36, 0x8f37, 0x8f3a, 0x8f40, 0x8f41, /* 0x6121 - 0x617e */ 0x8f43, 0x8f47, 0x8f4f, 0x8f51, 0x8f52, 0x8f53, 0x8f54, 0x8f55, 0x8f58, 0x8f5d, 0x8f5e, 0x8f65, 0x8f9d, 0x8fa0, 0x8fa1, 0x8fa4, 0x8fa5, 0x8fa6, 0x8fb5, 0x8fb6, 0x8fb8, 0x8fbe, 0x8fc0, 0x8fc1, 0x8fc6, 0x8fca, 0x8fcb, 0x8fcd, 0x8fd0, 0x8fd2, 0x8fd3, 0x8fd5, 0x8fe0, 0x8fe3, 0x8fe4, 0x8fe8, 0x8fee, 0x8ff1, 0x8ff5, 0x8ff6, 0x8ffb, 0x8ffe, 0x9002, 0x9004, 0x9008, 0x900c, 0x9018, 0x901b, 0x9028, 0x9029, 0x902f, 0x902a, 0x902c, 0x902d, 0x9033, 0x9034, 0x9037, 0x903f, 0x9043, 0x9044, 0x904c, 0x905b, 0x905d, 0x9062, 0x9066, 0x9067, 0x906c, 0x9070, 0x9074, 0x9079, 0x9085, 0x9088, 0x908b, 0x908c, 0x908e, 0x9090, 0x9095, 0x9097, 0x9098, 0x9099, 0x909b, 0x90a0, 0x90a1, 0x90a2, 0x90a5, 0x90b0, 0x90b2, 0x90b3, 0x90b4, 0x90b6, 0x90bd, 0x90cc, 0x90be, 0x90c3, /* 0x6221 - 0x627e */ 0x90c4, 0x90c5, 0x90c7, 0x90c8, 0x90d5, 0x90d7, 0x90d8, 0x90d9, 0x90dc, 0x90dd, 0x90df, 0x90e5, 0x90d2, 0x90f6, 0x90eb, 0x90ef, 0x90f0, 0x90f4, 0x90fe, 0x90ff, 0x9100, 0x9104, 0x9105, 0x9106, 0x9108, 0x910d, 0x9110, 0x9114, 0x9116, 0x9117, 0x9118, 0x911a, 0x911c, 0x911e, 0x9120, 0x9125, 0x9122, 0x9123, 0x9127, 0x9129, 0x912e, 0x912f, 0x9131, 0x9134, 0x9136, 0x9137, 0x9139, 0x913a, 0x913c, 0x913d, 0x9143, 0x9147, 0x9148, 0x914f, 0x9153, 0x9157, 0x9159, 0x915a, 0x915b, 0x9161, 0x9164, 0x9167, 0x916d, 0x9174, 0x9179, 0x917a, 0x917b, 0x9181, 0x9183, 0x9185, 0x9186, 0x918a, 0x918e, 0x9191, 0x9193, 0x9194, 0x9195, 0x9198, 0x919e, 0x91a1, 0x91a6, 0x91a8, 0x91ac, 0x91ad, 0x91ae, 0x91b0, 0x91b1, 0x91b2, 0x91b3, 0x91b6, 0x91bb, 0x91bc, 0x91bd, 0x91bf, /* 0x6321 - 0x637e */ 0x91c2, 0x91c3, 0x91c5, 0x91d3, 0x91d4, 0x91d7, 0x91d9, 0x91da, 0x91de, 0x91e4, 0x91e5, 0x91e9, 0x91ea, 0x91ec, 0x91ed, 0x91ee, 0x91ef, 0x91f0, 0x91f1, 0x91f7, 0x91f9, 0x91fb, 0x91fd, 0x9200, 0x9201, 0x9204, 0x9205, 0x9206, 0x9207, 0x9209, 0x920a, 0x920c, 0x9210, 0x9212, 0x9213, 0x9216, 0x9218, 0x921c, 0x921d, 0x9223, 0x9224, 0x9225, 0x9226, 0x9228, 0x922e, 0x922f, 0x9230, 0x9233, 0x9235, 0x9236, 0x9238, 0x9239, 0x923a, 0x923c, 0x923e, 0x9240, 0x9242, 0x9243, 0x9246, 0x9247, 0x924a, 0x924d, 0x924e, 0x924f, 0x9251, 0x9258, 0x9259, 0x925c, 0x925d, 0x9260, 0x9261, 0x9265, 0x9267, 0x9268, 0x9269, 0x926e, 0x926f, 0x9270, 0x9275, 0x9276, 0x9277, 0x9278, 0x9279, 0x927b, 0x927c, 0x927d, 0x927f, 0x9288, 0x9289, 0x928a, 0x928d, 0x928e, 0x9292, 0x9297, /* 0x6421 - 0x647e */ 0x9299, 0x929f, 0x92a0, 0x92a4, 0x92a5, 0x92a7, 0x92a8, 0x92ab, 0x92af, 0x92b2, 0x92b6, 0x92b8, 0x92ba, 0x92bb, 0x92bc, 0x92bd, 0x92bf, 0x92c0, 0x92c1, 0x92c2, 0x92c3, 0x92c5, 0x92c6, 0x92c7, 0x92c8, 0x92cb, 0x92cc, 0x92cd, 0x92ce, 0x92d0, 0x92d3, 0x92d5, 0x92d7, 0x92d8, 0x92d9, 0x92dc, 0x92dd, 0x92df, 0x92e0, 0x92e1, 0x92e3, 0x92e5, 0x92e7, 0x92e8, 0x92ec, 0x92ee, 0x92f0, 0x92f9, 0x92fb, 0x92ff, 0x9300, 0x9302, 0x9308, 0x930d, 0x9311, 0x9314, 0x9315, 0x931c, 0x931d, 0x931e, 0x931f, 0x9321, 0x9324, 0x9325, 0x9327, 0x9329, 0x932a, 0x9333, 0x9334, 0x9336, 0x9337, 0x9347, 0x9348, 0x9349, 0x9350, 0x9351, 0x9352, 0x9355, 0x9357, 0x9358, 0x935a, 0x935e, 0x9364, 0x9365, 0x9367, 0x9369, 0x936a, 0x936d, 0x936f, 0x9370, 0x9371, 0x9373, 0x9374, 0x9376, /* 0x6521 - 0x657e */ 0x937a, 0x937d, 0x937f, 0x9380, 0x9381, 0x9382, 0x9388, 0x938a, 0x938b, 0x938d, 0x938f, 0x9392, 0x9395, 0x9398, 0x939b, 0x939e, 0x93a1, 0x93a3, 0x93a4, 0x93a6, 0x93a8, 0x93ab, 0x93b4, 0x93b5, 0x93b6, 0x93ba, 0x93a9, 0x93c1, 0x93c4, 0x93c5, 0x93c6, 0x93c7, 0x93c9, 0x93ca, 0x93cb, 0x93cc, 0x93cd, 0x93d3, 0x93d9, 0x93dc, 0x93de, 0x93df, 0x93e2, 0x93e6, 0x93e7, 0x93f9, 0x93f7, 0x93f8, 0x93fa, 0x93fb, 0x93fd, 0x9401, 0x9402, 0x9404, 0x9408, 0x9409, 0x940d, 0x940e, 0x940f, 0x9415, 0x9416, 0x9417, 0x941f, 0x942e, 0x942f, 0x9431, 0x9432, 0x9433, 0x9434, 0x943b, 0x943f, 0x943d, 0x9443, 0x9445, 0x9448, 0x944a, 0x944c, 0x9455, 0x9459, 0x945c, 0x945f, 0x9461, 0x9463, 0x9468, 0x946b, 0x946d, 0x946e, 0x946f, 0x9471, 0x9472, 0x9484, 0x9483, 0x9578, 0x9579, /* 0x6621 - 0x667e */ 0x957e, 0x9584, 0x9588, 0x958c, 0x958d, 0x958e, 0x959d, 0x959e, 0x959f, 0x95a1, 0x95a6, 0x95a9, 0x95ab, 0x95ac, 0x95b4, 0x95b6, 0x95ba, 0x95bd, 0x95bf, 0x95c6, 0x95c8, 0x95c9, 0x95cb, 0x95d0, 0x95d1, 0x95d2, 0x95d3, 0x95d9, 0x95da, 0x95dd, 0x95de, 0x95df, 0x95e0, 0x95e4, 0x95e6, 0x961d, 0x961e, 0x9622, 0x9624, 0x9625, 0x9626, 0x962c, 0x9631, 0x9633, 0x9637, 0x9638, 0x9639, 0x963a, 0x963c, 0x963d, 0x9641, 0x9652, 0x9654, 0x9656, 0x9657, 0x9658, 0x9661, 0x966e, 0x9674, 0x967b, 0x967c, 0x967e, 0x967f, 0x9681, 0x9682, 0x9683, 0x9684, 0x9689, 0x9691, 0x9696, 0x969a, 0x969d, 0x969f, 0x96a4, 0x96a5, 0x96a6, 0x96a9, 0x96ae, 0x96af, 0x96b3, 0x96ba, 0x96ca, 0x96d2, 0x5db2, 0x96d8, 0x96da, 0x96dd, 0x96de, 0x96df, 0x96e9, 0x96ef, 0x96f1, 0x96fa, 0x9702, /* 0x6721 - 0x677e */ 0x9703, 0x9705, 0x9709, 0x971a, 0x971b, 0x971d, 0x9721, 0x9722, 0x9723, 0x9728, 0x9731, 0x9733, 0x9741, 0x9743, 0x974a, 0x974e, 0x974f, 0x9755, 0x9757, 0x9758, 0x975a, 0x975b, 0x9763, 0x9767, 0x976a, 0x976e, 0x9773, 0x9776, 0x9777, 0x9778, 0x977b, 0x977d, 0x977f, 0x9780, 0x9789, 0x9795, 0x9796, 0x9797, 0x9799, 0x979a, 0x979e, 0x979f, 0x97a2, 0x97ac, 0x97ae, 0x97b1, 0x97b2, 0x97b5, 0x97b6, 0x97b8, 0x97b9, 0x97ba, 0x97bc, 0x97be, 0x97bf, 0x97c1, 0x97c4, 0x97c5, 0x97c7, 0x97c9, 0x97ca, 0x97cc, 0x97cd, 0x97ce, 0x97d0, 0x97d1, 0x97d4, 0x97d7, 0x97d8, 0x97d9, 0x97dd, 0x97de, 0x97e0, 0x97db, 0x97e1, 0x97e4, 0x97ef, 0x97f1, 0x97f4, 0x97f7, 0x97f8, 0x97fa, 0x9807, 0x980a, 0x9819, 0x980d, 0x980e, 0x9814, 0x9816, 0x981c, 0x981e, 0x9820, 0x9823, 0x9826, /* 0x6821 - 0x687e */ 0x982b, 0x982e, 0x982f, 0x9830, 0x9832, 0x9833, 0x9835, 0x9825, 0x983e, 0x9844, 0x9847, 0x984a, 0x9851, 0x9852, 0x9853, 0x9856, 0x9857, 0x9859, 0x985a, 0x9862, 0x9863, 0x9865, 0x9866, 0x986a, 0x986c, 0x98ab, 0x98ad, 0x98ae, 0x98b0, 0x98b4, 0x98b7, 0x98b8, 0x98ba, 0x98bb, 0x98bf, 0x98c2, 0x98c5, 0x98c8, 0x98cc, 0x98e1, 0x98e3, 0x98e5, 0x98e6, 0x98e7, 0x98ea, 0x98f3, 0x98f6, 0x9902, 0x9907, 0x9908, 0x9911, 0x9915, 0x9916, 0x9917, 0x991a, 0x991b, 0x991c, 0x991f, 0x9922, 0x9926, 0x9927, 0x992b, 0x9931, 0x9932, 0x9933, 0x9934, 0x9935, 0x9939, 0x993a, 0x993b, 0x993c, 0x9940, 0x9941, 0x9946, 0x9947, 0x9948, 0x994d, 0x994e, 0x9954, 0x9958, 0x9959, 0x995b, 0x995c, 0x995e, 0x995f, 0x9960, 0x999b, 0x999d, 0x999f, 0x99a6, 0x99b0, 0x99b1, 0x99b2, 0x99b5, /* 0x6921 - 0x697e */ 0x99b9, 0x99ba, 0x99bd, 0x99bf, 0x99c3, 0x99c9, 0x99d3, 0x99d4, 0x99d9, 0x99da, 0x99dc, 0x99de, 0x99e7, 0x99ea, 0x99eb, 0x99ec, 0x99f0, 0x99f4, 0x99f5, 0x99f9, 0x99fd, 0x99fe, 0x9a02, 0x9a03, 0x9a04, 0x9a0b, 0x9a0c, 0x9a10, 0x9a11, 0x9a16, 0x9a1e, 0x9a20, 0x9a22, 0x9a23, 0x9a24, 0x9a27, 0x9a2d, 0x9a2e, 0x9a33, 0x9a35, 0x9a36, 0x9a38, 0x9a47, 0x9a41, 0x9a44, 0x9a4a, 0x9a4b, 0x9a4c, 0x9a4e, 0x9a51, 0x9a54, 0x9a56, 0x9a5d, 0x9aaa, 0x9aac, 0x9aae, 0x9aaf, 0x9ab2, 0x9ab4, 0x9ab5, 0x9ab6, 0x9ab9, 0x9abb, 0x9abe, 0x9abf, 0x9ac1, 0x9ac3, 0x9ac6, 0x9ac8, 0x9ace, 0x9ad0, 0x9ad2, 0x9ad5, 0x9ad6, 0x9ad7, 0x9adb, 0x9adc, 0x9ae0, 0x9ae4, 0x9ae5, 0x9ae7, 0x9ae9, 0x9aec, 0x9af2, 0x9af3, 0x9af5, 0x9af9, 0x9afa, 0x9afd, 0x9aff, 0x9b00, 0x9b01, 0x9b02, 0x9b03, /* 0x6a21 - 0x6a7e */ 0x9b04, 0x9b05, 0x9b08, 0x9b09, 0x9b0b, 0x9b0c, 0x9b0d, 0x9b0e, 0x9b10, 0x9b12, 0x9b16, 0x9b19, 0x9b1b, 0x9b1c, 0x9b20, 0x9b26, 0x9b2b, 0x9b2d, 0x9b33, 0x9b34, 0x9b35, 0x9b37, 0x9b39, 0x9b3a, 0x9b3d, 0x9b48, 0x9b4b, 0x9b4c, 0x9b55, 0x9b56, 0x9b57, 0x9b5b, 0x9b5e, 0x9b61, 0x9b63, 0x9b65, 0x9b66, 0x9b68, 0x9b6a, 0x9b6b, 0x9b6c, 0x9b6d, 0x9b6e, 0x9b73, 0x9b75, 0x9b77, 0x9b78, 0x9b79, 0x9b7f, 0x9b80, 0x9b84, 0x9b85, 0x9b86, 0x9b87, 0x9b89, 0x9b8a, 0x9b8b, 0x9b8d, 0x9b8f, 0x9b90, 0x9b94, 0x9b9a, 0x9b9d, 0x9b9e, 0x9ba6, 0x9ba7, 0x9ba9, 0x9bac, 0x9bb0, 0x9bb1, 0x9bb2, 0x9bb7, 0x9bb8, 0x9bbb, 0x9bbc, 0x9bbe, 0x9bbf, 0x9bc1, 0x9bc7, 0x9bc8, 0x9bce, 0x9bd0, 0x9bd7, 0x9bd8, 0x9bdd, 0x9bdf, 0x9be5, 0x9be7, 0x9bea, 0x9beb, 0x9bef, 0x9bf3, 0x9bf7, 0x9bf8, /* 0x6b21 - 0x6b7e */ 0x9bf9, 0x9bfa, 0x9bfd, 0x9bff, 0x9c00, 0x9c02, 0x9c0b, 0x9c0f, 0x9c11, 0x9c16, 0x9c18, 0x9c19, 0x9c1a, 0x9c1c, 0x9c1e, 0x9c22, 0x9c23, 0x9c26, 0x9c27, 0x9c28, 0x9c29, 0x9c2a, 0x9c31, 0x9c35, 0x9c36, 0x9c37, 0x9c3d, 0x9c41, 0x9c43, 0x9c44, 0x9c45, 0x9c49, 0x9c4a, 0x9c4e, 0x9c4f, 0x9c50, 0x9c53, 0x9c54, 0x9c56, 0x9c58, 0x9c5b, 0x9c5d, 0x9c5e, 0x9c5f, 0x9c63, 0x9c69, 0x9c6a, 0x9c5c, 0x9c6b, 0x9c68, 0x9c6e, 0x9c70, 0x9c72, 0x9c75, 0x9c77, 0x9c7b, 0x9ce6, 0x9cf2, 0x9cf7, 0x9cf9, 0x9d0b, 0x9d02, 0x9d11, 0x9d17, 0x9d18, 0x9d1c, 0x9d1d, 0x9d1e, 0x9d2f, 0x9d30, 0x9d32, 0x9d33, 0x9d34, 0x9d3a, 0x9d3c, 0x9d45, 0x9d3d, 0x9d42, 0x9d43, 0x9d47, 0x9d4a, 0x9d53, 0x9d54, 0x9d5f, 0x9d63, 0x9d62, 0x9d65, 0x9d69, 0x9d6a, 0x9d6b, 0x9d70, 0x9d76, 0x9d77, 0x9d7b, /* 0x6c21 - 0x6c7e */ 0x9d7c, 0x9d7e, 0x9d83, 0x9d84, 0x9d86, 0x9d8a, 0x9d8d, 0x9d8e, 0x9d92, 0x9d93, 0x9d95, 0x9d96, 0x9d97, 0x9d98, 0x9da1, 0x9daa, 0x9dac, 0x9dae, 0x9db1, 0x9db5, 0x9db9, 0x9dbc, 0x9dbf, 0x9dc3, 0x9dc7, 0x9dc9, 0x9dca, 0x9dd4, 0x9dd5, 0x9dd6, 0x9dd7, 0x9dda, 0x9dde, 0x9ddf, 0x9de0, 0x9de5, 0x9de7, 0x9de9, 0x9deb, 0x9dee, 0x9df0, 0x9df3, 0x9df4, 0x9dfe, 0x9e0a, 0x9e02, 0x9e07, 0x9e0e, 0x9e10, 0x9e11, 0x9e12, 0x9e15, 0x9e16, 0x9e19, 0x9e1c, 0x9e1d, 0x9e7a, 0x9e7b, 0x9e7c, 0x9e80, 0x9e82, 0x9e83, 0x9e84, 0x9e85, 0x9e87, 0x9e8e, 0x9e8f, 0x9e96, 0x9e98, 0x9e9b, 0x9e9e, 0x9ea4, 0x9ea8, 0x9eac, 0x9eae, 0x9eaf, 0x9eb0, 0x9eb3, 0x9eb4, 0x9eb5, 0x9ec6, 0x9ec8, 0x9ecb, 0x9ed5, 0x9edf, 0x9ee4, 0x9ee7, 0x9eec, 0x9eed, 0x9eee, 0x9ef0, 0x9ef1, 0x9ef2, 0x9ef5, /* 0x6d21 - 0x6d7e */ 0x9ef8, 0x9eff, 0x9f02, 0x9f03, 0x9f09, 0x9f0f, 0x9f10, 0x9f11, 0x9f12, 0x9f14, 0x9f16, 0x9f17, 0x9f19, 0x9f1a, 0x9f1b, 0x9f1f, 0x9f22, 0x9f26, 0x9f2a, 0x9f2b, 0x9f2f, 0x9f31, 0x9f32, 0x9f34, 0x9f37, 0x9f39, 0x9f3a, 0x9f3c, 0x9f3d, 0x9f3f, 0x9f41, 0x9f43, 0x9f44, 0x9f45, 0x9f46, 0x9f47, 0x9f53, 0x9f55, 0x9f56, 0x9f57, 0x9f58, 0x9f5a, 0x9f5d, 0x9f5e, 0x9f68, 0x9f69, 0x9f6d, 0x9f6e, 0x9f6f, 0x9f70, 0x9f71, 0x9f73, 0x9f75, 0x9f7a, 0x9f7d, 0x9f8f, 0x9f90, 0x9f91, 0x9f92, 0x9f94, 0x9f96, 0x9f97, 0x9f9e, 0x9fa1, 0x9fa2, 0x9fa3, 0x9fa5, 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, /* 0x6e21 - 0x6e7e */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 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, /* 0x6f21 - 0x6f7e */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 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, /* 0x7021 - 0x707e */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 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, /* 0x7121 - 0x717e */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 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, /* 0x7221 - 0x727e */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 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, /* 0x7321 - 0x737e */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x2170, 0x2171, 0x2172, 0x2173, 0x2174, 0x2175, 0x2176, 0x2177, 0x2178, 0x2179, 0x2160, 0x2161, /* 0x7421 - 0x747e */ 0x2162, 0x2163, 0x2164, 0x2165, 0x2166, 0x2167, 0x2168, 0x2169, 0xff07, 0xff02, 0x3231, 0x2116, 0x2121, 0x70bb, 0x4efc, 0x50f4, 0x51ec, 0x5307, 0x5324, 0xfa0e, 0x548a, 0x5759, 0xfa0f, 0xfa10, 0x589e, 0x5bec, 0x5cf5, 0x5d53, 0xfa11, 0x5fb7, 0x6085, 0x6120, 0x654e, 0x663b, 0x6665, 0xfa12, 0xf929, 0x6801, 0xfa13, 0xfa14, 0x6a6b, 0x6ae2, 0x6df8, 0x6df2, 0x7028, 0xfa15, 0xfa16, 0x7501, 0x7682, 0x769e, 0xfa17, 0x7930, 0xfa18, 0xfa19, 0xfa1a, 0xfa1b, 0x7ae7, 0xfa1c, 0xfa1d, 0x7da0, 0x7dd6, 0xfa1e, 0x8362, 0xfa1f, 0x85b0, 0xfa20, 0xfa21, 0x8807, 0xfa22, 0x8b7f, 0x8cf4, 0x8d76, 0xfa23, 0xfa24, 0xfa25, 0x90de, 0xfa26, 0x9115, 0xfa27, 0xfa28, 0x9592, 0xf9dc, 0xfa29, 0x973b, 0x974d, 0x9751, 0xfa2a, 0xfa2b, 0xfa2c, 0x999e, 0x9ad9, 0x9b72, 0xfa2d, 0x9ed1, /* 0x7521 - 0x757e */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 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, /* 0x7621 - 0x767e */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 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, /* 0x7721 - 0x777e */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 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, /* 0x7821 - 0x787e */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 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, /* 0x7921 - 0x797e */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 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, /* 0x7a21 - 0x7a7e */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 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, /* 0x7b21 - 0x7b7e */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 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, /* 0x7c21 - 0x7c7e */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 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, /* 0x7d21 - 0x7d7e */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 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, /* 0x7e21 - 0x7e7e */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 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, }; ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// static const uint16_t REPLACEMENT = 0xfffd; static inline uint16_t ValidChar(unsigned u) { return u != 0 ? static_cast(u) : REPLACEMENT; } static inline bool IsKana(unsigned c) { return c >= 0xa1 && c <= 0xdf; } static inline bool IsSjisChar1(unsigned c) { return (c >= 0x81 && c <= 0x9f) || (c >= 0xe0 && c <= 0xfc); } static inline bool IsSjisChar2(unsigned c) { return c >= 0x40 && c != 0x7f && c <= 0xfc; } static inline bool IsUserDefinedChar1(unsigned c) { return c >= 0xf0 && c <= 0xfc; } static inline unsigned jisx0208ToUnicode11(unsigned h, unsigned l) { if ((0x0021 <= h) && (h <= 0x007e) && (0x0021 <= l) && (l <= 0x007e)) { return jisx0208_to_unicode[(h - 0x0021) * 0x005e + (l - 0x0021)]; } return 0x0000; } unsigned inline jisx0208ToUnicode(unsigned h, unsigned l) { if ((h == 0x21) && (l == 0x40)) { return 0xff3c; } return jisx0208ToUnicode11(h, l); } unsigned jisx0208ToUnicode(unsigned jis) { return jisx0208ToUnicode((jis & 0xff00) >> 8, (jis & 0x00ff)); } static inline unsigned jisx0212ToUnicode11(unsigned h, unsigned l) { if ((0x0021 <= h) && (h <= 0x007e) && (0x0021 <= l) && (l <= 0x007e)) { return jisx0212_to_unicode[(h - 0x0021) * 0x005e + (l - 0x0021)]; } return 0x0000; } unsigned inline jisx0212ToUnicode(unsigned h, unsigned l) { if ((h == 0x22) && (l == 0x37)) { return 0xff5e; } return jisx0212ToUnicode11(h, l); } /* * This function is derived from Unicode 1.1, * JIS X 0201 (1976) to Unicode mapping table version 0.9 . */ #define JISX0201_YEN_SIGN 0x005c #define UNICODE_YEN_SIGN 0x00a5 #define JISX0201_OVERLINE 0x007e #define UNICODE_OVERLINE 0x203e static inline unsigned jisx0201ToUnicode(unsigned h, unsigned l) { if (h == 0) { if (l < 0x80) { if (l == JISX0201_YEN_SIGN) { return UNICODE_YEN_SIGN; } else if (l == JISX0201_OVERLINE) { return UNICODE_OVERLINE; } else { return l; } } else if ((0xa1 <= l) && (l <= 0x00df)) { return 0xff61 + l - 0x00a1; } } return 0x0000; } static inline unsigned jisx0201ToUnicode(unsigned jis) { return jisx0201ToUnicode((jis & 0xff00) >> 8, (jis & 0x00ff)); } static unsigned sjisToJisx0208(unsigned h, unsigned l) { if ((((0x81 <= h) && (h <= 0x9f)) || ((0xe0 <= h) && (h <= 0xef))) && ((0x40 <= l) && (l != 0x7f) && (l <= 0xfc))) { if (l < 0x9f) { return (((h << 1) - ((h <= 0x9f) ? 0x00e1 : 0x0161)) << 8) | (l - ((l <= 0x7f) ? 0x1f : 0x20)); } else { return (((h << 1) - ((h <= 0x9f) ? 0x00e1 : 0x0161) + 1) << 8) | (l - 0x7e); } } return 0x0000; } static inline unsigned sjisToUnicode(unsigned h, unsigned l) { if (h == 0) { return jisx0201ToUnicode(h, l); } else if (IsSjisChar1(h) && IsSjisChar2(l)) { return jisx0208ToUnicode(sjisToJisx0208(h, l)); } return 0x0000; } void JPTextDecoder::AppendShiftJIS(std::vector& result, const uint8_t* bytes, size_t length) { uint8_t buf[1] = { 0 }; int nbuf = 0; int invalid = 0; unsigned u = 0; for (size_t i = 0; i= 0xa1 && c <= 0xfe; } void JPTextDecoder::AppendEUCJP(std::vector& result, const uint8_t* bytes, size_t length) { static const uint8_t Ss2 = 0x8e; // Single Shift 2 static const uint8_t Ss3 = 0x8f; // Single Shift 3 uint8_t buf[2] = { 0, 0 }; int nbuf = 0; int invalid = 0; for (size_t i = 0; i #include #include class JPTextDecoder { public: static void AppendShiftJIS(std::vector& utf16, const uint8_t* bytes, size_t length); static void AppendEUCJP(std::vector& utf16, const uint8_t* bytes, size_t length); }; zxing-cpp-1.0.8+ds2/core/src/textcodec/JPTextEncoder.cpp000066400000000000000000006421021361167020700230160ustar00rootroot00000000000000/**************************************************************************** ** ** Copyright (C) 2015 The Qt Company Ltd. ** Contact: http://www.qt.io/licensing/ ** ** This file is part of the QtCore module of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:LGPL21$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and The Qt Company. For licensing terms ** and conditions see http://www.qt.io/terms-conditions. For further ** information use the contact form at http://www.qt.io/contact-us. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 or version 3 as published by the Free ** Software Foundation and appearing in the file LICENSE.LGPLv21 and ** LICENSE.LGPLv3 included in the packaging of this file. Please review the ** following information to ensure the GNU Lesser General Public License ** requirements will be met: https://www.gnu.org/licenses/lgpl.html and ** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** As a special exception, The Qt Company gives you certain additional ** rights. These rights are described in The Qt Company LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** $QT_END_LICENSE$ ** ****************************************************************************/ // Most of the code here was originally written by Serika Kurusugawa // a.k.a. Junji Takagi, and is included in Qt with the author's permission, // and the grateful thanks of the Qt team. #include "JPTextEncoder.h" /* * This data is derived from Unicode 1.1, * JIS X 0208 (1990) to Unicode mapping table version 0.9 . * (In addition NEC Vender Defined Char included) */ static const uint16_t unicode_to_jisx0208_00[256] = { 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 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, 0x2140, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x2171, 0x2172, 0x0000, 0x0000, 0x0000, 0x2178, 0x212f, 0x0000, 0x0000, 0x0000, 0x224c, 0x0000, 0x0000, 0x0000, 0x216b, 0x215e, 0x0000, 0x0000, 0x212d, 0x0000, 0x2279, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x215f, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x2160, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, }; static const uint16_t unicode_to_jisx0208_03[256] = { 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x2621, 0x2622, 0x2623, 0x2624, 0x2625, 0x2626, 0x2627, 0x2628, 0x2629, 0x262a, 0x262b, 0x262c, 0x262d, 0x262e, 0x262f, 0x2630, 0x2631, 0x0000, 0x2632, 0x2633, 0x2634, 0x2635, 0x2636, 0x2637, 0x2638, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x2641, 0x2642, 0x2643, 0x2644, 0x2645, 0x2646, 0x2647, 0x2648, 0x2649, 0x264a, 0x264b, 0x264c, 0x264d, 0x264e, 0x264f, 0x2650, 0x2651, 0x0000, 0x2652, 0x2653, 0x2654, 0x2655, 0x2656, 0x2657, 0x2658, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, }; static const uint16_t unicode_to_jisx0208_04[256] = { 0x0000, 0x2727, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x2721, 0x2722, 0x2723, 0x2724, 0x2725, 0x2726, 0x2728, 0x2729, 0x272a, 0x272b, 0x272c, 0x272d, 0x272e, 0x272f, 0x2730, 0x2731, 0x2732, 0x2733, 0x2734, 0x2735, 0x2736, 0x2737, 0x2738, 0x2739, 0x273a, 0x273b, 0x273c, 0x273d, 0x273e, 0x273f, 0x2740, 0x2741, 0x2751, 0x2752, 0x2753, 0x2754, 0x2755, 0x2756, 0x2758, 0x2759, 0x275a, 0x275b, 0x275c, 0x275d, 0x275e, 0x275f, 0x2760, 0x2761, 0x2762, 0x2763, 0x2764, 0x2765, 0x2766, 0x2767, 0x2768, 0x2769, 0x276a, 0x276b, 0x276c, 0x276d, 0x276e, 0x276f, 0x2770, 0x2771, 0x0000, 0x2757, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, }; static const uint16_t unicode_to_jisx0208_20[256] = { 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x213e, 0x0000, 0x0000, 0x0000, 0x0000, 0x213d, 0x2142, 0x0000, 0x2146, 0x2147, 0x0000, 0x0000, 0x2148, 0x2149, 0x0000, 0x0000, 0x2277, 0x2278, 0x0000, 0x0000, 0x0000, 0x2145, 0x2144, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x2273, 0x0000, 0x216c, 0x216d, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x2228, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, }; static const uint16_t unicode_to_jisx0208_21[256] = { 0x0000, 0x0000, 0x0000, 0x216e, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x2d62, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x2d64, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x2272, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x2d35, 0x2d36, 0x2d37, 0x2d38, 0x2d39, 0x2d3a, 0x2d3b, 0x2d3c, 0x2d3d, 0x2d3e, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x222b, 0x222c, 0x222a, 0x222d, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 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, 0x224d, 0x0000, 0x224e, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, }; static const uint16_t unicode_to_jisx0208_22[256] = { 0x224f, 0x0000, 0x225f, 0x2250, 0x0000, 0x0000, 0x0000, 0x2260, 0x223a, 0x0000, 0x0000, 0x223b, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x2d74, 0x215d, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x2265, 0x0000, 0x0000, 0x2267, 0x2167, 0x2d78, 0x225c, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x224a, 0x224b, 0x2241, 0x2240, 0x2269, 0x226a, 0x0000, 0x2d73, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x2168, 0x2268, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x2266, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x2262, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x2162, 0x2261, 0x0000, 0x0000, 0x0000, 0x0000, 0x2165, 0x2166, 0x0000, 0x0000, 0x2263, 0x2264, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x223e, 0x223f, 0x0000, 0x0000, 0x223c, 0x223d, 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, 0x225d, 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, 0x2d79, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, }; static const uint16_t unicode_to_jisx0208_23[256] = { 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x225e, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, }; static const uint16_t unicode_to_jisx0208_24[256] = { 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x2d21, 0x2d22, 0x2d23, 0x2d24, 0x2d25, 0x2d26, 0x2d27, 0x2d28, 0x2d29, 0x2d2a, 0x2d2b, 0x2d2c, 0x2d2d, 0x2d2e, 0x2d2f, 0x2d30, 0x2d31, 0x2d32, 0x2d33, 0x2d34, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, }; static const uint16_t unicode_to_jisx0208_25[256] = { 0x2821, 0x282c, 0x2822, 0x282d, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x2823, 0x0000, 0x0000, 0x282e, 0x2824, 0x0000, 0x0000, 0x282f, 0x2826, 0x0000, 0x0000, 0x2831, 0x2825, 0x0000, 0x0000, 0x2830, 0x2827, 0x283c, 0x0000, 0x0000, 0x2837, 0x0000, 0x0000, 0x2832, 0x2829, 0x283e, 0x0000, 0x0000, 0x2839, 0x0000, 0x0000, 0x2834, 0x2828, 0x0000, 0x0000, 0x2838, 0x283d, 0x0000, 0x0000, 0x2833, 0x282a, 0x0000, 0x0000, 0x283a, 0x283f, 0x0000, 0x0000, 0x2835, 0x282b, 0x0000, 0x0000, 0x283b, 0x0000, 0x0000, 0x2840, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x2836, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x2223, 0x2222, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x2225, 0x2224, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x2227, 0x2226, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x2221, 0x217e, 0x0000, 0x0000, 0x0000, 0x217b, 0x0000, 0x0000, 0x217d, 0x217c, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x227e, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, }; static const uint16_t unicode_to_jisx0208_26[256] = { 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x217a, 0x2179, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 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, 0x216a, 0x0000, 0x2169, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x2276, 0x0000, 0x0000, 0x2275, 0x0000, 0x2274, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, }; static const uint16_t unicode_to_jisx0208_30[256] = { 0x2121, 0x2122, 0x2123, 0x2137, 0x0000, 0x2139, 0x213a, 0x213b, 0x2152, 0x2153, 0x2154, 0x2155, 0x2156, 0x2157, 0x2158, 0x2159, 0x215a, 0x215b, 0x2229, 0x222e, 0x214c, 0x214d, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x2141, 0x2d60, 0x0000, 0x2d61, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x2421, 0x2422, 0x2423, 0x2424, 0x2425, 0x2426, 0x2427, 0x2428, 0x2429, 0x242a, 0x242b, 0x242c, 0x242d, 0x242e, 0x242f, 0x2430, 0x2431, 0x2432, 0x2433, 0x2434, 0x2435, 0x2436, 0x2437, 0x2438, 0x2439, 0x243a, 0x243b, 0x243c, 0x243d, 0x243e, 0x243f, 0x2440, 0x2441, 0x2442, 0x2443, 0x2444, 0x2445, 0x2446, 0x2447, 0x2448, 0x2449, 0x244a, 0x244b, 0x244c, 0x244d, 0x244e, 0x244f, 0x2450, 0x2451, 0x2452, 0x2453, 0x2454, 0x2455, 0x2456, 0x2457, 0x2458, 0x2459, 0x245a, 0x245b, 0x245c, 0x245d, 0x245e, 0x245f, 0x2460, 0x2461, 0x2462, 0x2463, 0x2464, 0x2465, 0x2466, 0x2467, 0x2468, 0x2469, 0x246a, 0x246b, 0x246c, 0x246d, 0x246e, 0x246f, 0x2470, 0x2471, 0x2472, 0x2473, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x212b, 0x212c, 0x2135, 0x2136, 0x0000, 0x0000, 0x2521, 0x2522, 0x2523, 0x2524, 0x2525, 0x2526, 0x2527, 0x2528, 0x2529, 0x252a, 0x252b, 0x252c, 0x252d, 0x252e, 0x252f, 0x2530, 0x2531, 0x2532, 0x2533, 0x2534, 0x2535, 0x2536, 0x2537, 0x2538, 0x2539, 0x253a, 0x253b, 0x253c, 0x253d, 0x253e, 0x253f, 0x2540, 0x2541, 0x2542, 0x2543, 0x2544, 0x2545, 0x2546, 0x2547, 0x2548, 0x2549, 0x254a, 0x254b, 0x254c, 0x254d, 0x254e, 0x254f, 0x2550, 0x2551, 0x2552, 0x2553, 0x2554, 0x2555, 0x2556, 0x2557, 0x2558, 0x2559, 0x255a, 0x255b, 0x255c, 0x255d, 0x255e, 0x255f, 0x2560, 0x2561, 0x2562, 0x2563, 0x2564, 0x2565, 0x2566, 0x2567, 0x2568, 0x2569, 0x256a, 0x256b, 0x256c, 0x256d, 0x256e, 0x256f, 0x2570, 0x2571, 0x2572, 0x2573, 0x2574, 0x2575, 0x2576, 0x0000, 0x0000, 0x0000, 0x0000, 0x2126, 0x213c, 0x2133, 0x2134, 0x0000, }; static const uint16_t unicode_to_jisx0208_32[256] = { 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x2d6a, 0x2d6b, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x2d6c, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x2d65, 0x2d66, 0x2d67, 0x2d68, 0x2d69, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, }; static const uint16_t unicode_to_jisx0208_33[256] = { 0x0000, 0x0000, 0x0000, 0x2d46, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x2d4a, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x2d41, 0x0000, 0x0000, 0x0000, 0x2d44, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x2d42, 0x2d4c, 0x0000, 0x0000, 0x2d4b, 0x2d45, 0x0000, 0x0000, 0x0000, 0x2d4d, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x2d47, 0x0000, 0x0000, 0x0000, 0x0000, 0x2d4f, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x2d40, 0x2d4e, 0x0000, 0x0000, 0x2d43, 0x0000, 0x0000, 0x0000, 0x2d48, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x2d49, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x2d5f, 0x2d6f, 0x2d6e, 0x2d6d, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x2d53, 0x2d54, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x2d50, 0x2d51, 0x2d52, 0x0000, 0x0000, 0x2d56, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x2d55, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x2d63, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, }; static const uint16_t unicode_to_jisx0208_4e[256] = { 0x306c, 0x437a, 0x0000, 0x3c37, 0x0000, 0x0000, 0x0000, 0x4b7c, 0x3e66, 0x3b30, 0x3e65, 0x323c, 0x0000, 0x4954, 0x4d3f, 0x0000, 0x5022, 0x312f, 0x0000, 0x0000, 0x336e, 0x5023, 0x4024, 0x5242, 0x3556, 0x4a3a, 0x0000, 0x0000, 0x0000, 0x0000, 0x3e67, 0x0000, 0x0000, 0x4e3e, 0x0000, 0x0000, 0x0000, 0x0000, 0x4a42, 0x0000, 0x0000, 0x0000, 0x5024, 0x0000, 0x0000, 0x4366, 0x0000, 0x0000, 0x0000, 0x5025, 0x367a, 0x0000, 0x0000, 0x0000, 0x5026, 0x0000, 0x345d, 0x4330, 0x0000, 0x3c67, 0x5027, 0x0000, 0x0000, 0x5028, 0x0000, 0x0000, 0x5029, 0x4735, 0x0000, 0x3557, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x4737, 0x0000, 0x4663, 0x3843, 0x4b33, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x6949, 0x502a, 0x3e68, 0x502b, 0x3235, 0x0000, 0x0000, 0x0000, 0x3665, 0x3870, 0x4c69, 0x0000, 0x0000, 0x5626, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x4d70, 0x0000, 0x467d, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x3425, 0x0000, 0x3535, 0x0000, 0x502c, 0x0000, 0x0000, 0x502d, 0x4e3b, 0x0000, 0x4d3d, 0x4168, 0x502f, 0x3b76, 0x4673, 0x0000, 0x5032, 0x0000, 0x0000, 0x313e, 0x385f, 0x0000, 0x385e, 0x3066, 0x0000, 0x0000, 0x4f4b, 0x4f4a, 0x0000, 0x3a33, 0x3021, 0x0000, 0x5033, 0x5034, 0x5035, 0x4b34, 0x5036, 0x0000, 0x3872, 0x3067, 0x4b72, 0x0000, 0x357c, 0x0000, 0x0000, 0x357d, 0x357e, 0x4462, 0x4e3c, 0x0000, 0x5037, 0x0000, 0x0000, 0x5038, 0x0000, 0x0000, 0x5039, 0x0000, 0x0000, 0x0000, 0x3f4d, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x3d3a, 0x3f4e, 0x503e, 0x0000, 0x503c, 0x0000, 0x503d, 0x3558, 0x0000, 0x0000, 0x3a23, 0x3270, 0x0000, 0x503b, 0x503a, 0x4a29, 0x0000, 0x0000, 0x0000, 0x0000, 0x3b46, 0x3b45, 0x423e, 0x503f, 0x4955, 0x4067, 0x0000, 0x0000, 0x0000, 0x2138, 0x5040, 0x5042, 0x0000, 0x0000, 0x0000, 0x4265, 0x4e61, 0x304a, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x5041, 0x323e, 0x0000, 0x3644, 0x0000, 0x4367, 0x0000, 0x0000, 0x0000, 0x376f, 0x5043, 0x0000, 0x0000, 0x0000, 0x4724, 0x0000, 0x0000, 0x0000, 0x0000, }; static const uint16_t unicode_to_jisx0208_4f[256] = { 0x0000, 0x346b, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x5044, 0x304b, 0x0000, 0x0000, 0x3860, 0x346c, 0x497a, 0x4832, 0x3559, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x3271, 0x0000, 0x5067, 0x4541, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x476c, 0x5046, 0x0000, 0x0000, 0x0000, 0x483c, 0x0000, 0x4e62, 0x0000, 0x3f2d, 0x0000, 0x3b47, 0x0000, 0x3b77, 0x3240, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x4451, 0x0000, 0x0000, 0x4322, 0x504a, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x304c, 0x4463, 0x3d3b, 0x3a34, 0x4d24, 0x0000, 0x424e, 0x0000, 0x323f, 0x0000, 0x5049, 0x0000, 0x4d3e, 0x5045, 0x5047, 0x3a6e, 0x5048, 0x5524, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x5050, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x5053, 0x5051, 0x0000, 0x0000, 0x3242, 0x0000, 0x4a3b, 0x504b, 0x0000, 0x0000, 0x0000, 0x0000, 0x504f, 0x3873, 0x0000, 0x0000, 0x3b48, 0x0000, 0x0000, 0x0000, 0x3426, 0x0000, 0x0000, 0x5054, 0x0000, 0x504c, 0x0000, 0x0000, 0x4e63, 0x0000, 0x3b78, 0x0000, 0x504d, 0x0000, 0x5052, 0x0000, 0x0000, 0x0000, 0x0000, 0x5055, 0x0000, 0x504e, 0x0000, 0x0000, 0x3621, 0x0000, 0x304d, 0x0000, 0x0000, 0x3622, 0x3241, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x5525, 0x0000, 0x4b79, 0x496e, 0x3874, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x3f2f, 0x4e37, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x4a58, 0x0000, 0x0000, 0x3738, 0x4225, 0x3264, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x3d53, 0x0000, 0x0000, 0x0000, 0x5059, 0x0000, 0x505e, 0x505c, 0x0000, 0x0000, 0x5057, 0x0000, 0x0000, 0x422f, 0x505a, 0x0000, 0x505d, 0x505b, 0x0000, 0x4a5d, 0x0000, 0x5058, 0x0000, 0x3f2e, 0x0000, 0x4b73, 0x505f, 0x5060, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x3d24, 0x506d, 0x0000, 0x0000, 0x0000, 0x4750, 0x0000, 0x4936, 0x5068, 0x0000, 0x4a70, 0x0000, 0x3236, 0x0000, 0x0000, 0x0000, 0x506c, 0x0000, }; static const uint16_t unicode_to_jisx0208_50[256] = { 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x5066, 0x506f, 0x0000, 0x0000, 0x4152, 0x0000, 0x3844, 0x0000, 0x475c, 0x0000, 0x6047, 0x0000, 0x506e, 0x455d, 0x0000, 0x5063, 0x0000, 0x3876, 0x0000, 0x0000, 0x3875, 0x5061, 0x0000, 0x0000, 0x0000, 0x0000, 0x3c5a, 0x0000, 0x5069, 0x0000, 0x4a6f, 0x434d, 0x5065, 0x3771, 0x0000, 0x5062, 0x506a, 0x5064, 0x4e51, 0x506b, 0x4f41, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x3666, 0x0000, 0x0000, 0x3770, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x5070, 0x0000, 0x0000, 0x0000, 0x5071, 0x5075, 0x304e, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x4a50, 0x5074, 0x0000, 0x0000, 0x0000, 0x0000, 0x5073, 0x5077, 0x0000, 0x0000, 0x0000, 0x5076, 0x0000, 0x4464, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x3772, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x5078, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x3c45, 0x0000, 0x4226, 0x4465, 0x3676, 0x0000, 0x5079, 0x0000, 0x0000, 0x0000, 0x0000, 0x3536, 0x0000, 0x0000, 0x507a, 0x0000, 0x0000, 0x0000, 0x0000, 0x507c, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x4b35, 0x0000, 0x0000, 0x0000, 0x3766, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x3b31, 0x4877, 0x507b, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x3a45, 0x4d43, 0x0000, 0x0000, 0x0000, 0x0000, 0x507e, 0x5123, 0x507d, 0x3a44, 0x0000, 0x3d7d, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x3739, 0x0000, 0x0000, 0x0000, 0x5124, 0x0000, 0x0000, 0x364f, 0x0000, 0x0000, 0x0000, 0x5121, 0x5122, 0x0000, 0x0000, 0x462f, 0x0000, 0x417c, 0x0000, 0x3623, 0x0000, 0x0000, 0x0000, 0x4b4d, 0x5125, 0x0000, 0x0000, 0x0000, 0x4e3d, 0x0000, 0x0000, 0x0000, 0x5126, 0x0000, 0x0000, 0x0000, 0x0000, 0x5129, 0x0000, 0x5127, 0x0000, 0x414e, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x5128, 0x512a, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x512c, 0x0000, 0x0000, 0x0000, 0x512b, 0x0000, 0x4a48, 0x0000, 0x0000, 0x0000, 0x0000, }; static const uint16_t unicode_to_jisx0208_51[256] = { 0x3537, 0x512e, 0x512f, 0x0000, 0x322f, 0x0000, 0x0000, 0x0000, 0x0000, 0x512d, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x3c74, 0x0000, 0x5132, 0x5131, 0x5130, 0x0000, 0x5056, 0x0000, 0x5133, 0x0000, 0x0000, 0x0000, 0x0000, 0x3d7e, 0x0000, 0x5134, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x4d25, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x4c59, 0x0000, 0x0000, 0x0000, 0x0000, 0x5136, 0x0000, 0x0000, 0x5135, 0x5138, 0x5137, 0x0000, 0x0000, 0x5139, 0x513a, 0x3074, 0x0000, 0x3835, 0x373b, 0x3d3c, 0x437b, 0x3624, 0x4068, 0x3877, 0x0000, 0x396e, 0x513c, 0x4c48, 0x4546, 0x0000, 0x3b79, 0x0000, 0x513b, 0x0000, 0x513d, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x455e, 0x0000, 0x3375, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x513e, 0x0000, 0x0000, 0x467e, 0x0000, 0x0000, 0x4134, 0x5140, 0x5141, 0x482c, 0x3878, 0x4f3b, 0x5142, 0x0000, 0x0000, 0x3626, 0x0000, 0x0000, 0x0000, 0x4a3c, 0x4236, 0x3671, 0x4535, 0x0000, 0x0000, 0x0000, 0x3773, 0x0000, 0x0000, 0x0000, 0x5143, 0x0000, 0x5144, 0x0000, 0x0000, 0x4662, 0x315f, 0x0000, 0x0000, 0x5147, 0x3a7d, 0x0000, 0x5146, 0x3a46, 0x0000, 0x5148, 0x666e, 0x5149, 0x4b41, 0x514a, 0x0000, 0x514b, 0x514c, 0x3e69, 0x0000, 0x3c4c, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x3427, 0x0000, 0x514f, 0x0000, 0x514d, 0x4c3d, 0x514e, 0x0000, 0x495a, 0x5150, 0x5151, 0x5152, 0x455f, 0x0000, 0x0000, 0x0000, 0x5156, 0x5154, 0x5155, 0x5153, 0x3a63, 0x5157, 0x4c6a, 0x4e64, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x5158, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x4028, 0x5159, 0x3d5a, 0x0000, 0x0000, 0x515a, 0x0000, 0x437c, 0x4e3f, 0x4560, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x5245, 0x0000, 0x0000, 0x0000, 0x0000, 0x515b, 0x7425, 0x3645, 0x0000, 0x0000, 0x515c, 0x4b5e, 0x0000, 0x0000, 0x0000, 0x0000, 0x3d68, 0x427c, 0x0000, 0x515e, 0x4664, 0x0000, 0x0000, 0x515f, 0x0000, 0x0000, 0x5160, 0x332e, 0x0000, 0x0000, 0x0000, 0x5161, 0x3627, 0x0000, 0x464c, 0x317a, 0x3d50, 0x0000, 0x0000, 0x4821, 0x5162, 0x0000, }; static const uint16_t unicode_to_jisx0208_52[256] = { 0x4561, 0x0000, 0x0000, 0x3f4f, 0x5163, 0x0000, 0x4a2c, 0x405a, 0x3422, 0x0000, 0x3429, 0x5164, 0x0000, 0x0000, 0x5166, 0x0000, 0x0000, 0x373a, 0x0000, 0x0000, 0x5165, 0x0000, 0x0000, 0x4e73, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x3d69, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x483d, 0x4a4c, 0x0000, 0x5167, 0x0000, 0x4d78, 0x5168, 0x0000, 0x0000, 0x0000, 0x5169, 0x0000, 0x457e, 0x0000, 0x0000, 0x516a, 0x0000, 0x0000, 0x4029, 0x3a7e, 0x3774, 0x516b, 0x3b49, 0x396f, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x4466, 0x516d, 0x0000, 0x0000, 0x4227, 0x0000, 0x0000, 0x3a6f, 0x516e, 0x516f, 0x4130, 0x0000, 0x516c, 0x0000, 0x0000, 0x0000, 0x0000, 0x5171, 0x0000, 0x4b36, 0x0000, 0x0000, 0x0000, 0x0000, 0x3964, 0x0000, 0x0000, 0x5170, 0x0000, 0x0000, 0x0000, 0x0000, 0x3775, 0x3a5e, 0x476d, 0x0000, 0x0000, 0x0000, 0x5174, 0x5172, 0x0000, 0x0000, 0x0000, 0x0000, 0x497b, 0x3e6a, 0x517b, 0x3364, 0x5175, 0x5173, 0x414f, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x5177, 0x0000, 0x5176, 0x0000, 0x0000, 0x0000, 0x3344, 0x0000, 0x0000, 0x0000, 0x3760, 0x517c, 0x4e2d, 0x0000, 0x0000, 0x0000, 0x5178, 0x0000, 0x0000, 0x0000, 0x517d, 0x517a, 0x0000, 0x5179, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x4e4f, 0x0000, 0x0000, 0x0000, 0x3879, 0x3243, 0x0000, 0x0000, 0x4e74, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x3d75, 0x4558, 0x3965, 0x5222, 0x5223, 0x0000, 0x0000, 0x0000, 0x4e65, 0x0000, 0x0000, 0x4f2b, 0x5225, 0x0000, 0x0000, 0x0000, 0x387a, 0x0000, 0x0000, 0x5224, 0x0000, 0x332f, 0x0000, 0x0000, 0x5226, 0x0000, 0x4b56, 0x0000, 0x443c, 0x0000, 0x4d26, 0x0000, 0x4a59, 0x0000, 0x0000, 0x0000, 0x5227, 0x0000, 0x0000, 0x0000, 0x0000, 0x7055, 0x0000, 0x0000, 0x4630, 0x0000, 0x5228, 0x342a, 0x4c33, 0x0000, 0x0000, 0x0000, 0x3e21, 0x5229, 0x4a67, 0x522d, 0x0000, 0x402a, 0x522a, 0x3650, 0x0000, 0x522b, 0x342b, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x372e, 0x522e, 0x0000, 0x522f, 0x0000, 0x0000, 0x5230, 0x5231, 0x3c5b, 0x0000, 0x0000, 0x0000, 0x387b, 0x4c5e, }; static const uint16_t unicode_to_jisx0208_53[256] = { 0x0000, 0x4c68, 0x4677, 0x0000, 0x0000, 0x4a71, 0x5232, 0x0000, 0x5233, 0x0000, 0x0000, 0x0000, 0x0000, 0x5235, 0x0000, 0x5237, 0x5236, 0x0000, 0x0000, 0x0000, 0x0000, 0x5238, 0x323d, 0x4b4c, 0x0000, 0x3a7c, 0x5239, 0x0000, 0x0000, 0x4159, 0x0000, 0x0000, 0x3e22, 0x3629, 0x0000, 0x523a, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x485b, 0x0000, 0x0000, 0x0000, 0x0000, 0x523b, 0x0000, 0x523c, 0x0000, 0x523d, 0x0000, 0x0000, 0x0000, 0x0000, 0x523e, 0x4924, 0x3668, 0x3065, 0x0000, 0x0000, 0x0000, 0x463f, 0x523f, 0x3d3d, 0x0000, 0x4069, 0x0000, 0x5241, 0x5240, 0x3e23, 0x3861, 0x5243, 0x483e, 0x0000, 0x0000, 0x5244, 0x0000, 0x0000, 0x0000, 0x485c, 0x4234, 0x426e, 0x3628, 0x0000, 0x0000, 0x466e, 0x4331, 0x0000, 0x476e, 0x0000, 0x4b4e, 0x0000, 0x5246, 0x0000, 0x406a, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x3735, 0x0000, 0x0000, 0x5247, 0x0000, 0x0000, 0x0000, 0x0000, 0x5248, 0x312c, 0x3075, 0x346d, 0x0000, 0x4228, 0x3551, 0x4d71, 0x0000, 0x524b, 0x3237, 0x0000, 0x0000, 0x524a, 0x0000, 0x0000, 0x0000, 0x362a, 0x0000, 0x0000, 0x524c, 0x0000, 0x4c71, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x524d, 0x0000, 0x4e52, 0x0000, 0x387c, 0x0000, 0x0000, 0x0000, 0x0000, 0x3836, 0x524e, 0x0000, 0x0000, 0x0000, 0x0000, 0x5250, 0x524f, 0x0000, 0x3f5f, 0x3139, 0x0000, 0x0000, 0x0000, 0x315e, 0x5251, 0x0000, 0x5252, 0x0000, 0x0000, 0x3837, 0x0000, 0x0000, 0x5253, 0x0000, 0x0000, 0x0000, 0x0000, 0x356e, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x3b32, 0x5254, 0x0000, 0x0000, 0x0000, 0x0000, 0x4b74, 0x3a35, 0x355a, 0x4d27, 0x4150, 0x483f, 0x3c7d, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x3d47, 0x0000, 0x3c68, 0x3c75, 0x0000, 0x3d76, 0x0000, 0x4840, 0x0000, 0x0000, 0x0000, 0x5257, 0x0000, 0x3143, 0x4151, 0x387d, 0x3845, 0x3667, 0x0000, 0x0000, 0x525b, 0x4321, 0x427e, 0x362b, 0x3e24, 0x525c, 0x525a, 0x3244, 0x4266, 0x3c38, 0x3b4b, 0x3126, 0x0000, 0x0000, 0x3370, 0x3966, 0x3b4a, 0x0000, 0x525d, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, }; static const uint16_t unicode_to_jisx0208_54[256] = { 0x0000, 0x525e, 0x0000, 0x3549, 0x3346, 0x0000, 0x0000, 0x0000, 0x3967, 0x3548, 0x445f, 0x3125, 0x4631, 0x4c3e, 0x3921, 0x4d79, 0x4547, 0x387e, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x372f, 0x0000, 0x5267, 0x0000, 0x3663, 0x4b4a, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x485d, 0x0000, 0x0000, 0x5266, 0x0000, 0x345e, 0x5261, 0x5262, 0x5264, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x5265, 0x0000, 0x355b, 0x3f61, 0x0000, 0x4a2d, 0x5263, 0x525f, 0x3863, 0x0000, 0x5260, 0x0000, 0x4f24, 0x0000, 0x0000, 0x0000, 0x4a72, 0x0000, 0x4468, 0x3862, 0x3970, 0x0000, 0x0000, 0x0000, 0x5268, 0x0000, 0x0000, 0x465d, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x526c, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x3c7e, 0x0000, 0x3c76, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x526f, 0x526d, 0x0000, 0x4c23, 0x0000, 0x526a, 0x5273, 0x526e, 0x0000, 0x0000, 0x0000, 0x5271, 0x3846, 0x4c3f, 0x0000, 0x0000, 0x5272, 0x0000, 0x0000, 0x0000, 0x5274, 0x0000, 0x5276, 0x0000, 0x0000, 0x0000, 0x0000, 0x3a70, 0x4f42, 0x0000, 0x526b, 0x5269, 0x5275, 0x0000, 0x5270, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x5278, 0x0000, 0x5323, 0x527a, 0x0000, 0x0000, 0x527e, 0x0000, 0x0000, 0x5321, 0x527b, 0x0000, 0x0000, 0x533e, 0x0000, 0x0000, 0x3a69, 0x3331, 0x0000, 0x0000, 0x0000, 0x0000, 0x5279, 0x0000, 0x0000, 0x0000, 0x5325, 0x3076, 0x5324, 0x0000, 0x3025, 0x494a, 0x5322, 0x0000, 0x527c, 0x0000, 0x0000, 0x5277, 0x527d, 0x3a48, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x5326, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x3077, 0x532f, 0x0000, 0x0000, 0x5327, 0x5328, 0x0000, 0x3e25, 0x4b69, 0x0000, 0x0000, 0x0000, 0x532d, 0x532c, 0x0000, 0x0000, 0x0000, 0x452f, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x532e, 0x0000, 0x0000, 0x532b, 0x0000, 0x0000, }; static const uint16_t unicode_to_jisx0208_55[256] = { 0x0000, 0x0000, 0x0000, 0x0000, 0x3134, 0x0000, 0x3a36, 0x3f30, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x5329, 0x4562, 0x0000, 0x0000, 0x0000, 0x532a, 0x0000, 0x3022, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x5334, 0x4d23, 0x0000, 0x3e27, 0x0000, 0x533a, 0x0000, 0x0000, 0x0000, 0x0000, 0x5339, 0x5330, 0x0000, 0x0000, 0x0000, 0x0000, 0x4243, 0x0000, 0x5331, 0x0000, 0x0000, 0x0000, 0x426f, 0x5336, 0x3e26, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x5333, 0x0000, 0x0000, 0x4c64, 0x0000, 0x0000, 0x0000, 0x373c, 0x0000, 0x0000, 0x5337, 0x5338, 0x0000, 0x0000, 0x0000, 0x0000, 0x5335, 0x533b, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x5332, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x5341, 0x5346, 0x0000, 0x5342, 0x0000, 0x533d, 0x0000, 0x0000, 0x5347, 0x4131, 0x0000, 0x0000, 0x5349, 0x0000, 0x3922, 0x533f, 0x437d, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x5343, 0x533c, 0x342d, 0x0000, 0x346e, 0x3365, 0x5344, 0x5340, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x3776, 0x534a, 0x5348, 0x4153, 0x354a, 0x362c, 0x0000, 0x5345, 0x0000, 0x3674, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x3144, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x534e, 0x534c, 0x0000, 0x5427, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x5351, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x534b, 0x0000, 0x534f, 0x0000, 0x0000, 0x534d, 0x0000, 0x0000, 0x0000, 0x3b4c, 0x5350, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x5353, 0x0000, 0x5358, 0x0000, 0x0000, 0x0000, 0x5356, 0x5355, 0x0000, }; static const uint16_t unicode_to_jisx0208_56[256] = { 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x4332, 0x0000, 0x0000, 0x3245, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x5352, 0x0000, 0x5354, 0x3e28, 0x3133, 0x0000, 0x0000, 0x5357, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x325e, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x5362, 0x0000, 0x3e7c, 0x535e, 0x0000, 0x535c, 0x0000, 0x535d, 0x0000, 0x535f, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x313d, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x4139, 0x0000, 0x5359, 0x0000, 0x535a, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x337a, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x5361, 0x0000, 0x0000, 0x0000, 0x346f, 0x0000, 0x5364, 0x5360, 0x5363, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x4a2e, 0x0000, 0x0000, 0x0000, 0x4655, 0x0000, 0x4838, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x5366, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x5365, 0x3345, 0x0000, 0x0000, 0x5367, 0x0000, 0x0000, 0x0000, 0x0000, 0x536a, 0x0000, 0x0000, 0x0000, 0x0000, 0x5369, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x5368, 0x0000, 0x4739, 0x0000, 0x0000, 0x536b, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x536c, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x536e, 0x0000, 0x536d, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x5370, 0x0000, 0x0000, 0x0000, 0x5373, 0x5371, 0x536f, 0x5372, 0x0000, 0x0000, 0x0000, 0x0000, 0x5374, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x5375, 0x0000, 0x0000, 0x5376, 0x0000, 0x5377, 0x0000, 0x0000, 0x0000, 0x5378, 0x5145, 0x0000, 0x3c7c, 0x3b4d, 0x0000, 0x0000, 0x3273, 0x0000, 0x3078, 0x0000, 0x0000, 0x4344, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x5379, 0x0000, 0x3a24, 0x0000, 0x304f, 0x3f5e, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x537a, 0x3847, 0x0000, 0x0000, 0x3971, 0x0000, 0x537c, }; static const uint16_t unicode_to_jisx0208_57[256] = { 0x537b, 0x0000, 0x0000, 0x4a60, 0x537d, 0x0000, 0x0000, 0x0000, 0x5421, 0x537e, 0x0000, 0x5422, 0x0000, 0x5423, 0x0000, 0x3777, 0x0000, 0x0000, 0x3160, 0x5424, 0x0000, 0x0000, 0x5426, 0x0000, 0x5425, 0x0000, 0x0000, 0x0000, 0x5428, 0x0000, 0x0000, 0x455a, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x5429, 0x3035, 0x3a5f, 0x0000, 0x0000, 0x0000, 0x0000, 0x373d, 0x0000, 0x0000, 0x434f, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x542a, 0x542b, 0x0000, 0x0000, 0x542d, 0x0000, 0x0000, 0x0000, 0x0000, 0x542e, 0x0000, 0x3a64, 0x0000, 0x0000, 0x0000, 0x0000, 0x3651, 0x0000, 0x0000, 0x4b37, 0x0000, 0x0000, 0x0000, 0x542c, 0x542f, 0x3a41, 0x3923, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x5433, 0x0000, 0x0000, 0x3a25, 0x0000, 0x4333, 0x0000, 0x0000, 0x5430, 0x445a, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x5434, 0x0000, 0x0000, 0x3f62, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x5432, 0x5435, 0x0000, 0x373f, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x5436, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x5437, 0x0000, 0x3924, 0x3340, 0x5439, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x543a, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x543b, 0x0000, 0x0000, 0x5438, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x5431, 0x0000, 0x0000, 0x543c, 0x0000, 0x0000, 0x543d, 0x0000, 0x0000, 0x0000, 0x0000, 0x4b64, 0x0000, 0x0000, 0x3e6b, 0x0000, 0x0000, 0x0000, 0x543f, 0x5440, 0x543e, 0x0000, 0x5442, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x4738, 0x0000, 0x0000, 0x3068, 0x4956, 0x0000, 0x0000, 0x5443, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x3e7d, 0x0000, 0x0000, 0x3c39, 0x0000, 0x475d, 0x3470, 0x0000, 0x3a6b, 0x0000, 0x0000, 0x0000, }; static const uint16_t unicode_to_jisx0208_58[256] = { 0x4b59, 0x0000, 0x4632, 0x0000, 0x0000, 0x3778, 0x424f, 0x0000, 0x0000, 0x0000, 0x5441, 0x5444, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x4244, 0x0000, 0x0000, 0x0000, 0x5445, 0x0000, 0x0000, 0x0000, 0x5446, 0x0000, 0x0000, 0x0000, 0x5448, 0x0000, 0x0000, 0x4469, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x342e, 0x0000, 0x0000, 0x0000, 0x0000, 0x7421, 0x3161, 0x4a73, 0x0000, 0x0000, 0x3e6c, 0x4548, 0x0000, 0x0000, 0x0000, 0x0000, 0x3a66, 0x0000, 0x0000, 0x544e, 0x0000, 0x0000, 0x4a3d, 0x4e5d, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x3274, 0x544a, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x413a, 0x544d, 0x0000, 0x4563, 0x0000, 0x0000, 0x4549, 0x4564, 0x4839, 0x444d, 0x0000, 0x0000, 0x0000, 0x3a49, 0x0000, 0x0000, 0x0000, 0x5449, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x3176, 0x0000, 0x4536, 0x0000, 0x0000, 0x0000, 0x0000, 0x544b, 0x0000, 0x5447, 0x0000, 0x0000, 0x3f50, 0x0000, 0x0000, 0x0000, 0x544f, 0x0000, 0x0000, 0x0000, 0x0000, 0x3d4e, 0x0000, 0x0000, 0x0000, 0x0000, 0x362d, 0x0000, 0x5450, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x4a68, 0x0000, 0x0000, 0x0000, 0x417d, 0x0000, 0x0000, 0x0000, 0x0000, 0x4446, 0x0000, 0x0000, 0x5452, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x4b4f, 0x0000, 0x0000, 0x5453, 0x0000, 0x0000, 0x5458, 0x0000, 0x0000, 0x0000, 0x0000, 0x4a2f, 0x0000, 0x0000, 0x0000, 0x0000, 0x5457, 0x5451, 0x5454, 0x5456, 0x0000, 0x0000, 0x3a26, 0x0000, 0x0000, 0x4a49, 0x0000, 0x0000, 0x0000, 0x5459, 0x0000, 0x4345, 0x0000, 0x0000, 0x3275, 0x0000, 0x3e6d, 0x0000, 0x0000, 0x0000, 0x0000, 0x545b, 0x0000, 0x545a, 0x0000, 0x3968, 0x0000, 0x545c, 0x545e, 0x545d, 0x0000, 0x0000, 0x5460, 0x0000, 0x5455, 0x5462, 0x0000, 0x0000, 0x0000, 0x0000, 0x5461, 0x545f, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x3b4e, 0x3f51, 0x0000, 0x4154, 0x5463, 0x403c, 0x306d, 0x4764, 0x0000, 0x0000, 0x0000, 0x0000, 0x445b, 0x0000, 0x5465, 0x5464, 0x5466, 0x5467, 0x5468, 0x0000, 0x0000, }; static const uint16_t unicode_to_jisx0208_59[256] = { 0x0000, 0x0000, 0x5469, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x4a51, 0x546a, 0x0000, 0x0000, 0x0000, 0x0000, 0x3246, 0x546b, 0x0000, 0x0000, 0x0000, 0x0000, 0x4d3c, 0x3330, 0x0000, 0x5249, 0x3d48, 0x423f, 0x546c, 0x4c6b, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x4c34, 0x0000, 0x0000, 0x546e, 0x0000, 0x4267, 0x0000, 0x4537, 0x4240, 0x4957, 0x546f, 0x5470, 0x317b, 0x0000, 0x0000, 0x3c3a, 0x5471, 0x0000, 0x0000, 0x0000, 0x0000, 0x3050, 0x5472, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x5473, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x3162, 0x0000, 0x0000, 0x3471, 0x4660, 0x4a74, 0x0000, 0x0000, 0x0000, 0x0000, 0x5477, 0x4155, 0x5476, 0x3740, 0x0000, 0x0000, 0x4b5b, 0x5475, 0x0000, 0x4565, 0x5479, 0x0000, 0x5478, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x547b, 0x0000, 0x547a, 0x0000, 0x0000, 0x317c, 0x0000, 0x547c, 0x3e29, 0x547e, 0x4325, 0x0000, 0x547d, 0x0000, 0x4a33, 0x0000, 0x0000, 0x0000, 0x0000, 0x3d77, 0x455b, 0x0000, 0x0000, 0x0000, 0x5521, 0x0000, 0x0000, 0x0000, 0x0000, 0x3925, 0x0000, 0x0000, 0x0000, 0x5522, 0x4721, 0x485e, 0x4c51, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x4725, 0x0000, 0x0000, 0x552b, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x3538, 0x0000, 0x0000, 0x4d45, 0x0000, 0x0000, 0x4c2f, 0x0000, 0x562c, 0x0000, 0x5523, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x5526, 0x0000, 0x4245, 0x0000, 0x0000, 0x4b38, 0x0000, 0x0000, 0x0000, 0x454a, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x5527, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x4b65, 0x0000, 0x3a4a, 0x0000, 0x0000, 0x3e2a, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x5528, 0x0000, 0x0000, 0x3b50, 0x0000, 0x3b4f, 0x0000, 0x0000, 0x0000, 0x0000, 0x3039, 0x3848, 0x0000, 0x402b, 0x3051, 0x0000, 0x0000, 0x0000, 0x0000, 0x552c, 0x552d, 0x0000, 0x552a, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x3138, 0x342f, 0x0000, 0x5529, 0x0000, 0x4c45, 0x4931, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x3028, 0x0000, 0x0000, 0x0000, 0x0000, 0x3079, 0x0000, 0x0000, 0x0000, 0x3b51, }; static const uint16_t unicode_to_jisx0208_5a[256] = { 0x0000, 0x3052, 0x0000, 0x3023, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x5532, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x5530, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x4c3c, 0x0000, 0x5533, 0x0000, 0x5531, 0x0000, 0x0000, 0x552f, 0x3f31, 0x0000, 0x0000, 0x0000, 0x0000, 0x552e, 0x0000, 0x0000, 0x0000, 0x4a5a, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x3864, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x5537, 0x5538, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x3e2b, 0x0000, 0x0000, 0x0000, 0x5534, 0x4f2c, 0x0000, 0x0000, 0x0000, 0x0000, 0x474c, 0x0000, 0x0000, 0x5536, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x3a27, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x5539, 0x0000, 0x0000, 0x0000, 0x4958, 0x0000, 0x0000, 0x0000, 0x553a, 0x0000, 0x5535, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x4c3b, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x475e, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x553b, 0x4932, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x553c, 0x5540, 0x553d, 0x0000, 0x0000, 0x3247, 0x553f, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x3c3b, 0x0000, 0x553e, 0x3779, 0x0000, 0x0000, 0x0000, 0x554c, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x5545, 0x5542, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x4364, 0x0000, 0x5541, 0x0000, 0x0000, 0x5543, 0x0000, 0x0000, 0x5544, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x5546, 0x5547, 0x0000, 0x0000, 0x0000, 0x0000, }; static const uint16_t unicode_to_jisx0208_5b[256] = { 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x3472, 0x0000, 0x5549, 0x5548, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x554a, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x3e6e, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x554d, 0x0000, 0x445c, 0x0000, 0x0000, 0x0000, 0x3145, 0x0000, 0x554b, 0x0000, 0x0000, 0x0000, 0x554e, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x554f, 0x0000, 0x5552, 0x0000, 0x0000, 0x5550, 0x0000, 0x5551, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x3b52, 0x5553, 0x0000, 0x0000, 0x3926, 0x5554, 0x0000, 0x3b7a, 0x4238, 0x0000, 0x5555, 0x5556, 0x3b5a, 0x3927, 0x0000, 0x4c52, 0x0000, 0x0000, 0x0000, 0x3528, 0x3849, 0x5557, 0x3358, 0x0000, 0x0000, 0x5558, 0x0000, 0x4239, 0x0000, 0x0000, 0x0000, 0x0000, 0x5559, 0x5623, 0x0000, 0x555a, 0x0000, 0x555b, 0x0000, 0x0000, 0x555c, 0x0000, 0x555e, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x555f, 0x0000, 0x0000, 0x5560, 0x0000, 0x4270, 0x0000, 0x3127, 0x3c69, 0x3042, 0x0000, 0x4157, 0x3430, 0x3c35, 0x0000, 0x3928, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x4566, 0x0000, 0x3d21, 0x3431, 0x4368, 0x446a, 0x3038, 0x3539, 0x4a75, 0x0000, 0x3c42, 0x0000, 0x0000, 0x3552, 0x406b, 0x3c3c, 0x4d28, 0x5561, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x355c, 0x0000, 0x3a4b, 0x0000, 0x0000, 0x3332, 0x3163, 0x3e2c, 0x3248, 0x0000, 0x5562, 0x4d46, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x3d49, 0x0000, 0x0000, 0x3c64, 0x5563, 0x3473, 0x4652, 0x4c29, 0x5564, 0x0000, 0x5565, 0x0000, 0x0000, 0x4959, 0x0000, 0x0000, 0x0000, 0x5567, 0x0000, 0x3428, 0x3677, 0x5566, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x3432, 0x0000, 0x3f32, 0x556b, 0x3b21, 0x0000, 0x3249, 0x556a, 0x0000, 0x5568, 0x556c, 0x5569, 0x472b, 0x5c4d, 0x3f33, 0x0000, 0x556d, 0x0000, 0x0000, 0x4e40, 0x0000, 0x556e, 0x0000, 0x0000, 0x5570, 0x0000, 0x437e, 0x556f, 0x0000, 0x4023, 0x0000, 0x3b7b, 0x0000, 0x0000, 0x0000, 0x4250, 0x3c77, }; static const uint16_t unicode_to_jisx0208_5c[256] = { 0x0000, 0x4975, 0x406c, 0x0000, 0x3c4d, 0x5571, 0x3e2d, 0x5572, 0x5573, 0x3053, 0x423a, 0x3f52, 0x0000, 0x5574, 0x4633, 0x3e2e, 0x0000, 0x3e2f, 0x0000, 0x5575, 0x0000, 0x0000, 0x406d, 0x0000, 0x0000, 0x0000, 0x3e30, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x5576, 0x0000, 0x5577, 0x0000, 0x4c60, 0x0000, 0x0000, 0x0000, 0x5578, 0x0000, 0x0000, 0x0000, 0x0000, 0x3646, 0x0000, 0x0000, 0x0000, 0x3d22, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x5579, 0x557a, 0x3c5c, 0x3f2c, 0x4674, 0x3f54, 0x4878, 0x4722, 0x3649, 0x557b, 0x0000, 0x0000, 0x0000, 0x356f, 0x557c, 0x0000, 0x367e, 0x0000, 0x464f, 0x3230, 0x0000, 0x3b53, 0x557d, 0x5622, 0x5621, 0x367d, 0x0000, 0x557e, 0x0000, 0x4538, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x4230, 0x0000, 0x454b, 0x3c48, 0x0000, 0x0000, 0x4158, 0x4d7a, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x5624, 0x0000, 0x5625, 0x4656, 0x0000, 0x3b33, 0x0000, 0x0000, 0x0000, 0x0000, 0x5627, 0x0000, 0x0000, 0x5628, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x5629, 0x0000, 0x0000, 0x0000, 0x3474, 0x562a, 0x0000, 0x0000, 0x562b, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x322c, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x413b, 0x3464, 0x0000, 0x562d, 0x4c28, 0x0000, 0x0000, 0x0000, 0x0000, 0x4252, 0x0000, 0x3359, 0x0000, 0x0000, 0x562f, 0x5631, 0x345f, 0x0000, 0x0000, 0x562e, 0x5630, 0x0000, 0x5633, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x5632, 0x0000, 0x5634, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x5635, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x463d, 0x362e, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x3265, 0x5636, 0x563b, 0x0000, 0x0000, 0x5639, 0x0000, 0x4a77, 0x4a76, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x4567, 0x0000, 0x0000, 0x0000, 0x5638, 0x3d54, 0x0000, 0x5637, 0x0000, 0x0000, }; static const uint16_t unicode_to_jisx0208_5d[256] = { 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x3f72, 0x0000, 0x0000, 0x0000, 0x563c, 0x0000, 0x0000, 0x3a6a, 0x0000, 0x0000, 0x5642, 0x0000, 0x0000, 0x5643, 0x563d, 0x3333, 0x563e, 0x5647, 0x5646, 0x5645, 0x5641, 0x0000, 0x0000, 0x0000, 0x5640, 0x0000, 0x0000, 0x5644, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x4a78, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x564b, 0x5648, 0x0000, 0x564a, 0x0000, 0x4d72, 0x0000, 0x5649, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x563f, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x3f73, 0x0000, 0x0000, 0x564c, 0x0000, 0x0000, 0x3a37, 0x0000, 0x0000, 0x0000, 0x564d, 0x0000, 0x0000, 0x564e, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x5651, 0x0000, 0x5650, 0x0000, 0x0000, 0x564f, 0x0000, 0x0000, 0x0000, 0x4568, 0x563a, 0x0000, 0x0000, 0x0000, 0x5657, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x5653, 0x0000, 0x0000, 0x0000, 0x0000, 0x5652, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x5654, 0x0000, 0x5655, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x5658, 0x0000, 0x0000, 0x4e66, 0x0000, 0x5659, 0x5656, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x565a, 0x0000, 0x0000, 0x3460, 0x565b, 0x0000, 0x0000, 0x0000, 0x0000, 0x565d, 0x565c, 0x0000, 0x0000, 0x565e, 0x0000, 0x0000, 0x0000, 0x0000, 0x565f, 0x0000, 0x406e, 0x3d23, 0x0000, 0x0000, 0x3d64, 0x0000, 0x4163, 0x0000, 0x3929, 0x3a38, 0x392a, 0x3570, 0x0000, 0x0000, 0x5660, 0x0000, 0x0000, 0x3a39, 0x0000, 0x0000, 0x384a, 0x5661, 0x4c26, 0x4743, 0x5662, 0x0000, 0x392b, 0x0000, 0x0000, 0x0000, 0x342c, 0x0000, 0x4327, 0x3652, 0x0000, }; static const uint16_t unicode_to_jisx0208_5e[256] = { 0x0000, 0x0000, 0x3b54, 0x495b, 0x0000, 0x0000, 0x4841, 0x0000, 0x0000, 0x0000, 0x0000, 0x5663, 0x3475, 0x0000, 0x0000, 0x0000, 0x0000, 0x5666, 0x0000, 0x0000, 0x0000, 0x0000, 0x4421, 0x0000, 0x0000, 0x5665, 0x5664, 0x5667, 0x0000, 0x446b, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x3f63, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x3b55, 0x0000, 0x404a, 0x0000, 0x4253, 0x3522, 0x0000, 0x0000, 0x4422, 0x0000, 0x0000, 0x5668, 0x5669, 0x3e6f, 0x0000, 0x0000, 0x0000, 0x0000, 0x4b39, 0x0000, 0x0000, 0x566c, 0x0000, 0x0000, 0x566b, 0x566a, 0x497d, 0x0000, 0x5673, 0x0000, 0x0000, 0x0000, 0x0000, 0x4b5a, 0x0000, 0x566d, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x566f, 0x4b6b, 0x0000, 0x566e, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x5670, 0x0000, 0x4828, 0x5671, 0x4a3e, 0x5672, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x3433, 0x4a3f, 0x472f, 0x5674, 0x5675, 0x0000, 0x392c, 0x3434, 0x5676, 0x3838, 0x4d44, 0x4d29, 0x3476, 0x5678, 0x0000, 0x4423, 0x0000, 0x392d, 0x3e31, 0x0000, 0x0000, 0x485f, 0x0000, 0x0000, 0x3e32, 0x0000, 0x0000, 0x0000, 0x0000, 0x3d78, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x446c, 0x4a79, 0x4539, 0x0000, 0x0000, 0x392e, 0x0000, 0x495c, 0x0000, 0x0000, 0x0000, 0x5679, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x4559, 0x3a42, 0x0000, 0x0000, 0x0000, 0x384b, 0x0000, 0x446d, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x3043, 0x3d6e, 0x392f, 0x4d47, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x567a, 0x567b, 0x4751, 0x0000, 0x0000, 0x0000, 0x0000, 0x567c, 0x4e77, 0x4f2d, 0x0000, 0x0000, 0x0000, 0x0000, 0x567e, 0x567d, 0x0000, 0x0000, 0x3347, 0x0000, 0x0000, 0x5721, 0x0000, 0x0000, 0x0000, 0x5724, 0x5725, 0x0000, 0x5723, 0x0000, 0x4940, 0x3e33, 0x5727, 0x5726, 0x5722, 0x0000, 0x0000, 0x0000, 0x0000, 0x5728, 0x5729, 0x0000, 0x0000, 0x572a, 0x0000, 0x0000, 0x0000, 0x572d, 0x572b, 0x0000, 0x572c, 0x572e, 0x0000, 0x3164, 0x446e, 0x572f, 0x0000, 0x377a, 0x3276, 0x4736, 0x0000, 0x5730, 0x467b, }; static const uint16_t unicode_to_jisx0208_5f[256] = { 0x0000, 0x4a5b, 0x0000, 0x5731, 0x4f2e, 0x0000, 0x0000, 0x0000, 0x0000, 0x5732, 0x4a40, 0x5735, 0x5021, 0x5031, 0x0000, 0x3c30, 0x4675, 0x5736, 0x0000, 0x355d, 0x4424, 0x307a, 0x5737, 0x4a26, 0x3930, 0x0000, 0x0000, 0x4350, 0x0000, 0x0000, 0x0000, 0x446f, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x4c6f, 0x3839, 0x384c, 0x0000, 0x5738, 0x0000, 0x0000, 0x0000, 0x5739, 0x0000, 0x573f, 0x0000, 0x3c65, 0x0000, 0x0000, 0x0000, 0x4425, 0x0000, 0x362f, 0x573a, 0x0000, 0x0000, 0x0000, 0x492b, 0x0000, 0x4346, 0x0000, 0x0000, 0x573b, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x573c, 0x0000, 0x3630, 0x0000, 0x573d, 0x0000, 0x573e, 0x0000, 0x0000, 0x5740, 0x0000, 0x4576, 0x0000, 0x0000, 0x5741, 0x5742, 0x0000, 0x5743, 0x0000, 0x0000, 0x5734, 0x5733, 0x0000, 0x0000, 0x0000, 0x5744, 0x3741, 0x0000, 0x0000, 0x0000, 0x4927, 0x0000, 0x0000, 0x3a4c, 0x4937, 0x4426, 0x494b, 0x5745, 0x0000, 0x0000, 0x3e34, 0x3146, 0x0000, 0x5746, 0x0000, 0x0000, 0x0000, 0x5747, 0x0000, 0x4c72, 0x0000, 0x0000, 0x4860, 0x0000, 0x0000, 0x574a, 0x317d, 0x402c, 0x5749, 0x5748, 0x3742, 0x4254, 0x0000, 0x574e, 0x574c, 0x0000, 0x574b, 0x4e27, 0x3865, 0x0000, 0x0000, 0x0000, 0x3d79, 0x574d, 0x454c, 0x3d3e, 0x0000, 0x0000, 0x0000, 0x4640, 0x5751, 0x5750, 0x0000, 0x0000, 0x0000, 0x0000, 0x574f, 0x0000, 0x5752, 0x3866, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x5753, 0x497c, 0x3d5b, 0x0000, 0x0000, 0x5754, 0x4879, 0x0000, 0x0000, 0x0000, 0x0000, 0x4641, 0x4427, 0x0000, 0x0000, 0x0000, 0x0000, 0x4530, 0x0000, 0x0000, 0x5755, 0x352b, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x3f34, 0x0000, 0x492c, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x3477, 0x4726, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x5756, 0x3b56, 0x4b3a, 0x4b3b, 0x0000, 0x0000, 0x317e, 0x575b, 0x0000, 0x0000, 0x4369, 0x0000, 0x0000, 0x0000, 0x5758, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x3277, 0x0000, 0x0000, 0x0000, 0x0000, 0x582d, 0x575a, 0x0000, 0x0000, 0x0000, 0x4730, 0x0000, 0x0000, 0x5759, 0x0000, 0x0000, 0x5757, 0x0000, 0x397a, 0x0000, 0x575d, }; static const uint16_t unicode_to_jisx0208_60[256] = { 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x5763, 0x5769, 0x5761, 0x0000, 0x455c, 0x0000, 0x0000, 0x5766, 0x495d, 0x0000, 0x0000, 0x5760, 0x0000, 0x5765, 0x4e67, 0x3b57, 0x0000, 0x0000, 0x4255, 0x575e, 0x0000, 0x0000, 0x0000, 0x355e, 0x5768, 0x402d, 0x3165, 0x5762, 0x3278, 0x5767, 0x0000, 0x0000, 0x0000, 0x3631, 0x0000, 0x5764, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x576a, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x576c, 0x5776, 0x5774, 0x0000, 0x0000, 0x5771, 0x0000, 0x0000, 0x0000, 0x5770, 0x4e78, 0x0000, 0x5772, 0x0000, 0x0000, 0x3632, 0x0000, 0x3931, 0x0000, 0x0000, 0x3d7a, 0x0000, 0x0000, 0x0000, 0x5779, 0x576b, 0x0000, 0x0000, 0x0000, 0x0000, 0x576f, 0x575f, 0x0000, 0x327a, 0x5773, 0x5775, 0x4351, 0x0000, 0x0000, 0x3a28, 0x3238, 0x576d, 0x5778, 0x5777, 0x3633, 0x0000, 0x4229, 0x3366, 0x0000, 0x0000, 0x0000, 0x0000, 0x3743, 0x0000, 0x576e, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x577a, 0x0000, 0x577d, 0x5821, 0x0000, 0x0000, 0x0000, 0x0000, 0x3c3d, 0x0000, 0x5827, 0x4470, 0x577b, 0x0000, 0x0000, 0x0000, 0x0000, 0x5825, 0x0000, 0x3279, 0x0000, 0x5823, 0x5824, 0x0000, 0x0000, 0x577e, 0x5822, 0x0000, 0x0000, 0x0000, 0x3867, 0x4d2a, 0x0000, 0x0000, 0x3435, 0x0000, 0x0000, 0x3159, 0x5826, 0x0000, 0x473a, 0x302d, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x4861, 0x575c, 0x582c, 0x5830, 0x4c65, 0x0000, 0x5829, 0x0000, 0x0000, 0x0000, 0x4569, 0x582e, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x3e70, 0x582f, 0x4657, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x4f47, 0x0000, 0x582b, 0x0000, 0x0000, 0x0000, 0x0000, 0x5831, 0x0000, 0x397b, 0x0000, 0x404b, 0x0000, 0x0000, 0x3054, 0x582a, 0x5828, 0x0000, 0x415a, 0x0000, 0x0000, 0x0000, 0x577c, 0x3b34, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x4246, 0x583d, 0x0000, 0x415b, 0x5838, 0x0000, 0x5835, 0x5836, 0x0000, 0x3c66, 0x5839, 0x583c, 0x0000, 0x0000, 0x0000, 0x0000, }; static const uint16_t unicode_to_jisx0208_61[256] = { 0x5837, 0x3d25, 0x0000, 0x583a, 0x0000, 0x0000, 0x5834, 0x0000, 0x4c7c, 0x4c7b, 0x0000, 0x0000, 0x0000, 0x583e, 0x583f, 0x3055, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x5833, 0x0000, 0x0000, 0x0000, 0x0000, 0x3672, 0x3026, 0x0000, 0x0000, 0x0000, 0x3436, 0x0000, 0x583b, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x5843, 0x5842, 0x0000, 0x0000, 0x0000, 0x5847, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x5848, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x5846, 0x5849, 0x5841, 0x5845, 0x0000, 0x0000, 0x584a, 0x0000, 0x584b, 0x0000, 0x0000, 0x5840, 0x3b7c, 0x0000, 0x5844, 0x4256, 0x3932, 0x5832, 0x3f35, 0x0000, 0x0000, 0x0000, 0x0000, 0x5858, 0x0000, 0x4a69, 0x0000, 0x0000, 0x584e, 0x584f, 0x5850, 0x0000, 0x0000, 0x5857, 0x0000, 0x5856, 0x0000, 0x0000, 0x4b7d, 0x3437, 0x0000, 0x5854, 0x0000, 0x3745, 0x3334, 0x0000, 0x0000, 0x5851, 0x0000, 0x0000, 0x4e38, 0x5853, 0x3056, 0x5855, 0x0000, 0x584c, 0x5852, 0x5859, 0x3744, 0x584d, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x4d5d, 0x0000, 0x0000, 0x0000, 0x4d2b, 0x0000, 0x0000, 0x0000, 0x0000, 0x585c, 0x0000, 0x0000, 0x5860, 0x0000, 0x0000, 0x0000, 0x417e, 0x0000, 0x4e79, 0x5861, 0x0000, 0x0000, 0x585e, 0x0000, 0x585b, 0x0000, 0x0000, 0x585a, 0x585f, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x4a30, 0x0000, 0x0000, 0x4634, 0x0000, 0x3746, 0x0000, 0x5862, 0x585d, 0x0000, 0x5863, 0x0000, 0x0000, 0x0000, 0x377b, 0x0000, 0x0000, 0x0000, 0x3231, 0x0000, 0x0000, 0x0000, 0x586b, 0x0000, 0x0000, 0x0000, 0x3438, 0x0000, 0x0000, 0x0000, 0x0000, 0x5869, 0x0000, 0x0000, 0x586a, 0x3a29, 0x5868, 0x5866, 0x5865, 0x586c, 0x5864, 0x586e, 0x0000, 0x0000, 0x327b, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x5870, 0x0000, 0x0000, 0x586f, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x4428, 0x0000, 0x5873, 0x0000, 0x5871, 0x5867, 0x377c, 0x0000, 0x5872, 0x0000, 0x5876, 0x5875, 0x5877, 0x5874, }; static const uint16_t unicode_to_jisx0208_62[256] = { 0x5878, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x5879, 0x587a, 0x4a6a, 0x0000, 0x587c, 0x587b, 0x3d3f, 0x0000, 0x402e, 0x3266, 0x327c, 0x0000, 0x587d, 0x0000, 0x303f, 0x0000, 0x0000, 0x0000, 0x404c, 0x587e, 0x0000, 0x6c43, 0x5921, 0x3761, 0x0000, 0x5922, 0x0000, 0x0000, 0x0000, 0x0000, 0x406f, 0x0000, 0x0000, 0x0000, 0x5923, 0x0000, 0x0000, 0x0000, 0x5924, 0x353a, 0x5925, 0x0000, 0x5926, 0x5927, 0x4257, 0x0000, 0x0000, 0x0000, 0x384d, 0x0000, 0x0000, 0x4c61, 0x0000, 0x0000, 0x0000, 0x4b3c, 0x3d6a, 0x5928, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x4070, 0x6e3d, 0x4862, 0x0000, 0x3c6a, 0x0000, 0x3a4d, 0x5929, 0x0000, 0x0000, 0x0000, 0x0000, 0x4247, 0x0000, 0x4a27, 0x0000, 0x0000, 0x4271, 0x0000, 0x0000, 0x592c, 0x0000, 0x0000, 0x592a, 0x0000, 0x592d, 0x0000, 0x0000, 0x592b, 0x0000, 0x0000, 0x0000, 0x0000, 0x592e, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x4a31, 0x0000, 0x0000, 0x3037, 0x0000, 0x0000, 0x0000, 0x0000, 0x495e, 0x0000, 0x0000, 0x4863, 0x0000, 0x0000, 0x592f, 0x0000, 0x5932, 0x3e35, 0x353b, 0x0000, 0x5930, 0x5937, 0x3e36, 0x0000, 0x0000, 0x0000, 0x0000, 0x5931, 0x4744, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x4d5e, 0x5933, 0x5934, 0x5938, 0x456a, 0x5935, 0x3933, 0x405e, 0x0000, 0x0000, 0x5946, 0x4834, 0x0000, 0x4272, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x4864, 0x5a2d, 0x0000, 0x0000, 0x0000, 0x0000, 0x4a7a, 0x0000, 0x0000, 0x0000, 0x4471, 0x0000, 0x0000, 0x0000, 0x4b75, 0x0000, 0x593b, 0x3221, 0x436a, 0x0000, 0x0000, 0x0000, 0x0000, 0x5944, 0x0000, 0x0000, 0x4334, 0x593e, 0x5945, 0x5940, 0x5947, 0x5943, 0x0000, 0x5942, 0x476f, 0x0000, 0x593c, 0x327d, 0x593a, 0x3571, 0x4273, 0x5936, 0x0000, 0x0000, 0x5939, 0x3934, 0x405b, 0x0000, 0x3e37, 0x5941, 0x4752, 0x0000, 0x0000, 0x3572, 0x3348, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x3367, 0x3f21, 0x5949, 0x594e, 0x0000, 0x594a, 0x0000, 0x377d, 0x0000, 0x594f, 0x3b22, 0x3969, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x3d26, 0x593d, }; static const uint16_t unicode_to_jisx0208_63[256] = { 0x0000, 0x3b7d, 0x594c, 0x0000, 0x0000, 0x0000, 0x0000, 0x3b58, 0x594d, 0x3044, 0x0000, 0x0000, 0x5948, 0x0000, 0x0000, 0x0000, 0x0000, 0x4429, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x3573, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x3634, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x594b, 0x3027, 0x0000, 0x0000, 0x3a43, 0x0000, 0x0000, 0x0000, 0x3f36, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x4472, 0x0000, 0x0000, 0x4854, 0x5951, 0x415e, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x422a, 0x0000, 0x0000, 0x3b2b, 0x5952, 0x0000, 0x5954, 0x5950, 0x0000, 0x0000, 0x0000, 0x0000, 0x4a61, 0x0000, 0x443d, 0x0000, 0x0000, 0x0000, 0x0000, 0x415c, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x4a7b, 0x3c4e, 0x5960, 0x0000, 0x595f, 0x0000, 0x0000, 0x3f78, 0x0000, 0x0000, 0x0000, 0x377e, 0x0000, 0x0000, 0x0000, 0x5959, 0x3e39, 0x0000, 0x0000, 0x4668, 0x4731, 0x0000, 0x0000, 0x0000, 0x0000, 0x5957, 0x0000, 0x0000, 0x415d, 0x0000, 0x0000, 0x0000, 0x0000, 0x3c78, 0x595c, 0x0000, 0x0000, 0x3e38, 0x0000, 0x5956, 0x595b, 0x0000, 0x0000, 0x4753, 0x0000, 0x0000, 0x0000, 0x5955, 0x0000, 0x3721, 0x0000, 0x0000, 0x335d, 0x0000, 0x0000, 0x0000, 0x595d, 0x4e2b, 0x3a4e, 0x4335, 0x595a, 0x0000, 0x405c, 0x0000, 0x3935, 0x3f64, 0x3166, 0x413c, 0x5958, 0x3545, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x3747, 0x0000, 0x444f, 0x595e, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x415f, 0x0000, 0x0000, 0x5961, 0x0000, 0x5963, 0x0000, 0x0000, 0x4237, 0x5969, 0x0000, 0x5964, 0x0000, 0x0000, 0x5966, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x4941, 0x4473, 0x0000, 0x5967, 0x0000, 0x0000, 0x0000, 0x4d2c, 0x0000, 0x0000, 0x0000, 0x4d48, 0x3439, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x302e, 0x0000, 0x5965, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x5962, 0x0000, 0x0000, 0x0000, 0x0000, 0x3478, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x3167, 0x0000, 0x5968, 0x0000, 0x0000, 0x0000, 0x4d49, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, }; static const uint16_t unicode_to_jisx0208_64[256] = { 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x596c, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x423b, 0x0000, 0x5973, 0x0000, 0x0000, 0x0000, 0x596d, 0x0000, 0x0000, 0x596a, 0x5971, 0x0000, 0x0000, 0x0000, 0x0000, 0x5953, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x596e, 0x0000, 0x5972, 0x0000, 0x0000, 0x0000, 0x4842, 0x456b, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x596b, 0x0000, 0x596f, 0x0000, 0x0000, 0x0000, 0x3748, 0x0000, 0x0000, 0x0000, 0x3a71, 0x0000, 0x0000, 0x0000, 0x405d, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x5977, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x4526, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x5974, 0x0000, 0x4b60, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x5975, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x5976, 0x0000, 0x4c4e, 0x0000, 0x4022, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x3762, 0x0000, 0x0000, 0x0000, 0x0000, 0x597d, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x3b35, 0x597a, 0x0000, 0x5979, 0x0000, 0x0000, 0x0000, 0x0000, 0x4732, 0x0000, 0x0000, 0x0000, 0x4635, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x4531, 0x597b, 0x0000, 0x0000, 0x0000, 0x597c, 0x0000, 0x496f, 0x0000, 0x4745, 0x3b23, 0x0000, 0x4071, 0x0000, 0x4b50, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x3349, 0x0000, 0x5a25, 0x597e, 0x0000, 0x0000, 0x0000, 0x0000, 0x4d4a, 0x5a27, 0x0000, 0x0000, 0x5a23, 0x0000, 0x5a24, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x4160, 0x0000, 0x0000, 0x0000, 0x0000, 0x5a22, 0x0000, 0x593f, 0x0000, 0x0000, 0x0000, 0x5a26, 0x0000, 0x5a21, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x5a2b, 0x5a2c, 0x4527, 0x5a2e, 0x0000, 0x0000, 0x3b24, 0x5a29, 0x0000, 0x0000, 0x0000, 0x0000, 0x353c, 0x0000, 0x0000, 0x5a2f, 0x0000, 0x5a28, 0x5a33, 0x0000, 0x5a32, 0x0000, 0x5a31, 0x0000, 0x0000, 0x0000, 0x5a34, 0x0000, 0x0000, 0x5a36, 0x3e71, 0x0000, }; static const uint16_t unicode_to_jisx0208_65[256] = { 0x5a35, 0x0000, 0x0000, 0x0000, 0x0000, 0x5a39, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x5a37, 0x0000, 0x0000, 0x0000, 0x5a38, 0x5970, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x5a3b, 0x5a3a, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x5978, 0x5a3c, 0x5a30, 0x0000, 0x0000, 0x3b59, 0x0000, 0x0000, 0x0000, 0x0000, 0x5a3d, 0x5a3e, 0x5a40, 0x5a3f, 0x5a41, 0x327e, 0x0000, 0x3936, 0x0000, 0x0000, 0x4a7c, 0x402f, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x384e, 0x0000, 0x0000, 0x5a43, 0x0000, 0x0000, 0x0000, 0x0000, 0x5a46, 0x0000, 0x4952, 0x0000, 0x355f, 0x0000, 0x0000, 0x0000, 0x5a45, 0x5a44, 0x4754, 0x5a47, 0x3635, 0x0000, 0x0000, 0x0000, 0x5a49, 0x5a48, 0x0000, 0x0000, 0x0000, 0x343a, 0x3b36, 0x0000, 0x0000, 0x4658, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x3749, 0x0000, 0x0000, 0x0000, 0x3f74, 0x0000, 0x5a4a, 0x0000, 0x4030, 0x4528, 0x0000, 0x495f, 0x5a4b, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x5a4c, 0x5a4d, 0x0000, 0x0000, 0x0000, 0x4a38, 0x555d, 0x4046, 0x0000, 0x0000, 0x494c, 0x0000, 0x3a58, 0x0000, 0x4865, 0x4843, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x454d, 0x0000, 0x4e41, 0x0000, 0x5a4f, 0x3c50, 0x0000, 0x0000, 0x5a50, 0x0000, 0x3036, 0x0000, 0x0000, 0x3654, 0x404d, 0x0000, 0x4960, 0x0000, 0x0000, 0x0000, 0x5a51, 0x3b42, 0x4347, 0x0000, 0x3b5b, 0x3f37, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x5a52, 0x0000, 0x4a7d, 0x0000, 0x0000, 0x3177, 0x3b5c, 0x0000, 0x0000, 0x0000, 0x5a55, 0x0000, 0x5a53, 0x5a56, 0x4e39, 0x5a54, 0x0000, 0x0000, 0x0000, 0x0000, 0x407b, 0x5a57, 0x0000, 0x0000, 0x4232, 0x0000, 0x0000, 0x5a58, 0x0000, 0x0000, 0x0000, 0x0000, 0x347a, 0x0000, 0x5a5a, 0x0000, 0x5a59, 0x0000, 0x0000, 0x0000, 0x0000, 0x5a5b, 0x5a5c, 0x347b, 0x0000, 0x0000, 0x467c, 0x4336, 0x356c, 0x3b5d, 0x4161, 0x0000, 0x0000, 0x3d5c, 0x3030, 0x0000, 0x0000, 0x0000, 0x5a5d, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x3222, 0x5a61, 0x0000, 0x0000, 0x0000, 0x0000, }; static const uint16_t unicode_to_jisx0208_66[256] = { 0x0000, 0x0000, 0x3937, 0x5a60, 0x0000, 0x0000, 0x3a2b, 0x3e3a, 0x0000, 0x0000, 0x5a5f, 0x0000, 0x3e3b, 0x0000, 0x4c40, 0x3a2a, 0x0000, 0x0000, 0x0000, 0x3057, 0x404e, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x5a66, 0x0000, 0x0000, 0x4031, 0x3147, 0x0000, 0x0000, 0x0000, 0x0000, 0x3d55, 0x0000, 0x4b66, 0x3a72, 0x0000, 0x0000, 0x0000, 0x0000, 0x3e3c, 0x0000, 0x4027, 0x0000, 0x0000, 0x0000, 0x0000, 0x5a65, 0x5a63, 0x5a64, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x436b, 0x0000, 0x0000, 0x5b26, 0x0000, 0x5a6a, 0x3b7e, 0x3938, 0x5a68, 0x0000, 0x0000, 0x0000, 0x0000, 0x5a69, 0x0000, 0x3f38, 0x0000, 0x0000, 0x0000, 0x5a67, 0x0000, 0x0000, 0x3b2f, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x5a6c, 0x5a6b, 0x5a70, 0x0000, 0x0000, 0x5a71, 0x0000, 0x5a6d, 0x0000, 0x3322, 0x5a6e, 0x5a6f, 0x4855, 0x0000, 0x0000, 0x0000, 0x0000, 0x4961, 0x374a, 0x5a72, 0x0000, 0x0000, 0x0000, 0x4032, 0x0000, 0x3e3d, 0x0000, 0x0000, 0x0000, 0x4352, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x3647, 0x0000, 0x5a73, 0x5a77, 0x0000, 0x0000, 0x324b, 0x5a74, 0x5a76, 0x0000, 0x0000, 0x0000, 0x0000, 0x5a75, 0x0000, 0x0000, 0x3d6b, 0x0000, 0x0000, 0x0000, 0x0000, 0x4348, 0x3045, 0x5a78, 0x0000, 0x0000, 0x0000, 0x0000, 0x5a79, 0x0000, 0x0000, 0x0000, 0x0000, 0x442a, 0x0000, 0x0000, 0x0000, 0x4e71, 0x0000, 0x0000, 0x0000, 0x0000, 0x3b43, 0x0000, 0x0000, 0x4a6b, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x4b3d, 0x0000, 0x0000, 0x0000, 0x5b22, 0x5a7b, 0x0000, 0x0000, 0x5a7e, 0x0000, 0x5a7d, 0x0000, 0x0000, 0x5a7a, 0x0000, 0x0000, 0x5b21, 0x0000, 0x0000, 0x465e, 0x0000, 0x5a7c, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x5b23, 0x0000, 0x0000, 0x3d6c, 0x5b24, 0x0000, 0x4d4b, 0x4778, 0x0000, 0x0000, 0x5b25, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x5b27, 0x0000, 0x0000, 0x5b28, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x5b29, 0x0000, 0x364a, 0x3148, 0x3939, 0x5b2a, 0x0000, 0x5b2b, 0x3d71, 0x4162, 0x0000, 0x0000, 0x5258, 0x413e, 0x413d, 0x4258, }; static const uint16_t unicode_to_jisx0208_67[256] = { 0x3a47, 0x0000, 0x0000, 0x5072, 0x0000, 0x0000, 0x0000, 0x0000, 0x376e, 0x4d2d, 0x0000, 0x4a7e, 0x0000, 0x497e, 0x0000, 0x5b2c, 0x0000, 0x0000, 0x0000, 0x0000, 0x3a73, 0x443f, 0x5b2d, 0x4f2f, 0x0000, 0x0000, 0x0000, 0x4b3e, 0x0000, 0x442b, 0x5b2e, 0x347c, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x5b2f, 0x5b30, 0x4c5a, 0x0000, 0x4c24, 0x4b76, 0x4b5c, 0x3b25, 0x5b32, 0x0000, 0x0000, 0x3c6b, 0x0000, 0x0000, 0x4b51, 0x0000, 0x5b34, 0x5b37, 0x5b36, 0x0000, 0x3479, 0x0000, 0x0000, 0x3560, 0x0000, 0x5b33, 0x0000, 0x5b35, 0x0000, 0x0000, 0x0000, 0x0000, 0x5b38, 0x0000, 0x0000, 0x3f79, 0x0000, 0x0000, 0x0000, 0x0000, 0x4d7b, 0x3049, 0x3a60, 0x423c, 0x0000, 0x3c5d, 0x0000, 0x0000, 0x3e73, 0x0000, 0x0000, 0x5b3b, 0x0000, 0x0000, 0x454e, 0x0000, 0x5b39, 0x422b, 0x5b3a, 0x3e72, 0x4c5d, 0x5b3c, 0x5b3d, 0x4d68, 0x0000, 0x0000, 0x0000, 0x0000, 0x5b42, 0x0000, 0x0000, 0x393a, 0x0000, 0x4755, 0x5b3f, 0x456c, 0x5a5e, 0x5a62, 0x0000, 0x354f, 0x0000, 0x4747, 0x0000, 0x0000, 0x0000, 0x0000, 0x5b41, 0x0000, 0x3e3e, 0x4844, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x5b47, 0x0000, 0x487a, 0x0000, 0x5b3e, 0x0000, 0x5b44, 0x5b43, 0x0000, 0x0000, 0x0000, 0x404f, 0x0000, 0x0000, 0x0000, 0x0000, 0x4b6d, 0x0000, 0x4e53, 0x0000, 0x0000, 0x4b67, 0x0000, 0x324c, 0x3b5e, 0x0000, 0x0000, 0x4f48, 0x5b46, 0x3f75, 0x0000, 0x0000, 0x0000, 0x5b45, 0x0000, 0x0000, 0x5b40, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x384f, 0x0000, 0x0000, 0x0000, 0x5b4c, 0x5b4a, 0x0000, 0x324d, 0x5b48, 0x5b4e, 0x5b54, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x4248, 0x0000, 0x0000, 0x4a41, 0x0000, 0x5b56, 0x0000, 0x0000, 0x0000, 0x4922, 0x0000, 0x0000, 0x0000, 0x5b55, 0x4770, 0x4b3f, 0x343b, 0x0000, 0x4077, 0x3d40, 0x0000, 0x0000, 0x0000, 0x4453, 0x0000, 0x4d2e, 0x0000, 0x0000, 0x5b51, 0x5b50, 0x0000, 0x0000, 0x0000, 0x5b52, 0x0000, 0x5b4f, 0x0000, 0x0000, 0x5b57, 0x0000, 0x5b4d, 0x0000, 0x0000, 0x5b4b, 0x0000, 0x5b53, 0x5b49, 0x0000, 0x436c, 0x0000, 0x4c78, 0x3c46, 0x3a74, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x3a3a, 0x0000, 0x0000, 0x4b6f, 0x3341, }; static const uint16_t unicode_to_jisx0208_68[256] = { 0x0000, 0x0000, 0x444e, 0x464a, 0x3149, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x4072, 0x0000, 0x0000, 0x4034, 0x372a, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x5b59, 0x0000, 0x0000, 0x393b, 0x337c, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x5b5b, 0x3374, 0x5b61, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x5b5e, 0x0000, 0x4073, 0x0000, 0x0000, 0x0000, 0x334b, 0x3a2c, 0x0000, 0x0000, 0x334a, 0x3a4f, 0x0000, 0x0000, 0x5b5c, 0x3765, 0x374b, 0x456d, 0x0000, 0x0000, 0x5b5a, 0x0000, 0x3046, 0x0000, 0x0000, 0x0000, 0x0000, 0x5b5d, 0x5b5f, 0x0000, 0x364d, 0x372c, 0x0000, 0x343c, 0x354b, 0x0000, 0x0000, 0x0000, 0x0000, 0x5b62, 0x0000, 0x0000, 0x3a79, 0x4b71, 0x0000, 0x3b37, 0x0000, 0x0000, 0x0000, 0x5b63, 0x0000, 0x0000, 0x0000, 0x4930, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x5b6f, 0x0000, 0x3233, 0x5b64, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x5b75, 0x5b65, 0x0000, 0x4e42, 0x0000, 0x5b6c, 0x0000, 0x475f, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x5b74, 0x0000, 0x5b67, 0x0000, 0x0000, 0x0000, 0x3034, 0x5b69, 0x0000, 0x0000, 0x393c, 0x0000, 0x0000, 0x0000, 0x5b6b, 0x0000, 0x5b6a, 0x0000, 0x5b66, 0x5b71, 0x0000, 0x3e3f, 0x0000, 0x0000, 0x0000, 0x546d, 0x3868, 0x4d7c, 0x0000, 0x0000, 0x0000, 0x0000, 0x5b68, 0x0000, 0x4474, 0x3323, 0x3a2d, 0x0000, 0x5b60, 0x0000, 0x5b70, 0x3361, 0x0000, 0x0000, 0x5b6e, 0x5b72, 0x0000, 0x456e, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x347e, 0x0000, 0x5c32, 0x0000, 0x0000, 0x4c49, 0x5b77, 0x347d, 0x0000, 0x5b7e, 0x0000, 0x0000, 0x0000, 0x0000, 0x4b40, 0x0000, 0x5c21, 0x5c23, 0x0000, 0x5c27, 0x5b79, 0x0000, 0x432a, 0x0000, 0x0000, 0x0000, 0x0000, 0x456f, 0x5c2b, 0x5b7c, 0x0000, 0x5c28, 0x0000, 0x0000, 0x0000, 0x5c22, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x3f39, 0x5c2c, 0x0000, 0x0000, 0x4033, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x5c2a, 0x343d, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, }; static const uint16_t unicode_to_jisx0208_69[256] = { 0x4f50, 0x5b76, 0x0000, 0x0000, 0x5c26, 0x3058, 0x0000, 0x0000, 0x5b78, 0x0000, 0x0000, 0x4c3a, 0x5b7d, 0x3f22, 0x4447, 0x5b73, 0x0000, 0x0000, 0x5c25, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x3f7a, 0x5c2f, 0x3371, 0x3821, 0x0000, 0x0000, 0x0000, 0x0000, 0x5c31, 0x5b7a, 0x5c30, 0x0000, 0x5c29, 0x5b7b, 0x0000, 0x5c2d, 0x0000, 0x5c2e, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x5c3f, 0x0000, 0x0000, 0x0000, 0x464e, 0x0000, 0x5c24, 0x0000, 0x0000, 0x5c3b, 0x0000, 0x0000, 0x0000, 0x5c3d, 0x0000, 0x4458, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x4d4c, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x4976, 0x5c38, 0x424a, 0x0000, 0x0000, 0x0000, 0x5c3e, 0x413f, 0x0000, 0x5c35, 0x5c42, 0x5c41, 0x0000, 0x466f, 0x5c40, 0x466a, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x5c44, 0x5c37, 0x0000, 0x3648, 0x5c3a, 0x3d5d, 0x0000, 0x0000, 0x0000, 0x4760, 0x5c3c, 0x364b, 0x0000, 0x5c34, 0x5c36, 0x5c33, 0x0000, 0x0000, 0x4f30, 0x335a, 0x5c39, 0x0000, 0x0000, 0x5c43, 0x3335, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x3a67, 0x0000, 0x0000, 0x0000, 0x315d, 0x0000, 0x0000, 0x5c54, 0x0000, 0x0000, 0x4f31, 0x5c57, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x3f3a, 0x5c56, 0x0000, 0x0000, 0x0000, 0x5c55, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x5c52, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x5c46, 0x0000, 0x0000, 0x5c63, 0x5c45, 0x0000, 0x5c58, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x5c50, 0x0000, 0x0000, 0x5c4b, 0x5c48, 0x0000, 0x5c49, 0x0000, 0x5c51, 0x0000, 0x0000, 0x0000, 0x7422, 0x0000, 0x0000, 0x5c4e, 0x393d, 0x4448, 0x4164, 0x5c4c, 0x0000, 0x5c47, 0x0000, 0x0000, 0x5c4a, 0x0000, 0x0000, 0x0000, 0x0000, 0x4d4d, 0x4b6a, 0x0000, 0x0000, 0x0000, 0x5c4f, 0x5c59, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x5c61, 0x5c5a, 0x0000, 0x0000, 0x5c67, 0x0000, 0x5c65, 0x0000, 0x0000, 0x0000, 0x0000, 0x5c60, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x5c5f, 0x0000, 0x4450, 0x0000, 0x4165, 0x0000, 0x5c5d, }; static const uint16_t unicode_to_jisx0208_6a[256] = { 0x0000, 0x0000, 0x5c5b, 0x0000, 0x0000, 0x5c62, 0x0000, 0x0000, 0x0000, 0x0000, 0x5c68, 0x4875, 0x5c6e, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x5c69, 0x5c6c, 0x5c66, 0x0000, 0x0000, 0x4374, 0x0000, 0x4938, 0x0000, 0x5c5c, 0x0000, 0x0000, 0x5c64, 0x3e40, 0x0000, 0x4c4f, 0x5c78, 0x5c6b, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x3822, 0x3223, 0x335f, 0x0000, 0x0000, 0x5c53, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x3e41, 0x5c70, 0x0000, 0x5c77, 0x3c79, 0x3372, 0x0000, 0x0000, 0x432e, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x5c6d, 0x0000, 0x0000, 0x5c72, 0x5c76, 0x0000, 0x0000, 0x3636, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x354c, 0x5c74, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x3521, 0x0000, 0x464b, 0x5c73, 0x0000, 0x0000, 0x0000, 0x5c75, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x5c6f, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x5c71, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x3360, 0x4349, 0x0000, 0x0000, 0x0000, 0x5c7c, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x5c7a, 0x3869, 0x0000, 0x5c79, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x5d21, 0x0000, 0x0000, 0x0000, 0x0000, 0x5b58, 0x0000, 0x0000, 0x0000, 0x5c7b, 0x0000, 0x5c7d, 0x5c7e, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x5d2c, 0x0000, 0x5d28, 0x0000, 0x5b6d, 0x0000, 0x0000, 0x0000, 0x0000, 0x5d27, 0x0000, 0x0000, 0x0000, 0x0000, 0x5d26, 0x0000, 0x0000, 0x5d23, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x5c6a, 0x5d25, 0x5d24, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x5d2a, 0x0000, 0x4f26, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x5d2d, 0x367b, 0x0000, 0x0000, 0x5d29, 0x5d2b, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x4827, 0x0000, 0x5d2e, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x5d32, 0x5d2f, 0x0000, 0x0000, 0x0000, 0x0000, }; static const uint16_t unicode_to_jisx0208_6b[256] = { 0x0000, 0x0000, 0x0000, 0x0000, 0x4d73, 0x5d30, 0x0000, 0x0000, 0x0000, 0x0000, 0x5c5e, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x5d33, 0x0000, 0x0000, 0x0000, 0x5d34, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x3135, 0x0000, 0x5d36, 0x3767, 0x3c21, 0x0000, 0x3655, 0x0000, 0x0000, 0x0000, 0x3224, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x4d5f, 0x0000, 0x0000, 0x0000, 0x0000, 0x5d38, 0x5d37, 0x5d3a, 0x353d, 0x0000, 0x0000, 0x3656, 0x343e, 0x0000, 0x0000, 0x0000, 0x0000, 0x5d3d, 0x0000, 0x0000, 0x0000, 0x5d3c, 0x0000, 0x5d3e, 0x0000, 0x0000, 0x324e, 0x0000, 0x4337, 0x0000, 0x5d3f, 0x0000, 0x0000, 0x343f, 0x5d41, 0x0000, 0x0000, 0x0000, 0x0000, 0x5d40, 0x0000, 0x5d42, 0x0000, 0x0000, 0x0000, 0x5d43, 0x0000, 0x5d44, 0x3b5f, 0x4035, 0x3a21, 0x0000, 0x4970, 0x0000, 0x0000, 0x4a62, 0x4f44, 0x0000, 0x0000, 0x0000, 0x0000, 0x3b75, 0x0000, 0x0000, 0x0000, 0x3a50, 0x4e72, 0x0000, 0x0000, 0x0000, 0x5d45, 0x5d46, 0x0000, 0x3b60, 0x0000, 0x0000, 0x0000, 0x5d47, 0x5d48, 0x0000, 0x0000, 0x5d4a, 0x5d49, 0x0000, 0x4b58, 0x0000, 0x0000, 0x3d5e, 0x3c6c, 0x3b44, 0x0000, 0x5d4b, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x5d4d, 0x3f23, 0x0000, 0x5d4c, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x5d4e, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x5d4f, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x5d50, 0x5d51, 0x0000, 0x0000, 0x0000, 0x5d52, 0x0000, 0x5d54, 0x5d53, 0x5d55, 0x3225, 0x434a, 0x0000, 0x5d56, 0x0000, 0x0000, 0x3b26, 0x334c, 0x5d57, 0x0000, 0x0000, 0x4542, 0x544c, 0x0000, 0x0000, 0x0000, 0x0000, 0x3523, 0x5d58, 0x0000, 0x0000, 0x0000, 0x0000, 0x5d59, 0x0000, 0x4a6c, 0x4b68, 0x0000, 0x0000, 0x0000, 0x4647, 0x5d5a, 0x4866, 0x0000, 0x0000, 0x0000, 0x487b, 0x0000, 0x0000, 0x4c53, 0x0000, 0x0000, 0x0000, 0x5d5b, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x5d5d, 0x5d5c, 0x0000, 0x0000, 0x5d5f, 0x0000, 0x0000, 0x0000, 0x5d5e, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, }; static const uint16_t unicode_to_jisx0208_6c[256] = { 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x5d61, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x3b61, 0x0000, 0x4c31, 0x0000, 0x5d62, 0x5d63, 0x0000, 0x0000, 0x3524, 0x0000, 0x0000, 0x0000, 0x5d64, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x5d66, 0x5d65, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x3f65, 0x0000, 0x0000, 0x4939, 0x314a, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x4845, 0x0000, 0x4475, 0x3d41, 0x3561, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x4846, 0x0000, 0x3c2e, 0x0000, 0x0000, 0x0000, 0x0000, 0x5d68, 0x0000, 0x3440, 0x0000, 0x0000, 0x3178, 0x0000, 0x0000, 0x4672, 0x5d67, 0x393e, 0x4353, 0x0000, 0x5d69, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x5d71, 0x0000, 0x5d6a, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x4241, 0x0000, 0x3562, 0x5d72, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x3768, 0x0000, 0x0000, 0x3525, 0x5d70, 0x0000, 0x0000, 0x5d6e, 0x5d6b, 0x4d60, 0x0000, 0x0000, 0x0000, 0x0000, 0x4440, 0x0000, 0x0000, 0x0000, 0x4659, 0x5d6c, 0x0000, 0x0000, 0x5d74, 0x0000, 0x5d73, 0x3723, 0x0000, 0x0000, 0x322d, 0x0000, 0x0000, 0x3a3b, 0x5d6d, 0x5d6f, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x4b57, 0x4274, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x4b77, 0x0000, 0x0000, 0x5d7c, 0x0000, 0x0000, 0x5d7d, 0x0000, 0x324f, 0x0000, 0x0000, 0x0000, 0x0000, 0x4a28, 0x4c7d, 0x5e21, 0x3c23, 0x3e42, 0x5d78, 0x5d7e, 0x3168, 0x0000, 0x3637, 0x0000, 0x0000, 0x5d75, 0x5d7a, 0x0000, 0x0000, 0x0000, 0x4074, 0x4771, 0x0000, 0x4867, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x5d77, 0x0000, 0x4b21, 0x0000, 0x5d79, 0x0000, 0x5e24, 0x0000, 0x5e22, 0x0000, 0x5d7b, 0x0000, 0x0000, 0x0000, 0x4b22, 0x4748, 0x3563, 0x0000, 0x4525, 0x0000, 0x0000, 0x436d, 0x0000, 0x5e25, 0x0000, 0x0000, 0x0000, 0x0000, 0x5e23, 0x4259, 0x5d76, 0x0000, 0x314b, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, }; static const uint16_t unicode_to_jisx0208_6d[256] = { 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x4d4e, 0x5e30, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x5e2f, 0x0000, 0x0000, 0x0000, 0x0000, 0x4076, 0x0000, 0x5e2c, 0x0000, 0x4d6c, 0x0000, 0x0000, 0x4636, 0x5e26, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x4445, 0x0000, 0x0000, 0x0000, 0x314c, 0x393f, 0x5e29, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x3d27, 0x5e2e, 0x0000, 0x5e2d, 0x5e28, 0x0000, 0x5e2b, 0x0000, 0x0000, 0x3368, 0x0000, 0x5e2a, 0x4749, 0x0000, 0x0000, 0x4e2e, 0x0000, 0x0000, 0x3e74, 0x4075, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x5e36, 0x5e34, 0x0000, 0x494d, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x5e31, 0x5e33, 0x0000, 0x313a, 0x0000, 0x0000, 0x3940, 0x4f32, 0x0000, 0x333d, 0x0000, 0x4962, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x4d61, 0x0000, 0x0000, 0x3324, 0x3f3b, 0x5e35, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x5e3a, 0x0000, 0x0000, 0x3e43, 0x0000, 0x0000, 0x0000, 0x4d30, 0x0000, 0x5e37, 0x0000, 0x0000, 0x0000, 0x0000, 0x5e32, 0x0000, 0x5e38, 0x0000, 0x0000, 0x0000, 0x4e5e, 0x0000, 0x4573, 0x4642, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x3336, 0x0000, 0x0000, 0x3155, 0x0000, 0x0000, 0x5e3e, 0x0000, 0x0000, 0x5e41, 0x0000, 0x0000, 0x0000, 0x4e43, 0x0000, 0x0000, 0x0000, 0x4d64, 0x0000, 0x0000, 0x0000, 0x0000, 0x5e48, 0x5e42, 0x5e3f, 0x0000, 0x0000, 0x0000, 0x4e54, 0x5e45, 0x0000, 0x0000, 0x0000, 0x0000, 0x3d4a, 0x5e47, 0x0000, 0x0000, 0x5e4c, 0x0000, 0x0000, 0x4571, 0x5e4a, 0x0000, 0x0000, 0x0000, 0x0000, 0x5e44, 0x0000, 0x0000, 0x4338, 0x0000, 0x0000, 0x5e4b, 0x0000, 0x5e40, 0x0000, 0x5e46, 0x0000, 0x5e4d, 0x307c, 0x5e43, 0x0000, 0x5e4e, 0x0000, 0x0000, 0x3f3c, 0x0000, 0x3d5f, 0x0000, 0x4a25, 0x0000, 0x3a2e, 0x0000, 0x5e3b, 0x5e49, 0x453a, 0x0000, 0x0000, 0x0000, 0x0000, }; static const uint16_t unicode_to_jisx0208_6e[256] = { 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x4036, 0x0000, 0x3369, 0x3a51, 0x3e44, 0x5e3d, 0x3d42, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x374c, 0x0000, 0x5e3c, 0x0000, 0x0000, 0x0000, 0x5e52, 0x3d6d, 0x383a, 0x0000, 0x5e61, 0x0000, 0x5e5b, 0x3574, 0x454f, 0x0000, 0x5e56, 0x5e5f, 0x302f, 0x3132, 0x0000, 0x0000, 0x3239, 0x0000, 0x5e58, 0x422c, 0x5e4f, 0x5e51, 0x3941, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x5e62, 0x0000, 0x5e5d, 0x0000, 0x0000, 0x0000, 0x5e55, 0x0000, 0x0000, 0x0000, 0x0000, 0x5e5c, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x4c2b, 0x0000, 0x0000, 0x5e5a, 0x5e5e, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x3850, 0x0000, 0x3e45, 0x0000, 0x0000, 0x4339, 0x0000, 0x0000, 0x0000, 0x5e54, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x4d2f, 0x0000, 0x0000, 0x0000, 0x5e57, 0x0000, 0x0000, 0x5e50, 0x4572, 0x0000, 0x0000, 0x5e53, 0x0000, 0x0000, 0x0000, 0x5e59, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x4f51, 0x3c3e, 0x4b7e, 0x0000, 0x5e63, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x482e, 0x0000, 0x0000, 0x5e6f, 0x383b, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x3d60, 0x0000, 0x5e65, 0x0000, 0x0000, 0x0000, 0x4e2f, 0x3942, 0x0000, 0x5e72, 0x0000, 0x0000, 0x306e, 0x0000, 0x0000, 0x5e70, 0x0000, 0x0000, 0x0000, 0x0000, 0x5e64, 0x0000, 0x0000, 0x0000, 0x0000, 0x5e6a, 0x0000, 0x0000, 0x5e6c, 0x0000, 0x0000, 0x0000, 0x4d4f, 0x5e67, 0x0000, 0x0000, 0x452e, 0x0000, 0x0000, 0x5e69, 0x0000, 0x0000, 0x0000, 0x0000, 0x5e71, 0x0000, 0x5e6b, 0x4c47, 0x0000, 0x0000, 0x0000, 0x5e66, 0x0000, 0x3c22, 0x5e7e, 0x0000, 0x0000, 0x0000, 0x0000, 0x336a, 0x0000, 0x5e68, 0x5e6d, 0x5e6e, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x426c, 0x425a, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x5e76, 0x0000, 0x0000, 0x5e7c, 0x0000, 0x0000, 0x5e7a, 0x0000, 0x4529, 0x0000, 0x0000, 0x5f23, 0x5e77, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x5e78, 0x5e60, }; static const uint16_t unicode_to_jisx0208_6f[256] = { 0x0000, 0x3579, 0x493a, 0x0000, 0x0000, 0x0000, 0x3c3f, 0x0000, 0x0000, 0x3977, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x4f33, 0x0000, 0x5e74, 0x0000, 0x5f22, 0x3169, 0x4166, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x4779, 0x0000, 0x3441, 0x4e7a, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x4c21, 0x4452, 0x0000, 0x0000, 0x0000, 0x0000, 0x5e7b, 0x5e7d, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x4132, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x5f21, 0x5e79, 0x0000, 0x5e73, 0x0000, 0x0000, 0x0000, 0x3443, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x3769, 0x0000, 0x0000, 0x0000, 0x5f2f, 0x0000, 0x0000, 0x5f2a, 0x4078, 0x0000, 0x0000, 0x3363, 0x0000, 0x0000, 0x0000, 0x0000, 0x3d61, 0x0000, 0x5f33, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x5f2c, 0x442c, 0x5f29, 0x4459, 0x0000, 0x0000, 0x0000, 0x5f4c, 0x0000, 0x0000, 0x0000, 0x5f26, 0x0000, 0x5f25, 0x0000, 0x5f2e, 0x0000, 0x0000, 0x0000, 0x5f28, 0x5f27, 0x5f2d, 0x0000, 0x4021, 0x0000, 0x5f24, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x5f30, 0x0000, 0x0000, 0x5f31, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x3442, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x5f36, 0x0000, 0x5f35, 0x5f37, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x5f3a, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x4543, 0x0000, 0x5f34, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x5f38, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x3763, 0x4279, 0x5f32, 0x473b, 0x0000, 0x0000, 0x5f39, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x5f3e, 0x5f3c, 0x0000, 0x0000, 0x5f3f, 0x0000, 0x0000, 0x5f42, 0x0000, 0x0000, 0x0000, 0x5f3b, 0x396a, 0x4728, 0x0000, 0x0000, 0x5e39, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x4d74, 0x5f3d, 0x0000, 0x5f41, 0x4275, 0x0000, 0x5f40, 0x0000, 0x5f2b, 0x0000, 0x0000, 0x6f69, 0x0000, 0x0000, 0x0000, 0x5f45, 0x0000, 0x0000, 0x0000, 0x5f49, 0x0000, }; static const uint16_t unicode_to_jisx0208_70[256] = { 0x0000, 0x5f47, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x5f43, 0x0000, 0x5f44, 0x0000, 0x0000, 0x0000, 0x5f48, 0x0000, 0x5f46, 0x0000, 0x0000, 0x0000, 0x494e, 0x0000, 0x0000, 0x5f4e, 0x0000, 0x5f4b, 0x5f4a, 0x0000, 0x5f4d, 0x4654, 0x5f4f, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x4375, 0x426d, 0x0000, 0x0000, 0x0000, 0x0000, 0x4025, 0x0000, 0x0000, 0x0000, 0x5f50, 0x0000, 0x5f52, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x5f51, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x5e75, 0x0000, 0x0000, 0x0000, 0x0000, 0x5f53, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x4667, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x5f54, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x3250, 0x0000, 0x0000, 0x0000, 0x4574, 0x3325, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x3564, 0x0000, 0x0000, 0x0000, 0x3c5e, 0x3a52, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x4f27, 0x3f66, 0x0000, 0x0000, 0x0000, 0x316a, 0x0000, 0x0000, 0x0000, 0x5f56, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x5f55, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x5f59, 0x433a, 0x5f5c, 0x5f57, 0x0000, 0x0000, 0x0000, 0x5f5b, 0x0000, 0x0000, 0x0000, 0x0000, 0x5f5a, 0x4540, 0x3059, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x4e75, 0x0000, 0x0000, 0x5f5e, 0x0000, 0x0000, 0x0000, 0x3128, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x5f60, 0x0000, 0x0000, 0x0000, 0x5f5f, 0x0000, 0x5f5d, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x5f58, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x4b23, 0x0000, 0x0000, 0x0000, 0x5f62, 0x0000, 0x0000, }; static const uint16_t unicode_to_jisx0208_71[256] = { 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x5f61, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x316b, 0x0000, 0x0000, 0x0000, 0x0000, 0x5f64, 0x4a32, 0x0000, 0x5f63, 0x0000, 0x0000, 0x0000, 0x0000, 0x4c35, 0x0000, 0x0000, 0x0000, 0x0000, 0x3e47, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x4133, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x3e46, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x4e7b, 0x0000, 0x0000, 0x5f6a, 0x0000, 0x4079, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x5f66, 0x5f6b, 0x0000, 0x0000, 0x316c, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x5f69, 0x0000, 0x4761, 0x5f65, 0x5f68, 0x3e48, 0x0000, 0x4851, 0x0000, 0x0000, 0x5f6c, 0x0000, 0x3c51, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x407a, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x5f6f, 0x0000, 0x0000, 0x0000, 0x5f67, 0x0000, 0x3727, 0x0000, 0x0000, 0x0000, 0x0000, 0x5f6d, 0x0000, 0x0000, 0x0000, 0x0000, 0x4d50, 0x5f70, 0x0000, 0x0000, 0x0000, 0x7426, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x3d4f, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x5f71, 0x0000, 0x0000, 0x0000, 0x5f72, 0x0000, 0x0000, 0x0000, 0x0000, 0x472e, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x5f74, 0x0000, 0x0000, 0x0000, 0x0000, 0x5f75, 0x0000, 0x0000, 0x0000, 0x0000, 0x4733, 0x0000, 0x0000, 0x0000, 0x0000, 0x4575, 0x5f77, 0x0000, 0x0000, 0x0000, 0x0000, 0x5f79, 0x0000, 0x4e55, 0x0000, 0x5f76, 0x0000, 0x5f78, 0x316d, 0x0000, 0x5f73, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x535b, 0x5f7a, 0x0000, 0x0000, 0x0000, 0x0000, 0x4167, 0x3b38, 0x5f7c, 0x0000, 0x0000, 0x0000, 0x0000, 0x5f7b, 0x3f24, 0x5259, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x5f7d, 0x0000, 0x0000, 0x0000, 0x6021, 0x0000, 0x5f6e, 0x5f7e, 0x0000, 0x0000, 0x6022, }; static const uint16_t unicode_to_jisx0208_72[256] = { 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x477a, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x6023, 0x0000, 0x0000, 0x6024, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x6025, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x6026, 0x0000, 0x445e, 0x0000, 0x6028, 0x6027, 0x0000, 0x0000, 0x6029, 0x0000, 0x602a, 0x0000, 0x0000, 0x3c5f, 0x4963, 0x0000, 0x0000, 0x0000, 0x4c6c, 0x602b, 0x602c, 0x4156, 0x3c24, 0x602d, 0x602e, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x602f, 0x4a52, 0x4847, 0x0000, 0x0000, 0x6030, 0x4757, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x442d, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x6031, 0x3267, 0x0000, 0x356d, 0x0000, 0x4c46, 0x0000, 0x4c36, 0x0000, 0x3234, 0x4f34, 0x0000, 0x0000, 0x0000, 0x0000, 0x4b52, 0x0000, 0x4a2a, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x4037, 0x0000, 0x6032, 0x0000, 0x0000, 0x0000, 0x0000, 0x4643, 0x0000, 0x0000, 0x0000, 0x3823, 0x6033, 0x0000, 0x3a54, 0x6035, 0x6034, 0x0000, 0x0000, 0x0000, 0x0000, 0x6036, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x6037, 0x0000, 0x0000, 0x0000, 0x6038, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x353e, 0x0000, 0x6039, 0x0000, 0x0000, 0x0000, 0x0000, 0x603a, 0x0000, 0x0000, 0x0000, 0x0000, 0x3824, 0x0000, 0x0000, 0x4848, 0x0000, 0x0000, 0x603c, 0x0000, 0x0000, 0x0000, 0x3e75, 0x0000, 0x0000, 0x603b, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x3638, 0x603d, 0x603f, 0x0000, 0x603e, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x6040, 0x0000, 0x3851, 0x0000, 0x6041, 0x0000, 0x0000, 0x0000, 0x0000, 0x3669, 0x0000, 0x4140, 0x0000, 0x397d, 0x0000, 0x0000, 0x0000, 0x0000, 0x6043, 0x6044, 0x6042, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x3c6d, 0x0000, 0x0000, 0x4648, 0x3639, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x6046, 0x432c, 0x6045, 0x0000, 0x0000, 0x4f35, 0x4762, 0x0000, 0x0000, }; static const uint16_t unicode_to_jisx0208_73[256] = { 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x6049, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x604b, 0x6048, 0x0000, 0x0000, 0x0000, 0x4c54, 0x604a, 0x604c, 0x0000, 0x4e44, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x6050, 0x0000, 0x0000, 0x0000, 0x604f, 0x4376, 0x472d, 0x0000, 0x0000, 0x3825, 0x604e, 0x0000, 0x0000, 0x0000, 0x0000, 0x604d, 0x0000, 0x4d31, 0x4d32, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x6051, 0x316e, 0x0000, 0x0000, 0x0000, 0x0000, 0x3976, 0x3b62, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x6052, 0x6053, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x6055, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x3d43, 0x0000, 0x0000, 0x0000, 0x0000, 0x6057, 0x0000, 0x6056, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x6058, 0x0000, 0x334d, 0x0000, 0x0000, 0x605a, 0x0000, 0x0000, 0x6059, 0x0000, 0x605c, 0x605b, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x383c, 0x0000, 0x0000, 0x4e28, 0x0000, 0x364c, 0x0000, 0x3226, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x366a, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x3461, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x4e68, 0x605e, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x6060, 0x0000, 0x0000, 0x0000, 0x0000, 0x6061, 0x0000, 0x3251, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x605d, 0x0000, 0x3b39, 0x0000, 0x0000, 0x4441, 0x605f, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x6064, 0x0000, 0x3c6e, 0x0000, 0x0000, 0x0000, 0x0000, 0x6062, 0x0000, 0x0000, 0x0000, 0x0000, 0x373e, 0x0000, 0x0000, 0x4849, 0x6063, 0x0000, 0x0000, 0x607e, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x6069, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x383d, 0x0000, }; static const uint16_t unicode_to_jisx0208_74[256] = { 0x0000, 0x0000, 0x0000, 0x3565, 0x0000, 0x6066, 0x4d7d, 0x0000, 0x0000, 0x4e30, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x4276, 0x0000, 0x0000, 0x6068, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x606a, 0x4e56, 0x3657, 0x487c, 0x474a, 0x0000, 0x0000, 0x0000, 0x606b, 0x0000, 0x0000, 0x0000, 0x0000, 0x606d, 0x0000, 0x6070, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x606c, 0x0000, 0x0000, 0x0000, 0x606f, 0x386a, 0x314d, 0x6071, 0x0000, 0x3f70, 0x606e, 0x4e5c, 0x0000, 0x0000, 0x6074, 0x7424, 0x0000, 0x0000, 0x0000, 0x0000, 0x6072, 0x6075, 0x0000, 0x0000, 0x0000, 0x0000, 0x6067, 0x6073, 0x0000, 0x0000, 0x3a3c, 0x0000, 0x0000, 0x6076, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x6077, 0x0000, 0x0000, 0x0000, 0x0000, 0x4d7e, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x6078, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x6079, 0x0000, 0x0000, 0x0000, 0x6065, 0x0000, 0x0000, 0x0000, 0x0000, 0x607a, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x3444, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x3c25, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x607b, 0x0000, 0x0000, 0x0000, 0x0000, 0x607c, 0x0000, 0x0000, 0x0000, 0x0000, 0x607d, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x313b, 0x0000, 0x0000, 0x0000, 0x6121, 0x0000, 0x493b, 0x6122, 0x0000, 0x0000, 0x3424, 0x6123, 0x0000, 0x6124, 0x0000, 0x0000, 0x0000, 0x0000, 0x6125, 0x0000, 0x6127, 0x6128, 0x6126, 0x0000, 0x0000, 0x0000, 0x4953, 0x612a, 0x6129, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, }; static const uint16_t unicode_to_jisx0208_75[256] = { 0x0000, 0x0000, 0x0000, 0x612c, 0x612b, 0x612d, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x612e, 0x6130, 0x612f, 0x0000, 0x0000, 0x3979, 0x0000, 0x6132, 0x0000, 0x6131, 0x0000, 0x0000, 0x3445, 0x0000, 0x3f53, 0x0000, 0x453c, 0x0000, 0x6133, 0x4038, 0x0000, 0x0000, 0x0000, 0x3b3a, 0x0000, 0x3179, 0x6134, 0x0000, 0x4d51, 0x0000, 0x0000, 0x4a63, 0x6135, 0x0000, 0x0000, 0x0000, 0x4544, 0x4d33, 0x3943, 0x3f3d, 0x0000, 0x0000, 0x0000, 0x434b, 0x5234, 0x0000, 0x442e, 0x3268, 0x6136, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x6137, 0x0000, 0x613c, 0x0000, 0x0000, 0x613a, 0x6139, 0x5a42, 0x3326, 0x6138, 0x0000, 0x305a, 0x0000, 0x482a, 0x0000, 0x0000, 0x484a, 0x0000, 0x0000, 0x0000, 0x0000, 0x4e31, 0x613d, 0x613b, 0x435c, 0x4026, 0x0000, 0x0000, 0x482b, 0x0000, 0x492d, 0x0000, 0x613f, 0x4e2c, 0x374d, 0x6140, 0x0000, 0x613e, 0x4856, 0x6141, 0x0000, 0x6142, 0x0000, 0x0000, 0x305b, 0x0000, 0x0000, 0x3e76, 0x6147, 0x0000, 0x6144, 0x466d, 0x6143, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x3526, 0x0000, 0x0000, 0x614a, 0x0000, 0x0000, 0x0000, 0x6145, 0x6146, 0x0000, 0x6149, 0x6148, 0x4925, 0x0000, 0x0000, 0x4142, 0x4141, 0x0000, 0x353f, 0x0000, 0x0000, 0x614b, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x614c, 0x0000, 0x0000, 0x614d, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x614f, 0x0000, 0x614e, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x3156, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x6157, 0x4868, 0x6151, 0x0000, 0x6153, 0x0000, 0x0000, 0x6155, 0x3f3e, 0x0000, 0x0000, 0x6156, 0x6154, 0x3c40, 0x0000, 0x0000, 0x0000, 0x6150, 0x6152, 0x0000, 0x4942, 0x0000, 0x3e49, 0x0000, 0x0000, 0x6159, 0x0000, 0x0000, 0x6158, 0x0000, 0x0000, 0x0000, 0x0000, 0x615a, 0x0000, 0x3c26, 0x3a2f, 0x0000, 0x0000, 0x4577, 0x615b, 0x0000, 0x444b, 0x0000, 0x0000, 0x615d, 0x0000, 0x0000, 0x0000, 0x4e21, 0x615c, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x4169, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x6162, 0x0000, 0x6164, 0x6165, 0x4354, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x6163, 0x0000, 0x6160, 0x0000, 0x615e, 0x615f, }; static const uint16_t unicode_to_jisx0208_76[256] = { 0x0000, 0x6161, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x6168, 0x0000, 0x6166, 0x0000, 0x6167, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x6169, 0x616b, 0x616c, 0x616d, 0x0000, 0x616e, 0x0000, 0x0000, 0x616a, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x6170, 0x0000, 0x0000, 0x0000, 0x616f, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x6171, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x4e45, 0x0000, 0x0000, 0x0000, 0x6174, 0x6172, 0x6173, 0x0000, 0x0000, 0x0000, 0x3462, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x4c7e, 0x0000, 0x0000, 0x0000, 0x4a4a, 0x0000, 0x6176, 0x0000, 0x0000, 0x0000, 0x6175, 0x0000, 0x0000, 0x0000, 0x0000, 0x6177, 0x6178, 0x0000, 0x0000, 0x0000, 0x0000, 0x617c, 0x6179, 0x617a, 0x617b, 0x0000, 0x617d, 0x0000, 0x0000, 0x0000, 0x617e, 0x0000, 0x6221, 0x0000, 0x0000, 0x0000, 0x6222, 0x0000, 0x6223, 0x0000, 0x482f, 0x4550, 0x6224, 0x4772, 0x4934, 0x0000, 0x6225, 0x0000, 0x0000, 0x6226, 0x452a, 0x0000, 0x3327, 0x3944, 0x6227, 0x0000, 0x0000, 0x6228, 0x0000, 0x0000, 0x6229, 0x0000, 0x3b29, 0x0000, 0x0000, 0x622b, 0x0000, 0x0000, 0x622a, 0x0000, 0x0000, 0x622c, 0x622d, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x4869, 0x0000, 0x622e, 0x0000, 0x0000, 0x0000, 0x622f, 0x0000, 0x0000, 0x7369, 0x6230, 0x6231, 0x6232, 0x0000, 0x0000, 0x0000, 0x0000, 0x3b2e, 0x0000, 0x0000, 0x6233, 0x4756, 0x0000, 0x0000, 0x4b5f, 0x0000, 0x314e, 0x0000, 0x3157, 0x0000, 0x0000, 0x6234, 0x0000, 0x0000, 0x0000, 0x0000, 0x6236, 0x0000, 0x0000, 0x0000, 0x6235, 0x4570, 0x0000, 0x0000, 0x0000, 0x4039, 0x5d39, 0x0000, 0x6237, 0x4c41, 0x0000, 0x6238, 0x0000, 0x3446, 0x4857, 0x6239, 0x0000, 0x623a, 0x0000, 0x0000, 0x623b, 0x0000, 0x0000, 0x0000, 0x4c5c, 0x0000, 0x0000, 0x0000, 0x4c55, 0x0000, 0x443e, 0x0000, 0x0000, 0x0000, 0x416a, 0x0000, 0x0000, 0x623d, 0x0000, 0x0000, 0x3d62, 0x0000, }; static const uint16_t unicode_to_jisx0208_77[256] = { 0x0000, 0x3e4a, 0x0000, 0x0000, 0x6240, 0x0000, 0x0000, 0x623f, 0x623e, 0x487d, 0x0000, 0x3447, 0x3829, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x6246, 0x0000, 0x0000, 0x6243, 0x3f3f, 0x4c32, 0x0000, 0x0000, 0x0000, 0x6242, 0x6244, 0x6245, 0x0000, 0x0000, 0x6241, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x6247, 0x6248, 0x0000, 0x442f, 0x0000, 0x3463, 0x0000, 0x0000, 0x0000, 0x4365, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x6249, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x624a, 0x624d, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x3f67, 0x0000, 0x4644, 0x0000, 0x624e, 0x4b53, 0x0000, 0x624b, 0x0000, 0x0000, 0x624c, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x6251, 0x0000, 0x0000, 0x0000, 0x0000, 0x6250, 0x624f, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x6253, 0x0000, 0x0000, 0x6252, 0x0000, 0x0000, 0x6254, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x6256, 0x0000, 0x6255, 0x0000, 0x0000, 0x0000, 0x0000, 0x4a4d, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x3d56, 0x4e46, 0x0000, 0x0000, 0x6257, 0x0000, 0x0000, 0x4637, 0x0000, 0x0000, 0x6258, 0x0000, 0x0000, 0x6259, 0x0000, 0x625d, 0x625b, 0x625c, 0x0000, 0x625a, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x625e, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x625f, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x6260, 0x0000, 0x0000, 0x6261, 0x4c37, 0x6262, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x4c70, 0x6263, 0x0000, 0x434e, 0x0000, 0x476a, 0x0000, 0x366b, 0x0000, 0x0000, 0x0000, 0x433b, 0x6264, 0x363a, 0x0000, 0x0000, 0x0000, 0x4050, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x6265, 0x0000, 0x0000, 0x0000, }; static const uint16_t unicode_to_jisx0208_78[256] = { 0x0000, 0x0000, 0x3a3d, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x6266, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x6267, 0x0000, 0x3826, 0x3a55, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x6269, 0x0000, 0x0000, 0x0000, 0x0000, 0x4556, 0x3a56, 0x354e, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x4b24, 0x0000, 0x474b, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x4557, 0x0000, 0x0000, 0x0000, 0x0000, 0x395c, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x626b, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x3e4b, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x4e32, 0x3945, 0x0000, 0x0000, 0x3827, 0x0000, 0x0000, 0x4823, 0x0000, 0x626d, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x626f, 0x0000, 0x0000, 0x0000, 0x0000, 0x386b, 0x0000, 0x0000, 0x0000, 0x0000, 0x626e, 0x4476, 0x0000, 0x0000, 0x0000, 0x0000, 0x6271, 0x3337, 0x626c, 0x0000, 0x0000, 0x486a, 0x0000, 0x3130, 0x0000, 0x3a6c, 0x0000, 0x4f52, 0x0000, 0x0000, 0x6270, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x6272, 0x0000, 0x0000, 0x0000, 0x4a4b, 0x0000, 0x4059, 0x6274, 0x0000, 0x0000, 0x0000, 0x0000, 0x6275, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x6273, 0x0000, 0x0000, 0x0000, 0x0000, 0x334e, 0x0000, 0x627b, 0x0000, 0x627a, 0x0000, 0x0000, 0x3c27, 0x0000, 0x0000, 0x0000, 0x627c, 0x6277, 0x0000, 0x0000, 0x0000, 0x627d, 0x6278, 0x0000, 0x0000, 0x0000, 0x0000, 0x4858, 0x6276, 0x0000, 0x0000, 0x6279, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x6322, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x6321, 0x4b61, 0x0000, 0x0000, 0x0000, 0x627e, 0x0000, 0x0000, 0x306b, 0x0000, 0x0000, 0x0000, 0x0000, 0x6324, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x6323, 0x0000, 0x0000, }; static const uint16_t unicode_to_jisx0208_79[256] = { 0x0000, 0x3e4c, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x6325, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x4143, 0x0000, 0x0000, 0x6327, 0x6326, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x6328, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x6268, 0x0000, 0x0000, 0x0000, 0x626a, 0x632a, 0x6329, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x3c28, 0x0000, 0x4e69, 0x0000, 0x3c52, 0x0000, 0x632b, 0x3737, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x3540, 0x3527, 0x3b63, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x4d34, 0x0000, 0x0000, 0x6331, 0x0000, 0x6330, 0x4144, 0x632d, 0x0000, 0x0000, 0x632f, 0x0000, 0x0000, 0x3d4b, 0x3f40, 0x632e, 0x632c, 0x0000, 0x472a, 0x0000, 0x0000, 0x3e4d, 0x0000, 0x0000, 0x493c, 0x0000, 0x0000, 0x0000, 0x0000, 0x3a57, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x4578, 0x0000, 0x0000, 0x6332, 0x0000, 0x0000, 0x0000, 0x0000, 0x6333, 0x6349, 0x3658, 0x0000, 0x0000, 0x4f3d, 0x4135, 0x0000, 0x0000, 0x0000, 0x0000, 0x6334, 0x0000, 0x0000, 0x3252, 0x4477, 0x4a21, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x6335, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x357a, 0x6336, 0x0000, 0x0000, 0x6338, 0x0000, 0x0000, 0x0000, 0x6339, 0x0000, 0x4729, 0x0000, 0x0000, 0x633a, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x633b, 0x633c, 0x0000, 0x0000, 0x3659, 0x3253, 0x4645, 0x3d28, 0x3b64, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x633d, 0x0000, 0x3d29, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x324a, 0x4943, 0x0000, 0x0000, 0x633e, 0x0000, 0x0000, 0x486b, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x4145, 0x0000, 0x6341, 0x0000, 0x6342, 0x4769, 0x0000, 0x3f41, 0x633f, 0x0000, 0x4361, 0x0000, 0x0000, 0x6340, 0x0000, 0x0000, 0x0000, 0x3e4e, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x305c, 0x0000, 0x0000, 0x0000, 0x0000, }; static const uint16_t unicode_to_jisx0208_7a[256] = { 0x3529, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x6343, 0x0000, 0x0000, 0x4478, 0x0000, 0x6344, 0x4047, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x4c2d, 0x0000, 0x0000, 0x4923, 0x6345, 0x6346, 0x4355, 0x0000, 0x4e47, 0x0000, 0x0000, 0x6348, 0x6347, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x3c6f, 0x0000, 0x0000, 0x634a, 0x3070, 0x0000, 0x0000, 0x0000, 0x0000, 0x634d, 0x0000, 0x0000, 0x0000, 0x634b, 0x3254, 0x374e, 0x634c, 0x3946, 0x3972, 0x0000, 0x4a66, 0x634e, 0x0000, 0x0000, 0x4b54, 0x0000, 0x0000, 0x6350, 0x0000, 0x0000, 0x0000, 0x4051, 0x314f, 0x323a, 0x302c, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x634f, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x6351, 0x6352, 0x3e77, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x6353, 0x0000, 0x334f, 0x0000, 0x0000, 0x0000, 0x0000, 0x6355, 0x0000, 0x0000, 0x0000, 0x376a, 0x0000, 0x3566, 0x0000, 0x0000, 0x6356, 0x3675, 0x0000, 0x0000, 0x6357, 0x0000, 0x407c, 0x0000, 0x464d, 0x0000, 0x4060, 0x3a75, 0x0000, 0x0000, 0x0000, 0x6358, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x4362, 0x416b, 0x0000, 0x635a, 0x635c, 0x6359, 0x635b, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x3722, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x635d, 0x3726, 0x0000, 0x0000, 0x0000, 0x3567, 0x4d52, 0x635f, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x6360, 0x0000, 0x0000, 0x0000, 0x312e, 0x0000, 0x0000, 0x0000, 0x0000, 0x6363, 0x0000, 0x0000, 0x0000, 0x3376, 0x6362, 0x6361, 0x0000, 0x6365, 0x635e, 0x0000, 0x6366, 0x4e29, 0x0000, 0x6367, 0x0000, 0x6368, 0x0000, 0x0000, 0x5474, 0x636a, 0x0000, 0x6369, 0x0000, 0x0000, 0x0000, 0x636b, 0x636c, 0x0000, 0x4e35, 0x636d, 0x0000, 0x706f, 0x3e4f, 0x636e, 0x636f, 0x3d57, 0x0000, 0x4638, 0x6370, 0x0000, 0x0000, 0x0000, 0x4328, 0x0000, 0x0000, 0x6371, 0x0000, 0x433c, 0x6372, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x3625, 0x0000, 0x513f, 0x435d, 0x3c33, 0x0000, 0x0000, 0x0000, 0x0000, 0x3448, }; static const uint16_t unicode_to_jisx0208_7b[256] = { 0x0000, 0x0000, 0x6373, 0x0000, 0x6422, 0x0000, 0x6376, 0x0000, 0x3568, 0x0000, 0x6375, 0x6424, 0x0000, 0x0000, 0x0000, 0x6374, 0x0000, 0x3e50, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x6378, 0x6379, 0x0000, 0x452b, 0x0000, 0x0000, 0x637a, 0x0000, 0x335e, 0x0000, 0x0000, 0x0000, 0x0000, 0x3f5a, 0x4964, 0x0000, 0x637c, 0x0000, 0x0000, 0x0000, 0x4268, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x6377, 0x0000, 0x637b, 0x637d, 0x0000, 0x0000, 0x3a7b, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x6426, 0x492e, 0x0000, 0x4826, 0x4579, 0x0000, 0x365a, 0x6425, 0x6423, 0x0000, 0x4835, 0x637e, 0x435e, 0x457b, 0x0000, 0x457a, 0x0000, 0x3a76, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x6438, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x6428, 0x0000, 0x642a, 0x0000, 0x0000, 0x0000, 0x0000, 0x642d, 0x0000, 0x642e, 0x0000, 0x642b, 0x642c, 0x0000, 0x0000, 0x6429, 0x6427, 0x0000, 0x0000, 0x0000, 0x0000, 0x6421, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x4a4f, 0x3255, 0x0000, 0x0000, 0x0000, 0x6435, 0x0000, 0x6432, 0x0000, 0x6437, 0x0000, 0x0000, 0x6436, 0x0000, 0x4773, 0x4c27, 0x0000, 0x3b3b, 0x6430, 0x6439, 0x6434, 0x0000, 0x6433, 0x642f, 0x0000, 0x6431, 0x0000, 0x3449, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x433d, 0x0000, 0x0000, 0x407d, 0x0000, 0x0000, 0x0000, 0x4822, 0x0000, 0x0000, 0x643e, 0x0000, 0x0000, 0x0000, 0x4824, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x4061, 0x643b, 0x0000, 0x0000, 0x484f, 0x0000, 0x643f, 0x4a53, 0x0000, 0x435b, 0x0000, 0x643a, 0x643c, 0x0000, 0x0000, 0x643d, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x6440, 0x0000, 0x0000, 0x3c44, 0x0000, 0x0000, 0x0000, 0x4646, 0x6445, 0x6444, 0x0000, 0x0000, 0x6441, 0x0000, 0x0000, 0x0000, 0x4f36, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x644a, 0x0000, 0x0000, 0x644e, 0x644b, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, }; static const uint16_t unicode_to_jisx0208_7c[256] = { 0x6447, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x6448, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x644d, 0x0000, 0x0000, 0x0000, 0x6442, 0x5255, 0x6449, 0x6443, 0x0000, 0x0000, 0x644c, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x6452, 0x0000, 0x344a, 0x0000, 0x644f, 0x0000, 0x0000, 0x0000, 0x6450, 0x0000, 0x0000, 0x6451, 0x6454, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x6453, 0x4876, 0x0000, 0x0000, 0x0000, 0x0000, 0x6455, 0x4e7c, 0x4a6d, 0x645a, 0x0000, 0x0000, 0x6457, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x6456, 0x4052, 0x0000, 0x6459, 0x645b, 0x0000, 0x0000, 0x0000, 0x6458, 0x0000, 0x645f, 0x0000, 0x645c, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x645d, 0x6446, 0x0000, 0x0000, 0x0000, 0x645e, 0x6460, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x6461, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x4a46, 0x0000, 0x6462, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x4c62, 0x0000, 0x0000, 0x364e, 0x3729, 0x6463, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x4a34, 0x0000, 0x3f68, 0x0000, 0x4c30, 0x0000, 0x0000, 0x6464, 0x0000, 0x4e33, 0x0000, 0x0000, 0x4774, 0x0000, 0x4146, 0x4734, 0x0000, 0x0000, 0x3d4d, 0x0000, 0x0000, 0x0000, 0x3040, 0x0000, 0x6469, 0x6467, 0x0000, 0x6465, 0x3421, 0x0000, 0x3e51, 0x646a, 0x0000, 0x0000, 0x6468, 0x0000, 0x6466, 0x646e, 0x0000, 0x0000, 0x646d, 0x646c, 0x646b, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x646f, 0x0000, 0x0000, 0x0000, 0x6470, 0x403a, 0x0000, 0x6471, 0x0000, 0x6473, 0x0000, 0x0000, 0x6472, 0x0000, 0x0000, 0x0000, 0x0000, 0x3852, 0x0000, 0x0000, 0x0000, 0x4138, 0x0000, 0x0000, 0x0000, 0x6475, 0x0000, 0x0000, 0x0000, 0x457c, 0x0000, 0x6474, 0x0000, 0x0000, 0x0000, 0x6476, 0x0000, 0x4a35, 0x416c, 0x3947, 0x0000, 0x6477, 0x0000, 0x0000, 0x0000, 0x0000, 0x4e48, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x6479, 0x0000, 0x0000, 0x647a, 0x0000, 0x647b, 0x0000, 0x647c, 0x0000, 0x3b65, 0x0000, 0x647d, 0x374f, 0x0000, 0x0000, 0x356a, 0x0000, }; static const uint16_t unicode_to_jisx0208_7d[256] = { 0x352a, 0x0000, 0x6521, 0x0000, 0x4c73, 0x3948, 0x647e, 0x0000, 0x0000, 0x0000, 0x6524, 0x4c66, 0x0000, 0x473c, 0x0000, 0x0000, 0x4933, 0x0000, 0x0000, 0x0000, 0x3d63, 0x6523, 0x0000, 0x3c53, 0x3949, 0x3b66, 0x3569, 0x4a36, 0x6522, 0x0000, 0x0000, 0x0000, 0x4147, 0x4b42, 0x3a77, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x3b67, 0x445d, 0x0000, 0x6527, 0x4e5f, 0x3a59, 0x0000, 0x6528, 0x3f42, 0x0000, 0x652a, 0x0000, 0x0000, 0x0000, 0x3e52, 0x3a30, 0x0000, 0x0000, 0x0000, 0x0000, 0x6529, 0x0000, 0x0000, 0x3d2a, 0x383e, 0x4148, 0x6525, 0x652b, 0x0000, 0x0000, 0x0000, 0x0000, 0x6526, 0x3750, 0x0000, 0x652e, 0x6532, 0x376b, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x652d, 0x0000, 0x0000, 0x0000, 0x0000, 0x6536, 0x0000, 0x0000, 0x394a, 0x0000, 0x0000, 0x4d6d, 0x303c, 0x6533, 0x0000, 0x0000, 0x356b, 0x0000, 0x6530, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x6531, 0x0000, 0x0000, 0x457d, 0x652f, 0x652c, 0x0000, 0x3328, 0x4064, 0x0000, 0x0000, 0x3828, 0x0000, 0x0000, 0x0000, 0x6538, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x6535, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x6537, 0x0000, 0x0000, 0x0000, 0x6534, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x3751, 0x4233, 0x6539, 0x416e, 0x0000, 0x0000, 0x6546, 0x0000, 0x0000, 0x6542, 0x653c, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x6540, 0x3c7a, 0x305d, 0x653b, 0x6543, 0x6547, 0x394b, 0x4c56, 0x0000, 0x4456, 0x653d, 0x0000, 0x0000, 0x6545, 0x0000, 0x653a, 0x433e, 0x0000, 0x653f, 0x303d, 0x4c4a, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x653e, 0x0000, 0x0000, 0x365b, 0x486c, 0x0000, 0x0000, 0x0000, 0x416d, 0x0000, 0x4e50, 0x3d6f, 0x0000, 0x0000, 0x656e, 0x0000, 0x0000, 0x6548, 0x0000, 0x407e, 0x0000, 0x6544, 0x6549, 0x654b, 0x0000, 0x4479, 0x654e, 0x0000, 0x0000, 0x654a, 0x0000, 0x0000, 0x0000, 0x4a54, 0x344b, 0x0000, 0x0000, 0x4c4b, 0x0000, 0x0000, 0x305e, 0x0000, 0x0000, 0x654d, 0x0000, 0x4e7d, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x654c, 0x0000, 0x0000, 0x0000, 0x0000, }; static const uint16_t unicode_to_jisx0208_7e[256] = { 0x0000, 0x316f, 0x0000, 0x0000, 0x466c, 0x654f, 0x0000, 0x0000, 0x0000, 0x6556, 0x6550, 0x6557, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x6553, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x477b, 0x0000, 0x0000, 0x3c4a, 0x6555, 0x0000, 0x6552, 0x6558, 0x6551, 0x0000, 0x0000, 0x3d44, 0x0000, 0x0000, 0x0000, 0x0000, 0x4b25, 0x0000, 0x0000, 0x3d4c, 0x0000, 0x0000, 0x6554, 0x6560, 0x0000, 0x0000, 0x655c, 0x0000, 0x655f, 0x0000, 0x655d, 0x6561, 0x655b, 0x0000, 0x6541, 0x4053, 0x0000, 0x0000, 0x484b, 0x0000, 0x655e, 0x0000, 0x0000, 0x6559, 0x0000, 0x0000, 0x0000, 0x4121, 0x3752, 0x0000, 0x3d2b, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x3f25, 0x4136, 0x6564, 0x0000, 0x0000, 0x6566, 0x6567, 0x0000, 0x0000, 0x6563, 0x6565, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x655a, 0x6562, 0x0000, 0x656a, 0x6569, 0x0000, 0x0000, 0x4b7a, 0x0000, 0x0000, 0x372b, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x6568, 0x0000, 0x656c, 0x656b, 0x656f, 0x0000, 0x6571, 0x0000, 0x0000, 0x3b3c, 0x656d, 0x0000, 0x0000, 0x0000, 0x0000, 0x6572, 0x6573, 0x0000, 0x0000, 0x6574, 0x0000, 0x657a, 0x453b, 0x6576, 0x0000, 0x6575, 0x6577, 0x6578, 0x0000, 0x6579, 0x0000, 0x0000, 0x0000, 0x0000, 0x657b, 0x657c, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, }; static const uint16_t unicode_to_jisx0208_7f[256] = { 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x344c, 0x0000, 0x657d, 0x0000, 0x657e, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x6621, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x6622, 0x6623, 0x6624, 0x0000, 0x6625, 0x6626, 0x0000, 0x0000, 0x6628, 0x6627, 0x0000, 0x0000, 0x6629, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x662a, 0x662b, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x662e, 0x662c, 0x662d, 0x3a61, 0x3753, 0x0000, 0x0000, 0x4356, 0x0000, 0x4833, 0x0000, 0x3d70, 0x0000, 0x0000, 0x474d, 0x0000, 0x486d, 0x662f, 0x586d, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x6630, 0x6632, 0x0000, 0x4d65, 0x6631, 0x6634, 0x6633, 0x0000, 0x4d53, 0x0000, 0x6635, 0x0000, 0x487e, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x6636, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x6639, 0x0000, 0x0000, 0x6638, 0x6637, 0x0000, 0x0000, 0x0000, 0x0000, 0x663a, 0x3732, 0x0000, 0x0000, 0x0000, 0x4122, 0x3541, 0x0000, 0x0000, 0x0000, 0x0000, 0x663e, 0x663b, 0x0000, 0x0000, 0x663c, 0x0000, 0x0000, 0x0000, 0x663f, 0x0000, 0x6640, 0x663d, 0x0000, 0x0000, 0x0000, 0x3129, 0x0000, 0x0000, 0x0000, 0x3227, 0x0000, 0x0000, 0x0000, 0x6642, 0x6643, 0x0000, 0x0000, 0x0000, 0x6644, 0x0000, 0x4d62, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x3d2c, 0x0000, 0x6646, 0x6645, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x3f69, 0x6647, 0x0000, 0x0000, 0x0000, 0x0000, 0x6648, 0x0000, 0x0000, 0x6649, 0x0000, 0x3465, 0x0000, 0x0000, 0x0000, 0x0000, 0x344d, 0x0000, 0x0000, 0x664a, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x664b, 0x0000, 0x4b5d, 0x4d63, 0x0000, 0x0000, 0x0000, }; static const uint16_t unicode_to_jisx0208_80[256] = { 0x4d54, 0x4f37, 0x0000, 0x394d, 0x664e, 0x3c54, 0x664d, 0x0000, 0x0000, 0x0000, 0x0000, 0x664f, 0x3c29, 0x0000, 0x0000, 0x0000, 0x4251, 0x0000, 0x6650, 0x0000, 0x0000, 0x394c, 0x0000, 0x4c57, 0x6651, 0x6652, 0x0000, 0x0000, 0x6653, 0x0000, 0x0000, 0x0000, 0x0000, 0x6654, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x6655, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x3c2a, 0x0000, 0x0000, 0x4c6d, 0x0000, 0x0000, 0x0000, 0x0000, 0x6657, 0x0000, 0x433f, 0x0000, 0x6656, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x6659, 0x0000, 0x0000, 0x0000, 0x6658, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x665a, 0x0000, 0x0000, 0x0000, 0x403b, 0x0000, 0x665b, 0x0000, 0x665c, 0x0000, 0x0000, 0x0000, 0x4a39, 0x665d, 0x0000, 0x416f, 0x665e, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x665f, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x4e7e, 0x6662, 0x0000, 0x6661, 0x6660, 0x4430, 0x0000, 0x6663, 0x3f26, 0x0000, 0x6664, 0x0000, 0x0000, 0x0000, 0x6665, 0x4f38, 0x6666, 0x0000, 0x0000, 0x0000, 0x0000, 0x6667, 0x6669, 0x6668, 0x4825, 0x0000, 0x4679, 0x0000, 0x4f3e, 0x4829, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x666b, 0x0000, 0x0000, 0x3e53, 0x0000, 0x492a, 0x0000, 0x666c, 0x666a, 0x0000, 0x344e, 0x0000, 0x0000, 0x0000, 0x3854, 0x3b68, 0x0000, 0x0000, 0x486e, 0x0000, 0x0000, 0x0000, 0x382a, 0x4b43, 0x0000, 0x666f, 0x666d, 0x0000, 0x394e, 0x0000, 0x394f, 0x3069, 0x0000, 0x3a68, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x4759, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x305f, 0x6674, 0x0000, 0x4340, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x4758, 0x0000, 0x425b, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x6676, 0x0000, 0x0000, 0x6672, 0x6675, 0x6670, 0x0000, 0x6673, 0x4b26, 0x0000, 0x0000, 0x3855, 0x0000, 0x0000, 0x307d, 0x6671, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x6678, 0x0000, 0x6679, 0x0000, 0x0000, 0x4639, 0x0000, 0x0000, 0x0000, 0x363b, 0x0000, 0x0000, 0x0000, 0x6726, 0x473d, 0x0000, 0x0000, }; static const uint16_t unicode_to_jisx0208_81[256] = { 0x0000, 0x0000, 0x3b69, 0x0000, 0x0000, 0x363c, 0x4048, 0x4f46, 0x4c2e, 0x6677, 0x4054, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x3553, 0x667a, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x667c, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x667b, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x667d, 0x0000, 0x4326, 0x0000, 0x473e, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x4431, 0x0000, 0x0000, 0x0000, 0x0000, 0x6723, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x6722, 0x0000, 0x0000, 0x0000, 0x0000, 0x667e, 0x0000, 0x0000, 0x3f55, 0x0000, 0x4965, 0x6725, 0x0000, 0x6724, 0x3950, 0x4f53, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x6735, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x6729, 0x672a, 0x0000, 0x0000, 0x0000, 0x0000, 0x3c70, 0x0000, 0x0000, 0x6728, 0x0000, 0x3978, 0x6727, 0x0000, 0x0000, 0x672b, 0x0000, 0x0000, 0x0000, 0x4432, 0x4a22, 0x4123, 0x0000, 0x0000, 0x0000, 0x0000, 0x425c, 0x672f, 0x0000, 0x6730, 0x672c, 0x0000, 0x0000, 0x0000, 0x0000, 0x672d, 0x0000, 0x672e, 0x0000, 0x0000, 0x0000, 0x0000, 0x3951, 0x0000, 0x0000, 0x0000, 0x6736, 0x0000, 0x6732, 0x0000, 0x0000, 0x0000, 0x0000, 0x4966, 0x0000, 0x4b6c, 0x4928, 0x0000, 0x0000, 0x6731, 0x0000, 0x0000, 0x6734, 0x6733, 0x0000, 0x0000, 0x0000, 0x4b44, 0x6737, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x6738, 0x0000, 0x0000, 0x4137, 0x0000, 0x6739, 0x0000, 0x0000, 0x673b, 0x0000, 0x673f, 0x0000, 0x0000, 0x673c, 0x673a, 0x473f, 0x673d, 0x0000, 0x673e, 0x0000, 0x0000, 0x0000, 0x3232, 0x0000, 0x6745, 0x6740, 0x0000, 0x0000, 0x0000, 0x6741, 0x0000, 0x0000, 0x0000, 0x6742, 0x0000, 0x4221, 0x0000, 0x0000, 0x0000, 0x0000, 0x6744, 0x6743, 0x6746, 0x0000, 0x0000, 0x0000, 0x0000, 0x6747, 0x6748, 0x0000, 0x0000, 0x3f43, 0x0000, 0x3269, 0x0000, 0x6749, 0x4e57, 0x0000, 0x3c2b, 0x0000, 0x0000, 0x3d2d, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x3b6a, 0x4357, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x674a, 0x674b, 0x3131, 0x0000, 0x674c, 0x0000, }; static const uint16_t unicode_to_jisx0208_82[256] = { 0x0000, 0x674d, 0x674e, 0x0000, 0x0000, 0x674f, 0x0000, 0x6750, 0x363d, 0x5a2a, 0x6751, 0x0000, 0x4065, 0x6752, 0x3c4b, 0x0000, 0x6753, 0x0000, 0x5030, 0x0000, 0x0000, 0x0000, 0x6754, 0x4a5e, 0x345c, 0x0000, 0x0000, 0x4124, 0x3d58, 0x0000, 0x4971, 0x3d2e, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x6755, 0x3952, 0x6756, 0x484c, 0x0000, 0x6764, 0x0000, 0x0000, 0x0000, 0x0000, 0x6758, 0x0000, 0x4249, 0x4775, 0x383f, 0x6757, 0x4125, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x6759, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x447a, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x675b, 0x675a, 0x675d, 0x0000, 0x0000, 0x675c, 0x0000, 0x675e, 0x0000, 0x0000, 0x6760, 0x0000, 0x675f, 0x0000, 0x344f, 0x0000, 0x6761, 0x0000, 0x6762, 0x6763, 0x0000, 0x0000, 0x3a31, 0x4e49, 0x0000, 0x6765, 0x3f27, 0x0000, 0x0000, 0x0000, 0x3170, 0x6766, 0x6767, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x6768, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x3072, 0x0000, 0x6769, 0x0000, 0x0000, 0x0000, 0x0000, 0x676a, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x4967, 0x0000, 0x0000, 0x0000, 0x3c47, 0x0000, 0x676c, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x3329, 0x3032, 0x0000, 0x0000, 0x0000, 0x0000, 0x676b, 0x676e, 0x474e, 0x0000, 0x3f44, 0x0000, 0x3256, 0x0000, 0x4b27, 0x0000, 0x0000, 0x0000, 0x0000, 0x375d, 0x365c, 0x0000, 0x676d, 0x0000, 0x326a, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x3423, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x3171, 0x6772, 0x4e6a, 0x425d, 0x0000, 0x0000, 0x4944, 0x0000, 0x677e, 0x0000, 0x3257, 0x677c, 0x0000, 0x677a, 0x6771, 0x0000, 0x676f, 0x0000, 0x6770, 0x0000, 0x3c63, 0x366c, 0x4377, 0x0000, 0x0000, 0x0000, 0x4651, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x3151, 0x0000, 0x6774, 0x6773, 0x0000, 0x0000, 0x0000, 0x0000, 0x6779, 0x6775, 0x6778, 0x0000, 0x0000, 0x0000, 0x0000, }; static const uint16_t unicode_to_jisx0208_83[256] = { 0x0000, 0x0000, 0x4c50, 0x6777, 0x3258, 0x337d, 0x677b, 0x0000, 0x0000, 0x677d, 0x0000, 0x0000, 0x0000, 0x0000, 0x3754, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x6823, 0x682c, 0x682d, 0x0000, 0x0000, 0x0000, 0x302b, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x6834, 0x0000, 0x0000, 0x0000, 0x0000, 0x3071, 0x0000, 0x0000, 0x682b, 0x0000, 0x0000, 0x0000, 0x682a, 0x0000, 0x6825, 0x6824, 0x0000, 0x6822, 0x6821, 0x4363, 0x0000, 0x427b, 0x6827, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x6826, 0x0000, 0x0000, 0x0000, 0x0000, 0x6829, 0x0000, 0x0000, 0x0000, 0x4170, 0x3755, 0x0000, 0x0000, 0x0000, 0x0000, 0x3141, 0x6828, 0x0000, 0x3953, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x4171, 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, 0x683a, 0x0000, 0x683b, 0x0000, 0x3259, 0x0000, 0x0000, 0x0000, 0x322e, 0x6838, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x682e, 0x0000, 0x6836, 0x0000, 0x683d, 0x6837, 0x0000, 0x0000, 0x0000, 0x6835, 0x0000, 0x0000, 0x0000, 0x0000, 0x6776, 0x0000, 0x0000, 0x6833, 0x0000, 0x0000, 0x0000, 0x682f, 0x0000, 0x0000, 0x0000, 0x3450, 0x6831, 0x683c, 0x0000, 0x6832, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x683e, 0x0000, 0x6830, 0x477c, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x4d69, 0x0000, 0x0000, 0x0000, 0x6839, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x684f, 0x0000, 0x0000, 0x0000, 0x6847, 0x0000, 0x0000, 0x0000, 0x3f7b, 0x0000, 0x0000, 0x0000, 0x0000, 0x3546, 0x0000, 0x365d, 0x0000, 0x6842, 0x0000, 0x0000, 0x0000, 0x0000, 0x325b, 0x0000, 0x0000, 0x3e54, 0x0000, 0x6845, 0x0000, 0x0000, 0x0000, 0x3a5a, 0x0000, 0x0000, 0x4551, 0x684a, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x4a6e, 0x0000, 0x6841, 0x0000, 0x0000, 0x0000, 0x325a, 0x3856, 0x4929, 0x684b, 0x0000, 0x683f, 0x0000, 0x0000, 0x6848, 0x0000, 0x0000, 0x0000, 0x6852, 0x0000, 0x6843, 0x0000, 0x0000, }; static const uint16_t unicode_to_jisx0208_84[256] = { 0x0000, 0x0000, 0x0000, 0x6844, 0x463a, 0x0000, 0x0000, 0x6849, 0x0000, 0x0000, 0x0000, 0x6846, 0x4b28, 0x684c, 0x3060, 0x0000, 0x0000, 0x0000, 0x0000, 0x6840, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x684e, 0x0000, 0x684d, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x476b, 0x6854, 0x0000, 0x685f, 0x0000, 0x0000, 0x0000, 0x0000, 0x337e, 0x0000, 0x0000, 0x0000, 0x6862, 0x0000, 0x0000, 0x6850, 0x0000, 0x0000, 0x0000, 0x6855, 0x4d6e, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x685e, 0x0000, 0x0000, 0x4d55, 0x0000, 0x0000, 0x0000, 0x0000, 0x4e2a, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x4378, 0x0000, 0x0000, 0x0000, 0x336b, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x4972, 0x6864, 0x4621, 0x0000, 0x0000, 0x3031, 0x0000, 0x0000, 0x685d, 0x0000, 0x6859, 0x4172, 0x6853, 0x685b, 0x6860, 0x0000, 0x472c, 0x0000, 0x0000, 0x0000, 0x302a, 0x0000, 0x6858, 0x0000, 0x6861, 0x4978, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x685c, 0x0000, 0x6857, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x3e55, 0x0000, 0x0000, 0x0000, 0x0000, 0x3d2f, 0x0000, 0x0000, 0x0000, 0x3c2c, 0x0000, 0x0000, 0x0000, 0x0000, 0x4c58, 0x0000, 0x0000, 0x4947, 0x0000, 0x0000, 0x6867, 0x0000, 0x6870, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x685a, 0x0000, 0x0000, 0x0000, 0x0000, 0x3377, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x3e78, 0x6865, 0x0000, 0x686a, 0x4173, 0x0000, 0x0000, 0x6866, 0x0000, 0x686d, 0x0000, 0x0000, 0x435f, 0x0000, 0x686e, 0x0000, 0x0000, 0x4d56, 0x6863, 0x3338, 0x0000, 0x6869, 0x0000, 0x0000, 0x686c, 0x4c2c, 0x0000, 0x0000, 0x0000, 0x0000, 0x686f, 0x0000, 0x0000, 0x6868, 0x686b, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x4b29, 0x0000, 0x4f21, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x6873, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x687a, 0x0000, 0x0000, 0x6872, }; static const uint16_t unicode_to_jisx0208_85[256] = { 0x3c43, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x6851, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x4a4e, 0x0000, 0x4c22, 0x6879, 0x6878, 0x0000, 0x6874, 0x6875, 0x0000, 0x3136, 0x0000, 0x0000, 0x0000, 0x0000, 0x6877, 0x0000, 0x6871, 0x0000, 0x0000, 0x0000, 0x0000, 0x4455, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x6876, 0x307e, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x4222, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x4a43, 0x0000, 0x0000, 0x687b, 0x6921, 0x0000, 0x4859, 0x0000, 0x0000, 0x0000, 0x0000, 0x687e, 0x3e56, 0x3c49, 0x6923, 0x0000, 0x0000, 0x363e, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x6924, 0x0000, 0x4979, 0x687d, 0x0000, 0x6856, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x687c, 0x0000, 0x0000, 0x0000, 0x0000, 0x4f4f, 0x4622, 0x4973, 0x0000, 0x0000, 0x692b, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x6931, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x6932, 0x0000, 0x6925, 0x0000, 0x0000, 0x0000, 0x4776, 0x0000, 0x0000, 0x692f, 0x6927, 0x0000, 0x6929, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x6933, 0x6928, 0x0000, 0x0000, 0x692c, 0x0000, 0x0000, 0x3172, 0x0000, 0x4665, 0x0000, 0x692d, 0x6930, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x6926, 0x0000, 0x4126, 0x0000, 0x692a, 0x3b27, 0x3f45, 0x3730, 0x4c74, 0x0000, 0x4c79, 0x3d72, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x6937, 0x6935, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x4f4e, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x6934, 0x0000, 0x0000, 0x0000, 0x4d75, 0x0000, 0x6936, 0x6938, 0x0000, 0x0000, 0x0000, 0x0000, 0x6939, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x693c, 0x693a, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x4623, 0x693b, 0x0000, 0x0000, 0x0000, 0x484d, 0x692e, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x3d73, 0x0000, 0x693d, 0x6942, 0x4174, 0x0000, 0x0000, 0x6941, 0x0000, }; static const uint16_t unicode_to_jisx0208_86[256] = { 0x0000, 0x0000, 0x6922, 0x0000, 0x0000, 0x0000, 0x6943, 0x4149, 0x0000, 0x0000, 0x693e, 0x6940, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x693f, 0x0000, 0x0000, 0x5d31, 0x5d22, 0x0000, 0x0000, 0x6945, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x6944, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x4d76, 0x0000, 0x623c, 0x6946, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x6947, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x6948, 0x3857, 0x0000, 0x3554, 0x0000, 0x0000, 0x0000, 0x694a, 0x515d, 0x0000, 0x0000, 0x0000, 0x0000, 0x3575, 0x0000, 0x4e3a, 0x0000, 0x3673, 0x694b, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x694c, 0x0000, 0x0000, 0x0000, 0x436e, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x694d, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x467a, 0x0000, 0x303a, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x3263, 0x6952, 0x6953, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x694e, 0x0000, 0x3b3d, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x694f, 0x4742, 0x0000, 0x0000, 0x0000, 0x0000, 0x6950, 0x6951, 0x695b, 0x0000, 0x0000, 0x0000, 0x6955, 0x6958, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x6954, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x6956, 0x0000, 0x6957, 0x3c58, 0x0000, 0x6959, 0x0000, 0x4341, 0x0000, 0x3756, 0x3342, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x695c, 0x0000, 0x0000, 0x0000, 0x0000, 0x333f, 0x0000, 0x6961, 0x0000, 0x0000, 0x695d, 0x6960, 0x0000, 0x0000, 0x0000, 0x0000, 0x483a, 0x0000, 0x0000, 0x0000, 0x0000, 0x695e, 0x0000, 0x0000, 0x695f, 0x4948, 0x485a, 0x6962, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x427d, 0x696c, 0x0000, 0x6968, 0x0000, 0x0000, 0x326b, 0x0000, }; static const uint16_t unicode_to_jisx0208_87[256] = { 0x6966, 0x0000, 0x4b2a, 0x6967, 0x0000, 0x0000, 0x6964, 0x0000, 0x6965, 0x696a, 0x696d, 0x0000, 0x0000, 0x696b, 0x0000, 0x0000, 0x0000, 0x6969, 0x6963, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x4358, 0x0000, 0x6974, 0x0000, 0x4c2a, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x6972, 0x0000, 0x0000, 0x0000, 0x6973, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x696e, 0x0000, 0x0000, 0x6970, 0x0000, 0x0000, 0x0000, 0x6971, 0x0000, 0x0000, 0x0000, 0x696f, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x4066, 0x0000, 0x4f39, 0x6978, 0x0000, 0x6979, 0x0000, 0x0000, 0x0000, 0x0000, 0x6a21, 0x0000, 0x3f2a, 0x0000, 0x697b, 0x0000, 0x697e, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x6976, 0x6975, 0x0000, 0x0000, 0x6a22, 0x0000, 0x0000, 0x325c, 0x0000, 0x697c, 0x0000, 0x6a23, 0x0000, 0x0000, 0x0000, 0x697d, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x697a, 0x0000, 0x4433, 0x0000, 0x6977, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x4768, 0x0000, 0x0000, 0x6a27, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x4d3b, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x6a26, 0x0000, 0x0000, 0x6a25, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x6a2e, 0x0000, 0x0000, 0x0000, 0x6a28, 0x0000, 0x0000, 0x0000, 0x6a30, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x4d66, 0x6a33, 0x0000, 0x6a2a, 0x0000, 0x0000, 0x6a2b, 0x0000, 0x0000, 0x0000, 0x6a2f, 0x0000, 0x6a32, 0x6a31, 0x0000, 0x0000, 0x0000, 0x6a29, 0x0000, 0x0000, 0x0000, 0x0000, 0x6a2c, 0x0000, 0x6a3d, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x6a36, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x6a34, 0x0000, 0x0000, 0x6a35, 0x0000, 0x0000, 0x0000, 0x6a3a, 0x6a3b, 0x0000, 0x332a, 0x0000, 0x3542, 0x0000, 0x0000, 0x6a39, 0x0000, }; static const uint16_t unicode_to_jisx0208_88[256] = { 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x6a24, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x6a38, 0x6a3c, 0x6a37, 0x0000, 0x6a3e, 0x0000, 0x0000, 0x0000, 0x6a40, 0x6a3f, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x6a42, 0x6a41, 0x695a, 0x0000, 0x0000, 0x0000, 0x6a46, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x6a43, 0x0000, 0x0000, 0x0000, 0x0000, 0x6a44, 0x0000, 0x0000, 0x6a45, 0x0000, 0x6a47, 0x0000, 0x0000, 0x0000, 0x0000, 0x376c, 0x0000, 0x6a49, 0x0000, 0x6a48, 0x0000, 0x3d30, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x3954, 0x5e27, 0x0000, 0x0000, 0x0000, 0x0000, 0x6a4a, 0x3d51, 0x0000, 0x0000, 0x0000, 0x3339, 0x0000, 0x6a4b, 0x0000, 0x3152, 0x0000, 0x3e57, 0x6a4c, 0x0000, 0x0000, 0x3955, 0x6a4d, 0x3061, 0x0000, 0x0000, 0x0000, 0x0000, 0x493d, 0x0000, 0x0000, 0x6a4e, 0x0000, 0x0000, 0x0000, 0x0000, 0x3f6a, 0x0000, 0x6a55, 0x0000, 0x0000, 0x6a52, 0x0000, 0x436f, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x6a53, 0x6a50, 0x365e, 0x0000, 0x6a4f, 0x6a56, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x3736, 0x0000, 0x0000, 0x425e, 0x0000, 0x6a5c, 0x0000, 0x0000, 0x0000, 0x0000, 0x6a58, 0x0000, 0x0000, 0x0000, 0x4235, 0x6a57, 0x0000, 0x6a5a, 0x0000, 0x0000, 0x0000, 0x0000, 0x6a51, 0x0000, 0x0000, 0x0000, 0x6a5b, 0x0000, 0x6a5d, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x486f, 0x0000, 0x0000, 0x6a59, 0x0000, 0x6a5e, 0x6a60, 0x0000, 0x0000, 0x3853, 0x6a54, 0x0000, 0x3041, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x6a5f, 0x0000, 0x3a5b, 0x4e76, 0x6a61, 0x6a62, 0x4175, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x4e22, 0x0000, 0x0000, 0x0000, 0x0000, 0x6a63, 0x4d35, 0x0000, 0x0000, 0x6a64, 0x6a65, 0x0000, 0x0000, 0x4a64, 0x6a66, 0x0000, 0x3a40, 0x0000, 0x4e23, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x6a6b, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x6a6c, 0x3e58, 0x6a6a, 0x0000, 0x0000, 0x0000, 0x4d67, 0x6a67, 0x0000, 0x0000, 0x6a69, 0x403d, 0x3f7e, 0x0000, }; static const uint16_t unicode_to_jisx0208_89[256] = { 0x0000, 0x0000, 0x6a68, 0x0000, 0x6a6d, 0x0000, 0x0000, 0x4a23, 0x0000, 0x0000, 0x6a6f, 0x0000, 0x6a6e, 0x0000, 0x0000, 0x0000, 0x336c, 0x0000, 0x4b2b, 0x6a70, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x6a7c, 0x6a72, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x6a73, 0x0000, 0x0000, 0x0000, 0x0000, 0x6a74, 0x6a75, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x6a79, 0x0000, 0x6a7a, 0x0000, 0x0000, 0x6a78, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x6a76, 0x0000, 0x6a71, 0x6a77, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x6a7b, 0x7037, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x3228, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x6a7e, 0x365f, 0x6a7d, 0x0000, 0x0000, 0x0000, 0x6b22, 0x0000, 0x6b21, 0x0000, 0x0000, 0x0000, 0x6b24, 0x0000, 0x0000, 0x6b23, 0x0000, 0x6b25, 0x0000, 0x0000, 0x3d31, 0x0000, 0x6b26, 0x0000, 0x0000, 0x6b27, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x6b28, 0x403e, 0x0000, 0x4d57, 0x0000, 0x6b29, 0x0000, 0x0000, 0x4a24, 0x4746, 0x6b2a, 0x0000, 0x6b2b, 0x382b, 0x0000, 0x0000, 0x0000, 0x352c, 0x0000, 0x0000, 0x0000, 0x6b2c, 0x0000, 0x0000, 0x3b6b, 0x4741, 0x6b2d, 0x0000, 0x3350, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x6b2e, 0x0000, 0x0000, 0x0000, 0x0000, 0x6b30, 0x4d77, 0x0000, 0x6b2f, 0x3f46, 0x0000, 0x6b31, 0x0000, 0x0000, 0x6b32, 0x0000, 0x0000, 0x6b33, 0x3451, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x6b34, 0x0000, 0x0000, 0x6b35, 0x0000, 0x6b36, 0x6b37, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x3351, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x6b38, 0x0000, 0x6b39, 0x6b3a, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x3272, 0x0000, 0x0000, 0x3f28, 0x6b3b, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x6b3c, 0x0000, 0x0000, 0x0000, 0x6b3d, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, }; static const uint16_t unicode_to_jisx0208_8a[256] = { 0x3840, 0x0000, 0x447b, 0x6b3e, 0x0000, 0x0000, 0x0000, 0x0000, 0x3757, 0x0000, 0x3f56, 0x0000, 0x6b41, 0x0000, 0x4624, 0x0000, 0x6b40, 0x0000, 0x0000, 0x3731, 0x0000, 0x0000, 0x6b3f, 0x4277, 0x352d, 0x0000, 0x0000, 0x6b42, 0x0000, 0x6b43, 0x0000, 0x3e59, 0x0000, 0x0000, 0x0000, 0x376d, 0x0000, 0x6b44, 0x0000, 0x0000, 0x0000, 0x0000, 0x4b2c, 0x0000, 0x0000, 0x405f, 0x0000, 0x0000, 0x0000, 0x3576, 0x0000, 0x4c75, 0x414a, 0x0000, 0x6b45, 0x0000, 0x0000, 0x0000, 0x3f47, 0x4370, 0x3e5a, 0x0000, 0x0000, 0x0000, 0x0000, 0x6b46, 0x0000, 0x0000, 0x0000, 0x0000, 0x6b49, 0x0000, 0x6b4a, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x3a3e, 0x4242, 0x6b48, 0x0000, 0x3e5b, 0x493e, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x6b47, 0x0000, 0x0000, 0x3b6c, 0x0000, 0x3153, 0x0000, 0x6b4e, 0x3758, 0x0000, 0x0000, 0x3b6e, 0x0000, 0x0000, 0x3b6d, 0x0000, 0x4f4d, 0x6b4d, 0x6b4c, 0x4127, 0x0000, 0x354d, 0x4f43, 0x333a, 0x3e5c, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x6b4b, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x6b50, 0x0000, 0x6b51, 0x6b4f, 0x0000, 0x3858, 0x0000, 0x4d40, 0x0000, 0x0000, 0x3b6f, 0x4727, 0x0000, 0x0000, 0x0000, 0x6b54, 0x0000, 0x4040, 0x0000, 0x4342, 0x0000, 0x0000, 0x4d36, 0x0000, 0x6b57, 0x0000, 0x0000, 0x0000, 0x386c, 0x0000, 0x403f, 0x6b53, 0x0000, 0x6b58, 0x386d, 0x6b55, 0x6b56, 0x0000, 0x6b52, 0x0000, 0x0000, 0x0000, 0x4062, 0x4649, 0x0000, 0x0000, 0x432f, 0x0000, 0x325d, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x4870, 0x0000, 0x0000, 0x3543, 0x0000, 0x0000, 0x4434, 0x0000, 0x0000, 0x6b5b, 0x0000, 0x6b59, 0x0000, 0x0000, 0x434c, 0x0000, 0x0000, 0x0000, 0x4041, 0x3452, 0x6b5a, 0x0000, 0x3f5b, 0x0000, 0x0000, 0x4e4a, 0x0000, 0x0000, 0x0000, 0x4f40, 0x0000, 0x0000, 0x0000, 0x6b5c, 0x6b67, 0x4435, 0x0000, 0x6b66, 0x0000, 0x6b63, 0x6b6b, 0x6b64, 0x0000, 0x6b60, 0x0000, 0x447c, 0x6b5f, 0x0000, 0x0000, 0x0000, 0x6b5d, 0x0000, 0x4d21, 0x3b70, 0x0000, 0x0000, 0x6b61, 0x0000, 0x6b5e, 0x0000, 0x0000, 0x0000, 0x6b65, 0x3d74, 0x0000, 0x3841, 0x0000, 0x0000, 0x0000, 0x427a, 0x0000, }; static const uint16_t unicode_to_jisx0208_8b[256] = { 0x4b45, 0x315a, 0x3062, 0x0000, 0x4625, 0x0000, 0x0000, 0x6b69, 0x0000, 0x0000, 0x0000, 0x0000, 0x6b68, 0x0000, 0x4666, 0x0000, 0x6b6d, 0x0000, 0x0000, 0x0000, 0x6b62, 0x0000, 0x6b6c, 0x6b6e, 0x0000, 0x382c, 0x6b6a, 0x3956, 0x0000, 0x3c55, 0x0000, 0x0000, 0x6b6f, 0x4d58, 0x0000, 0x0000, 0x0000, 0x0000, 0x6b72, 0x0000, 0x6b75, 0x0000, 0x0000, 0x6b73, 0x4935, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x6b70, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x3660, 0x0000, 0x0000, 0x0000, 0x0000, 0x6b74, 0x0000, 0x0000, 0x6b76, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x6b7a, 0x0000, 0x0000, 0x6b77, 0x0000, 0x6b79, 0x6b78, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x6b7b, 0x0000, 0x3c31, 0x0000, 0x6b7d, 0x6b7c, 0x4968, 0x0000, 0x0000, 0x6c21, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x3759, 0x0000, 0x0000, 0x0000, 0x0000, 0x6b7e, 0x6c22, 0x0000, 0x0000, 0x6c23, 0x3544, 0x6641, 0x3e79, 0x0000, 0x6c24, 0x0000, 0x0000, 0x386e, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x6c25, 0x0000, 0x0000, 0x6c26, 0x0000, 0x0000, 0x3b3e, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x5a4e, 0x0000, 0x6c27, 0x0000, 0x6c28, 0x0000, 0x3d32, 0x0000, 0x6c29, 0x6c2a, 0x0000, 0x0000, 0x6c2b, 0x0000, 0x0000, 0x6c2c, 0x6c2d, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, }; static const uint16_t unicode_to_jisx0208_8c[256] = { 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x432b, 0x0000, 0x0000, 0x6c2e, 0x0000, 0x0000, 0x0000, 0x0000, 0x6c30, 0x0000, 0x6c2f, 0x0000, 0x0000, 0x0000, 0x0000, 0x4626, 0x0000, 0x6c31, 0x0000, 0x4b2d, 0x0000, 0x6c32, 0x0000, 0x6c33, 0x0000, 0x6c34, 0x0000, 0x0000, 0x0000, 0x0000, 0x6c35, 0x0000, 0x0000, 0x0000, 0x0000, 0x465a, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x3e5d, 0x6c36, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x396b, 0x502e, 0x6c37, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x6c38, 0x493f, 0x6c39, 0x0000, 0x6c41, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x6c3a, 0x0000, 0x0000, 0x6c3c, 0x0000, 0x0000, 0x0000, 0x6c3b, 0x6c3d, 0x0000, 0x4b46, 0x6c3e, 0x6c3f, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x6c40, 0x0000, 0x0000, 0x0000, 0x6c42, 0x0000, 0x0000, 0x0000, 0x0000, 0x332d, 0x4467, 0x0000, 0x4969, 0x3a62, 0x3957, 0x0000, 0x0000, 0x0000, 0x0000, 0x494f, 0x325f, 0x484e, 0x6c45, 0x3453, 0x4055, 0x6c44, 0x6c49, 0x4379, 0x4c63, 0x0000, 0x6c47, 0x6c48, 0x352e, 0x0000, 0x6c4a, 0x4763, 0x425f, 0x0000, 0x0000, 0x4871, 0x453d, 0x6c46, 0x0000, 0x4b47, 0x326c, 0x6c4c, 0x4f28, 0x4442, 0x4f45, 0x0000, 0x0000, 0x3b71, 0x6c4b, 0x0000, 0x4231, 0x0000, 0x0000, 0x6c5c, 0x4128, 0x0000, 0x0000, 0x4678, 0x0000, 0x4950, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x6c4f, 0x3b3f, 0x3b72, 0x0000, 0x3e5e, 0x0000, 0x4765, 0x0000, 0x382d, 0x6c4e, 0x6c4d, 0x0000, 0x496a, 0x0000, 0x0000, 0x0000, 0x3c41, 0x0000, 0x0000, 0x4552, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x6c51, 0x6c52, 0x3958, 0x6c50, 0x0000, 0x0000, }; static const uint16_t unicode_to_jisx0208_8d[256] = { 0x0000, 0x0000, 0x0000, 0x0000, 0x6c53, 0x6c54, 0x0000, 0x6c56, 0x4223, 0x0000, 0x6c55, 0x3466, 0x0000, 0x6c58, 0x0000, 0x6c57, 0x6c59, 0x0000, 0x0000, 0x6c5b, 0x6c5d, 0x0000, 0x6c5e, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x4056, 0x0000, 0x3c4f, 0x6c5f, 0x0000, 0x0000, 0x0000, 0x3352, 0x0000, 0x6c60, 0x0000, 0x0000, 0x4176, 0x6c61, 0x0000, 0x6c62, 0x496b, 0x0000, 0x0000, 0x352f, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x6c63, 0x0000, 0x0000, 0x0000, 0x4436, 0x0000, 0x0000, 0x0000, 0x0000, 0x315b, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x6c64, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x3c71, 0x0000, 0x0000, 0x0000, 0x0000, 0x3f76, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x422d, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x6c67, 0x0000, 0x0000, 0x0000, 0x6c66, 0x0000, 0x0000, 0x0000, 0x6c65, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x6c6d, 0x6c6b, 0x0000, 0x0000, 0x6c68, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x6c6a, 0x0000, 0x0000, 0x0000, 0x6c69, 0x6c6c, 0x0000, 0x3577, 0x0000, 0x6c70, 0x0000, 0x4057, 0x0000, 0x6c71, 0x0000, 0x0000, 0x0000, 0x0000, 0x3859, 0x0000, 0x6c6e, 0x6c6f, 0x0000, 0x0000, 0x0000, 0x4f29, 0x0000, 0x0000, 0x0000, 0x4437, 0x0000, 0x4129, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x6c72, 0x0000, 0x0000, 0x6c75, }; static const uint16_t unicode_to_jisx0208_8e[256] = { 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x6c73, 0x6c74, 0x4d59, 0x0000, 0x0000, 0x0000, 0x0000, 0x4627, 0x6c78, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x6c76, 0x6c77, 0x6c79, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x6d29, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x6c7c, 0x0000, 0x0000, 0x0000, 0x6c7d, 0x6c7b, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x6c7a, 0x0000, 0x447d, 0x0000, 0x0000, 0x6d21, 0x6d25, 0x6d22, 0x6c7e, 0x0000, 0x6d23, 0x0000, 0x0000, 0x0000, 0x6d24, 0x0000, 0x0000, 0x0000, 0x0000, 0x6d2b, 0x0000, 0x0000, 0x0000, 0x6d26, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x4058, 0x6d28, 0x0000, 0x0000, 0x6d2a, 0x6d27, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x6d2d, 0x0000, 0x3d33, 0x0000, 0x6d2c, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x6d2e, 0x0000, 0x0000, 0x0000, 0x0000, 0x6d2f, 0x0000, 0x0000, 0x6d32, 0x6d31, 0x0000, 0x6d30, 0x0000, 0x0000, 0x6d34, 0x6d33, 0x0000, 0x4c76, 0x0000, 0x0000, 0x0000, 0x6d36, 0x0000, 0x6d35, 0x6d37, 0x0000, 0x0000, 0x0000, 0x0000, 0x6d38, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x6d3a, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x6d39, 0x3f48, 0x6d3b, 0x0000, 0x0000, 0x366d, 0x6d3c, 0x6d3e, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x6d3f, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x6d40, 0x6d3d, 0x0000, 0x6d41, 0x0000, 0x3c56, 0x6d42, 0x3530, 0x3733, 0x0000, 0x0000, 0x0000, 0x0000, 0x382e, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x6d43, 0x0000, 0x0000, 0x0000, 0x4670, 0x0000, 0x0000, 0x453e, 0x6d44, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x6d47, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x3c34, 0x0000, 0x0000, 0x6d46, 0x6d45, 0x375a, 0x6d48, 0x0000, }; static const uint16_t unicode_to_jisx0208_8f[256] = { 0x0000, 0x0000, 0x0000, 0x3353, 0x0000, 0x6d4a, 0x0000, 0x0000, 0x0000, 0x3a5c, 0x6d49, 0x0000, 0x6d52, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x6d4c, 0x6d4e, 0x4a65, 0x6d4b, 0x0000, 0x0000, 0x0000, 0x6d4d, 0x0000, 0x6d51, 0x6d4f, 0x3531, 0x0000, 0x6d50, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x6d53, 0x0000, 0x0000, 0x475a, 0x4e58, 0x0000, 0x0000, 0x0000, 0x0000, 0x3d34, 0x0000, 0x0000, 0x0000, 0x6d54, 0x0000, 0x0000, 0x0000, 0x0000, 0x4d22, 0x6d56, 0x0000, 0x6d55, 0x0000, 0x0000, 0x6d59, 0x4d41, 0x0000, 0x0000, 0x6d58, 0x0000, 0x336d, 0x6d57, 0x6d5c, 0x0000, 0x0000, 0x6d5b, 0x0000, 0x0000, 0x6d5a, 0x4532, 0x6d5d, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x6d5e, 0x0000, 0x0000, 0x0000, 0x0000, 0x6d5f, 0x0000, 0x0000, 0x396c, 0x0000, 0x3725, 0x6d60, 0x6d61, 0x6d62, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x3f49, 0x6d63, 0x0000, 0x3c2d, 0x6d64, 0x0000, 0x0000, 0x0000, 0x6d65, 0x0000, 0x0000, 0x0000, 0x5221, 0x517e, 0x0000, 0x0000, 0x0000, 0x0000, 0x6d66, 0x6570, 0x6d67, 0x4324, 0x3f2b, 0x4740, 0x0000, 0x0000, 0x0000, 0x0000, 0x6d68, 0x0000, 0x0000, 0x4a55, 0x4454, 0x397e, 0x0000, 0x0000, 0x4329, 0x0000, 0x0000, 0x312a, 0x0000, 0x4b78, 0x3f57, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x375e, 0x0000, 0x0000, 0x3661, 0x0000, 0x0000, 0x4a56, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x6d69, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x6d6b, 0x0000, 0x0000, 0x6d6a, 0x3260, 0x0000, 0x0000, 0x4676, 0x6d6c, 0x4777, 0x0000, 0x4533, 0x0000, 0x6d6d, 0x3d52, 0x0000, 0x0000, 0x0000, 0x6d6f, 0x0000, 0x0000, 0x4c42, 0x6d7e, 0x6d71, 0x6d72, 0x0000, 0x0000, 0x4449, 0x0000, 0x0000, }; static const uint16_t unicode_to_jisx0208_90[256] = { 0x4260, 0x4177, 0x0000, 0x4628, 0x0000, 0x6d70, 0x3555, 0x0000, 0x0000, 0x0000, 0x0000, 0x6d79, 0x0000, 0x6d76, 0x6e25, 0x4629, 0x4360, 0x6d73, 0x0000, 0x447e, 0x4553, 0x6d74, 0x6d78, 0x3f60, 0x0000, 0x4767, 0x444c, 0x0000, 0x0000, 0x4042, 0x6d77, 0x422e, 0x4224, 0x6d75, 0x3029, 0x4f22, 0x0000, 0x0000, 0x0000, 0x6d7a, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x4261, 0x0000, 0x0000, 0x3d35, 0x3f4a, 0x0000, 0x0000, 0x6d7c, 0x6d7b, 0x0000, 0x306f, 0x6d7d, 0x0000, 0x0000, 0x492f, 0x0000, 0x6e27, 0x0000, 0x0000, 0x465b, 0x3f6b, 0x0000, 0x0000, 0x4359, 0x0000, 0x3678, 0x0000, 0x6e26, 0x4d37, 0x313f, 0x0000, 0x4a57, 0x3261, 0x6e21, 0x6e22, 0x6e23, 0x6e24, 0x463b, 0x4323, 0x3063, 0x6e28, 0x0000, 0x6e29, 0x7423, 0x0000, 0x0000, 0x423d, 0x0000, 0x6e2a, 0x0000, 0x3173, 0x414c, 0x0000, 0x382f, 0x0000, 0x4d5a, 0x0000, 0x0000, 0x6e2b, 0x452c, 0x0000, 0x0000, 0x0000, 0x4178, 0x3c57, 0x6e2c, 0x0000, 0x0000, 0x6e2f, 0x0000, 0x0000, 0x3d65, 0x6e2d, 0x412b, 0x412a, 0x0000, 0x3064, 0x0000, 0x4e4b, 0x6e31, 0x0000, 0x4872, 0x6e33, 0x6e32, 0x6e30, 0x6364, 0x3454, 0x0000, 0x0000, 0x6d6e, 0x0000, 0x6e35, 0x6e34, 0x0000, 0x0000, 0x0000, 0x0000, 0x6e36, 0x0000, 0x4d38, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x4661, 0x0000, 0x0000, 0x4b2e, 0x0000, 0x6e37, 0x0000, 0x3c59, 0x0000, 0x0000, 0x0000, 0x0000, 0x6e38, 0x0000, 0x6e39, 0x0000, 0x0000, 0x0000, 0x6e3a, 0x0000, 0x0000, 0x4521, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x306a, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x3959, 0x0000, 0x0000, 0x0000, 0x4f3a, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x6e3e, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x3734, 0x6e3b, 0x0000, 0x6e3c, 0x0000, 0x0000, 0x0000, 0x4974, 0x0000, 0x0000, 0x0000, 0x0000, 0x3354, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x4d39, 0x0000, 0x363f, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x4554, 0x0000, 0x0000, }; static const uint16_t unicode_to_jisx0208_91[256] = { 0x0000, 0x0000, 0x6e3f, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x6e40, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x6e41, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x4522, 0x0000, 0x0000, 0x6e43, 0x0000, 0x6e42, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x4653, 0x6e44, 0x3d36, 0x3c60, 0x475b, 0x4371, 0x0000, 0x0000, 0x0000, 0x3c72, 0x0000, 0x3f6c, 0x0000, 0x6e45, 0x0000, 0x6e46, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x3f5d, 0x6e47, 0x0000, 0x6e48, 0x0000, 0x0000, 0x0000, 0x6e49, 0x4d6f, 0x0000, 0x3d37, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x6e4b, 0x6e4a, 0x0000, 0x395a, 0x0000, 0x3973, 0x3b40, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x6e4e, 0x0000, 0x0000, 0x0000, 0x0000, 0x3d66, 0x0000, 0x6e4d, 0x0000, 0x6e4c, 0x0000, 0x4269, 0x0000, 0x0000, 0x386f, 0x0000, 0x4043, 0x0000, 0x0000, 0x0000, 0x0000, 0x4830, 0x0000, 0x0000, 0x0000, 0x0000, 0x3d39, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x6e4f, 0x0000, 0x3e5f, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x6e52, 0x6e50, 0x0000, 0x0000, 0x0000, 0x6e51, 0x0000, 0x0000, 0x0000, 0x0000, 0x6e54, 0x6e53, 0x0000, 0x0000, 0x3e7a, 0x0000, 0x6e55, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x6e56, 0x6e57, 0x0000, 0x0000, 0x0000, 0x0000, 0x4850, 0x3a53, 0x3c61, 0x6e58, 0x0000, 0x6e59, 0x4e24, 0x3d45, 0x4c6e, 0x4e4c, 0x6e5a, 0x3662, 0x0000, 0x0000, 0x0000, 0x0000, 0x6e5b, 0x0000, 0x4523, 0x0000, 0x0000, 0x6e5e, 0x3378, 0x3f4b, 0x0000, 0x6e5c, 0x0000, 0x6e5d, 0x0000, 0x4460, 0x0000, 0x0000, 0x4b55, 0x367c, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x6e60, 0x6e61, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x6e5f, 0x0000, 0x0000, 0x6e63, }; static const uint16_t unicode_to_jisx0208_92[256] = { 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x465f, 0x3343, 0x0000, 0x0000, 0x6e67, 0x0000, 0x0000, 0x6e64, 0x6e66, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x6e62, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x6f4f, 0x0000, 0x0000, 0x6e65, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x4e6b, 0x0000, 0x0000, 0x385a, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x6e6f, 0x0000, 0x0000, 0x0000, 0x0000, 0x4534, 0x6e6a, 0x0000, 0x0000, 0x6e6d, 0x6e6b, 0x0000, 0x6e70, 0x0000, 0x0000, 0x0000, 0x0000, 0x6e71, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x6e69, 0x0000, 0x0000, 0x6e76, 0x3174, 0x0000, 0x0000, 0x6e68, 0x0000, 0x0000, 0x0000, 0x482d, 0x0000, 0x6e6c, 0x0000, 0x3e60, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x395b, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x4b48, 0x0000, 0x3664, 0x0000, 0x0000, 0x3d46, 0x0000, 0x463c, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x412d, 0x0000, 0x6e74, 0x0000, 0x6e6e, 0x6e73, 0x0000, 0x4c43, 0x0000, 0x4438, 0x6e75, 0x6e72, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x412c, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x6e79, 0x0000, 0x6e78, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x6e77, 0x0000, 0x0000, 0x4b2f, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x3d7b, 0x0000, 0x0000, 0x0000, 0x0000, 0x6e7a, 0x4a5f, 0x0000, 0x0000, 0x3154, 0x0000, 0x0000, 0x0000, 0x0000, 0x4946, 0x4372, 0x0000, 0x0000, 0x0000, 0x0000, 0x3578, 0x0000, 0x6e7c, 0x0000, 0x395d, 0x0000, 0x0000, 0x0000, }; static const uint16_t unicode_to_jisx0208_93[256] = { 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x3b2c, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x6e7b, 0x3f6d, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x3f6e, 0x6f21, 0x6f23, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x3e7b, 0x0000, 0x6f22, 0x6f24, 0x0000, 0x0000, 0x3653, 0x0000, 0x4945, 0x0000, 0x0000, 0x3c62, 0x4f23, 0x0000, 0x6e7e, 0x3a78, 0x0000, 0x0000, 0x4f3f, 0x0000, 0x0000, 0x6f26, 0x0000, 0x0000, 0x0000, 0x0000, 0x6f25, 0x6f27, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x6e7d, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x4669, 0x0000, 0x4555, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x4457, 0x0000, 0x6f2c, 0x0000, 0x0000, 0x0000, 0x0000, 0x4343, 0x6f28, 0x0000, 0x0000, 0x0000, 0x6f29, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x372d, 0x0000, 0x6f2b, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x3830, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x6f2a, 0x0000, 0x3e61, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x3379, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x6f30, 0x0000, 0x3a3f, 0x4179, 0x0000, 0x0000, 0x444a, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x333b, 0x0000, 0x0000, 0x0000, 0x0000, 0x6f2e, 0x6f2f, 0x4443, 0x0000, 0x6f2d, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x6f31, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x6f37, 0x0000, 0x0000, 0x0000, 0x0000, 0x6f3a, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x6f39, 0x452d, 0x0000, 0x0000, 0x0000, 0x0000, 0x6f32, 0x6f33, 0x6f36, 0x0000, 0x0000, 0x0000, 0x0000, 0x6f38, 0x0000, 0x0000, 0x0000, 0x3640, 0x0000, 0x0000, 0x6f3b, 0x6f35, 0x0000, 0x0000, 0x6f34, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, }; static const uint16_t unicode_to_jisx0208_94[256] = { 0x0000, 0x0000, 0x0000, 0x6f3f, 0x0000, 0x0000, 0x0000, 0x6f40, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x6f41, 0x0000, 0x0000, 0x6f3e, 0x6f3d, 0x0000, 0x0000, 0x0000, 0x3e62, 0x462a, 0x6f3c, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x6f45, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x6f43, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x6f44, 0x6f42, 0x0000, 0x4278, 0x0000, 0x6f46, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x6f47, 0x0000, 0x0000, 0x6f49, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x3455, 0x6f48, 0x4c7a, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x6f54, 0x6f4a, 0x0000, 0x0000, 0x6f4d, 0x0000, 0x6f4b, 0x0000, 0x6f4c, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x6f4e, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x6f50, 0x0000, 0x0000, 0x0000, 0x0000, 0x6f51, 0x0000, 0x6f52, 0x0000, 0x0000, 0x0000, 0x0000, 0x6f55, 0x6f53, 0x6f56, 0x6f58, 0x0000, 0x6f57, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 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, }; static const uint16_t unicode_to_jisx0208_95[256] = { 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x4439, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x4c67, 0x0000, 0x6f59, 0x412e, 0x0000, 0x0000, 0x0000, 0x6f5a, 0x0000, 0x4a44, 0x6f5b, 0x332b, 0x0000, 0x0000, 0x0000, 0x313c, 0x0000, 0x3457, 0x0000, 0x3456, 0x6f5c, 0x0000, 0x6f5d, 0x0000, 0x6f5e, 0x6f5f, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x6f60, 0x0000, 0x3458, 0x3355, 0x395e, 0x4836, 0x0000, 0x6f62, 0x6f61, 0x0000, 0x0000, 0x0000, 0x0000, 0x6f63, 0x0000, 0x0000, 0x0000, 0x0000, 0x315c, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x6f66, 0x0000, 0x6f65, 0x6f64, 0x0000, 0x6f67, 0x0000, 0x0000, 0x0000, 0x0000, 0x6f6a, 0x0000, 0x0000, 0x0000, 0x3047, 0x0000, 0x0000, 0x6f68, 0x0000, 0x6f6c, 0x6f6b, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x6f6e, 0x6f6d, 0x6f6f, 0x0000, 0x462e, 0x0000, 0x0000, 0x0000, 0x6f70, 0x0000, 0x0000, 0x0000, 0x0000, 0x6f71, 0x6f73, 0x0000, 0x0000, 0x6f72, 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, }; static const uint16_t unicode_to_jisx0208_96[256] = { 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, 0x496c, 0x0000, 0x0000, 0x0000, 0x0000, 0x6f74, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x6f75, 0x0000, 0x3a65, 0x0000, 0x0000, 0x0000, 0x6f76, 0x6f77, 0x0000, 0x0000, 0x4b49, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x414b, 0x0000, 0x0000, 0x0000, 0x3024, 0x424b, 0x0000, 0x6f78, 0x0000, 0x496d, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x6f7b, 0x6f79, 0x395f, 0x0000, 0x6f7a, 0x3842, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x4a45, 0x6f7d, 0x7021, 0x6f7e, 0x7022, 0x0000, 0x0000, 0x3121, 0x3f58, 0x3d7c, 0x3459, 0x7023, 0x0000, 0x0000, 0x0000, 0x4766, 0x0000, 0x7025, 0x0000, 0x0000, 0x0000, 0x3122, 0x0000, 0x7024, 0x4444, 0x0000, 0x4e4d, 0x462b, 0x6f7c, 0x4e26, 0x0000, 0x3831, 0x0000, 0x0000, 0x4d5b, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x3679, 0x4e34, 0x0000, 0x3728, 0x0000, 0x4262, 0x6721, 0x0000, 0x7026, 0x332c, 0x3f6f, 0x0000, 0x0000, 0x0000, 0x0000, 0x3356, 0x7028, 0x0000, 0x7029, 0x7027, 0x3764, 0x0000, 0x3a5d, 0x3e63, 0x0000, 0x0000, 0x0000, 0x3123, 0x0000, 0x0000, 0x4e59, 0x0000, 0x0000, 0x0000, 0x702b, 0x6e2e, 0x0000, 0x702a, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x702e, 0x702c, 0x702d, 0x0000, 0x702f, 0x0000, 0x7030, 0x4e6c, 0x7031, 0x7032, 0x0000, 0x4049, 0x483b, 0x0000, 0x0000, 0x0000, 0x3f7d, 0x3467, 0x0000, 0x0000, 0x4d3a, 0x326d, 0x3d38, 0x385b, 0x0000, 0x7035, 0x0000, 0x7034, 0x3b73, 0x7036, 0x7033, 0x0000, 0x0000, 0x3b28, 0x0000, 0x0000, 0x0000, 0x703a, 0x6a2d, 0x0000, 0x0000, 0x5256, 0x0000, 0x3f77, 0x7038, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x4e25, 0x4671, 0x0000, 0x0000, 0x0000, 0x0000, 0x312b, 0x0000, 0x4063, 0x3c36, 0x0000, 0x0000, 0x0000, 0x0000, 0x4a37, 0x0000, 0x3140, 0x0000, 0x0000, 0x0000, 0x4e6d, 0x4d6b, 0x0000, 0x703b, 0x0000, 0x4545, 0x0000, 0x0000, 0x0000, 0x0000, }; static const uint16_t unicode_to_jisx0208_97[256] = { 0x3c7b, 0x0000, 0x0000, 0x0000, 0x703c, 0x0000, 0x703d, 0x3f4c, 0x703e, 0x0000, 0x4e6e, 0x0000, 0x0000, 0x7039, 0x7040, 0x7042, 0x0000, 0x7041, 0x0000, 0x703f, 0x0000, 0x0000, 0x7043, 0x0000, 0x0000, 0x7044, 0x0000, 0x0000, 0x417a, 0x0000, 0x3262, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x7045, 0x0000, 0x0000, 0x4c38, 0x0000, 0x0000, 0x7046, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x7047, 0x0000, 0x4f2a, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x5b31, 0x7048, 0x0000, 0x0000, 0x0000, 0x7049, 0x704a, 0x0000, 0x0000, 0x0000, 0x704e, 0x0000, 0x704b, 0x0000, 0x704c, 0x0000, 0x704d, 0x704f, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x4044, 0x0000, 0x0000, 0x0000, 0x4c77, 0x0000, 0x0000, 0x4045, 0x0000, 0x0000, 0x7050, 0x0000, 0x4873, 0x0000, 0x7051, 0x7353, 0x4c4c, 0x0000, 0x7052, 0x0000, 0x7053, 0x0000, 0x7054, 0x3357, 0x0000, 0x7056, 0x0000, 0x3f59, 0x0000, 0x0000, 0x0000, 0x7057, 0x0000, 0x0000, 0x3724, 0x0000, 0x0000, 0x0000, 0x0000, 0x7058, 0x705c, 0x0000, 0x705a, 0x0000, 0x0000, 0x0000, 0x0000, 0x705b, 0x0000, 0x0000, 0x3373, 0x7059, 0x705d, 0x0000, 0x0000, 0x0000, 0x0000, 0x705e, 0x0000, 0x3048, 0x0000, 0x705f, 0x7060, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x3e64, 0x0000, 0x0000, 0x0000, 0x7061, 0x0000, 0x0000, 0x0000, 0x3547, 0x0000, 0x0000, 0x7064, 0x0000, 0x0000, 0x7063, 0x0000, 0x7062, 0x0000, 0x0000, 0x6b71, 0x0000, 0x4a5c, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x7065, 0x7066, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x7067, 0x0000, 0x0000, 0x7068, 0x0000, 0x7069, 0x0000, 0x0000, 0x706a, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x345a, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x706b, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x706c, 0x4723, 0x0000, 0x0000, 0x0000, 0x706e, 0x323b, 0x0000, 0x7071, 0x7070, 0x0000, 0x0000, 0x0000, 0x0000, 0x3124, 0x0000, 0x0000, 0x0000, 0x3641, }; static const uint16_t unicode_to_jisx0208_98[256] = { 0x0000, 0x4a47, 0x443a, 0x3a22, 0x0000, 0x3960, 0x3d67, 0x0000, 0x3f5c, 0x0000, 0x0000, 0x0000, 0x7073, 0x0000, 0x0000, 0x7072, 0x4d42, 0x3468, 0x4852, 0x465c, 0x0000, 0x0000, 0x0000, 0x3f7c, 0x4e4e, 0x0000, 0x375b, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x7076, 0x0000, 0x0000, 0x7075, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x4b4b, 0x462c, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x3150, 0x0000, 0x0000, 0x7077, 0x7074, 0x0000, 0x0000, 0x4951, 0x4d6a, 0x7078, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x7079, 0x0000, 0x0000, 0x0000, 0x0000, 0x707b, 0x426a, 0x335b, 0x335c, 0x707a, 0x0000, 0x0000, 0x0000, 0x0000, 0x3469, 0x3832, 0x0000, 0x0000, 0x346a, 0x0000, 0x0000, 0x453f, 0x0000, 0x0000, 0x4e60, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x385c, 0x0000, 0x0000, 0x0000, 0x707c, 0x0000, 0x0000, 0x0000, 0x707d, 0x707e, 0x7121, 0x0000, 0x7123, 0x7122, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x4977, 0x0000, 0x7124, 0x0000, 0x0000, 0x0000, 0x0000, 0x7125, 0x0000, 0x7126, 0x0000, 0x0000, 0x0000, 0x0000, 0x7127, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x7129, 0x7128, 0x0000, 0x712a, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x4874, 0x664c, 0x0000, 0x0000, 0x3f29, 0x0000, 0x0000, 0x3532, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x712b, 0x0000, 0x712c, 0x0000, 0x522c, 0x5d3b, 0x4853, 0x0000, 0x0000, 0x307b, 0x0000, 0x303b, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x3b74, 0x4b30, 0x3e7e, 0x0000, }; static const uint16_t unicode_to_jisx0208_99[256] = { 0x0000, 0x0000, 0x0000, 0x712d, 0x0000, 0x4c5f, 0x0000, 0x0000, 0x0000, 0x712e, 0x4d5c, 0x0000, 0x3142, 0x0000, 0x0000, 0x0000, 0x3b41, 0x0000, 0x712f, 0x326e, 0x7130, 0x0000, 0x0000, 0x0000, 0x7131, 0x0000, 0x0000, 0x0000, 0x0000, 0x7133, 0x7134, 0x0000, 0x7136, 0x7132, 0x0000, 0x0000, 0x7135, 0x0000, 0x0000, 0x0000, 0x345b, 0x0000, 0x0000, 0x0000, 0x7137, 0x0000, 0x7138, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x7139, 0x713a, 0x0000, 0x0000, 0x0000, 0x713b, 0x0000, 0x0000, 0x713d, 0x0000, 0x0000, 0x0000, 0x713c, 0x0000, 0x713f, 0x7142, 0x0000, 0x0000, 0x0000, 0x713e, 0x7140, 0x7141, 0x0000, 0x0000, 0x7143, 0x0000, 0x3642, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 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, 0x3c73, 0x7144, 0x7145, 0x3961, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x7146, 0x0000, 0x0000, 0x333e, 0x0000, 0x0000, 0x0000, 0x474f, 0x7147, 0x7148, 0x0000, 0x0000, 0x0000, 0x0000, 0x435a, 0x466b, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x7149, 0x0000, 0x0000, 0x0000, 0x0000, 0x477d, 0x0000, 0x0000, 0x424c, 0x3158, 0x366e, 0x0000, 0x366f, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x4373, 0x714e, 0x3670, 0x0000, 0x0000, 0x326f, 0x0000, 0x0000, 0x714d, 0x0000, 0x0000, 0x714b, 0x0000, 0x714c, 0x0000, 0x714a, 0x0000, 0x0000, 0x7158, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x714f, 0x7150, 0x0000, 0x0000, 0x7151, 0x7152, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x7154, 0x0000, 0x0000, 0x7153, 0x0000, 0x0000, 0x0000, 0x3d59, }; static const uint16_t unicode_to_jisx0208_9a[256] = { 0x0000, 0x7155, 0x0000, 0x0000, 0x0000, 0x7157, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x3533, 0x7156, 0x0000, 0x0000, 0x417b, 0x3833, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x7159, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x424d, 0x0000, 0x0000, 0x715a, 0x0000, 0x0000, 0x0000, 0x0000, 0x462d, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x715b, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x7160, 0x0000, 0x715e, 0x0000, 0x715d, 0x715f, 0x0000, 0x715c, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x7162, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x7161, 0x0000, 0x7164, 0x0000, 0x0000, 0x3643, 0x7163, 0x0000, 0x0000, 0x0000, 0x7165, 0x0000, 0x0000, 0x7166, 0x0000, 0x7168, 0x7167, 0x0000, 0x0000, 0x0000, 0x7169, 0x716b, 0x716a, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 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, 0x397c, 0x0000, 0x0000, 0x0000, 0x0000, 0x716c, 0x0000, 0x0000, 0x716d, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x333c, 0x0000, 0x0000, 0x0000, 0x716e, 0x0000, 0x0000, 0x0000, 0x716f, 0x0000, 0x0000, 0x0000, 0x3f71, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x7170, 0x0000, 0x7171, 0x0000, 0x7172, 0x7173, 0x0000, 0x0000, 0x0000, 0x3962, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x7174, 0x7175, 0x0000, 0x0000, 0x7176, 0x7177, 0x0000, 0x0000, 0x7178, 0x0000, 0x0000, 0x0000, 0x4831, 0x717a, 0x0000, 0x4926, 0x717b, 0x7179, 0x0000, 0x717d, 0x0000, 0x0000, 0x717c, 0x0000, 0x0000, 0x717e, 0x0000, 0x0000, 0x0000, 0x7221, 0x0000, 0x0000, 0x0000, 0x0000, }; static const uint16_t unicode_to_jisx0208_9b[256] = { 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x7222, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x7223, 0x0000, 0x7224, 0x0000, 0x0000, 0x0000, 0x0000, 0x7225, 0x0000, 0x0000, 0x7226, 0x7227, 0x0000, 0x7228, 0x0000, 0x7229, 0x722a, 0x722b, 0x722c, 0x0000, 0x0000, 0x0000, 0x722d, 0x722e, 0x0000, 0x5d35, 0x722f, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x6478, 0x3534, 0x0000, 0x0000, 0x0000, 0x0000, 0x3321, 0x3a32, 0x7231, 0x7230, 0x4c25, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x7233, 0x7234, 0x7232, 0x0000, 0x7235, 0x0000, 0x0000, 0x4b62, 0x0000, 0x0000, 0x0000, 0x7236, 0x0000, 0x357b, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x4f25, 0x0000, 0x0000, 0x0000, 0x0000, 0x7237, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x7239, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x303e, 0x0000, 0x0000, 0x723a, 0x4a2b, 0x7238, 0x0000, 0x0000, 0x723b, 0x723c, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x723d, 0x723e, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x723f, 0x0000, 0x4b6e, 0x3b2d, 0x0000, 0x3a7a, 0x412f, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x7240, 0x0000, 0x0000, 0x0000, 0x0000, 0x7243, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x7241, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x7244, 0x0000, 0x0000, 0x3871, 0x7242, 0x0000, 0x0000, 0x0000, 0x0000, 0x7245, 0x0000, 0x7246, 0x7247, 0x0000, 0x724b, 0x0000, 0x3b2a, 0x0000, 0x0000, 0x0000, 0x0000, 0x4264, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x724c, 0x7249, 0x7248, 0x724a, 0x0000, 0x0000, 0x0000, 0x375f, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x7250, 0x724f, 0x724e, 0x0000, 0x0000, 0x3033, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, }; static const uint16_t unicode_to_jisx0208_9c[256] = { 0x0000, 0x0000, 0x0000, 0x0000, 0x725a, 0x0000, 0x7256, 0x0000, 0x7257, 0x7253, 0x7259, 0x0000, 0x7255, 0x3362, 0x0000, 0x0000, 0x4f4c, 0x0000, 0x7258, 0x7254, 0x7252, 0x7251, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x725c, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x725f, 0x0000, 0x0000, 0x725e, 0x725d, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x4949, 0x725b, 0x3073, 0x7260, 0x0000, 0x7262, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x336f, 0x724d, 0x3137, 0x0000, 0x0000, 0x7264, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x7263, 0x7261, 0x432d, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x4b70, 0x0000, 0x0000, 0x0000, 0x0000, 0x4e5a, 0x0000, 0x0000, 0x7265, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x7266, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x7267, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x7268, 0x0000, 0x7269, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x443b, 0x0000, 0x726a, 0x0000, 0x4837, 0x0000, 0x726f, 0x726b, 0x0000, 0x0000, 0x0000, 0x726c, 0x0000, 0x0000, 0x4b31, 0x4c44, 0x0000, 0x4650, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, }; static const uint16_t unicode_to_jisx0208_9d[256] = { 0x0000, 0x0000, 0x0000, 0x7270, 0x0000, 0x0000, 0x7271, 0x463e, 0x726e, 0x726d, 0x0000, 0x0000, 0x0000, 0x0000, 0x322a, 0x0000, 0x0000, 0x0000, 0x7279, 0x0000, 0x0000, 0x7278, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x3175, 0x0000, 0x0000, 0x0000, 0x7276, 0x0000, 0x0000, 0x0000, 0x7275, 0x0000, 0x0000, 0x7273, 0x0000, 0x337b, 0x0000, 0x7272, 0x3c32, 0x3229, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x3963, 0x0000, 0x0000, 0x727c, 0x727b, 0x0000, 0x727a, 0x0000, 0x0000, 0x7277, 0x0000, 0x727d, 0x0000, 0x727e, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x7325, 0x7324, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x7326, 0x0000, 0x0000, 0x312d, 0x7321, 0x7322, 0x0000, 0x3974, 0x4c39, 0x0000, 0x0000, 0x7323, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x4b32, 0x0000, 0x0000, 0x732b, 0x0000, 0x0000, 0x7327, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x732c, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x7329, 0x0000, 0x7328, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x375c, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x732d, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x732e, 0x0000, 0x0000, 0x0000, 0x0000, 0x732f, 0x0000, 0x732a, 0x0000, 0x0000, 0x0000, 0x7274, 0x0000, 0x0000, 0x7330, 0x0000, 0x4461, 0x0000, 0x0000, 0x0000, 0x7334, 0x0000, 0x7335, 0x7333, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x7332, 0x7338, 0x0000, 0x7331, 0x0000, 0x7336, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x7337, 0x0000, 0x0000, 0x0000, 0x733a, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x7339, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x733c, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x733d, 0x0000, 0x733e, 0x0000, 0x0000, 0x4f49, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x733b, 0x426b, 0x3a6d, 0x0000, 0x0000, 0x733f, 0x0000, 0x0000, }; static const uint16_t unicode_to_jisx0208_9e[256] = { 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, 0x7340, 0x7341, 0x0000, 0x0000, 0x7342, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x7343, 0x0000, 0x0000, 0x3834, 0x7344, 0x0000, 0x0000, 0x0000, 0x7345, 0x0000, 0x3c2f, 0x0000, 0x7346, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x7347, 0x0000, 0x0000, 0x7348, 0x7349, 0x0000, 0x0000, 0x0000, 0x0000, 0x734c, 0x734a, 0x4f3c, 0x0000, 0x734b, 0x0000, 0x4e6f, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x734d, 0x0000, 0x4e5b, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x734e, 0x477e, 0x0000, 0x0000, 0x734f, 0x7351, 0x0000, 0x0000, 0x7352, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x7350, 0x396d, 0x4c4d, 0x4b63, 0x5677, 0x0000, 0x5d60, 0x4b7b, 0x0000, 0x0000, 0x0000, 0x0000, 0x322b, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x7354, 0x3550, 0x7355, 0x7356, 0x7357, 0x0000, 0x3975, 0x0000, 0x7358, 0x0000, 0x0000, 0x0000, 0x6054, 0x4c5b, 0x0000, 0x4263, 0x7359, 0x735b, 0x735a, 0x0000, 0x735c, 0x0000, 0x0000, 0x0000, 0x0000, 0x735d, 0x0000, 0x0000, 0x735e, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x735f, 0x0000, 0x0000, 0x0000, 0x0000, 0x7360, 0x0000, 0x7361, 0x7362, 0x0000, 0x7363, 0x0000, 0x7364, 0x7365, 0x7366, 0x0000, 0x0000, }; static const uint16_t unicode_to_jisx0208_9f[256] = { 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x7367, 0x7368, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x4524, 0x0000, 0x0000, 0x0000, 0x0000, 0x385d, 0x0000, 0x736a, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x414d, 0x736b, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x736c, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x4921, 0x0000, 0x0000, 0x736d, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x736e, 0x6337, 0x0000, 0x0000, 0x6c5a, 0x706d, 0x0000, 0x0000, 0x736f, 0x0000, 0x7370, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x7372, 0x7373, 0x7374, 0x4e70, 0x7371, 0x0000, 0x0000, 0x7375, 0x7376, 0x0000, 0x0000, 0x7378, 0x0000, 0x7377, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x737a, 0x0000, 0x0000, 0x0000, 0x737b, 0x7379, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x4e36, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x737c, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x737d, 0x6354, 0x0000, 0x0000, 0x737e, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, }; static const uint16_t unicode_to_jisx0208_ff[256] = { 0x0000, 0x212a, 0x2149, 0x2174, 0x2170, 0x2173, 0x2175, 0x216d, 0x214a, 0x214b, 0x2176, 0x215c, 0x2124, 0x213e, 0x2125, 0x213f, 0x2330, 0x2331, 0x2332, 0x2333, 0x2334, 0x2335, 0x2336, 0x2337, 0x2338, 0x2339, 0x2127, 0x2128, 0x2163, 0x2161, 0x2164, 0x2129, 0x2177, 0x2341, 0x2342, 0x2343, 0x2344, 0x2345, 0x2346, 0x2347, 0x2348, 0x2349, 0x234a, 0x234b, 0x234c, 0x234d, 0x234e, 0x234f, 0x2350, 0x2351, 0x2352, 0x2353, 0x2354, 0x2355, 0x2356, 0x2357, 0x2358, 0x2359, 0x235a, 0x214e, 0x2140, 0x214f, 0x2130, 0x2132, 0x212e, 0x2361, 0x2362, 0x2363, 0x2364, 0x2365, 0x2366, 0x2367, 0x2368, 0x2369, 0x236a, 0x236b, 0x236c, 0x236d, 0x236e, 0x236f, 0x2370, 0x2371, 0x2372, 0x2373, 0x2374, 0x2375, 0x2376, 0x2377, 0x2378, 0x2379, 0x237a, 0x2150, 0x2143, 0x2151, 0x2141, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x2131, 0x0000, 0x216f, 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, }; static const uint16_t * const unicode_to_jisx0208_map[0x100] = { /* 0x00XX - 0x0fXX */ unicode_to_jisx0208_00, 0, 0, unicode_to_jisx0208_03, unicode_to_jisx0208_04, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 0x10XX - 0x1fXX */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 0x20XX - 0x2fXX */ unicode_to_jisx0208_20, unicode_to_jisx0208_21, unicode_to_jisx0208_22, unicode_to_jisx0208_23, unicode_to_jisx0208_24, unicode_to_jisx0208_25, unicode_to_jisx0208_26, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 0x30XX - 0x3fXX */ unicode_to_jisx0208_30, 0, unicode_to_jisx0208_32, unicode_to_jisx0208_33, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 0x40XX - 0x4fXX */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, unicode_to_jisx0208_4e, unicode_to_jisx0208_4f, /* 0x50XX - 0x5fXX */ unicode_to_jisx0208_50, unicode_to_jisx0208_51, unicode_to_jisx0208_52, unicode_to_jisx0208_53, unicode_to_jisx0208_54, unicode_to_jisx0208_55, unicode_to_jisx0208_56, unicode_to_jisx0208_57, unicode_to_jisx0208_58, unicode_to_jisx0208_59, unicode_to_jisx0208_5a, unicode_to_jisx0208_5b, unicode_to_jisx0208_5c, unicode_to_jisx0208_5d, unicode_to_jisx0208_5e, unicode_to_jisx0208_5f, /* 0x60XX - 0x6fXX */ unicode_to_jisx0208_60, unicode_to_jisx0208_61, unicode_to_jisx0208_62, unicode_to_jisx0208_63, unicode_to_jisx0208_64, unicode_to_jisx0208_65, unicode_to_jisx0208_66, unicode_to_jisx0208_67, unicode_to_jisx0208_68, unicode_to_jisx0208_69, unicode_to_jisx0208_6a, unicode_to_jisx0208_6b, unicode_to_jisx0208_6c, unicode_to_jisx0208_6d, unicode_to_jisx0208_6e, unicode_to_jisx0208_6f, /* 0x70XX - 0x7fXX */ unicode_to_jisx0208_70, unicode_to_jisx0208_71, unicode_to_jisx0208_72, unicode_to_jisx0208_73, unicode_to_jisx0208_74, unicode_to_jisx0208_75, unicode_to_jisx0208_76, unicode_to_jisx0208_77, unicode_to_jisx0208_78, unicode_to_jisx0208_79, unicode_to_jisx0208_7a, unicode_to_jisx0208_7b, unicode_to_jisx0208_7c, unicode_to_jisx0208_7d, unicode_to_jisx0208_7e, unicode_to_jisx0208_7f, /* 0x80XX - 0x8fXX */ unicode_to_jisx0208_80, unicode_to_jisx0208_81, unicode_to_jisx0208_82, unicode_to_jisx0208_83, unicode_to_jisx0208_84, unicode_to_jisx0208_85, unicode_to_jisx0208_86, unicode_to_jisx0208_87, unicode_to_jisx0208_88, unicode_to_jisx0208_89, unicode_to_jisx0208_8a, unicode_to_jisx0208_8b, unicode_to_jisx0208_8c, unicode_to_jisx0208_8d, unicode_to_jisx0208_8e, unicode_to_jisx0208_8f, /* 0x90XX - 0x9fXX */ unicode_to_jisx0208_90, unicode_to_jisx0208_91, unicode_to_jisx0208_92, unicode_to_jisx0208_93, unicode_to_jisx0208_94, unicode_to_jisx0208_95, unicode_to_jisx0208_96, unicode_to_jisx0208_97, unicode_to_jisx0208_98, unicode_to_jisx0208_99, unicode_to_jisx0208_9a, unicode_to_jisx0208_9b, unicode_to_jisx0208_9c, unicode_to_jisx0208_9d, unicode_to_jisx0208_9e, unicode_to_jisx0208_9f, /* 0xa0XX - 0xafXX */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 0xb0XX - 0xbfXX */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 0xc0XX - 0xcfXX */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 0xd0XX - 0xdfXX */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 0xe0XX - 0xefXX */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 0xf0XX - 0xffXX */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, unicode_to_jisx0208_ff, }; static inline bool IsKana(unsigned c) { return c >= 0xa1 && c <= 0xdf; } static inline bool IsLatin(unsigned c) { return /*(c) >= 0x00 &&*/ c <= 0x7f; } /* * This function is derived from Unicode 1.1, * JIS X 0201 (1976) to Unicode mapping table version 0.9 . */ #define JISX0201_YEN_SIGN 0x005c #define UNICODE_YEN_SIGN 0x00a5 #define JISX0201_OVERLINE 0x007e #define UNICODE_OVERLINE 0x203e static inline unsigned Hi(unsigned c) { return (c >> 8) & 0xff; } static inline unsigned Lo(unsigned c) { return c & 0xff; } /* * This function is derived from Unicode 1.1, * JIS X 0201 (1976) to Unicode mapping table version 0.9 . */ static unsigned unicode11ToJisx0201(unsigned h, unsigned l) { if ((h == 0x00) && (l < 0x80)) { if ((l == JISX0201_YEN_SIGN) || (l == JISX0201_OVERLINE)) { return 0x0000; } return l; } else if ((h == 0x00) && (l == 0xa5)) { return JISX0201_YEN_SIGN; } else if ((h == 0x20) && (l == 0x3e)) { return JISX0201_OVERLINE; } else if ((h == 0xff) && (0x61 <= l) && (l <= 0x9f)) { return 0x00a1 + l - 0x61; } return 0x0000; } static unsigned unicodeToJisx0201Latin(unsigned h, unsigned l) { unsigned jis = unicode11ToJisx0201(h, l); if (IsLatin(jis)) { return jis; } return 0x0000; } static unsigned unicodeToJisx0201Kana(unsigned h, unsigned l) { unsigned jis = unicode11ToJisx0201(h, l); if (IsKana(jis)) { return jis; } return 0x0000; } static unsigned unicodeToJisx0201(unsigned h, unsigned l) { unsigned jis; if ((jis = unicodeToJisx0201Latin(h, l)) != 0) { return jis; } else if ((jis = unicodeToJisx0201Kana(h, l)) != 0) { return jis; } return 0x0000; } static unsigned unicodeToJisx0208(unsigned h, unsigned l) { if ((h == 0x00) && (l == 0x5c)) { return 0x0000; } uint16_t const *table; table = unicode_to_jisx0208_map[h]; if (table != 0) { return table[l]; } return 0x0000; } static unsigned jisx0208ToSjis(unsigned h, unsigned l) { if ((0x0021 <= h) && (h <= 0x007e) && (0x0021 <= l) && (l <= 0x007e)) { return ((((h - 1) >> 1) + ((h <= 0x5e) ? 0x71 : 0xb1)) << 8) | (l + ((h & 1) ? ((l < 0x60) ? 0x1f : 0x20) : 0x7e)); } return 0x0000; } /*! \internal */ unsigned unicodeToJisx0212(unsigned h, unsigned l) { if ((h == 0x00) && (l == 0x7e)) { return 0x0000; } if ((h == 0xff) && (l == 0x5e)) { return 0x2237; } return unicodeToJisx0208(h, l); } static unsigned unicodeToSjis(unsigned h, unsigned l) { unsigned jis; if ((jis = unicodeToJisx0201(h, l)) != 0x0000) { return jis; } else if ((jis = unicodeToJisx0208(h, l)) != 0x0000) { return jisx0208ToSjis(Hi(jis), Lo(jis)); } else if ((jis = unicodeToJisx0212(h, l)) != 0x0000) { return 0x0000; } return 0x0000; } void JPTextEncoder::EncodeShiftJIS(const std::wstring& str, std::string& bytes) { static const char replacement = '?'; //int invalid = 0; bytes.resize(2 * str.length() + 1); int index = 0; for (wchar_t ch : str) { unsigned j; if (ch < 0x80) { // ASCII bytes[index++] = static_cast(ch); } else if ((j = unicodeToJisx0201(Hi(ch), Lo(ch))) != 0) { // JIS X 0201 Latin or JIS X 0201 Kana bytes[index++] = static_cast(j); } else if ((j = unicodeToSjis(Hi(ch), Lo(ch))) != 0) { // JIS X 0208 bytes[index++] = static_cast(j >> 8); bytes[index++] = static_cast(j & 0xff); } else if ((j = unicodeToJisx0212(Hi(ch), Lo(ch))) != 0) { // JIS X 0212 (can't be encoded in ShiftJIS !) bytes[index++] = static_cast(0x81); // white square bytes[index++] = static_cast(0xa0); // white square } else { // Error bytes[index++] = replacement; //++invalid; } } bytes.resize(index); } void JPTextEncoder::EncodeEUCJP(const std::wstring& str, std::string& bytes) { static const char replacement = '?'; static const uint8_t Ss2 = 0x8e; // Single Shift 2 static const uint8_t Ss3 = 0x8f; // Single Shift 3 //int invalid = 0; bytes.resize(3 * str.length() + 1); int index = 0; for (wchar_t ch : str) { unsigned j; if (ch < 0x80) { // ASCII bytes[index++] = static_cast(ch); } else if ((j = unicodeToJisx0201(Hi(ch), Lo(ch))) != 0) { if (j < 0x80) { // JIS X 0201 Latin ? bytes[index++] = static_cast(j); } else { // JIS X 0201 Kana bytes[index++] = Ss2; bytes[index++] = static_cast(j); } } else if ((j = unicodeToJisx0208(Hi(ch), Lo(ch))) != 0) { // JIS X 0208 bytes[index++] = static_cast((j >> 8) | 0x80); bytes[index++] = static_cast((j & 0xff) | 0x80); } else if ((j = unicodeToJisx0212(Hi(ch), Lo(ch))) != 0) { // JIS X 0212 bytes[index++] = Ss3; bytes[index++] = static_cast((j >> 8) | 0x80); bytes[index++] = static_cast((j & 0xff) | 0x80); } else { // Error bytes[index++] = replacement; //++invalid; } } bytes.resize(index); } zxing-cpp-1.0.8+ds2/core/src/textcodec/JPTextEncoder.h000066400000000000000000000064121361167020700224610ustar00rootroot00000000000000#pragma once /**************************************************************************** ** ** Copyright (C) 2015 The Qt Company Ltd. ** Contact: http://www.qt.io/licensing/ ** ** This file is part of the QtCore module of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:LGPL21$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and The Qt Company. For licensing terms ** and conditions see http://www.qt.io/terms-conditions. For further ** information use the contact form at http://www.qt.io/contact-us. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 or version 3 as published by the Free ** Software Foundation and appearing in the file LICENSE.LGPLv21 and ** LICENSE.LGPLv3 included in the packaging of this file. Please review the ** following information to ensure the GNU Lesser General Public License ** requirements will be met: https://www.gnu.org/licenses/lgpl.html and ** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** As a special exception, The Qt Company gives you certain additional ** rights. These rights are described in The Qt Company LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** $QT_END_LICENSE$ ** ****************************************************************************/ // Most of the code here was originally written by Serika Kurusugawa // a.k.a. Junji Takagi, and is included in Qt with the author's permission, // and the grateful thanks of the Qt team. /* * Copyright (C) 1999 Serika Kurusugawa, All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. */ #include class JPTextEncoder { public: static void EncodeShiftJIS(const std::wstring& str, std::string& bytes); static void EncodeEUCJP(const std::wstring& str, std::string& bytes); }; zxing-cpp-1.0.8+ds2/core/src/textcodec/KRHangulMapping.cpp000066400000000000000000000505251361167020700233310ustar00rootroot00000000000000/**************************************************************************** ** ** Copyright (C) 2015 The Qt Company Ltd. ** Contact: http://www.qt.io/licensing/ ** ** This file is part of the QtCore module of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:LGPL21$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and The Qt Company. For licensing terms ** and conditions see http://www.qt.io/terms-conditions. For further ** information use the contact form at http://www.qt.io/contact-us. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 or version 3 as published by the Free ** Software Foundation and appearing in the file LICENSE.LGPLv21 and ** LICENSE.LGPLv3 included in the packaging of this file. Please review the ** following information to ensure the GNU Lesser General Public License ** requirements will be met: https://www.gnu.org/licenses/lgpl.html and ** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** As a special exception, The Qt Company gives you certain additional ** rights. These rights are described in The Qt Company LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** $QT_END_LICENSE$ ** ****************************************************************************/ // Most of the cp949 code was originally written by Joon-Kyu Park, and is included // in Qt with the author's permission and the grateful thanks of the Qt team. #include "KRHangulMapping.h" /* Table including ksc5601 hangul to unicode */ const uint16_t ksc5601_hangul_to_unicode[2350] = { 0xac00, 0xac01, 0xac04, 0xac07, 0xac08, 0xac09, 0xac0a, 0xac10, 0xac11, 0xac12, 0xac13, 0xac14, 0xac15, 0xac16, 0xac17, 0xac19, 0xac1a, 0xac1b, 0xac1c, 0xac1d, 0xac20, 0xac24, 0xac2c, 0xac2d, 0xac2f, 0xac30, 0xac31, 0xac38, 0xac39, 0xac3c, 0xac40, 0xac4b, 0xac4d, 0xac54, 0xac58, 0xac5c, 0xac70, 0xac71, 0xac74, 0xac77, 0xac78, 0xac7a, 0xac80, 0xac81, 0xac83, 0xac84, 0xac85, 0xac86, 0xac89, 0xac8a, 0xac8b, 0xac8c, 0xac90, 0xac94, 0xac9c, 0xac9d, 0xac9f, 0xaca0, 0xaca1, 0xaca8, 0xaca9, 0xacaa, 0xacac, 0xacaf, 0xacb0, 0xacb8, 0xacb9, 0xacbb, 0xacbc, 0xacbd, 0xacc1, 0xacc4, 0xacc8, 0xaccc, 0xacd5, 0xacd7, 0xace0, 0xace1, 0xace4, 0xace7, 0xace8, 0xacea, 0xacec, 0xacef, 0xacf0, 0xacf1, 0xacf3, 0xacf5, 0xacf6, 0xacfc, 0xacfd, 0xad00, 0xad04, 0xad06, 0xad0c, 0xad0d, 0xad0f, 0xad11, 0xad18, 0xad1c, 0xad20, 0xad29, 0xad2c, 0xad2d, 0xad34, 0xad35, 0xad38, 0xad3c, 0xad44, 0xad45, 0xad47, 0xad49, 0xad50, 0xad54, 0xad58, 0xad61, 0xad63, 0xad6c, 0xad6d, 0xad70, 0xad73, 0xad74, 0xad75, 0xad76, 0xad7b, 0xad7c, 0xad7d, 0xad7f, 0xad81, 0xad82, 0xad88, 0xad89, 0xad8c, 0xad90, 0xad9c, 0xad9d, 0xada4, 0xadb7, 0xadc0, 0xadc1, 0xadc4, 0xadc8, 0xadd0, 0xadd1, 0xadd3, 0xaddc, 0xade0, 0xade4, 0xadf8, 0xadf9, 0xadfc, 0xadff, 0xae00, 0xae01, 0xae08, 0xae09, 0xae0b, 0xae0d, 0xae14, 0xae30, 0xae31, 0xae34, 0xae37, 0xae38, 0xae3a, 0xae40, 0xae41, 0xae43, 0xae45, 0xae46, 0xae4a, 0xae4c, 0xae4d, 0xae4e, 0xae50, 0xae54, 0xae56, 0xae5c, 0xae5d, 0xae5f, 0xae60, 0xae61, 0xae65, 0xae68, 0xae69, 0xae6c, 0xae70, 0xae78, 0xae79, 0xae7b, 0xae7c, 0xae7d, 0xae84, 0xae85, 0xae8c, 0xaebc, 0xaebd, 0xaebe, 0xaec0, 0xaec4, 0xaecc, 0xaecd, 0xaecf, 0xaed0, 0xaed1, 0xaed8, 0xaed9, 0xaedc, 0xaee8, 0xaeeb, 0xaeed, 0xaef4, 0xaef8, 0xaefc, 0xaf07, 0xaf08, 0xaf0d, 0xaf10, 0xaf2c, 0xaf2d, 0xaf30, 0xaf32, 0xaf34, 0xaf3c, 0xaf3d, 0xaf3f, 0xaf41, 0xaf42, 0xaf43, 0xaf48, 0xaf49, 0xaf50, 0xaf5c, 0xaf5d, 0xaf64, 0xaf65, 0xaf79, 0xaf80, 0xaf84, 0xaf88, 0xaf90, 0xaf91, 0xaf95, 0xaf9c, 0xafb8, 0xafb9, 0xafbc, 0xafc0, 0xafc7, 0xafc8, 0xafc9, 0xafcb, 0xafcd, 0xafce, 0xafd4, 0xafdc, 0xafe8, 0xafe9, 0xaff0, 0xaff1, 0xaff4, 0xaff8, 0xb000, 0xb001, 0xb004, 0xb00c, 0xb010, 0xb014, 0xb01c, 0xb01d, 0xb028, 0xb044, 0xb045, 0xb048, 0xb04a, 0xb04c, 0xb04e, 0xb053, 0xb054, 0xb055, 0xb057, 0xb059, 0xb05d, 0xb07c, 0xb07d, 0xb080, 0xb084, 0xb08c, 0xb08d, 0xb08f, 0xb091, 0xb098, 0xb099, 0xb09a, 0xb09c, 0xb09f, 0xb0a0, 0xb0a1, 0xb0a2, 0xb0a8, 0xb0a9, 0xb0ab, 0xb0ac, 0xb0ad, 0xb0ae, 0xb0af, 0xb0b1, 0xb0b3, 0xb0b4, 0xb0b5, 0xb0b8, 0xb0bc, 0xb0c4, 0xb0c5, 0xb0c7, 0xb0c8, 0xb0c9, 0xb0d0, 0xb0d1, 0xb0d4, 0xb0d8, 0xb0e0, 0xb0e5, 0xb108, 0xb109, 0xb10b, 0xb10c, 0xb110, 0xb112, 0xb113, 0xb118, 0xb119, 0xb11b, 0xb11c, 0xb11d, 0xb123, 0xb124, 0xb125, 0xb128, 0xb12c, 0xb134, 0xb135, 0xb137, 0xb138, 0xb139, 0xb140, 0xb141, 0xb144, 0xb148, 0xb150, 0xb151, 0xb154, 0xb155, 0xb158, 0xb15c, 0xb160, 0xb178, 0xb179, 0xb17c, 0xb180, 0xb182, 0xb188, 0xb189, 0xb18b, 0xb18d, 0xb192, 0xb193, 0xb194, 0xb198, 0xb19c, 0xb1a8, 0xb1cc, 0xb1d0, 0xb1d4, 0xb1dc, 0xb1dd, 0xb1df, 0xb1e8, 0xb1e9, 0xb1ec, 0xb1f0, 0xb1f9, 0xb1fb, 0xb1fd, 0xb204, 0xb205, 0xb208, 0xb20b, 0xb20c, 0xb214, 0xb215, 0xb217, 0xb219, 0xb220, 0xb234, 0xb23c, 0xb258, 0xb25c, 0xb260, 0xb268, 0xb269, 0xb274, 0xb275, 0xb27c, 0xb284, 0xb285, 0xb289, 0xb290, 0xb291, 0xb294, 0xb298, 0xb299, 0xb29a, 0xb2a0, 0xb2a1, 0xb2a3, 0xb2a5, 0xb2a6, 0xb2aa, 0xb2ac, 0xb2b0, 0xb2b4, 0xb2c8, 0xb2c9, 0xb2cc, 0xb2d0, 0xb2d2, 0xb2d8, 0xb2d9, 0xb2db, 0xb2dd, 0xb2e2, 0xb2e4, 0xb2e5, 0xb2e6, 0xb2e8, 0xb2eb, 0xb2ec, 0xb2ed, 0xb2ee, 0xb2ef, 0xb2f3, 0xb2f4, 0xb2f5, 0xb2f7, 0xb2f8, 0xb2f9, 0xb2fa, 0xb2fb, 0xb2ff, 0xb300, 0xb301, 0xb304, 0xb308, 0xb310, 0xb311, 0xb313, 0xb314, 0xb315, 0xb31c, 0xb354, 0xb355, 0xb356, 0xb358, 0xb35b, 0xb35c, 0xb35e, 0xb35f, 0xb364, 0xb365, 0xb367, 0xb369, 0xb36b, 0xb36e, 0xb370, 0xb371, 0xb374, 0xb378, 0xb380, 0xb381, 0xb383, 0xb384, 0xb385, 0xb38c, 0xb390, 0xb394, 0xb3a0, 0xb3a1, 0xb3a8, 0xb3ac, 0xb3c4, 0xb3c5, 0xb3c8, 0xb3cb, 0xb3cc, 0xb3ce, 0xb3d0, 0xb3d4, 0xb3d5, 0xb3d7, 0xb3d9, 0xb3db, 0xb3dd, 0xb3e0, 0xb3e4, 0xb3e8, 0xb3fc, 0xb410, 0xb418, 0xb41c, 0xb420, 0xb428, 0xb429, 0xb42b, 0xb434, 0xb450, 0xb451, 0xb454, 0xb458, 0xb460, 0xb461, 0xb463, 0xb465, 0xb46c, 0xb480, 0xb488, 0xb49d, 0xb4a4, 0xb4a8, 0xb4ac, 0xb4b5, 0xb4b7, 0xb4b9, 0xb4c0, 0xb4c4, 0xb4c8, 0xb4d0, 0xb4d5, 0xb4dc, 0xb4dd, 0xb4e0, 0xb4e3, 0xb4e4, 0xb4e6, 0xb4ec, 0xb4ed, 0xb4ef, 0xb4f1, 0xb4f8, 0xb514, 0xb515, 0xb518, 0xb51b, 0xb51c, 0xb524, 0xb525, 0xb527, 0xb528, 0xb529, 0xb52a, 0xb530, 0xb531, 0xb534, 0xb538, 0xb540, 0xb541, 0xb543, 0xb544, 0xb545, 0xb54b, 0xb54c, 0xb54d, 0xb550, 0xb554, 0xb55c, 0xb55d, 0xb55f, 0xb560, 0xb561, 0xb5a0, 0xb5a1, 0xb5a4, 0xb5a8, 0xb5aa, 0xb5ab, 0xb5b0, 0xb5b1, 0xb5b3, 0xb5b4, 0xb5b5, 0xb5bb, 0xb5bc, 0xb5bd, 0xb5c0, 0xb5c4, 0xb5cc, 0xb5cd, 0xb5cf, 0xb5d0, 0xb5d1, 0xb5d8, 0xb5ec, 0xb610, 0xb611, 0xb614, 0xb618, 0xb625, 0xb62c, 0xb634, 0xb648, 0xb664, 0xb668, 0xb69c, 0xb69d, 0xb6a0, 0xb6a4, 0xb6ab, 0xb6ac, 0xb6b1, 0xb6d4, 0xb6f0, 0xb6f4, 0xb6f8, 0xb700, 0xb701, 0xb705, 0xb728, 0xb729, 0xb72c, 0xb72f, 0xb730, 0xb738, 0xb739, 0xb73b, 0xb744, 0xb748, 0xb74c, 0xb754, 0xb755, 0xb760, 0xb764, 0xb768, 0xb770, 0xb771, 0xb773, 0xb775, 0xb77c, 0xb77d, 0xb780, 0xb784, 0xb78c, 0xb78d, 0xb78f, 0xb790, 0xb791, 0xb792, 0xb796, 0xb797, 0xb798, 0xb799, 0xb79c, 0xb7a0, 0xb7a8, 0xb7a9, 0xb7ab, 0xb7ac, 0xb7ad, 0xb7b4, 0xb7b5, 0xb7b8, 0xb7c7, 0xb7c9, 0xb7ec, 0xb7ed, 0xb7f0, 0xb7f4, 0xb7fc, 0xb7fd, 0xb7ff, 0xb800, 0xb801, 0xb807, 0xb808, 0xb809, 0xb80c, 0xb810, 0xb818, 0xb819, 0xb81b, 0xb81d, 0xb824, 0xb825, 0xb828, 0xb82c, 0xb834, 0xb835, 0xb837, 0xb838, 0xb839, 0xb840, 0xb844, 0xb851, 0xb853, 0xb85c, 0xb85d, 0xb860, 0xb864, 0xb86c, 0xb86d, 0xb86f, 0xb871, 0xb878, 0xb87c, 0xb88d, 0xb8a8, 0xb8b0, 0xb8b4, 0xb8b8, 0xb8c0, 0xb8c1, 0xb8c3, 0xb8c5, 0xb8cc, 0xb8d0, 0xb8d4, 0xb8dd, 0xb8df, 0xb8e1, 0xb8e8, 0xb8e9, 0xb8ec, 0xb8f0, 0xb8f8, 0xb8f9, 0xb8fb, 0xb8fd, 0xb904, 0xb918, 0xb920, 0xb93c, 0xb93d, 0xb940, 0xb944, 0xb94c, 0xb94f, 0xb951, 0xb958, 0xb959, 0xb95c, 0xb960, 0xb968, 0xb969, 0xb96b, 0xb96d, 0xb974, 0xb975, 0xb978, 0xb97c, 0xb984, 0xb985, 0xb987, 0xb989, 0xb98a, 0xb98d, 0xb98e, 0xb9ac, 0xb9ad, 0xb9b0, 0xb9b4, 0xb9bc, 0xb9bd, 0xb9bf, 0xb9c1, 0xb9c8, 0xb9c9, 0xb9cc, 0xb9ce, 0xb9cf, 0xb9d0, 0xb9d1, 0xb9d2, 0xb9d8, 0xb9d9, 0xb9db, 0xb9dd, 0xb9de, 0xb9e1, 0xb9e3, 0xb9e4, 0xb9e5, 0xb9e8, 0xb9ec, 0xb9f4, 0xb9f5, 0xb9f7, 0xb9f8, 0xb9f9, 0xb9fa, 0xba00, 0xba01, 0xba08, 0xba15, 0xba38, 0xba39, 0xba3c, 0xba40, 0xba42, 0xba48, 0xba49, 0xba4b, 0xba4d, 0xba4e, 0xba53, 0xba54, 0xba55, 0xba58, 0xba5c, 0xba64, 0xba65, 0xba67, 0xba68, 0xba69, 0xba70, 0xba71, 0xba74, 0xba78, 0xba83, 0xba84, 0xba85, 0xba87, 0xba8c, 0xbaa8, 0xbaa9, 0xbaab, 0xbaac, 0xbab0, 0xbab2, 0xbab8, 0xbab9, 0xbabb, 0xbabd, 0xbac4, 0xbac8, 0xbad8, 0xbad9, 0xbafc, 0xbb00, 0xbb04, 0xbb0d, 0xbb0f, 0xbb11, 0xbb18, 0xbb1c, 0xbb20, 0xbb29, 0xbb2b, 0xbb34, 0xbb35, 0xbb36, 0xbb38, 0xbb3b, 0xbb3c, 0xbb3d, 0xbb3e, 0xbb44, 0xbb45, 0xbb47, 0xbb49, 0xbb4d, 0xbb4f, 0xbb50, 0xbb54, 0xbb58, 0xbb61, 0xbb63, 0xbb6c, 0xbb88, 0xbb8c, 0xbb90, 0xbba4, 0xbba8, 0xbbac, 0xbbb4, 0xbbb7, 0xbbc0, 0xbbc4, 0xbbc8, 0xbbd0, 0xbbd3, 0xbbf8, 0xbbf9, 0xbbfc, 0xbbff, 0xbc00, 0xbc02, 0xbc08, 0xbc09, 0xbc0b, 0xbc0c, 0xbc0d, 0xbc0f, 0xbc11, 0xbc14, 0xbc15, 0xbc16, 0xbc17, 0xbc18, 0xbc1b, 0xbc1c, 0xbc1d, 0xbc1e, 0xbc1f, 0xbc24, 0xbc25, 0xbc27, 0xbc29, 0xbc2d, 0xbc30, 0xbc31, 0xbc34, 0xbc38, 0xbc40, 0xbc41, 0xbc43, 0xbc44, 0xbc45, 0xbc49, 0xbc4c, 0xbc4d, 0xbc50, 0xbc5d, 0xbc84, 0xbc85, 0xbc88, 0xbc8b, 0xbc8c, 0xbc8e, 0xbc94, 0xbc95, 0xbc97, 0xbc99, 0xbc9a, 0xbca0, 0xbca1, 0xbca4, 0xbca7, 0xbca8, 0xbcb0, 0xbcb1, 0xbcb3, 0xbcb4, 0xbcb5, 0xbcbc, 0xbcbd, 0xbcc0, 0xbcc4, 0xbccd, 0xbccf, 0xbcd0, 0xbcd1, 0xbcd5, 0xbcd8, 0xbcdc, 0xbcf4, 0xbcf5, 0xbcf6, 0xbcf8, 0xbcfc, 0xbd04, 0xbd05, 0xbd07, 0xbd09, 0xbd10, 0xbd14, 0xbd24, 0xbd2c, 0xbd40, 0xbd48, 0xbd49, 0xbd4c, 0xbd50, 0xbd58, 0xbd59, 0xbd64, 0xbd68, 0xbd80, 0xbd81, 0xbd84, 0xbd87, 0xbd88, 0xbd89, 0xbd8a, 0xbd90, 0xbd91, 0xbd93, 0xbd95, 0xbd99, 0xbd9a, 0xbd9c, 0xbda4, 0xbdb0, 0xbdb8, 0xbdd4, 0xbdd5, 0xbdd8, 0xbddc, 0xbde9, 0xbdf0, 0xbdf4, 0xbdf8, 0xbe00, 0xbe03, 0xbe05, 0xbe0c, 0xbe0d, 0xbe10, 0xbe14, 0xbe1c, 0xbe1d, 0xbe1f, 0xbe44, 0xbe45, 0xbe48, 0xbe4c, 0xbe4e, 0xbe54, 0xbe55, 0xbe57, 0xbe59, 0xbe5a, 0xbe5b, 0xbe60, 0xbe61, 0xbe64, 0xbe68, 0xbe6a, 0xbe70, 0xbe71, 0xbe73, 0xbe74, 0xbe75, 0xbe7b, 0xbe7c, 0xbe7d, 0xbe80, 0xbe84, 0xbe8c, 0xbe8d, 0xbe8f, 0xbe90, 0xbe91, 0xbe98, 0xbe99, 0xbea8, 0xbed0, 0xbed1, 0xbed4, 0xbed7, 0xbed8, 0xbee0, 0xbee3, 0xbee4, 0xbee5, 0xbeec, 0xbf01, 0xbf08, 0xbf09, 0xbf18, 0xbf19, 0xbf1b, 0xbf1c, 0xbf1d, 0xbf40, 0xbf41, 0xbf44, 0xbf48, 0xbf50, 0xbf51, 0xbf55, 0xbf94, 0xbfb0, 0xbfc5, 0xbfcc, 0xbfcd, 0xbfd0, 0xbfd4, 0xbfdc, 0xbfdf, 0xbfe1, 0xc03c, 0xc051, 0xc058, 0xc05c, 0xc060, 0xc068, 0xc069, 0xc090, 0xc091, 0xc094, 0xc098, 0xc0a0, 0xc0a1, 0xc0a3, 0xc0a5, 0xc0ac, 0xc0ad, 0xc0af, 0xc0b0, 0xc0b3, 0xc0b4, 0xc0b5, 0xc0b6, 0xc0bc, 0xc0bd, 0xc0bf, 0xc0c0, 0xc0c1, 0xc0c5, 0xc0c8, 0xc0c9, 0xc0cc, 0xc0d0, 0xc0d8, 0xc0d9, 0xc0db, 0xc0dc, 0xc0dd, 0xc0e4, 0xc0e5, 0xc0e8, 0xc0ec, 0xc0f4, 0xc0f5, 0xc0f7, 0xc0f9, 0xc100, 0xc104, 0xc108, 0xc110, 0xc115, 0xc11c, 0xc11d, 0xc11e, 0xc11f, 0xc120, 0xc123, 0xc124, 0xc126, 0xc127, 0xc12c, 0xc12d, 0xc12f, 0xc130, 0xc131, 0xc136, 0xc138, 0xc139, 0xc13c, 0xc140, 0xc148, 0xc149, 0xc14b, 0xc14c, 0xc14d, 0xc154, 0xc155, 0xc158, 0xc15c, 0xc164, 0xc165, 0xc167, 0xc168, 0xc169, 0xc170, 0xc174, 0xc178, 0xc185, 0xc18c, 0xc18d, 0xc18e, 0xc190, 0xc194, 0xc196, 0xc19c, 0xc19d, 0xc19f, 0xc1a1, 0xc1a5, 0xc1a8, 0xc1a9, 0xc1ac, 0xc1b0, 0xc1bd, 0xc1c4, 0xc1c8, 0xc1cc, 0xc1d4, 0xc1d7, 0xc1d8, 0xc1e0, 0xc1e4, 0xc1e8, 0xc1f0, 0xc1f1, 0xc1f3, 0xc1fc, 0xc1fd, 0xc200, 0xc204, 0xc20c, 0xc20d, 0xc20f, 0xc211, 0xc218, 0xc219, 0xc21c, 0xc21f, 0xc220, 0xc228, 0xc229, 0xc22b, 0xc22d, 0xc22f, 0xc231, 0xc232, 0xc234, 0xc248, 0xc250, 0xc251, 0xc254, 0xc258, 0xc260, 0xc265, 0xc26c, 0xc26d, 0xc270, 0xc274, 0xc27c, 0xc27d, 0xc27f, 0xc281, 0xc288, 0xc289, 0xc290, 0xc298, 0xc29b, 0xc29d, 0xc2a4, 0xc2a5, 0xc2a8, 0xc2ac, 0xc2ad, 0xc2b4, 0xc2b5, 0xc2b7, 0xc2b9, 0xc2dc, 0xc2dd, 0xc2e0, 0xc2e3, 0xc2e4, 0xc2eb, 0xc2ec, 0xc2ed, 0xc2ef, 0xc2f1, 0xc2f6, 0xc2f8, 0xc2f9, 0xc2fb, 0xc2fc, 0xc300, 0xc308, 0xc309, 0xc30c, 0xc30d, 0xc313, 0xc314, 0xc315, 0xc318, 0xc31c, 0xc324, 0xc325, 0xc328, 0xc329, 0xc345, 0xc368, 0xc369, 0xc36c, 0xc370, 0xc372, 0xc378, 0xc379, 0xc37c, 0xc37d, 0xc384, 0xc388, 0xc38c, 0xc3c0, 0xc3d8, 0xc3d9, 0xc3dc, 0xc3df, 0xc3e0, 0xc3e2, 0xc3e8, 0xc3e9, 0xc3ed, 0xc3f4, 0xc3f5, 0xc3f8, 0xc408, 0xc410, 0xc424, 0xc42c, 0xc430, 0xc434, 0xc43c, 0xc43d, 0xc448, 0xc464, 0xc465, 0xc468, 0xc46c, 0xc474, 0xc475, 0xc479, 0xc480, 0xc494, 0xc49c, 0xc4b8, 0xc4bc, 0xc4e9, 0xc4f0, 0xc4f1, 0xc4f4, 0xc4f8, 0xc4fa, 0xc4ff, 0xc500, 0xc501, 0xc50c, 0xc510, 0xc514, 0xc51c, 0xc528, 0xc529, 0xc52c, 0xc530, 0xc538, 0xc539, 0xc53b, 0xc53d, 0xc544, 0xc545, 0xc548, 0xc549, 0xc54a, 0xc54c, 0xc54d, 0xc54e, 0xc553, 0xc554, 0xc555, 0xc557, 0xc558, 0xc559, 0xc55d, 0xc55e, 0xc560, 0xc561, 0xc564, 0xc568, 0xc570, 0xc571, 0xc573, 0xc574, 0xc575, 0xc57c, 0xc57d, 0xc580, 0xc584, 0xc587, 0xc58c, 0xc58d, 0xc58f, 0xc591, 0xc595, 0xc597, 0xc598, 0xc59c, 0xc5a0, 0xc5a9, 0xc5b4, 0xc5b5, 0xc5b8, 0xc5b9, 0xc5bb, 0xc5bc, 0xc5bd, 0xc5be, 0xc5c4, 0xc5c5, 0xc5c6, 0xc5c7, 0xc5c8, 0xc5c9, 0xc5ca, 0xc5cc, 0xc5ce, 0xc5d0, 0xc5d1, 0xc5d4, 0xc5d8, 0xc5e0, 0xc5e1, 0xc5e3, 0xc5e5, 0xc5ec, 0xc5ed, 0xc5ee, 0xc5f0, 0xc5f4, 0xc5f6, 0xc5f7, 0xc5fc, 0xc5fd, 0xc5fe, 0xc5ff, 0xc600, 0xc601, 0xc605, 0xc606, 0xc607, 0xc608, 0xc60c, 0xc610, 0xc618, 0xc619, 0xc61b, 0xc61c, 0xc624, 0xc625, 0xc628, 0xc62c, 0xc62d, 0xc62e, 0xc630, 0xc633, 0xc634, 0xc635, 0xc637, 0xc639, 0xc63b, 0xc640, 0xc641, 0xc644, 0xc648, 0xc650, 0xc651, 0xc653, 0xc654, 0xc655, 0xc65c, 0xc65d, 0xc660, 0xc66c, 0xc66f, 0xc671, 0xc678, 0xc679, 0xc67c, 0xc680, 0xc688, 0xc689, 0xc68b, 0xc68d, 0xc694, 0xc695, 0xc698, 0xc69c, 0xc6a4, 0xc6a5, 0xc6a7, 0xc6a9, 0xc6b0, 0xc6b1, 0xc6b4, 0xc6b8, 0xc6b9, 0xc6ba, 0xc6c0, 0xc6c1, 0xc6c3, 0xc6c5, 0xc6cc, 0xc6cd, 0xc6d0, 0xc6d4, 0xc6dc, 0xc6dd, 0xc6e0, 0xc6e1, 0xc6e8, 0xc6e9, 0xc6ec, 0xc6f0, 0xc6f8, 0xc6f9, 0xc6fd, 0xc704, 0xc705, 0xc708, 0xc70c, 0xc714, 0xc715, 0xc717, 0xc719, 0xc720, 0xc721, 0xc724, 0xc728, 0xc730, 0xc731, 0xc733, 0xc735, 0xc737, 0xc73c, 0xc73d, 0xc740, 0xc744, 0xc74a, 0xc74c, 0xc74d, 0xc74f, 0xc751, 0xc752, 0xc753, 0xc754, 0xc755, 0xc756, 0xc757, 0xc758, 0xc75c, 0xc760, 0xc768, 0xc76b, 0xc774, 0xc775, 0xc778, 0xc77c, 0xc77d, 0xc77e, 0xc783, 0xc784, 0xc785, 0xc787, 0xc788, 0xc789, 0xc78a, 0xc78e, 0xc790, 0xc791, 0xc794, 0xc796, 0xc797, 0xc798, 0xc79a, 0xc7a0, 0xc7a1, 0xc7a3, 0xc7a4, 0xc7a5, 0xc7a6, 0xc7ac, 0xc7ad, 0xc7b0, 0xc7b4, 0xc7bc, 0xc7bd, 0xc7bf, 0xc7c0, 0xc7c1, 0xc7c8, 0xc7c9, 0xc7cc, 0xc7ce, 0xc7d0, 0xc7d8, 0xc7dd, 0xc7e4, 0xc7e8, 0xc7ec, 0xc800, 0xc801, 0xc804, 0xc808, 0xc80a, 0xc810, 0xc811, 0xc813, 0xc815, 0xc816, 0xc81c, 0xc81d, 0xc820, 0xc824, 0xc82c, 0xc82d, 0xc82f, 0xc831, 0xc838, 0xc83c, 0xc840, 0xc848, 0xc849, 0xc84c, 0xc84d, 0xc854, 0xc870, 0xc871, 0xc874, 0xc878, 0xc87a, 0xc880, 0xc881, 0xc883, 0xc885, 0xc886, 0xc887, 0xc88b, 0xc88c, 0xc88d, 0xc894, 0xc89d, 0xc89f, 0xc8a1, 0xc8a8, 0xc8bc, 0xc8bd, 0xc8c4, 0xc8c8, 0xc8cc, 0xc8d4, 0xc8d5, 0xc8d7, 0xc8d9, 0xc8e0, 0xc8e1, 0xc8e4, 0xc8f5, 0xc8fc, 0xc8fd, 0xc900, 0xc904, 0xc905, 0xc906, 0xc90c, 0xc90d, 0xc90f, 0xc911, 0xc918, 0xc92c, 0xc934, 0xc950, 0xc951, 0xc954, 0xc958, 0xc960, 0xc961, 0xc963, 0xc96c, 0xc970, 0xc974, 0xc97c, 0xc988, 0xc989, 0xc98c, 0xc990, 0xc998, 0xc999, 0xc99b, 0xc99d, 0xc9c0, 0xc9c1, 0xc9c4, 0xc9c7, 0xc9c8, 0xc9ca, 0xc9d0, 0xc9d1, 0xc9d3, 0xc9d5, 0xc9d6, 0xc9d9, 0xc9da, 0xc9dc, 0xc9dd, 0xc9e0, 0xc9e2, 0xc9e4, 0xc9e7, 0xc9ec, 0xc9ed, 0xc9ef, 0xc9f0, 0xc9f1, 0xc9f8, 0xc9f9, 0xc9fc, 0xca00, 0xca08, 0xca09, 0xca0b, 0xca0c, 0xca0d, 0xca14, 0xca18, 0xca29, 0xca4c, 0xca4d, 0xca50, 0xca54, 0xca5c, 0xca5d, 0xca5f, 0xca60, 0xca61, 0xca68, 0xca7d, 0xca84, 0xca98, 0xcabc, 0xcabd, 0xcac0, 0xcac4, 0xcacc, 0xcacd, 0xcacf, 0xcad1, 0xcad3, 0xcad8, 0xcad9, 0xcae0, 0xcaec, 0xcaf4, 0xcb08, 0xcb10, 0xcb14, 0xcb18, 0xcb20, 0xcb21, 0xcb41, 0xcb48, 0xcb49, 0xcb4c, 0xcb50, 0xcb58, 0xcb59, 0xcb5d, 0xcb64, 0xcb78, 0xcb79, 0xcb9c, 0xcbb8, 0xcbd4, 0xcbe4, 0xcbe7, 0xcbe9, 0xcc0c, 0xcc0d, 0xcc10, 0xcc14, 0xcc1c, 0xcc1d, 0xcc21, 0xcc22, 0xcc27, 0xcc28, 0xcc29, 0xcc2c, 0xcc2e, 0xcc30, 0xcc38, 0xcc39, 0xcc3b, 0xcc3c, 0xcc3d, 0xcc3e, 0xcc44, 0xcc45, 0xcc48, 0xcc4c, 0xcc54, 0xcc55, 0xcc57, 0xcc58, 0xcc59, 0xcc60, 0xcc64, 0xcc66, 0xcc68, 0xcc70, 0xcc75, 0xcc98, 0xcc99, 0xcc9c, 0xcca0, 0xcca8, 0xcca9, 0xccab, 0xccac, 0xccad, 0xccb4, 0xccb5, 0xccb8, 0xccbc, 0xccc4, 0xccc5, 0xccc7, 0xccc9, 0xccd0, 0xccd4, 0xcce4, 0xccec, 0xccf0, 0xcd01, 0xcd08, 0xcd09, 0xcd0c, 0xcd10, 0xcd18, 0xcd19, 0xcd1b, 0xcd1d, 0xcd24, 0xcd28, 0xcd2c, 0xcd39, 0xcd5c, 0xcd60, 0xcd64, 0xcd6c, 0xcd6d, 0xcd6f, 0xcd71, 0xcd78, 0xcd88, 0xcd94, 0xcd95, 0xcd98, 0xcd9c, 0xcda4, 0xcda5, 0xcda7, 0xcda9, 0xcdb0, 0xcdc4, 0xcdcc, 0xcdd0, 0xcde8, 0xcdec, 0xcdf0, 0xcdf8, 0xcdf9, 0xcdfb, 0xcdfd, 0xce04, 0xce08, 0xce0c, 0xce14, 0xce19, 0xce20, 0xce21, 0xce24, 0xce28, 0xce30, 0xce31, 0xce33, 0xce35, 0xce58, 0xce59, 0xce5c, 0xce5f, 0xce60, 0xce61, 0xce68, 0xce69, 0xce6b, 0xce6d, 0xce74, 0xce75, 0xce78, 0xce7c, 0xce84, 0xce85, 0xce87, 0xce89, 0xce90, 0xce91, 0xce94, 0xce98, 0xcea0, 0xcea1, 0xcea3, 0xcea4, 0xcea5, 0xceac, 0xcead, 0xcec1, 0xcee4, 0xcee5, 0xcee8, 0xceeb, 0xceec, 0xcef4, 0xcef5, 0xcef7, 0xcef8, 0xcef9, 0xcf00, 0xcf01, 0xcf04, 0xcf08, 0xcf10, 0xcf11, 0xcf13, 0xcf15, 0xcf1c, 0xcf20, 0xcf24, 0xcf2c, 0xcf2d, 0xcf2f, 0xcf30, 0xcf31, 0xcf38, 0xcf54, 0xcf55, 0xcf58, 0xcf5c, 0xcf64, 0xcf65, 0xcf67, 0xcf69, 0xcf70, 0xcf71, 0xcf74, 0xcf78, 0xcf80, 0xcf85, 0xcf8c, 0xcfa1, 0xcfa8, 0xcfb0, 0xcfc4, 0xcfe0, 0xcfe1, 0xcfe4, 0xcfe8, 0xcff0, 0xcff1, 0xcff3, 0xcff5, 0xcffc, 0xd000, 0xd004, 0xd011, 0xd018, 0xd02d, 0xd034, 0xd035, 0xd038, 0xd03c, 0xd044, 0xd045, 0xd047, 0xd049, 0xd050, 0xd054, 0xd058, 0xd060, 0xd06c, 0xd06d, 0xd070, 0xd074, 0xd07c, 0xd07d, 0xd081, 0xd0a4, 0xd0a5, 0xd0a8, 0xd0ac, 0xd0b4, 0xd0b5, 0xd0b7, 0xd0b9, 0xd0c0, 0xd0c1, 0xd0c4, 0xd0c8, 0xd0c9, 0xd0d0, 0xd0d1, 0xd0d3, 0xd0d4, 0xd0d5, 0xd0dc, 0xd0dd, 0xd0e0, 0xd0e4, 0xd0ec, 0xd0ed, 0xd0ef, 0xd0f0, 0xd0f1, 0xd0f8, 0xd10d, 0xd130, 0xd131, 0xd134, 0xd138, 0xd13a, 0xd140, 0xd141, 0xd143, 0xd144, 0xd145, 0xd14c, 0xd14d, 0xd150, 0xd154, 0xd15c, 0xd15d, 0xd15f, 0xd161, 0xd168, 0xd16c, 0xd17c, 0xd184, 0xd188, 0xd1a0, 0xd1a1, 0xd1a4, 0xd1a8, 0xd1b0, 0xd1b1, 0xd1b3, 0xd1b5, 0xd1ba, 0xd1bc, 0xd1c0, 0xd1d8, 0xd1f4, 0xd1f8, 0xd207, 0xd209, 0xd210, 0xd22c, 0xd22d, 0xd230, 0xd234, 0xd23c, 0xd23d, 0xd23f, 0xd241, 0xd248, 0xd25c, 0xd264, 0xd280, 0xd281, 0xd284, 0xd288, 0xd290, 0xd291, 0xd295, 0xd29c, 0xd2a0, 0xd2a4, 0xd2ac, 0xd2b1, 0xd2b8, 0xd2b9, 0xd2bc, 0xd2bf, 0xd2c0, 0xd2c2, 0xd2c8, 0xd2c9, 0xd2cb, 0xd2d4, 0xd2d8, 0xd2dc, 0xd2e4, 0xd2e5, 0xd2f0, 0xd2f1, 0xd2f4, 0xd2f8, 0xd300, 0xd301, 0xd303, 0xd305, 0xd30c, 0xd30d, 0xd30e, 0xd310, 0xd314, 0xd316, 0xd31c, 0xd31d, 0xd31f, 0xd320, 0xd321, 0xd325, 0xd328, 0xd329, 0xd32c, 0xd330, 0xd338, 0xd339, 0xd33b, 0xd33c, 0xd33d, 0xd344, 0xd345, 0xd37c, 0xd37d, 0xd380, 0xd384, 0xd38c, 0xd38d, 0xd38f, 0xd390, 0xd391, 0xd398, 0xd399, 0xd39c, 0xd3a0, 0xd3a8, 0xd3a9, 0xd3ab, 0xd3ad, 0xd3b4, 0xd3b8, 0xd3bc, 0xd3c4, 0xd3c5, 0xd3c8, 0xd3c9, 0xd3d0, 0xd3d8, 0xd3e1, 0xd3e3, 0xd3ec, 0xd3ed, 0xd3f0, 0xd3f4, 0xd3fc, 0xd3fd, 0xd3ff, 0xd401, 0xd408, 0xd41d, 0xd440, 0xd444, 0xd45c, 0xd460, 0xd464, 0xd46d, 0xd46f, 0xd478, 0xd479, 0xd47c, 0xd47f, 0xd480, 0xd482, 0xd488, 0xd489, 0xd48b, 0xd48d, 0xd494, 0xd4a9, 0xd4cc, 0xd4d0, 0xd4d4, 0xd4dc, 0xd4df, 0xd4e8, 0xd4ec, 0xd4f0, 0xd4f8, 0xd4fb, 0xd4fd, 0xd504, 0xd508, 0xd50c, 0xd514, 0xd515, 0xd517, 0xd53c, 0xd53d, 0xd540, 0xd544, 0xd54c, 0xd54d, 0xd54f, 0xd551, 0xd558, 0xd559, 0xd55c, 0xd560, 0xd565, 0xd568, 0xd569, 0xd56b, 0xd56d, 0xd574, 0xd575, 0xd578, 0xd57c, 0xd584, 0xd585, 0xd587, 0xd588, 0xd589, 0xd590, 0xd5a5, 0xd5c8, 0xd5c9, 0xd5cc, 0xd5d0, 0xd5d2, 0xd5d8, 0xd5d9, 0xd5db, 0xd5dd, 0xd5e4, 0xd5e5, 0xd5e8, 0xd5ec, 0xd5f4, 0xd5f5, 0xd5f7, 0xd5f9, 0xd600, 0xd601, 0xd604, 0xd608, 0xd610, 0xd611, 0xd613, 0xd614, 0xd615, 0xd61c, 0xd620, 0xd624, 0xd62d, 0xd638, 0xd639, 0xd63c, 0xd640, 0xd645, 0xd648, 0xd649, 0xd64b, 0xd64d, 0xd651, 0xd654, 0xd655, 0xd658, 0xd65c, 0xd667, 0xd669, 0xd670, 0xd671, 0xd674, 0xd683, 0xd685, 0xd68c, 0xd68d, 0xd690, 0xd694, 0xd69d, 0xd69f, 0xd6a1, 0xd6a8, 0xd6ac, 0xd6b0, 0xd6b9, 0xd6bb, 0xd6c4, 0xd6c5, 0xd6c8, 0xd6cc, 0xd6d1, 0xd6d4, 0xd6d7, 0xd6d9, 0xd6e0, 0xd6e4, 0xd6e8, 0xd6f0, 0xd6f5, 0xd6fc, 0xd6fd, 0xd700, 0xd704, 0xd711, 0xd718, 0xd719, 0xd71c, 0xd720, 0xd728, 0xd729, 0xd72b, 0xd72d, 0xd734, 0xd735, 0xd738, 0xd73c, 0xd744, 0xd747, 0xd749, 0xd750, 0xd751, 0xd754, 0xd756, 0xd757, 0xd758, 0xd759, 0xd760, 0xd761, 0xd763, 0xd765, 0xd769, 0xd76c, 0xd770, 0xd774, 0xd77c, 0xd77d, 0xd781, 0xd788, 0xd789, 0xd78c, 0xd790, 0xd798, 0xd799, 0xd79b, 0xd79d }; zxing-cpp-1.0.8+ds2/core/src/textcodec/KRHangulMapping.h000066400000000000000000000032641361167020700227740ustar00rootroot00000000000000#pragma once /**************************************************************************** ** ** Copyright (C) 2015 The Qt Company Ltd. ** Contact: http://www.qt.io/licensing/ ** ** This file is part of the QtCore module of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:LGPL21$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and The Qt Company. For licensing terms ** and conditions see http://www.qt.io/terms-conditions. For further ** information use the contact form at http://www.qt.io/contact-us. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 or version 3 as published by the Free ** Software Foundation and appearing in the file LICENSE.LGPLv21 and ** LICENSE.LGPLv3 included in the packaging of this file. Please review the ** following information to ensure the GNU Lesser General Public License ** requirements will be met: https://www.gnu.org/licenses/lgpl.html and ** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** As a special exception, The Qt Company gives you certain additional ** rights. These rights are described in The Qt Company LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** $QT_END_LICENSE$ ** ****************************************************************************/ #include /* Table including ksc5601 hangul to unicode */ extern const uint16_t ksc5601_hangul_to_unicode[2350];zxing-cpp-1.0.8+ds2/core/src/textcodec/KRTextDecoder.cpp000066400000000000000000003622551361167020700230170ustar00rootroot00000000000000/**************************************************************************** ** ** Copyright (C) 2015 The Qt Company Ltd. ** Contact: http://www.qt.io/licensing/ ** ** This file is part of the QtCore module of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:LGPL21$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and The Qt Company. For licensing terms ** and conditions see http://www.qt.io/terms-conditions. For further ** information use the contact form at http://www.qt.io/contact-us. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 or version 3 as published by the Free ** Software Foundation and appearing in the file LICENSE.LGPLv21 and ** LICENSE.LGPLv3 included in the packaging of this file. Please review the ** following information to ensure the GNU Lesser General Public License ** requirements will be met: https://www.gnu.org/licenses/lgpl.html and ** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** As a special exception, The Qt Company gives you certain additional ** rights. These rights are described in The Qt Company LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** $QT_END_LICENSE$ ** ****************************************************************************/ // Most of the cp949 code was originally written by Joon-Kyu Park, and is included // in Qt with the author's permission and the grateful thanks of the Qt team. #include "KRTextDecoder.h" #include "KRHangulMapping.h" static const uint16_t cp949_icode_to_unicode[8822] = { 0xac02, 0xac03, 0xac05, 0xac06, 0xac0b, 0xac0c, 0xac0d, 0xac0e, 0xac0f, 0xac18, 0xac1e, 0xac1f, 0xac21, 0xac22, 0xac23, 0xac25, 0xac26, 0xac27, 0xac28, 0xac29, 0xac2a, 0xac2b, 0xac2e, 0xac32, 0xac33, 0xac34, 0xac35, 0xac36, 0xac37, 0xac3a, 0xac3b, 0xac3d, 0xac3e, 0xac3f, 0xac41, 0xac42, 0xac43, 0xac44, 0xac45, 0xac46, 0xac47, 0xac48, 0xac49, 0xac4a, 0xac4c, 0xac4e, 0xac4f, 0xac50, 0xac51, 0xac52, 0xac53, 0xac55, 0xac56, 0xac57, 0xac59, 0xac5a, 0xac5b, 0xac5d, 0xac5e, 0xac5f, 0xac60, 0xac61, 0xac62, 0xac63, 0xac64, 0xac65, 0xac66, 0xac67, 0xac68, 0xac69, 0xac6a, 0xac6b, 0xac6c, 0xac6d, 0xac6e, 0xac6f, 0xac72, 0xac73, 0xac75, 0xac76, 0xac79, 0xac7b, 0xac7c, 0xac7d, 0xac7e, 0xac7f, 0xac82, 0xac87, 0xac88, 0xac8d, 0xac8e, 0xac8f, 0xac91, 0xac92, 0xac93, 0xac95, 0xac96, 0xac97, 0xac98, 0xac99, 0xac9a, 0xac9b, 0xac9e, 0xaca2, 0xaca3, 0xaca4, 0xaca5, 0xaca6, 0xaca7, 0xacab, 0xacad, 0xacae, 0xacb1, 0xacb2, 0xacb3, 0xacb4, 0xacb5, 0xacb6, 0xacb7, 0xacba, 0xacbe, 0xacbf, 0xacc0, 0xacc2, 0xacc3, 0xacc5, 0xacc6, 0xacc7, 0xacc9, 0xacca, 0xaccb, 0xaccd, 0xacce, 0xaccf, 0xacd0, 0xacd1, 0xacd2, 0xacd3, 0xacd4, 0xacd6, 0xacd8, 0xacd9, 0xacda, 0xacdb, 0xacdc, 0xacdd, 0xacde, 0xacdf, 0xace2, 0xace3, 0xace5, 0xace6, 0xace9, 0xaceb, 0xaced, 0xacee, 0xacf2, 0xacf4, 0xacf7, 0xacf8, 0xacf9, 0xacfa, 0xacfb, 0xacfe, 0xacff, 0xad01, 0xad02, 0xad03, 0xad05, 0xad07, 0xad08, 0xad09, 0xad0a, 0xad0b, 0xad0e, 0xad10, 0xad12, 0xad13, 0xad14, 0xad15, 0xad16, 0xad17, 0xad19, 0xad1a, 0xad1b, 0xad1d, 0xad1e, 0xad1f, 0xad21, 0xad22, 0xad23, 0xad24, 0xad25, 0xad26, 0xad27, 0xad28, 0xad2a, 0xad2b, 0xad2e, 0xad2f, 0xad30, 0xad31, 0xad32, 0xad33, 0xad36, 0xad37, 0xad39, 0xad3a, 0xad3b, 0xad3d, 0xad3e, 0xad3f, 0xad40, 0xad41, 0xad42, 0xad43, 0xad46, 0xad48, 0xad4a, 0xad4b, 0xad4c, 0xad4d, 0xad4e, 0xad4f, 0xad51, 0xad52, 0xad53, 0xad55, 0xad56, 0xad57, 0xad59, 0xad5a, 0xad5b, 0xad5c, 0xad5d, 0xad5e, 0xad5f, 0xad60, 0xad62, 0xad64, 0xad65, 0xad66, 0xad67, 0xad68, 0xad69, 0xad6a, 0xad6b, 0xad6e, 0xad6f, 0xad71, 0xad72, 0xad77, 0xad78, 0xad79, 0xad7a, 0xad7e, 0xad80, 0xad83, 0xad84, 0xad85, 0xad86, 0xad87, 0xad8a, 0xad8b, 0xad8d, 0xad8e, 0xad8f, 0xad91, 0xad92, 0xad93, 0xad94, 0xad95, 0xad96, 0xad97, 0xad98, 0xad99, 0xad9a, 0xad9b, 0xad9e, 0xad9f, 0xada0, 0xada1, 0xada2, 0xada3, 0xada5, 0xada6, 0xada7, 0xada8, 0xada9, 0xadaa, 0xadab, 0xadac, 0xadad, 0xadae, 0xadaf, 0xadb0, 0xadb1, 0xadb2, 0xadb3, 0xadb4, 0xadb5, 0xadb6, 0xadb8, 0xadb9, 0xadba, 0xadbb, 0xadbc, 0xadbd, 0xadbe, 0xadbf, 0xadc2, 0xadc3, 0xadc5, 0xadc6, 0xadc7, 0xadc9, 0xadca, 0xadcb, 0xadcc, 0xadcd, 0xadce, 0xadcf, 0xadd2, 0xadd4, 0xadd5, 0xadd6, 0xadd7, 0xadd8, 0xadd9, 0xadda, 0xaddb, 0xaddd, 0xadde, 0xaddf, 0xade1, 0xade2, 0xade3, 0xade5, 0xade6, 0xade7, 0xade8, 0xade9, 0xadea, 0xadeb, 0xadec, 0xaded, 0xadee, 0xadef, 0xadf0, 0xadf1, 0xadf2, 0xadf3, 0xadf4, 0xadf5, 0xadf6, 0xadf7, 0xadfa, 0xadfb, 0xadfd, 0xadfe, 0xae02, 0xae03, 0xae04, 0xae05, 0xae06, 0xae07, 0xae0a, 0xae0c, 0xae0e, 0xae0f, 0xae10, 0xae11, 0xae12, 0xae13, 0xae15, 0xae16, 0xae17, 0xae18, 0xae19, 0xae1a, 0xae1b, 0xae1c, 0xae1d, 0xae1e, 0xae1f, 0xae20, 0xae21, 0xae22, 0xae23, 0xae24, 0xae25, 0xae26, 0xae27, 0xae28, 0xae29, 0xae2a, 0xae2b, 0xae2c, 0xae2d, 0xae2e, 0xae2f, 0xae32, 0xae33, 0xae35, 0xae36, 0xae39, 0xae3b, 0xae3c, 0xae3d, 0xae3e, 0xae3f, 0xae42, 0xae44, 0xae47, 0xae48, 0xae49, 0xae4b, 0xae4f, 0xae51, 0xae52, 0xae53, 0xae55, 0xae57, 0xae58, 0xae59, 0xae5a, 0xae5b, 0xae5e, 0xae62, 0xae63, 0xae64, 0xae66, 0xae67, 0xae6a, 0xae6b, 0xae6d, 0xae6e, 0xae6f, 0xae71, 0xae72, 0xae73, 0xae74, 0xae75, 0xae76, 0xae77, 0xae7a, 0xae7e, 0xae7f, 0xae80, 0xae81, 0xae82, 0xae83, 0xae86, 0xae87, 0xae88, 0xae89, 0xae8a, 0xae8b, 0xae8d, 0xae8e, 0xae8f, 0xae90, 0xae91, 0xae92, 0xae93, 0xae94, 0xae95, 0xae96, 0xae97, 0xae98, 0xae99, 0xae9a, 0xae9b, 0xae9c, 0xae9d, 0xae9e, 0xae9f, 0xaea0, 0xaea1, 0xaea2, 0xaea3, 0xaea4, 0xaea5, 0xaea6, 0xaea7, 0xaea8, 0xaea9, 0xaeaa, 0xaeab, 0xaeac, 0xaead, 0xaeae, 0xaeaf, 0xaeb0, 0xaeb1, 0xaeb2, 0xaeb3, 0xaeb4, 0xaeb5, 0xaeb6, 0xaeb7, 0xaeb8, 0xaeb9, 0xaeba, 0xaebb, 0xaebf, 0xaec1, 0xaec2, 0xaec3, 0xaec5, 0xaec6, 0xaec7, 0xaec8, 0xaec9, 0xaeca, 0xaecb, 0xaece, 0xaed2, 0xaed3, 0xaed4, 0xaed5, 0xaed6, 0xaed7, 0xaeda, 0xaedb, 0xaedd, 0xaede, 0xaedf, 0xaee0, 0xaee1, 0xaee2, 0xaee3, 0xaee4, 0xaee5, 0xaee6, 0xaee7, 0xaee9, 0xaeea, 0xaeec, 0xaeee, 0xaeef, 0xaef0, 0xaef1, 0xaef2, 0xaef3, 0xaef5, 0xaef6, 0xaef7, 0xaef9, 0xaefa, 0xaefb, 0xaefd, 0xaefe, 0xaeff, 0xaf00, 0xaf01, 0xaf02, 0xaf03, 0xaf04, 0xaf05, 0xaf06, 0xaf09, 0xaf0a, 0xaf0b, 0xaf0c, 0xaf0e, 0xaf0f, 0xaf11, 0xaf12, 0xaf13, 0xaf14, 0xaf15, 0xaf16, 0xaf17, 0xaf18, 0xaf19, 0xaf1a, 0xaf1b, 0xaf1c, 0xaf1d, 0xaf1e, 0xaf1f, 0xaf20, 0xaf21, 0xaf22, 0xaf23, 0xaf24, 0xaf25, 0xaf26, 0xaf27, 0xaf28, 0xaf29, 0xaf2a, 0xaf2b, 0xaf2e, 0xaf2f, 0xaf31, 0xaf33, 0xaf35, 0xaf36, 0xaf37, 0xaf38, 0xaf39, 0xaf3a, 0xaf3b, 0xaf3e, 0xaf40, 0xaf44, 0xaf45, 0xaf46, 0xaf47, 0xaf4a, 0xaf4b, 0xaf4c, 0xaf4d, 0xaf4e, 0xaf4f, 0xaf51, 0xaf52, 0xaf53, 0xaf54, 0xaf55, 0xaf56, 0xaf57, 0xaf58, 0xaf59, 0xaf5a, 0xaf5b, 0xaf5e, 0xaf5f, 0xaf60, 0xaf61, 0xaf62, 0xaf63, 0xaf66, 0xaf67, 0xaf68, 0xaf69, 0xaf6a, 0xaf6b, 0xaf6c, 0xaf6d, 0xaf6e, 0xaf6f, 0xaf70, 0xaf71, 0xaf72, 0xaf73, 0xaf74, 0xaf75, 0xaf76, 0xaf77, 0xaf78, 0xaf7a, 0xaf7b, 0xaf7c, 0xaf7d, 0xaf7e, 0xaf7f, 0xaf81, 0xaf82, 0xaf83, 0xaf85, 0xaf86, 0xaf87, 0xaf89, 0xaf8a, 0xaf8b, 0xaf8c, 0xaf8d, 0xaf8e, 0xaf8f, 0xaf92, 0xaf93, 0xaf94, 0xaf96, 0xaf97, 0xaf98, 0xaf99, 0xaf9a, 0xaf9b, 0xaf9d, 0xaf9e, 0xaf9f, 0xafa0, 0xafa1, 0xafa2, 0xafa3, 0xafa4, 0xafa5, 0xafa6, 0xafa7, 0xafa8, 0xafa9, 0xafaa, 0xafab, 0xafac, 0xafad, 0xafae, 0xafaf, 0xafb0, 0xafb1, 0xafb2, 0xafb3, 0xafb4, 0xafb5, 0xafb6, 0xafb7, 0xafba, 0xafbb, 0xafbd, 0xafbe, 0xafbf, 0xafc1, 0xafc2, 0xafc3, 0xafc4, 0xafc5, 0xafc6, 0xafca, 0xafcc, 0xafcf, 0xafd0, 0xafd1, 0xafd2, 0xafd3, 0xafd5, 0xafd6, 0xafd7, 0xafd8, 0xafd9, 0xafda, 0xafdb, 0xafdd, 0xafde, 0xafdf, 0xafe0, 0xafe1, 0xafe2, 0xafe3, 0xafe4, 0xafe5, 0xafe6, 0xafe7, 0xafea, 0xafeb, 0xafec, 0xafed, 0xafee, 0xafef, 0xaff2, 0xaff3, 0xaff5, 0xaff6, 0xaff7, 0xaff9, 0xaffa, 0xaffb, 0xaffc, 0xaffd, 0xaffe, 0xafff, 0xb002, 0xb003, 0xb005, 0xb006, 0xb007, 0xb008, 0xb009, 0xb00a, 0xb00b, 0xb00d, 0xb00e, 0xb00f, 0xb011, 0xb012, 0xb013, 0xb015, 0xb016, 0xb017, 0xb018, 0xb019, 0xb01a, 0xb01b, 0xb01e, 0xb01f, 0xb020, 0xb021, 0xb022, 0xb023, 0xb024, 0xb025, 0xb026, 0xb027, 0xb029, 0xb02a, 0xb02b, 0xb02c, 0xb02d, 0xb02e, 0xb02f, 0xb030, 0xb031, 0xb032, 0xb033, 0xb034, 0xb035, 0xb036, 0xb037, 0xb038, 0xb039, 0xb03a, 0xb03b, 0xb03c, 0xb03d, 0xb03e, 0xb03f, 0xb040, 0xb041, 0xb042, 0xb043, 0xb046, 0xb047, 0xb049, 0xb04b, 0xb04d, 0xb04f, 0xb050, 0xb051, 0xb052, 0xb056, 0xb058, 0xb05a, 0xb05b, 0xb05c, 0xb05e, 0xb05f, 0xb060, 0xb061, 0xb062, 0xb063, 0xb064, 0xb065, 0xb066, 0xb067, 0xb068, 0xb069, 0xb06a, 0xb06b, 0xb06c, 0xb06d, 0xb06e, 0xb06f, 0xb070, 0xb071, 0xb072, 0xb073, 0xb074, 0xb075, 0xb076, 0xb077, 0xb078, 0xb079, 0xb07a, 0xb07b, 0xb07e, 0xb07f, 0xb081, 0xb082, 0xb083, 0xb085, 0xb086, 0xb087, 0xb088, 0xb089, 0xb08a, 0xb08b, 0xb08e, 0xb090, 0xb092, 0xb093, 0xb094, 0xb095, 0xb096, 0xb097, 0xb09b, 0xb09d, 0xb09e, 0xb0a3, 0xb0a4, 0xb0a5, 0xb0a6, 0xb0a7, 0xb0aa, 0xb0b0, 0xb0b2, 0xb0b6, 0xb0b7, 0xb0b9, 0xb0ba, 0xb0bb, 0xb0bd, 0xb0be, 0xb0bf, 0xb0c0, 0xb0c1, 0xb0c2, 0xb0c3, 0xb0c6, 0xb0ca, 0xb0cb, 0xb0cc, 0xb0cd, 0xb0ce, 0xb0cf, 0xb0d2, 0xb0d3, 0xb0d5, 0xb0d6, 0xb0d7, 0xb0d9, 0xb0da, 0xb0db, 0xb0dc, 0xb0dd, 0xb0de, 0xb0df, 0xb0e1, 0xb0e2, 0xb0e3, 0xb0e4, 0xb0e6, 0xb0e7, 0xb0e8, 0xb0e9, 0xb0ea, 0xb0eb, 0xb0ec, 0xb0ed, 0xb0ee, 0xb0ef, 0xb0f0, 0xb0f1, 0xb0f2, 0xb0f3, 0xb0f4, 0xb0f5, 0xb0f6, 0xb0f7, 0xb0f8, 0xb0f9, 0xb0fa, 0xb0fb, 0xb0fc, 0xb0fd, 0xb0fe, 0xb0ff, 0xb100, 0xb101, 0xb102, 0xb103, 0xb104, 0xb105, 0xb106, 0xb107, 0xb10a, 0xb10d, 0xb10e, 0xb10f, 0xb111, 0xb114, 0xb115, 0xb116, 0xb117, 0xb11a, 0xb11e, 0xb11f, 0xb120, 0xb121, 0xb122, 0xb126, 0xb127, 0xb129, 0xb12a, 0xb12b, 0xb12d, 0xb12e, 0xb12f, 0xb130, 0xb131, 0xb132, 0xb133, 0xb136, 0xb13a, 0xb13b, 0xb13c, 0xb13d, 0xb13e, 0xb13f, 0xb142, 0xb143, 0xb145, 0xb146, 0xb147, 0xb149, 0xb14a, 0xb14b, 0xb14c, 0xb14d, 0xb14e, 0xb14f, 0xb152, 0xb153, 0xb156, 0xb157, 0xb159, 0xb15a, 0xb15b, 0xb15d, 0xb15e, 0xb15f, 0xb161, 0xb162, 0xb163, 0xb164, 0xb165, 0xb166, 0xb167, 0xb168, 0xb169, 0xb16a, 0xb16b, 0xb16c, 0xb16d, 0xb16e, 0xb16f, 0xb170, 0xb171, 0xb172, 0xb173, 0xb174, 0xb175, 0xb176, 0xb177, 0xb17a, 0xb17b, 0xb17d, 0xb17e, 0xb17f, 0xb181, 0xb183, 0xb184, 0xb185, 0xb186, 0xb187, 0xb18a, 0xb18c, 0xb18e, 0xb18f, 0xb190, 0xb191, 0xb195, 0xb196, 0xb197, 0xb199, 0xb19a, 0xb19b, 0xb19d, 0xb19e, 0xb19f, 0xb1a0, 0xb1a1, 0xb1a2, 0xb1a3, 0xb1a4, 0xb1a5, 0xb1a6, 0xb1a7, 0xb1a9, 0xb1aa, 0xb1ab, 0xb1ac, 0xb1ad, 0xb1ae, 0xb1af, 0xb1b0, 0xb1b1, 0xb1b2, 0xb1b3, 0xb1b4, 0xb1b5, 0xb1b6, 0xb1b7, 0xb1b8, 0xb1b9, 0xb1ba, 0xb1bb, 0xb1bc, 0xb1bd, 0xb1be, 0xb1bf, 0xb1c0, 0xb1c1, 0xb1c2, 0xb1c3, 0xb1c4, 0xb1c5, 0xb1c6, 0xb1c7, 0xb1c8, 0xb1c9, 0xb1ca, 0xb1cb, 0xb1cd, 0xb1ce, 0xb1cf, 0xb1d1, 0xb1d2, 0xb1d3, 0xb1d5, 0xb1d6, 0xb1d7, 0xb1d8, 0xb1d9, 0xb1da, 0xb1db, 0xb1de, 0xb1e0, 0xb1e1, 0xb1e2, 0xb1e3, 0xb1e4, 0xb1e5, 0xb1e6, 0xb1e7, 0xb1ea, 0xb1eb, 0xb1ed, 0xb1ee, 0xb1ef, 0xb1f1, 0xb1f2, 0xb1f3, 0xb1f4, 0xb1f5, 0xb1f6, 0xb1f7, 0xb1f8, 0xb1fa, 0xb1fc, 0xb1fe, 0xb1ff, 0xb200, 0xb201, 0xb202, 0xb203, 0xb206, 0xb207, 0xb209, 0xb20a, 0xb20d, 0xb20e, 0xb20f, 0xb210, 0xb211, 0xb212, 0xb213, 0xb216, 0xb218, 0xb21a, 0xb21b, 0xb21c, 0xb21d, 0xb21e, 0xb21f, 0xb221, 0xb222, 0xb223, 0xb224, 0xb225, 0xb226, 0xb227, 0xb228, 0xb229, 0xb22a, 0xb22b, 0xb22c, 0xb22d, 0xb22e, 0xb22f, 0xb230, 0xb231, 0xb232, 0xb233, 0xb235, 0xb236, 0xb237, 0xb238, 0xb239, 0xb23a, 0xb23b, 0xb23d, 0xb23e, 0xb23f, 0xb240, 0xb241, 0xb242, 0xb243, 0xb244, 0xb245, 0xb246, 0xb247, 0xb248, 0xb249, 0xb24a, 0xb24b, 0xb24c, 0xb24d, 0xb24e, 0xb24f, 0xb250, 0xb251, 0xb252, 0xb253, 0xb254, 0xb255, 0xb256, 0xb257, 0xb259, 0xb25a, 0xb25b, 0xb25d, 0xb25e, 0xb25f, 0xb261, 0xb262, 0xb263, 0xb264, 0xb265, 0xb266, 0xb267, 0xb26a, 0xb26b, 0xb26c, 0xb26d, 0xb26e, 0xb26f, 0xb270, 0xb271, 0xb272, 0xb273, 0xb276, 0xb277, 0xb278, 0xb279, 0xb27a, 0xb27b, 0xb27d, 0xb27e, 0xb27f, 0xb280, 0xb281, 0xb282, 0xb283, 0xb286, 0xb287, 0xb288, 0xb28a, 0xb28b, 0xb28c, 0xb28d, 0xb28e, 0xb28f, 0xb292, 0xb293, 0xb295, 0xb296, 0xb297, 0xb29b, 0xb29c, 0xb29d, 0xb29e, 0xb29f, 0xb2a2, 0xb2a4, 0xb2a7, 0xb2a8, 0xb2a9, 0xb2ab, 0xb2ad, 0xb2ae, 0xb2af, 0xb2b1, 0xb2b2, 0xb2b3, 0xb2b5, 0xb2b6, 0xb2b7, 0xb2b8, 0xb2b9, 0xb2ba, 0xb2bb, 0xb2bc, 0xb2bd, 0xb2be, 0xb2bf, 0xb2c0, 0xb2c1, 0xb2c2, 0xb2c3, 0xb2c4, 0xb2c5, 0xb2c6, 0xb2c7, 0xb2ca, 0xb2cb, 0xb2cd, 0xb2ce, 0xb2cf, 0xb2d1, 0xb2d3, 0xb2d4, 0xb2d5, 0xb2d6, 0xb2d7, 0xb2da, 0xb2dc, 0xb2de, 0xb2df, 0xb2e0, 0xb2e1, 0xb2e3, 0xb2e7, 0xb2e9, 0xb2ea, 0xb2f0, 0xb2f1, 0xb2f2, 0xb2f6, 0xb2fc, 0xb2fd, 0xb2fe, 0xb302, 0xb303, 0xb305, 0xb306, 0xb307, 0xb309, 0xb30a, 0xb30b, 0xb30c, 0xb30d, 0xb30e, 0xb30f, 0xb312, 0xb316, 0xb317, 0xb318, 0xb319, 0xb31a, 0xb31b, 0xb31d, 0xb31e, 0xb31f, 0xb320, 0xb321, 0xb322, 0xb323, 0xb324, 0xb325, 0xb326, 0xb327, 0xb328, 0xb329, 0xb32a, 0xb32b, 0xb32c, 0xb32d, 0xb32e, 0xb32f, 0xb330, 0xb331, 0xb332, 0xb333, 0xb334, 0xb335, 0xb336, 0xb337, 0xb338, 0xb339, 0xb33a, 0xb33b, 0xb33c, 0xb33d, 0xb33e, 0xb33f, 0xb340, 0xb341, 0xb342, 0xb343, 0xb344, 0xb345, 0xb346, 0xb347, 0xb348, 0xb349, 0xb34a, 0xb34b, 0xb34c, 0xb34d, 0xb34e, 0xb34f, 0xb350, 0xb351, 0xb352, 0xb353, 0xb357, 0xb359, 0xb35a, 0xb35d, 0xb360, 0xb361, 0xb362, 0xb363, 0xb366, 0xb368, 0xb36a, 0xb36c, 0xb36d, 0xb36f, 0xb372, 0xb373, 0xb375, 0xb376, 0xb377, 0xb379, 0xb37a, 0xb37b, 0xb37c, 0xb37d, 0xb37e, 0xb37f, 0xb382, 0xb386, 0xb387, 0xb388, 0xb389, 0xb38a, 0xb38b, 0xb38d, 0xb38e, 0xb38f, 0xb391, 0xb392, 0xb393, 0xb395, 0xb396, 0xb397, 0xb398, 0xb399, 0xb39a, 0xb39b, 0xb39c, 0xb39d, 0xb39e, 0xb39f, 0xb3a2, 0xb3a3, 0xb3a4, 0xb3a5, 0xb3a6, 0xb3a7, 0xb3a9, 0xb3aa, 0xb3ab, 0xb3ad, 0xb3ae, 0xb3af, 0xb3b0, 0xb3b1, 0xb3b2, 0xb3b3, 0xb3b4, 0xb3b5, 0xb3b6, 0xb3b7, 0xb3b8, 0xb3b9, 0xb3ba, 0xb3bb, 0xb3bc, 0xb3bd, 0xb3be, 0xb3bf, 0xb3c0, 0xb3c1, 0xb3c2, 0xb3c3, 0xb3c6, 0xb3c7, 0xb3c9, 0xb3ca, 0xb3cd, 0xb3cf, 0xb3d1, 0xb3d2, 0xb3d3, 0xb3d6, 0xb3d8, 0xb3da, 0xb3dc, 0xb3de, 0xb3df, 0xb3e1, 0xb3e2, 0xb3e3, 0xb3e5, 0xb3e6, 0xb3e7, 0xb3e9, 0xb3ea, 0xb3eb, 0xb3ec, 0xb3ed, 0xb3ee, 0xb3ef, 0xb3f0, 0xb3f1, 0xb3f2, 0xb3f3, 0xb3f4, 0xb3f5, 0xb3f6, 0xb3f7, 0xb3f8, 0xb3f9, 0xb3fa, 0xb3fb, 0xb3fd, 0xb3fe, 0xb3ff, 0xb400, 0xb401, 0xb402, 0xb403, 0xb404, 0xb405, 0xb406, 0xb407, 0xb408, 0xb409, 0xb40a, 0xb40b, 0xb40c, 0xb40d, 0xb40e, 0xb40f, 0xb411, 0xb412, 0xb413, 0xb414, 0xb415, 0xb416, 0xb417, 0xb419, 0xb41a, 0xb41b, 0xb41d, 0xb41e, 0xb41f, 0xb421, 0xb422, 0xb423, 0xb424, 0xb425, 0xb426, 0xb427, 0xb42a, 0xb42c, 0xb42d, 0xb42e, 0xb42f, 0xb430, 0xb431, 0xb432, 0xb433, 0xb435, 0xb436, 0xb437, 0xb438, 0xb439, 0xb43a, 0xb43b, 0xb43c, 0xb43d, 0xb43e, 0xb43f, 0xb440, 0xb441, 0xb442, 0xb443, 0xb444, 0xb445, 0xb446, 0xb447, 0xb448, 0xb449, 0xb44a, 0xb44b, 0xb44c, 0xb44d, 0xb44e, 0xb44f, 0xb452, 0xb453, 0xb455, 0xb456, 0xb457, 0xb459, 0xb45a, 0xb45b, 0xb45c, 0xb45d, 0xb45e, 0xb45f, 0xb462, 0xb464, 0xb466, 0xb467, 0xb468, 0xb469, 0xb46a, 0xb46b, 0xb46d, 0xb46e, 0xb46f, 0xb470, 0xb471, 0xb472, 0xb473, 0xb474, 0xb475, 0xb476, 0xb477, 0xb478, 0xb479, 0xb47a, 0xb47b, 0xb47c, 0xb47d, 0xb47e, 0xb47f, 0xb481, 0xb482, 0xb483, 0xb484, 0xb485, 0xb486, 0xb487, 0xb489, 0xb48a, 0xb48b, 0xb48c, 0xb48d, 0xb48e, 0xb48f, 0xb490, 0xb491, 0xb492, 0xb493, 0xb494, 0xb495, 0xb496, 0xb497, 0xb498, 0xb499, 0xb49a, 0xb49b, 0xb49c, 0xb49e, 0xb49f, 0xb4a0, 0xb4a1, 0xb4a2, 0xb4a3, 0xb4a5, 0xb4a6, 0xb4a7, 0xb4a9, 0xb4aa, 0xb4ab, 0xb4ad, 0xb4ae, 0xb4af, 0xb4b0, 0xb4b1, 0xb4b2, 0xb4b3, 0xb4b4, 0xb4b6, 0xb4b8, 0xb4ba, 0xb4bb, 0xb4bc, 0xb4bd, 0xb4be, 0xb4bf, 0xb4c1, 0xb4c2, 0xb4c3, 0xb4c5, 0xb4c6, 0xb4c7, 0xb4c9, 0xb4ca, 0xb4cb, 0xb4cc, 0xb4cd, 0xb4ce, 0xb4cf, 0xb4d1, 0xb4d2, 0xb4d3, 0xb4d4, 0xb4d6, 0xb4d7, 0xb4d8, 0xb4d9, 0xb4da, 0xb4db, 0xb4de, 0xb4df, 0xb4e1, 0xb4e2, 0xb4e5, 0xb4e7, 0xb4e8, 0xb4e9, 0xb4ea, 0xb4eb, 0xb4ee, 0xb4f0, 0xb4f2, 0xb4f3, 0xb4f4, 0xb4f5, 0xb4f6, 0xb4f7, 0xb4f9, 0xb4fa, 0xb4fb, 0xb4fc, 0xb4fd, 0xb4fe, 0xb4ff, 0xb500, 0xb501, 0xb502, 0xb503, 0xb504, 0xb505, 0xb506, 0xb507, 0xb508, 0xb509, 0xb50a, 0xb50b, 0xb50c, 0xb50d, 0xb50e, 0xb50f, 0xb510, 0xb511, 0xb512, 0xb513, 0xb516, 0xb517, 0xb519, 0xb51a, 0xb51d, 0xb51e, 0xb51f, 0xb520, 0xb521, 0xb522, 0xb523, 0xb526, 0xb52b, 0xb52c, 0xb52d, 0xb52e, 0xb52f, 0xb532, 0xb533, 0xb535, 0xb536, 0xb537, 0xb539, 0xb53a, 0xb53b, 0xb53c, 0xb53d, 0xb53e, 0xb53f, 0xb542, 0xb546, 0xb547, 0xb548, 0xb549, 0xb54a, 0xb54e, 0xb54f, 0xb551, 0xb552, 0xb553, 0xb555, 0xb556, 0xb557, 0xb558, 0xb559, 0xb55a, 0xb55b, 0xb55e, 0xb562, 0xb563, 0xb564, 0xb565, 0xb566, 0xb567, 0xb568, 0xb569, 0xb56a, 0xb56b, 0xb56c, 0xb56d, 0xb56e, 0xb56f, 0xb570, 0xb571, 0xb572, 0xb573, 0xb574, 0xb575, 0xb576, 0xb577, 0xb578, 0xb579, 0xb57a, 0xb57b, 0xb57c, 0xb57d, 0xb57e, 0xb57f, 0xb580, 0xb581, 0xb582, 0xb583, 0xb584, 0xb585, 0xb586, 0xb587, 0xb588, 0xb589, 0xb58a, 0xb58b, 0xb58c, 0xb58d, 0xb58e, 0xb58f, 0xb590, 0xb591, 0xb592, 0xb593, 0xb594, 0xb595, 0xb596, 0xb597, 0xb598, 0xb599, 0xb59a, 0xb59b, 0xb59c, 0xb59d, 0xb59e, 0xb59f, 0xb5a2, 0xb5a3, 0xb5a5, 0xb5a6, 0xb5a7, 0xb5a9, 0xb5ac, 0xb5ad, 0xb5ae, 0xb5af, 0xb5b2, 0xb5b6, 0xb5b7, 0xb5b8, 0xb5b9, 0xb5ba, 0xb5be, 0xb5bf, 0xb5c1, 0xb5c2, 0xb5c3, 0xb5c5, 0xb5c6, 0xb5c7, 0xb5c8, 0xb5c9, 0xb5ca, 0xb5cb, 0xb5ce, 0xb5d2, 0xb5d3, 0xb5d4, 0xb5d5, 0xb5d6, 0xb5d7, 0xb5d9, 0xb5da, 0xb5db, 0xb5dc, 0xb5dd, 0xb5de, 0xb5df, 0xb5e0, 0xb5e1, 0xb5e2, 0xb5e3, 0xb5e4, 0xb5e5, 0xb5e6, 0xb5e7, 0xb5e8, 0xb5e9, 0xb5ea, 0xb5eb, 0xb5ed, 0xb5ee, 0xb5ef, 0xb5f0, 0xb5f1, 0xb5f2, 0xb5f3, 0xb5f4, 0xb5f5, 0xb5f6, 0xb5f7, 0xb5f8, 0xb5f9, 0xb5fa, 0xb5fb, 0xb5fc, 0xb5fd, 0xb5fe, 0xb5ff, 0xb600, 0xb601, 0xb602, 0xb603, 0xb604, 0xb605, 0xb606, 0xb607, 0xb608, 0xb609, 0xb60a, 0xb60b, 0xb60c, 0xb60d, 0xb60e, 0xb60f, 0xb612, 0xb613, 0xb615, 0xb616, 0xb617, 0xb619, 0xb61a, 0xb61b, 0xb61c, 0xb61d, 0xb61e, 0xb61f, 0xb620, 0xb621, 0xb622, 0xb623, 0xb624, 0xb626, 0xb627, 0xb628, 0xb629, 0xb62a, 0xb62b, 0xb62d, 0xb62e, 0xb62f, 0xb630, 0xb631, 0xb632, 0xb633, 0xb635, 0xb636, 0xb637, 0xb638, 0xb639, 0xb63a, 0xb63b, 0xb63c, 0xb63d, 0xb63e, 0xb63f, 0xb640, 0xb641, 0xb642, 0xb643, 0xb644, 0xb645, 0xb646, 0xb647, 0xb649, 0xb64a, 0xb64b, 0xb64c, 0xb64d, 0xb64e, 0xb64f, 0xb650, 0xb651, 0xb652, 0xb653, 0xb654, 0xb655, 0xb656, 0xb657, 0xb658, 0xb659, 0xb65a, 0xb65b, 0xb65c, 0xb65d, 0xb65e, 0xb65f, 0xb660, 0xb661, 0xb662, 0xb663, 0xb665, 0xb666, 0xb667, 0xb669, 0xb66a, 0xb66b, 0xb66c, 0xb66d, 0xb66e, 0xb66f, 0xb670, 0xb671, 0xb672, 0xb673, 0xb674, 0xb675, 0xb676, 0xb677, 0xb678, 0xb679, 0xb67a, 0xb67b, 0xb67c, 0xb67d, 0xb67e, 0xb67f, 0xb680, 0xb681, 0xb682, 0xb683, 0xb684, 0xb685, 0xb686, 0xb687, 0xb688, 0xb689, 0xb68a, 0xb68b, 0xb68c, 0xb68d, 0xb68e, 0xb68f, 0xb690, 0xb691, 0xb692, 0xb693, 0xb694, 0xb695, 0xb696, 0xb697, 0xb698, 0xb699, 0xb69a, 0xb69b, 0xb69e, 0xb69f, 0xb6a1, 0xb6a2, 0xb6a3, 0xb6a5, 0xb6a6, 0xb6a7, 0xb6a8, 0xb6a9, 0xb6aa, 0xb6ad, 0xb6ae, 0xb6af, 0xb6b0, 0xb6b2, 0xb6b3, 0xb6b4, 0xb6b5, 0xb6b6, 0xb6b7, 0xb6b8, 0xb6b9, 0xb6ba, 0xb6bb, 0xb6bc, 0xb6bd, 0xb6be, 0xb6bf, 0xb6c0, 0xb6c1, 0xb6c2, 0xb6c3, 0xb6c4, 0xb6c5, 0xb6c6, 0xb6c7, 0xb6c8, 0xb6c9, 0xb6ca, 0xb6cb, 0xb6cc, 0xb6cd, 0xb6ce, 0xb6cf, 0xb6d0, 0xb6d1, 0xb6d2, 0xb6d3, 0xb6d5, 0xb6d6, 0xb6d7, 0xb6d8, 0xb6d9, 0xb6da, 0xb6db, 0xb6dc, 0xb6dd, 0xb6de, 0xb6df, 0xb6e0, 0xb6e1, 0xb6e2, 0xb6e3, 0xb6e4, 0xb6e5, 0xb6e6, 0xb6e7, 0xb6e8, 0xb6e9, 0xb6ea, 0xb6eb, 0xb6ec, 0xb6ed, 0xb6ee, 0xb6ef, 0xb6f1, 0xb6f2, 0xb6f3, 0xb6f5, 0xb6f6, 0xb6f7, 0xb6f9, 0xb6fa, 0xb6fb, 0xb6fc, 0xb6fd, 0xb6fe, 0xb6ff, 0xb702, 0xb703, 0xb704, 0xb706, 0xb707, 0xb708, 0xb709, 0xb70a, 0xb70b, 0xb70c, 0xb70d, 0xb70e, 0xb70f, 0xb710, 0xb711, 0xb712, 0xb713, 0xb714, 0xb715, 0xb716, 0xb717, 0xb718, 0xb719, 0xb71a, 0xb71b, 0xb71c, 0xb71d, 0xb71e, 0xb71f, 0xb720, 0xb721, 0xb722, 0xb723, 0xb724, 0xb725, 0xb726, 0xb727, 0xb72a, 0xb72b, 0xb72d, 0xb72e, 0xb731, 0xb732, 0xb733, 0xb734, 0xb735, 0xb736, 0xb737, 0xb73a, 0xb73c, 0xb73d, 0xb73e, 0xb73f, 0xb740, 0xb741, 0xb742, 0xb743, 0xb745, 0xb746, 0xb747, 0xb749, 0xb74a, 0xb74b, 0xb74d, 0xb74e, 0xb74f, 0xb750, 0xb751, 0xb752, 0xb753, 0xb756, 0xb757, 0xb758, 0xb759, 0xb75a, 0xb75b, 0xb75c, 0xb75d, 0xb75e, 0xb75f, 0xb761, 0xb762, 0xb763, 0xb765, 0xb766, 0xb767, 0xb769, 0xb76a, 0xb76b, 0xb76c, 0xb76d, 0xb76e, 0xb76f, 0xb772, 0xb774, 0xb776, 0xb777, 0xb778, 0xb779, 0xb77a, 0xb77b, 0xb77e, 0xb77f, 0xb781, 0xb782, 0xb783, 0xb785, 0xb786, 0xb787, 0xb788, 0xb789, 0xb78a, 0xb78b, 0xb78e, 0xb793, 0xb794, 0xb795, 0xb79a, 0xb79b, 0xb79d, 0xb79e, 0xb79f, 0xb7a1, 0xb7a2, 0xb7a3, 0xb7a4, 0xb7a5, 0xb7a6, 0xb7a7, 0xb7aa, 0xb7ae, 0xb7af, 0xb7b0, 0xb7b1, 0xb7b2, 0xb7b3, 0xb7b6, 0xb7b7, 0xb7b9, 0xb7ba, 0xb7bb, 0xb7bc, 0xb7bd, 0xb7be, 0xb7bf, 0xb7c0, 0xb7c1, 0xb7c2, 0xb7c3, 0xb7c4, 0xb7c5, 0xb7c6, 0xb7c8, 0xb7ca, 0xb7cb, 0xb7cc, 0xb7cd, 0xb7ce, 0xb7cf, 0xb7d0, 0xb7d1, 0xb7d2, 0xb7d3, 0xb7d4, 0xb7d5, 0xb7d6, 0xb7d7, 0xb7d8, 0xb7d9, 0xb7da, 0xb7db, 0xb7dc, 0xb7dd, 0xb7de, 0xb7df, 0xb7e0, 0xb7e1, 0xb7e2, 0xb7e3, 0xb7e4, 0xb7e5, 0xb7e6, 0xb7e7, 0xb7e8, 0xb7e9, 0xb7ea, 0xb7eb, 0xb7ee, 0xb7ef, 0xb7f1, 0xb7f2, 0xb7f3, 0xb7f5, 0xb7f6, 0xb7f7, 0xb7f8, 0xb7f9, 0xb7fa, 0xb7fb, 0xb7fe, 0xb802, 0xb803, 0xb804, 0xb805, 0xb806, 0xb80a, 0xb80b, 0xb80d, 0xb80e, 0xb80f, 0xb811, 0xb812, 0xb813, 0xb814, 0xb815, 0xb816, 0xb817, 0xb81a, 0xb81c, 0xb81e, 0xb81f, 0xb820, 0xb821, 0xb822, 0xb823, 0xb826, 0xb827, 0xb829, 0xb82a, 0xb82b, 0xb82d, 0xb82e, 0xb82f, 0xb830, 0xb831, 0xb832, 0xb833, 0xb836, 0xb83a, 0xb83b, 0xb83c, 0xb83d, 0xb83e, 0xb83f, 0xb841, 0xb842, 0xb843, 0xb845, 0xb846, 0xb847, 0xb848, 0xb849, 0xb84a, 0xb84b, 0xb84c, 0xb84d, 0xb84e, 0xb84f, 0xb850, 0xb852, 0xb854, 0xb855, 0xb856, 0xb857, 0xb858, 0xb859, 0xb85a, 0xb85b, 0xb85e, 0xb85f, 0xb861, 0xb862, 0xb863, 0xb865, 0xb866, 0xb867, 0xb868, 0xb869, 0xb86a, 0xb86b, 0xb86e, 0xb870, 0xb872, 0xb873, 0xb874, 0xb875, 0xb876, 0xb877, 0xb879, 0xb87a, 0xb87b, 0xb87d, 0xb87e, 0xb87f, 0xb880, 0xb881, 0xb882, 0xb883, 0xb884, 0xb885, 0xb886, 0xb887, 0xb888, 0xb889, 0xb88a, 0xb88b, 0xb88c, 0xb88e, 0xb88f, 0xb890, 0xb891, 0xb892, 0xb893, 0xb894, 0xb895, 0xb896, 0xb897, 0xb898, 0xb899, 0xb89a, 0xb89b, 0xb89c, 0xb89d, 0xb89e, 0xb89f, 0xb8a0, 0xb8a1, 0xb8a2, 0xb8a3, 0xb8a4, 0xb8a5, 0xb8a6, 0xb8a7, 0xb8a9, 0xb8aa, 0xb8ab, 0xb8ac, 0xb8ad, 0xb8ae, 0xb8af, 0xb8b1, 0xb8b2, 0xb8b3, 0xb8b5, 0xb8b6, 0xb8b7, 0xb8b9, 0xb8ba, 0xb8bb, 0xb8bc, 0xb8bd, 0xb8be, 0xb8bf, 0xb8c2, 0xb8c4, 0xb8c6, 0xb8c7, 0xb8c8, 0xb8c9, 0xb8ca, 0xb8cb, 0xb8cd, 0xb8ce, 0xb8cf, 0xb8d1, 0xb8d2, 0xb8d3, 0xb8d5, 0xb8d6, 0xb8d7, 0xb8d8, 0xb8d9, 0xb8da, 0xb8db, 0xb8dc, 0xb8de, 0xb8e0, 0xb8e2, 0xb8e3, 0xb8e4, 0xb8e5, 0xb8e6, 0xb8e7, 0xb8ea, 0xb8eb, 0xb8ed, 0xb8ee, 0xb8ef, 0xb8f1, 0xb8f2, 0xb8f3, 0xb8f4, 0xb8f5, 0xb8f6, 0xb8f7, 0xb8fa, 0xb8fc, 0xb8fe, 0xb8ff, 0xb900, 0xb901, 0xb902, 0xb903, 0xb905, 0xb906, 0xb907, 0xb908, 0xb909, 0xb90a, 0xb90b, 0xb90c, 0xb90d, 0xb90e, 0xb90f, 0xb910, 0xb911, 0xb912, 0xb913, 0xb914, 0xb915, 0xb916, 0xb917, 0xb919, 0xb91a, 0xb91b, 0xb91c, 0xb91d, 0xb91e, 0xb91f, 0xb921, 0xb922, 0xb923, 0xb924, 0xb925, 0xb926, 0xb927, 0xb928, 0xb929, 0xb92a, 0xb92b, 0xb92c, 0xb92d, 0xb92e, 0xb92f, 0xb930, 0xb931, 0xb932, 0xb933, 0xb934, 0xb935, 0xb936, 0xb937, 0xb938, 0xb939, 0xb93a, 0xb93b, 0xb93e, 0xb93f, 0xb941, 0xb942, 0xb943, 0xb945, 0xb946, 0xb947, 0xb948, 0xb949, 0xb94a, 0xb94b, 0xb94d, 0xb94e, 0xb950, 0xb952, 0xb953, 0xb954, 0xb955, 0xb956, 0xb957, 0xb95a, 0xb95b, 0xb95d, 0xb95e, 0xb95f, 0xb961, 0xb962, 0xb963, 0xb964, 0xb965, 0xb966, 0xb967, 0xb96a, 0xb96c, 0xb96e, 0xb96f, 0xb970, 0xb971, 0xb972, 0xb973, 0xb976, 0xb977, 0xb979, 0xb97a, 0xb97b, 0xb97d, 0xb97e, 0xb97f, 0xb980, 0xb981, 0xb982, 0xb983, 0xb986, 0xb988, 0xb98b, 0xb98c, 0xb98f, 0xb990, 0xb991, 0xb992, 0xb993, 0xb994, 0xb995, 0xb996, 0xb997, 0xb998, 0xb999, 0xb99a, 0xb99b, 0xb99c, 0xb99d, 0xb99e, 0xb99f, 0xb9a0, 0xb9a1, 0xb9a2, 0xb9a3, 0xb9a4, 0xb9a5, 0xb9a6, 0xb9a7, 0xb9a8, 0xb9a9, 0xb9aa, 0xb9ab, 0xb9ae, 0xb9af, 0xb9b1, 0xb9b2, 0xb9b3, 0xb9b5, 0xb9b6, 0xb9b7, 0xb9b8, 0xb9b9, 0xb9ba, 0xb9bb, 0xb9be, 0xb9c0, 0xb9c2, 0xb9c3, 0xb9c4, 0xb9c5, 0xb9c6, 0xb9c7, 0xb9ca, 0xb9cb, 0xb9cd, 0xb9d3, 0xb9d4, 0xb9d5, 0xb9d6, 0xb9d7, 0xb9da, 0xb9dc, 0xb9df, 0xb9e0, 0xb9e2, 0xb9e6, 0xb9e7, 0xb9e9, 0xb9ea, 0xb9eb, 0xb9ed, 0xb9ee, 0xb9ef, 0xb9f0, 0xb9f1, 0xb9f2, 0xb9f3, 0xb9f6, 0xb9fb, 0xb9fc, 0xb9fd, 0xb9fe, 0xb9ff, 0xba02, 0xba03, 0xba04, 0xba05, 0xba06, 0xba07, 0xba09, 0xba0a, 0xba0b, 0xba0c, 0xba0d, 0xba0e, 0xba0f, 0xba10, 0xba11, 0xba12, 0xba13, 0xba14, 0xba16, 0xba17, 0xba18, 0xba19, 0xba1a, 0xba1b, 0xba1c, 0xba1d, 0xba1e, 0xba1f, 0xba20, 0xba21, 0xba22, 0xba23, 0xba24, 0xba25, 0xba26, 0xba27, 0xba28, 0xba29, 0xba2a, 0xba2b, 0xba2c, 0xba2d, 0xba2e, 0xba2f, 0xba30, 0xba31, 0xba32, 0xba33, 0xba34, 0xba35, 0xba36, 0xba37, 0xba3a, 0xba3b, 0xba3d, 0xba3e, 0xba3f, 0xba41, 0xba43, 0xba44, 0xba45, 0xba46, 0xba47, 0xba4a, 0xba4c, 0xba4f, 0xba50, 0xba51, 0xba52, 0xba56, 0xba57, 0xba59, 0xba5a, 0xba5b, 0xba5d, 0xba5e, 0xba5f, 0xba60, 0xba61, 0xba62, 0xba63, 0xba66, 0xba6a, 0xba6b, 0xba6c, 0xba6d, 0xba6e, 0xba6f, 0xba72, 0xba73, 0xba75, 0xba76, 0xba77, 0xba79, 0xba7a, 0xba7b, 0xba7c, 0xba7d, 0xba7e, 0xba7f, 0xba80, 0xba81, 0xba82, 0xba86, 0xba88, 0xba89, 0xba8a, 0xba8b, 0xba8d, 0xba8e, 0xba8f, 0xba90, 0xba91, 0xba92, 0xba93, 0xba94, 0xba95, 0xba96, 0xba97, 0xba98, 0xba99, 0xba9a, 0xba9b, 0xba9c, 0xba9d, 0xba9e, 0xba9f, 0xbaa0, 0xbaa1, 0xbaa2, 0xbaa3, 0xbaa4, 0xbaa5, 0xbaa6, 0xbaa7, 0xbaaa, 0xbaad, 0xbaae, 0xbaaf, 0xbab1, 0xbab3, 0xbab4, 0xbab5, 0xbab6, 0xbab7, 0xbaba, 0xbabc, 0xbabe, 0xbabf, 0xbac0, 0xbac1, 0xbac2, 0xbac3, 0xbac5, 0xbac6, 0xbac7, 0xbac9, 0xbaca, 0xbacb, 0xbacc, 0xbacd, 0xbace, 0xbacf, 0xbad0, 0xbad1, 0xbad2, 0xbad3, 0xbad4, 0xbad5, 0xbad6, 0xbad7, 0xbada, 0xbadb, 0xbadc, 0xbadd, 0xbade, 0xbadf, 0xbae0, 0xbae1, 0xbae2, 0xbae3, 0xbae4, 0xbae5, 0xbae6, 0xbae7, 0xbae8, 0xbae9, 0xbaea, 0xbaeb, 0xbaec, 0xbaed, 0xbaee, 0xbaef, 0xbaf0, 0xbaf1, 0xbaf2, 0xbaf3, 0xbaf4, 0xbaf5, 0xbaf6, 0xbaf7, 0xbaf8, 0xbaf9, 0xbafa, 0xbafb, 0xbafd, 0xbafe, 0xbaff, 0xbb01, 0xbb02, 0xbb03, 0xbb05, 0xbb06, 0xbb07, 0xbb08, 0xbb09, 0xbb0a, 0xbb0b, 0xbb0c, 0xbb0e, 0xbb10, 0xbb12, 0xbb13, 0xbb14, 0xbb15, 0xbb16, 0xbb17, 0xbb19, 0xbb1a, 0xbb1b, 0xbb1d, 0xbb1e, 0xbb1f, 0xbb21, 0xbb22, 0xbb23, 0xbb24, 0xbb25, 0xbb26, 0xbb27, 0xbb28, 0xbb2a, 0xbb2c, 0xbb2d, 0xbb2e, 0xbb2f, 0xbb30, 0xbb31, 0xbb32, 0xbb33, 0xbb37, 0xbb39, 0xbb3a, 0xbb3f, 0xbb40, 0xbb41, 0xbb42, 0xbb43, 0xbb46, 0xbb48, 0xbb4a, 0xbb4b, 0xbb4c, 0xbb4e, 0xbb51, 0xbb52, 0xbb53, 0xbb55, 0xbb56, 0xbb57, 0xbb59, 0xbb5a, 0xbb5b, 0xbb5c, 0xbb5d, 0xbb5e, 0xbb5f, 0xbb60, 0xbb62, 0xbb64, 0xbb65, 0xbb66, 0xbb67, 0xbb68, 0xbb69, 0xbb6a, 0xbb6b, 0xbb6d, 0xbb6e, 0xbb6f, 0xbb70, 0xbb71, 0xbb72, 0xbb73, 0xbb74, 0xbb75, 0xbb76, 0xbb77, 0xbb78, 0xbb79, 0xbb7a, 0xbb7b, 0xbb7c, 0xbb7d, 0xbb7e, 0xbb7f, 0xbb80, 0xbb81, 0xbb82, 0xbb83, 0xbb84, 0xbb85, 0xbb86, 0xbb87, 0xbb89, 0xbb8a, 0xbb8b, 0xbb8d, 0xbb8e, 0xbb8f, 0xbb91, 0xbb92, 0xbb93, 0xbb94, 0xbb95, 0xbb96, 0xbb97, 0xbb98, 0xbb99, 0xbb9a, 0xbb9b, 0xbb9c, 0xbb9d, 0xbb9e, 0xbb9f, 0xbba0, 0xbba1, 0xbba2, 0xbba3, 0xbba5, 0xbba6, 0xbba7, 0xbba9, 0xbbaa, 0xbbab, 0xbbad, 0xbbae, 0xbbaf, 0xbbb0, 0xbbb1, 0xbbb2, 0xbbb3, 0xbbb5, 0xbbb6, 0xbbb8, 0xbbb9, 0xbbba, 0xbbbb, 0xbbbc, 0xbbbd, 0xbbbe, 0xbbbf, 0xbbc1, 0xbbc2, 0xbbc3, 0xbbc5, 0xbbc6, 0xbbc7, 0xbbc9, 0xbbca, 0xbbcb, 0xbbcc, 0xbbcd, 0xbbce, 0xbbcf, 0xbbd1, 0xbbd2, 0xbbd4, 0xbbd5, 0xbbd6, 0xbbd7, 0xbbd8, 0xbbd9, 0xbbda, 0xbbdb, 0xbbdc, 0xbbdd, 0xbbde, 0xbbdf, 0xbbe0, 0xbbe1, 0xbbe2, 0xbbe3, 0xbbe4, 0xbbe5, 0xbbe6, 0xbbe7, 0xbbe8, 0xbbe9, 0xbbea, 0xbbeb, 0xbbec, 0xbbed, 0xbbee, 0xbbef, 0xbbf0, 0xbbf1, 0xbbf2, 0xbbf3, 0xbbf4, 0xbbf5, 0xbbf6, 0xbbf7, 0xbbfa, 0xbbfb, 0xbbfd, 0xbbfe, 0xbc01, 0xbc03, 0xbc04, 0xbc05, 0xbc06, 0xbc07, 0xbc0a, 0xbc0e, 0xbc10, 0xbc12, 0xbc13, 0xbc19, 0xbc1a, 0xbc20, 0xbc21, 0xbc22, 0xbc23, 0xbc26, 0xbc28, 0xbc2a, 0xbc2b, 0xbc2c, 0xbc2e, 0xbc2f, 0xbc32, 0xbc33, 0xbc35, 0xbc36, 0xbc37, 0xbc39, 0xbc3a, 0xbc3b, 0xbc3c, 0xbc3d, 0xbc3e, 0xbc3f, 0xbc42, 0xbc46, 0xbc47, 0xbc48, 0xbc4a, 0xbc4b, 0xbc4e, 0xbc4f, 0xbc51, 0xbc52, 0xbc53, 0xbc54, 0xbc55, 0xbc56, 0xbc57, 0xbc58, 0xbc59, 0xbc5a, 0xbc5b, 0xbc5c, 0xbc5e, 0xbc5f, 0xbc60, 0xbc61, 0xbc62, 0xbc63, 0xbc64, 0xbc65, 0xbc66, 0xbc67, 0xbc68, 0xbc69, 0xbc6a, 0xbc6b, 0xbc6c, 0xbc6d, 0xbc6e, 0xbc6f, 0xbc70, 0xbc71, 0xbc72, 0xbc73, 0xbc74, 0xbc75, 0xbc76, 0xbc77, 0xbc78, 0xbc79, 0xbc7a, 0xbc7b, 0xbc7c, 0xbc7d, 0xbc7e, 0xbc7f, 0xbc80, 0xbc81, 0xbc82, 0xbc83, 0xbc86, 0xbc87, 0xbc89, 0xbc8a, 0xbc8d, 0xbc8f, 0xbc90, 0xbc91, 0xbc92, 0xbc93, 0xbc96, 0xbc98, 0xbc9b, 0xbc9c, 0xbc9d, 0xbc9e, 0xbc9f, 0xbca2, 0xbca3, 0xbca5, 0xbca6, 0xbca9, 0xbcaa, 0xbcab, 0xbcac, 0xbcad, 0xbcae, 0xbcaf, 0xbcb2, 0xbcb6, 0xbcb7, 0xbcb8, 0xbcb9, 0xbcba, 0xbcbb, 0xbcbe, 0xbcbf, 0xbcc1, 0xbcc2, 0xbcc3, 0xbcc5, 0xbcc6, 0xbcc7, 0xbcc8, 0xbcc9, 0xbcca, 0xbccb, 0xbccc, 0xbcce, 0xbcd2, 0xbcd3, 0xbcd4, 0xbcd6, 0xbcd7, 0xbcd9, 0xbcda, 0xbcdb, 0xbcdd, 0xbcde, 0xbcdf, 0xbce0, 0xbce1, 0xbce2, 0xbce3, 0xbce4, 0xbce5, 0xbce6, 0xbce7, 0xbce8, 0xbce9, 0xbcea, 0xbceb, 0xbcec, 0xbced, 0xbcee, 0xbcef, 0xbcf0, 0xbcf1, 0xbcf2, 0xbcf3, 0xbcf7, 0xbcf9, 0xbcfa, 0xbcfb, 0xbcfd, 0xbcfe, 0xbcff, 0xbd00, 0xbd01, 0xbd02, 0xbd03, 0xbd06, 0xbd08, 0xbd0a, 0xbd0b, 0xbd0c, 0xbd0d, 0xbd0e, 0xbd0f, 0xbd11, 0xbd12, 0xbd13, 0xbd15, 0xbd16, 0xbd17, 0xbd18, 0xbd19, 0xbd1a, 0xbd1b, 0xbd1c, 0xbd1d, 0xbd1e, 0xbd1f, 0xbd20, 0xbd21, 0xbd22, 0xbd23, 0xbd25, 0xbd26, 0xbd27, 0xbd28, 0xbd29, 0xbd2a, 0xbd2b, 0xbd2d, 0xbd2e, 0xbd2f, 0xbd30, 0xbd31, 0xbd32, 0xbd33, 0xbd34, 0xbd35, 0xbd36, 0xbd37, 0xbd38, 0xbd39, 0xbd3a, 0xbd3b, 0xbd3c, 0xbd3d, 0xbd3e, 0xbd3f, 0xbd41, 0xbd42, 0xbd43, 0xbd44, 0xbd45, 0xbd46, 0xbd47, 0xbd4a, 0xbd4b, 0xbd4d, 0xbd4e, 0xbd4f, 0xbd51, 0xbd52, 0xbd53, 0xbd54, 0xbd55, 0xbd56, 0xbd57, 0xbd5a, 0xbd5b, 0xbd5c, 0xbd5d, 0xbd5e, 0xbd5f, 0xbd60, 0xbd61, 0xbd62, 0xbd63, 0xbd65, 0xbd66, 0xbd67, 0xbd69, 0xbd6a, 0xbd6b, 0xbd6c, 0xbd6d, 0xbd6e, 0xbd6f, 0xbd70, 0xbd71, 0xbd72, 0xbd73, 0xbd74, 0xbd75, 0xbd76, 0xbd77, 0xbd78, 0xbd79, 0xbd7a, 0xbd7b, 0xbd7c, 0xbd7d, 0xbd7e, 0xbd7f, 0xbd82, 0xbd83, 0xbd85, 0xbd86, 0xbd8b, 0xbd8c, 0xbd8d, 0xbd8e, 0xbd8f, 0xbd92, 0xbd94, 0xbd96, 0xbd97, 0xbd98, 0xbd9b, 0xbd9d, 0xbd9e, 0xbd9f, 0xbda0, 0xbda1, 0xbda2, 0xbda3, 0xbda5, 0xbda6, 0xbda7, 0xbda8, 0xbda9, 0xbdaa, 0xbdab, 0xbdac, 0xbdad, 0xbdae, 0xbdaf, 0xbdb1, 0xbdb2, 0xbdb3, 0xbdb4, 0xbdb5, 0xbdb6, 0xbdb7, 0xbdb9, 0xbdba, 0xbdbb, 0xbdbc, 0xbdbd, 0xbdbe, 0xbdbf, 0xbdc0, 0xbdc1, 0xbdc2, 0xbdc3, 0xbdc4, 0xbdc5, 0xbdc6, 0xbdc7, 0xbdc8, 0xbdc9, 0xbdca, 0xbdcb, 0xbdcc, 0xbdcd, 0xbdce, 0xbdcf, 0xbdd0, 0xbdd1, 0xbdd2, 0xbdd3, 0xbdd6, 0xbdd7, 0xbdd9, 0xbdda, 0xbddb, 0xbddd, 0xbdde, 0xbddf, 0xbde0, 0xbde1, 0xbde2, 0xbde3, 0xbde4, 0xbde5, 0xbde6, 0xbde7, 0xbde8, 0xbdea, 0xbdeb, 0xbdec, 0xbded, 0xbdee, 0xbdef, 0xbdf1, 0xbdf2, 0xbdf3, 0xbdf5, 0xbdf6, 0xbdf7, 0xbdf9, 0xbdfa, 0xbdfb, 0xbdfc, 0xbdfd, 0xbdfe, 0xbdff, 0xbe01, 0xbe02, 0xbe04, 0xbe06, 0xbe07, 0xbe08, 0xbe09, 0xbe0a, 0xbe0b, 0xbe0e, 0xbe0f, 0xbe11, 0xbe12, 0xbe13, 0xbe15, 0xbe16, 0xbe17, 0xbe18, 0xbe19, 0xbe1a, 0xbe1b, 0xbe1e, 0xbe20, 0xbe21, 0xbe22, 0xbe23, 0xbe24, 0xbe25, 0xbe26, 0xbe27, 0xbe28, 0xbe29, 0xbe2a, 0xbe2b, 0xbe2c, 0xbe2d, 0xbe2e, 0xbe2f, 0xbe30, 0xbe31, 0xbe32, 0xbe33, 0xbe34, 0xbe35, 0xbe36, 0xbe37, 0xbe38, 0xbe39, 0xbe3a, 0xbe3b, 0xbe3c, 0xbe3d, 0xbe3e, 0xbe3f, 0xbe40, 0xbe41, 0xbe42, 0xbe43, 0xbe46, 0xbe47, 0xbe49, 0xbe4a, 0xbe4b, 0xbe4d, 0xbe4f, 0xbe50, 0xbe51, 0xbe52, 0xbe53, 0xbe56, 0xbe58, 0xbe5c, 0xbe5d, 0xbe5e, 0xbe5f, 0xbe62, 0xbe63, 0xbe65, 0xbe66, 0xbe67, 0xbe69, 0xbe6b, 0xbe6c, 0xbe6d, 0xbe6e, 0xbe6f, 0xbe72, 0xbe76, 0xbe77, 0xbe78, 0xbe79, 0xbe7a, 0xbe7e, 0xbe7f, 0xbe81, 0xbe82, 0xbe83, 0xbe85, 0xbe86, 0xbe87, 0xbe88, 0xbe89, 0xbe8a, 0xbe8b, 0xbe8e, 0xbe92, 0xbe93, 0xbe94, 0xbe95, 0xbe96, 0xbe97, 0xbe9a, 0xbe9b, 0xbe9c, 0xbe9d, 0xbe9e, 0xbe9f, 0xbea0, 0xbea1, 0xbea2, 0xbea3, 0xbea4, 0xbea5, 0xbea6, 0xbea7, 0xbea9, 0xbeaa, 0xbeab, 0xbeac, 0xbead, 0xbeae, 0xbeaf, 0xbeb0, 0xbeb1, 0xbeb2, 0xbeb3, 0xbeb4, 0xbeb5, 0xbeb6, 0xbeb7, 0xbeb8, 0xbeb9, 0xbeba, 0xbebb, 0xbebc, 0xbebd, 0xbebe, 0xbebf, 0xbec0, 0xbec1, 0xbec2, 0xbec3, 0xbec4, 0xbec5, 0xbec6, 0xbec7, 0xbec8, 0xbec9, 0xbeca, 0xbecb, 0xbecc, 0xbecd, 0xbece, 0xbecf, 0xbed2, 0xbed3, 0xbed5, 0xbed6, 0xbed9, 0xbeda, 0xbedb, 0xbedc, 0xbedd, 0xbede, 0xbedf, 0xbee1, 0xbee2, 0xbee6, 0xbee7, 0xbee8, 0xbee9, 0xbeea, 0xbeeb, 0xbeed, 0xbeee, 0xbeef, 0xbef0, 0xbef1, 0xbef2, 0xbef3, 0xbef4, 0xbef5, 0xbef6, 0xbef7, 0xbef8, 0xbef9, 0xbefa, 0xbefb, 0xbefc, 0xbefd, 0xbefe, 0xbeff, 0xbf00, 0xbf02, 0xbf03, 0xbf04, 0xbf05, 0xbf06, 0xbf07, 0xbf0a, 0xbf0b, 0xbf0c, 0xbf0d, 0xbf0e, 0xbf0f, 0xbf10, 0xbf11, 0xbf12, 0xbf13, 0xbf14, 0xbf15, 0xbf16, 0xbf17, 0xbf1a, 0xbf1e, 0xbf1f, 0xbf20, 0xbf21, 0xbf22, 0xbf23, 0xbf24, 0xbf25, 0xbf26, 0xbf27, 0xbf28, 0xbf29, 0xbf2a, 0xbf2b, 0xbf2c, 0xbf2d, 0xbf2e, 0xbf2f, 0xbf30, 0xbf31, 0xbf32, 0xbf33, 0xbf34, 0xbf35, 0xbf36, 0xbf37, 0xbf38, 0xbf39, 0xbf3a, 0xbf3b, 0xbf3c, 0xbf3d, 0xbf3e, 0xbf3f, 0xbf42, 0xbf43, 0xbf45, 0xbf46, 0xbf47, 0xbf49, 0xbf4a, 0xbf4b, 0xbf4c, 0xbf4d, 0xbf4e, 0xbf4f, 0xbf52, 0xbf53, 0xbf54, 0xbf56, 0xbf57, 0xbf58, 0xbf59, 0xbf5a, 0xbf5b, 0xbf5c, 0xbf5d, 0xbf5e, 0xbf5f, 0xbf60, 0xbf61, 0xbf62, 0xbf63, 0xbf64, 0xbf65, 0xbf66, 0xbf67, 0xbf68, 0xbf69, 0xbf6a, 0xbf6b, 0xbf6c, 0xbf6d, 0xbf6e, 0xbf6f, 0xbf70, 0xbf71, 0xbf72, 0xbf73, 0xbf74, 0xbf75, 0xbf76, 0xbf77, 0xbf78, 0xbf79, 0xbf7a, 0xbf7b, 0xbf7c, 0xbf7d, 0xbf7e, 0xbf7f, 0xbf80, 0xbf81, 0xbf82, 0xbf83, 0xbf84, 0xbf85, 0xbf86, 0xbf87, 0xbf88, 0xbf89, 0xbf8a, 0xbf8b, 0xbf8c, 0xbf8d, 0xbf8e, 0xbf8f, 0xbf90, 0xbf91, 0xbf92, 0xbf93, 0xbf95, 0xbf96, 0xbf97, 0xbf98, 0xbf99, 0xbf9a, 0xbf9b, 0xbf9c, 0xbf9d, 0xbf9e, 0xbf9f, 0xbfa0, 0xbfa1, 0xbfa2, 0xbfa3, 0xbfa4, 0xbfa5, 0xbfa6, 0xbfa7, 0xbfa8, 0xbfa9, 0xbfaa, 0xbfab, 0xbfac, 0xbfad, 0xbfae, 0xbfaf, 0xbfb1, 0xbfb2, 0xbfb3, 0xbfb4, 0xbfb5, 0xbfb6, 0xbfb7, 0xbfb8, 0xbfb9, 0xbfba, 0xbfbb, 0xbfbc, 0xbfbd, 0xbfbe, 0xbfbf, 0xbfc0, 0xbfc1, 0xbfc2, 0xbfc3, 0xbfc4, 0xbfc6, 0xbfc7, 0xbfc8, 0xbfc9, 0xbfca, 0xbfcb, 0xbfce, 0xbfcf, 0xbfd1, 0xbfd2, 0xbfd3, 0xbfd5, 0xbfd6, 0xbfd7, 0xbfd8, 0xbfd9, 0xbfda, 0xbfdb, 0xbfdd, 0xbfde, 0xbfe0, 0xbfe2, 0xbfe3, 0xbfe4, 0xbfe5, 0xbfe6, 0xbfe7, 0xbfe8, 0xbfe9, 0xbfea, 0xbfeb, 0xbfec, 0xbfed, 0xbfee, 0xbfef, 0xbff0, 0xbff1, 0xbff2, 0xbff3, 0xbff4, 0xbff5, 0xbff6, 0xbff7, 0xbff8, 0xbff9, 0xbffa, 0xbffb, 0xbffc, 0xbffd, 0xbffe, 0xbfff, 0xc000, 0xc001, 0xc002, 0xc003, 0xc004, 0xc005, 0xc006, 0xc007, 0xc008, 0xc009, 0xc00a, 0xc00b, 0xc00c, 0xc00d, 0xc00e, 0xc00f, 0xc010, 0xc011, 0xc012, 0xc013, 0xc014, 0xc015, 0xc016, 0xc017, 0xc018, 0xc019, 0xc01a, 0xc01b, 0xc01c, 0xc01d, 0xc01e, 0xc01f, 0xc020, 0xc021, 0xc022, 0xc023, 0xc024, 0xc025, 0xc026, 0xc027, 0xc028, 0xc029, 0xc02a, 0xc02b, 0xc02c, 0xc02d, 0xc02e, 0xc02f, 0xc030, 0xc031, 0xc032, 0xc033, 0xc034, 0xc035, 0xc036, 0xc037, 0xc038, 0xc039, 0xc03a, 0xc03b, 0xc03d, 0xc03e, 0xc03f, 0xc040, 0xc041, 0xc042, 0xc043, 0xc044, 0xc045, 0xc046, 0xc047, 0xc048, 0xc049, 0xc04a, 0xc04b, 0xc04c, 0xc04d, 0xc04e, 0xc04f, 0xc050, 0xc052, 0xc053, 0xc054, 0xc055, 0xc056, 0xc057, 0xc059, 0xc05a, 0xc05b, 0xc05d, 0xc05e, 0xc05f, 0xc061, 0xc062, 0xc063, 0xc064, 0xc065, 0xc066, 0xc067, 0xc06a, 0xc06b, 0xc06c, 0xc06d, 0xc06e, 0xc06f, 0xc070, 0xc071, 0xc072, 0xc073, 0xc074, 0xc075, 0xc076, 0xc077, 0xc078, 0xc079, 0xc07a, 0xc07b, 0xc07c, 0xc07d, 0xc07e, 0xc07f, 0xc080, 0xc081, 0xc082, 0xc083, 0xc084, 0xc085, 0xc086, 0xc087, 0xc088, 0xc089, 0xc08a, 0xc08b, 0xc08c, 0xc08d, 0xc08e, 0xc08f, 0xc092, 0xc093, 0xc095, 0xc096, 0xc097, 0xc099, 0xc09a, 0xc09b, 0xc09c, 0xc09d, 0xc09e, 0xc09f, 0xc0a2, 0xc0a4, 0xc0a6, 0xc0a7, 0xc0a8, 0xc0a9, 0xc0aa, 0xc0ab, 0xc0ae, 0xc0b1, 0xc0b2, 0xc0b7, 0xc0b8, 0xc0b9, 0xc0ba, 0xc0bb, 0xc0be, 0xc0c2, 0xc0c3, 0xc0c4, 0xc0c6, 0xc0c7, 0xc0ca, 0xc0cb, 0xc0cd, 0xc0ce, 0xc0cf, 0xc0d1, 0xc0d2, 0xc0d3, 0xc0d4, 0xc0d5, 0xc0d6, 0xc0d7, 0xc0da, 0xc0de, 0xc0df, 0xc0e0, 0xc0e1, 0xc0e2, 0xc0e3, 0xc0e6, 0xc0e7, 0xc0e9, 0xc0ea, 0xc0eb, 0xc0ed, 0xc0ee, 0xc0ef, 0xc0f0, 0xc0f1, 0xc0f2, 0xc0f3, 0xc0f6, 0xc0f8, 0xc0fa, 0xc0fb, 0xc0fc, 0xc0fd, 0xc0fe, 0xc0ff, 0xc101, 0xc102, 0xc103, 0xc105, 0xc106, 0xc107, 0xc109, 0xc10a, 0xc10b, 0xc10c, 0xc10d, 0xc10e, 0xc10f, 0xc111, 0xc112, 0xc113, 0xc114, 0xc116, 0xc117, 0xc118, 0xc119, 0xc11a, 0xc11b, 0xc121, 0xc122, 0xc125, 0xc128, 0xc129, 0xc12a, 0xc12b, 0xc12e, 0xc132, 0xc133, 0xc134, 0xc135, 0xc137, 0xc13a, 0xc13b, 0xc13d, 0xc13e, 0xc13f, 0xc141, 0xc142, 0xc143, 0xc144, 0xc145, 0xc146, 0xc147, 0xc14a, 0xc14e, 0xc14f, 0xc150, 0xc151, 0xc152, 0xc153, 0xc156, 0xc157, 0xc159, 0xc15a, 0xc15b, 0xc15d, 0xc15e, 0xc15f, 0xc160, 0xc161, 0xc162, 0xc163, 0xc166, 0xc16a, 0xc16b, 0xc16c, 0xc16d, 0xc16e, 0xc16f, 0xc171, 0xc172, 0xc173, 0xc175, 0xc176, 0xc177, 0xc179, 0xc17a, 0xc17b, 0xc17c, 0xc17d, 0xc17e, 0xc17f, 0xc180, 0xc181, 0xc182, 0xc183, 0xc184, 0xc186, 0xc187, 0xc188, 0xc189, 0xc18a, 0xc18b, 0xc18f, 0xc191, 0xc192, 0xc193, 0xc195, 0xc197, 0xc198, 0xc199, 0xc19a, 0xc19b, 0xc19e, 0xc1a0, 0xc1a2, 0xc1a3, 0xc1a4, 0xc1a6, 0xc1a7, 0xc1aa, 0xc1ab, 0xc1ad, 0xc1ae, 0xc1af, 0xc1b1, 0xc1b2, 0xc1b3, 0xc1b4, 0xc1b5, 0xc1b6, 0xc1b7, 0xc1b8, 0xc1b9, 0xc1ba, 0xc1bb, 0xc1bc, 0xc1be, 0xc1bf, 0xc1c0, 0xc1c1, 0xc1c2, 0xc1c3, 0xc1c5, 0xc1c6, 0xc1c7, 0xc1c9, 0xc1ca, 0xc1cb, 0xc1cd, 0xc1ce, 0xc1cf, 0xc1d0, 0xc1d1, 0xc1d2, 0xc1d3, 0xc1d5, 0xc1d6, 0xc1d9, 0xc1da, 0xc1db, 0xc1dc, 0xc1dd, 0xc1de, 0xc1df, 0xc1e1, 0xc1e2, 0xc1e3, 0xc1e5, 0xc1e6, 0xc1e7, 0xc1e9, 0xc1ea, 0xc1eb, 0xc1ec, 0xc1ed, 0xc1ee, 0xc1ef, 0xc1f2, 0xc1f4, 0xc1f5, 0xc1f6, 0xc1f7, 0xc1f8, 0xc1f9, 0xc1fa, 0xc1fb, 0xc1fe, 0xc1ff, 0xc201, 0xc202, 0xc203, 0xc205, 0xc206, 0xc207, 0xc208, 0xc209, 0xc20a, 0xc20b, 0xc20e, 0xc210, 0xc212, 0xc213, 0xc214, 0xc215, 0xc216, 0xc217, 0xc21a, 0xc21b, 0xc21d, 0xc21e, 0xc221, 0xc222, 0xc223, 0xc224, 0xc225, 0xc226, 0xc227, 0xc22a, 0xc22c, 0xc22e, 0xc230, 0xc233, 0xc235, 0xc236, 0xc237, 0xc238, 0xc239, 0xc23a, 0xc23b, 0xc23c, 0xc23d, 0xc23e, 0xc23f, 0xc240, 0xc241, 0xc242, 0xc243, 0xc244, 0xc245, 0xc246, 0xc247, 0xc249, 0xc24a, 0xc24b, 0xc24c, 0xc24d, 0xc24e, 0xc24f, 0xc252, 0xc253, 0xc255, 0xc256, 0xc257, 0xc259, 0xc25a, 0xc25b, 0xc25c, 0xc25d, 0xc25e, 0xc25f, 0xc261, 0xc262, 0xc263, 0xc264, 0xc266, 0xc267, 0xc268, 0xc269, 0xc26a, 0xc26b, 0xc26e, 0xc26f, 0xc271, 0xc272, 0xc273, 0xc275, 0xc276, 0xc277, 0xc278, 0xc279, 0xc27a, 0xc27b, 0xc27e, 0xc280, 0xc282, 0xc283, 0xc284, 0xc285, 0xc286, 0xc287, 0xc28a, 0xc28b, 0xc28c, 0xc28d, 0xc28e, 0xc28f, 0xc291, 0xc292, 0xc293, 0xc294, 0xc295, 0xc296, 0xc297, 0xc299, 0xc29a, 0xc29c, 0xc29e, 0xc29f, 0xc2a0, 0xc2a1, 0xc2a2, 0xc2a3, 0xc2a6, 0xc2a7, 0xc2a9, 0xc2aa, 0xc2ab, 0xc2ae, 0xc2af, 0xc2b0, 0xc2b1, 0xc2b2, 0xc2b3, 0xc2b6, 0xc2b8, 0xc2ba, 0xc2bb, 0xc2bc, 0xc2bd, 0xc2be, 0xc2bf, 0xc2c0, 0xc2c1, 0xc2c2, 0xc2c3, 0xc2c4, 0xc2c5, 0xc2c6, 0xc2c7, 0xc2c8, 0xc2c9, 0xc2ca, 0xc2cb, 0xc2cc, 0xc2cd, 0xc2ce, 0xc2cf, 0xc2d0, 0xc2d1, 0xc2d2, 0xc2d3, 0xc2d4, 0xc2d5, 0xc2d6, 0xc2d7, 0xc2d8, 0xc2d9, 0xc2da, 0xc2db, 0xc2de, 0xc2df, 0xc2e1, 0xc2e2, 0xc2e5, 0xc2e6, 0xc2e7, 0xc2e8, 0xc2e9, 0xc2ea, 0xc2ee, 0xc2f0, 0xc2f2, 0xc2f3, 0xc2f4, 0xc2f5, 0xc2f7, 0xc2fa, 0xc2fd, 0xc2fe, 0xc2ff, 0xc301, 0xc302, 0xc303, 0xc304, 0xc305, 0xc306, 0xc307, 0xc30a, 0xc30b, 0xc30e, 0xc30f, 0xc310, 0xc311, 0xc312, 0xc316, 0xc317, 0xc319, 0xc31a, 0xc31b, 0xc31d, 0xc31e, 0xc31f, 0xc320, 0xc321, 0xc322, 0xc323, 0xc326, 0xc327, 0xc32a, 0xc32b, 0xc32c, 0xc32d, 0xc32e, 0xc32f, 0xc330, 0xc331, 0xc332, 0xc333, 0xc334, 0xc335, 0xc336, 0xc337, 0xc338, 0xc339, 0xc33a, 0xc33b, 0xc33c, 0xc33d, 0xc33e, 0xc33f, 0xc340, 0xc341, 0xc342, 0xc343, 0xc344, 0xc346, 0xc347, 0xc348, 0xc349, 0xc34a, 0xc34b, 0xc34c, 0xc34d, 0xc34e, 0xc34f, 0xc350, 0xc351, 0xc352, 0xc353, 0xc354, 0xc355, 0xc356, 0xc357, 0xc358, 0xc359, 0xc35a, 0xc35b, 0xc35c, 0xc35d, 0xc35e, 0xc35f, 0xc360, 0xc361, 0xc362, 0xc363, 0xc364, 0xc365, 0xc366, 0xc367, 0xc36a, 0xc36b, 0xc36d, 0xc36e, 0xc36f, 0xc371, 0xc373, 0xc374, 0xc375, 0xc376, 0xc377, 0xc37a, 0xc37b, 0xc37e, 0xc37f, 0xc380, 0xc381, 0xc382, 0xc383, 0xc385, 0xc386, 0xc387, 0xc389, 0xc38a, 0xc38b, 0xc38d, 0xc38e, 0xc38f, 0xc390, 0xc391, 0xc392, 0xc393, 0xc394, 0xc395, 0xc396, 0xc397, 0xc398, 0xc399, 0xc39a, 0xc39b, 0xc39c, 0xc39d, 0xc39e, 0xc39f, 0xc3a0, 0xc3a1, 0xc3a2, 0xc3a3, 0xc3a4, 0xc3a5, 0xc3a6, 0xc3a7, 0xc3a8, 0xc3a9, 0xc3aa, 0xc3ab, 0xc3ac, 0xc3ad, 0xc3ae, 0xc3af, 0xc3b0, 0xc3b1, 0xc3b2, 0xc3b3, 0xc3b4, 0xc3b5, 0xc3b6, 0xc3b7, 0xc3b8, 0xc3b9, 0xc3ba, 0xc3bb, 0xc3bc, 0xc3bd, 0xc3be, 0xc3bf, 0xc3c1, 0xc3c2, 0xc3c3, 0xc3c4, 0xc3c5, 0xc3c6, 0xc3c7, 0xc3c8, 0xc3c9, 0xc3ca, 0xc3cb, 0xc3cc, 0xc3cd, 0xc3ce, 0xc3cf, 0xc3d0, 0xc3d1, 0xc3d2, 0xc3d3, 0xc3d4, 0xc3d5, 0xc3d6, 0xc3d7, 0xc3da, 0xc3db, 0xc3dd, 0xc3de, 0xc3e1, 0xc3e3, 0xc3e4, 0xc3e5, 0xc3e6, 0xc3e7, 0xc3ea, 0xc3eb, 0xc3ec, 0xc3ee, 0xc3ef, 0xc3f0, 0xc3f1, 0xc3f2, 0xc3f3, 0xc3f6, 0xc3f7, 0xc3f9, 0xc3fa, 0xc3fb, 0xc3fc, 0xc3fd, 0xc3fe, 0xc3ff, 0xc400, 0xc401, 0xc402, 0xc403, 0xc404, 0xc405, 0xc406, 0xc407, 0xc409, 0xc40a, 0xc40b, 0xc40c, 0xc40d, 0xc40e, 0xc40f, 0xc411, 0xc412, 0xc413, 0xc414, 0xc415, 0xc416, 0xc417, 0xc418, 0xc419, 0xc41a, 0xc41b, 0xc41c, 0xc41d, 0xc41e, 0xc41f, 0xc420, 0xc421, 0xc422, 0xc423, 0xc425, 0xc426, 0xc427, 0xc428, 0xc429, 0xc42a, 0xc42b, 0xc42d, 0xc42e, 0xc42f, 0xc431, 0xc432, 0xc433, 0xc435, 0xc436, 0xc437, 0xc438, 0xc439, 0xc43a, 0xc43b, 0xc43e, 0xc43f, 0xc440, 0xc441, 0xc442, 0xc443, 0xc444, 0xc445, 0xc446, 0xc447, 0xc449, 0xc44a, 0xc44b, 0xc44c, 0xc44d, 0xc44e, 0xc44f, 0xc450, 0xc451, 0xc452, 0xc453, 0xc454, 0xc455, 0xc456, 0xc457, 0xc458, 0xc459, 0xc45a, 0xc45b, 0xc45c, 0xc45d, 0xc45e, 0xc45f, 0xc460, 0xc461, 0xc462, 0xc463, 0xc466, 0xc467, 0xc469, 0xc46a, 0xc46b, 0xc46d, 0xc46e, 0xc46f, 0xc470, 0xc471, 0xc472, 0xc473, 0xc476, 0xc477, 0xc478, 0xc47a, 0xc47b, 0xc47c, 0xc47d, 0xc47e, 0xc47f, 0xc481, 0xc482, 0xc483, 0xc484, 0xc485, 0xc486, 0xc487, 0xc488, 0xc489, 0xc48a, 0xc48b, 0xc48c, 0xc48d, 0xc48e, 0xc48f, 0xc490, 0xc491, 0xc492, 0xc493, 0xc495, 0xc496, 0xc497, 0xc498, 0xc499, 0xc49a, 0xc49b, 0xc49d, 0xc49e, 0xc49f, 0xc4a0, 0xc4a1, 0xc4a2, 0xc4a3, 0xc4a4, 0xc4a5, 0xc4a6, 0xc4a7, 0xc4a8, 0xc4a9, 0xc4aa, 0xc4ab, 0xc4ac, 0xc4ad, 0xc4ae, 0xc4af, 0xc4b0, 0xc4b1, 0xc4b2, 0xc4b3, 0xc4b4, 0xc4b5, 0xc4b6, 0xc4b7, 0xc4b9, 0xc4ba, 0xc4bb, 0xc4bd, 0xc4be, 0xc4bf, 0xc4c0, 0xc4c1, 0xc4c2, 0xc4c3, 0xc4c4, 0xc4c5, 0xc4c6, 0xc4c7, 0xc4c8, 0xc4c9, 0xc4ca, 0xc4cb, 0xc4cc, 0xc4cd, 0xc4ce, 0xc4cf, 0xc4d0, 0xc4d1, 0xc4d2, 0xc4d3, 0xc4d4, 0xc4d5, 0xc4d6, 0xc4d7, 0xc4d8, 0xc4d9, 0xc4da, 0xc4db, 0xc4dc, 0xc4dd, 0xc4de, 0xc4df, 0xc4e0, 0xc4e1, 0xc4e2, 0xc4e3, 0xc4e4, 0xc4e5, 0xc4e6, 0xc4e7, 0xc4e8, 0xc4ea, 0xc4eb, 0xc4ec, 0xc4ed, 0xc4ee, 0xc4ef, 0xc4f2, 0xc4f3, 0xc4f5, 0xc4f6, 0xc4f7, 0xc4f9, 0xc4fb, 0xc4fc, 0xc4fd, 0xc4fe, 0xc502, 0xc503, 0xc504, 0xc505, 0xc506, 0xc507, 0xc508, 0xc509, 0xc50a, 0xc50b, 0xc50d, 0xc50e, 0xc50f, 0xc511, 0xc512, 0xc513, 0xc515, 0xc516, 0xc517, 0xc518, 0xc519, 0xc51a, 0xc51b, 0xc51d, 0xc51e, 0xc51f, 0xc520, 0xc521, 0xc522, 0xc523, 0xc524, 0xc525, 0xc526, 0xc527, 0xc52a, 0xc52b, 0xc52d, 0xc52e, 0xc52f, 0xc531, 0xc532, 0xc533, 0xc534, 0xc535, 0xc536, 0xc537, 0xc53a, 0xc53c, 0xc53e, 0xc53f, 0xc540, 0xc541, 0xc542, 0xc543, 0xc546, 0xc547, 0xc54b, 0xc54f, 0xc550, 0xc551, 0xc552, 0xc556, 0xc55a, 0xc55b, 0xc55c, 0xc55f, 0xc562, 0xc563, 0xc565, 0xc566, 0xc567, 0xc569, 0xc56a, 0xc56b, 0xc56c, 0xc56d, 0xc56e, 0xc56f, 0xc572, 0xc576, 0xc577, 0xc578, 0xc579, 0xc57a, 0xc57b, 0xc57e, 0xc57f, 0xc581, 0xc582, 0xc583, 0xc585, 0xc586, 0xc588, 0xc589, 0xc58a, 0xc58b, 0xc58e, 0xc590, 0xc592, 0xc593, 0xc594, 0xc596, 0xc599, 0xc59a, 0xc59b, 0xc59d, 0xc59e, 0xc59f, 0xc5a1, 0xc5a2, 0xc5a3, 0xc5a4, 0xc5a5, 0xc5a6, 0xc5a7, 0xc5a8, 0xc5aa, 0xc5ab, 0xc5ac, 0xc5ad, 0xc5ae, 0xc5af, 0xc5b0, 0xc5b1, 0xc5b2, 0xc5b3, 0xc5b6, 0xc5b7, 0xc5ba, 0xc5bf, 0xc5c0, 0xc5c1, 0xc5c2, 0xc5c3, 0xc5cb, 0xc5cd, 0xc5cf, 0xc5d2, 0xc5d3, 0xc5d5, 0xc5d6, 0xc5d7, 0xc5d9, 0xc5da, 0xc5db, 0xc5dc, 0xc5dd, 0xc5de, 0xc5df, 0xc5e2, 0xc5e4, 0xc5e6, 0xc5e7, 0xc5e8, 0xc5e9, 0xc5ea, 0xc5eb, 0xc5ef, 0xc5f1, 0xc5f2, 0xc5f3, 0xc5f5, 0xc5f8, 0xc5f9, 0xc5fa, 0xc5fb, 0xc602, 0xc603, 0xc604, 0xc609, 0xc60a, 0xc60b, 0xc60d, 0xc60e, 0xc60f, 0xc611, 0xc612, 0xc613, 0xc614, 0xc615, 0xc616, 0xc617, 0xc61a, 0xc61d, 0xc61e, 0xc61f, 0xc620, 0xc621, 0xc622, 0xc623, 0xc626, 0xc627, 0xc629, 0xc62a, 0xc62b, 0xc62f, 0xc631, 0xc632, 0xc636, 0xc638, 0xc63a, 0xc63c, 0xc63d, 0xc63e, 0xc63f, 0xc642, 0xc643, 0xc645, 0xc646, 0xc647, 0xc649, 0xc64a, 0xc64b, 0xc64c, 0xc64d, 0xc64e, 0xc64f, 0xc652, 0xc656, 0xc657, 0xc658, 0xc659, 0xc65a, 0xc65b, 0xc65e, 0xc65f, 0xc661, 0xc662, 0xc663, 0xc664, 0xc665, 0xc666, 0xc667, 0xc668, 0xc669, 0xc66a, 0xc66b, 0xc66d, 0xc66e, 0xc670, 0xc672, 0xc673, 0xc674, 0xc675, 0xc676, 0xc677, 0xc67a, 0xc67b, 0xc67d, 0xc67e, 0xc67f, 0xc681, 0xc682, 0xc683, 0xc684, 0xc685, 0xc686, 0xc687, 0xc68a, 0xc68c, 0xc68e, 0xc68f, 0xc690, 0xc691, 0xc692, 0xc693, 0xc696, 0xc697, 0xc699, 0xc69a, 0xc69b, 0xc69d, 0xc69e, 0xc69f, 0xc6a0, 0xc6a1, 0xc6a2, 0xc6a3, 0xc6a6, 0xc6a8, 0xc6aa, 0xc6ab, 0xc6ac, 0xc6ad, 0xc6ae, 0xc6af, 0xc6b2, 0xc6b3, 0xc6b5, 0xc6b6, 0xc6b7, 0xc6bb, 0xc6bc, 0xc6bd, 0xc6be, 0xc6bf, 0xc6c2, 0xc6c4, 0xc6c6, 0xc6c7, 0xc6c8, 0xc6c9, 0xc6ca, 0xc6cb, 0xc6ce, 0xc6cf, 0xc6d1, 0xc6d2, 0xc6d3, 0xc6d5, 0xc6d6, 0xc6d7, 0xc6d8, 0xc6d9, 0xc6da, 0xc6db, 0xc6de, 0xc6df, 0xc6e2, 0xc6e3, 0xc6e4, 0xc6e5, 0xc6e6, 0xc6e7, 0xc6ea, 0xc6eb, 0xc6ed, 0xc6ee, 0xc6ef, 0xc6f1, 0xc6f2, 0xc6f3, 0xc6f4, 0xc6f5, 0xc6f6, 0xc6f7, 0xc6fa, 0xc6fb, 0xc6fc, 0xc6fe, 0xc6ff, 0xc700, 0xc701, 0xc702, 0xc703, 0xc706, 0xc707, 0xc709, 0xc70a, 0xc70b, 0xc70d, 0xc70e, 0xc70f, 0xc710, 0xc711, 0xc712, 0xc713, 0xc716, 0xc718, 0xc71a, 0xc71b, 0xc71c, 0xc71d, 0xc71e, 0xc71f, 0xc722, 0xc723, 0xc725, 0xc726, 0xc727, 0xc729, 0xc72a, 0xc72b, 0xc72c, 0xc72d, 0xc72e, 0xc72f, 0xc732, 0xc734, 0xc736, 0xc738, 0xc739, 0xc73a, 0xc73b, 0xc73e, 0xc73f, 0xc741, 0xc742, 0xc743, 0xc745, 0xc746, 0xc747, 0xc748, 0xc749, 0xc74b, 0xc74e, 0xc750, 0xc759, 0xc75a, 0xc75b, 0xc75d, 0xc75e, 0xc75f, 0xc761, 0xc762, 0xc763, 0xc764, 0xc765, 0xc766, 0xc767, 0xc769, 0xc76a, 0xc76c, 0xc76d, 0xc76e, 0xc76f, 0xc770, 0xc771, 0xc772, 0xc773, 0xc776, 0xc777, 0xc779, 0xc77a, 0xc77b, 0xc77f, 0xc780, 0xc781, 0xc782, 0xc786, 0xc78b, 0xc78c, 0xc78d, 0xc78f, 0xc792, 0xc793, 0xc795, 0xc799, 0xc79b, 0xc79c, 0xc79d, 0xc79e, 0xc79f, 0xc7a2, 0xc7a7, 0xc7a8, 0xc7a9, 0xc7aa, 0xc7ab, 0xc7ae, 0xc7af, 0xc7b1, 0xc7b2, 0xc7b3, 0xc7b5, 0xc7b6, 0xc7b7, 0xc7b8, 0xc7b9, 0xc7ba, 0xc7bb, 0xc7be, 0xc7c2, 0xc7c3, 0xc7c4, 0xc7c5, 0xc7c6, 0xc7c7, 0xc7ca, 0xc7cb, 0xc7cd, 0xc7cf, 0xc7d1, 0xc7d2, 0xc7d3, 0xc7d4, 0xc7d5, 0xc7d6, 0xc7d7, 0xc7d9, 0xc7da, 0xc7db, 0xc7dc, 0xc7de, 0xc7df, 0xc7e0, 0xc7e1, 0xc7e2, 0xc7e3, 0xc7e5, 0xc7e6, 0xc7e7, 0xc7e9, 0xc7ea, 0xc7eb, 0xc7ed, 0xc7ee, 0xc7ef, 0xc7f0, 0xc7f1, 0xc7f2, 0xc7f3, 0xc7f4, 0xc7f5, 0xc7f6, 0xc7f7, 0xc7f8, 0xc7f9, 0xc7fa, 0xc7fb, 0xc7fc, 0xc7fd, 0xc7fe, 0xc7ff, 0xc802, 0xc803, 0xc805, 0xc806, 0xc807, 0xc809, 0xc80b, 0xc80c, 0xc80d, 0xc80e, 0xc80f, 0xc812, 0xc814, 0xc817, 0xc818, 0xc819, 0xc81a, 0xc81b, 0xc81e, 0xc81f, 0xc821, 0xc822, 0xc823, 0xc825, 0xc826, 0xc827, 0xc828, 0xc829, 0xc82a, 0xc82b, 0xc82e, 0xc830, 0xc832, 0xc833, 0xc834, 0xc835, 0xc836, 0xc837, 0xc839, 0xc83a, 0xc83b, 0xc83d, 0xc83e, 0xc83f, 0xc841, 0xc842, 0xc843, 0xc844, 0xc845, 0xc846, 0xc847, 0xc84a, 0xc84b, 0xc84e, 0xc84f, 0xc850, 0xc851, 0xc852, 0xc853, 0xc855, 0xc856, 0xc857, 0xc858, 0xc859, 0xc85a, 0xc85b, 0xc85c, 0xc85d, 0xc85e, 0xc85f, 0xc860, 0xc861, 0xc862, 0xc863, 0xc864, 0xc865, 0xc866, 0xc867, 0xc868, 0xc869, 0xc86a, 0xc86b, 0xc86c, 0xc86d, 0xc86e, 0xc86f, 0xc872, 0xc873, 0xc875, 0xc876, 0xc877, 0xc879, 0xc87b, 0xc87c, 0xc87d, 0xc87e, 0xc87f, 0xc882, 0xc884, 0xc888, 0xc889, 0xc88a, 0xc88e, 0xc88f, 0xc890, 0xc891, 0xc892, 0xc893, 0xc895, 0xc896, 0xc897, 0xc898, 0xc899, 0xc89a, 0xc89b, 0xc89c, 0xc89e, 0xc8a0, 0xc8a2, 0xc8a3, 0xc8a4, 0xc8a5, 0xc8a6, 0xc8a7, 0xc8a9, 0xc8aa, 0xc8ab, 0xc8ac, 0xc8ad, 0xc8ae, 0xc8af, 0xc8b0, 0xc8b1, 0xc8b2, 0xc8b3, 0xc8b4, 0xc8b5, 0xc8b6, 0xc8b7, 0xc8b8, 0xc8b9, 0xc8ba, 0xc8bb, 0xc8be, 0xc8bf, 0xc8c0, 0xc8c1, 0xc8c2, 0xc8c3, 0xc8c5, 0xc8c6, 0xc8c7, 0xc8c9, 0xc8ca, 0xc8cb, 0xc8cd, 0xc8ce, 0xc8cf, 0xc8d0, 0xc8d1, 0xc8d2, 0xc8d3, 0xc8d6, 0xc8d8, 0xc8da, 0xc8db, 0xc8dc, 0xc8dd, 0xc8de, 0xc8df, 0xc8e2, 0xc8e3, 0xc8e5, 0xc8e6, 0xc8e7, 0xc8e8, 0xc8e9, 0xc8ea, 0xc8eb, 0xc8ec, 0xc8ed, 0xc8ee, 0xc8ef, 0xc8f0, 0xc8f1, 0xc8f2, 0xc8f3, 0xc8f4, 0xc8f6, 0xc8f7, 0xc8f8, 0xc8f9, 0xc8fa, 0xc8fb, 0xc8fe, 0xc8ff, 0xc901, 0xc902, 0xc903, 0xc907, 0xc908, 0xc909, 0xc90a, 0xc90b, 0xc90e, 0xc910, 0xc912, 0xc913, 0xc914, 0xc915, 0xc916, 0xc917, 0xc919, 0xc91a, 0xc91b, 0xc91c, 0xc91d, 0xc91e, 0xc91f, 0xc920, 0xc921, 0xc922, 0xc923, 0xc924, 0xc925, 0xc926, 0xc927, 0xc928, 0xc929, 0xc92a, 0xc92b, 0xc92d, 0xc92e, 0xc92f, 0xc930, 0xc931, 0xc932, 0xc933, 0xc935, 0xc936, 0xc937, 0xc938, 0xc939, 0xc93a, 0xc93b, 0xc93c, 0xc93d, 0xc93e, 0xc93f, 0xc940, 0xc941, 0xc942, 0xc943, 0xc944, 0xc945, 0xc946, 0xc947, 0xc948, 0xc949, 0xc94a, 0xc94b, 0xc94c, 0xc94d, 0xc94e, 0xc94f, 0xc952, 0xc953, 0xc955, 0xc956, 0xc957, 0xc959, 0xc95a, 0xc95b, 0xc95c, 0xc95d, 0xc95e, 0xc95f, 0xc962, 0xc964, 0xc965, 0xc966, 0xc967, 0xc968, 0xc969, 0xc96a, 0xc96b, 0xc96d, 0xc96e, 0xc96f, 0xc971, 0xc972, 0xc973, 0xc975, 0xc976, 0xc977, 0xc978, 0xc979, 0xc97a, 0xc97b, 0xc97d, 0xc97e, 0xc97f, 0xc980, 0xc981, 0xc982, 0xc983, 0xc984, 0xc985, 0xc986, 0xc987, 0xc98a, 0xc98b, 0xc98d, 0xc98e, 0xc98f, 0xc991, 0xc992, 0xc993, 0xc994, 0xc995, 0xc996, 0xc997, 0xc99a, 0xc99c, 0xc99e, 0xc99f, 0xc9a0, 0xc9a1, 0xc9a2, 0xc9a3, 0xc9a4, 0xc9a5, 0xc9a6, 0xc9a7, 0xc9a8, 0xc9a9, 0xc9aa, 0xc9ab, 0xc9ac, 0xc9ad, 0xc9ae, 0xc9af, 0xc9b0, 0xc9b1, 0xc9b2, 0xc9b3, 0xc9b4, 0xc9b5, 0xc9b6, 0xc9b7, 0xc9b8, 0xc9b9, 0xc9ba, 0xc9bb, 0xc9bc, 0xc9bd, 0xc9be, 0xc9bf, 0xc9c2, 0xc9c3, 0xc9c5, 0xc9c6, 0xc9c9, 0xc9cb, 0xc9cc, 0xc9cd, 0xc9ce, 0xc9cf, 0xc9d2, 0xc9d4, 0xc9d7, 0xc9d8, 0xc9db, 0xc9de, 0xc9df, 0xc9e1, 0xc9e3, 0xc9e5, 0xc9e6, 0xc9e8, 0xc9e9, 0xc9ea, 0xc9eb, 0xc9ee, 0xc9f2, 0xc9f3, 0xc9f4, 0xc9f5, 0xc9f6, 0xc9f7, 0xc9fa, 0xc9fb, 0xc9fd, 0xc9fe, 0xc9ff, 0xca01, 0xca02, 0xca03, 0xca04, 0xca05, 0xca06, 0xca07, 0xca0a, 0xca0e, 0xca0f, 0xca10, 0xca11, 0xca12, 0xca13, 0xca15, 0xca16, 0xca17, 0xca19, 0xca1a, 0xca1b, 0xca1c, 0xca1d, 0xca1e, 0xca1f, 0xca20, 0xca21, 0xca22, 0xca23, 0xca24, 0xca25, 0xca26, 0xca27, 0xca28, 0xca2a, 0xca2b, 0xca2c, 0xca2d, 0xca2e, 0xca2f, 0xca30, 0xca31, 0xca32, 0xca33, 0xca34, 0xca35, 0xca36, 0xca37, 0xca38, 0xca39, 0xca3a, 0xca3b, 0xca3c, 0xca3d, 0xca3e, 0xca3f, 0xca40, 0xca41, 0xca42, 0xca43, 0xca44, 0xca45, 0xca46, 0xca47, 0xca48, 0xca49, 0xca4a, 0xca4b, 0xca4e, 0xca4f, 0xca51, 0xca52, 0xca53, 0xca55, 0xca56, 0xca57, 0xca58, 0xca59, 0xca5a, 0xca5b, 0xca5e, 0xca62, 0xca63, 0xca64, 0xca65, 0xca66, 0xca67, 0xca69, 0xca6a, 0xca6b, 0xca6c, 0xca6d, 0xca6e, 0xca6f, 0xca70, 0xca71, 0xca72, 0xca73, 0xca74, 0xca75, 0xca76, 0xca77, 0xca78, 0xca79, 0xca7a, 0xca7b, 0xca7c, 0xca7e, 0xca7f, 0xca80, 0xca81, 0xca82, 0xca83, 0xca85, 0xca86, 0xca87, 0xca88, 0xca89, 0xca8a, 0xca8b, 0xca8c, 0xca8d, 0xca8e, 0xca8f, 0xca90, 0xca91, 0xca92, 0xca93, 0xca94, 0xca95, 0xca96, 0xca97, 0xca99, 0xca9a, 0xca9b, 0xca9c, 0xca9d, 0xca9e, 0xca9f, 0xcaa0, 0xcaa1, 0xcaa2, 0xcaa3, 0xcaa4, 0xcaa5, 0xcaa6, 0xcaa7, 0xcaa8, 0xcaa9, 0xcaaa, 0xcaab, 0xcaac, 0xcaad, 0xcaae, 0xcaaf, 0xcab0, 0xcab1, 0xcab2, 0xcab3, 0xcab4, 0xcab5, 0xcab6, 0xcab7, 0xcab8, 0xcab9, 0xcaba, 0xcabb, 0xcabe, 0xcabf, 0xcac1, 0xcac2, 0xcac3, 0xcac5, 0xcac6, 0xcac7, 0xcac8, 0xcac9, 0xcaca, 0xcacb, 0xcace, 0xcad0, 0xcad2, 0xcad4, 0xcad5, 0xcad6, 0xcad7, 0xcada, 0xcadb, 0xcadc, 0xcadd, 0xcade, 0xcadf, 0xcae1, 0xcae2, 0xcae3, 0xcae4, 0xcae5, 0xcae6, 0xcae7, 0xcae8, 0xcae9, 0xcaea, 0xcaeb, 0xcaed, 0xcaee, 0xcaef, 0xcaf0, 0xcaf1, 0xcaf2, 0xcaf3, 0xcaf5, 0xcaf6, 0xcaf7, 0xcaf8, 0xcaf9, 0xcafa, 0xcafb, 0xcafc, 0xcafd, 0xcafe, 0xcaff, 0xcb00, 0xcb01, 0xcb02, 0xcb03, 0xcb04, 0xcb05, 0xcb06, 0xcb07, 0xcb09, 0xcb0a, 0xcb0b, 0xcb0c, 0xcb0d, 0xcb0e, 0xcb0f, 0xcb11, 0xcb12, 0xcb13, 0xcb15, 0xcb16, 0xcb17, 0xcb19, 0xcb1a, 0xcb1b, 0xcb1c, 0xcb1d, 0xcb1e, 0xcb1f, 0xcb22, 0xcb23, 0xcb24, 0xcb25, 0xcb26, 0xcb27, 0xcb28, 0xcb29, 0xcb2a, 0xcb2b, 0xcb2c, 0xcb2d, 0xcb2e, 0xcb2f, 0xcb30, 0xcb31, 0xcb32, 0xcb33, 0xcb34, 0xcb35, 0xcb36, 0xcb37, 0xcb38, 0xcb39, 0xcb3a, 0xcb3b, 0xcb3c, 0xcb3d, 0xcb3e, 0xcb3f, 0xcb40, 0xcb42, 0xcb43, 0xcb44, 0xcb45, 0xcb46, 0xcb47, 0xcb4a, 0xcb4b, 0xcb4d, 0xcb4e, 0xcb4f, 0xcb51, 0xcb52, 0xcb53, 0xcb54, 0xcb55, 0xcb56, 0xcb57, 0xcb5a, 0xcb5b, 0xcb5c, 0xcb5e, 0xcb5f, 0xcb60, 0xcb61, 0xcb62, 0xcb63, 0xcb65, 0xcb66, 0xcb67, 0xcb68, 0xcb69, 0xcb6a, 0xcb6b, 0xcb6c, 0xcb6d, 0xcb6e, 0xcb6f, 0xcb70, 0xcb71, 0xcb72, 0xcb73, 0xcb74, 0xcb75, 0xcb76, 0xcb77, 0xcb7a, 0xcb7b, 0xcb7c, 0xcb7d, 0xcb7e, 0xcb7f, 0xcb80, 0xcb81, 0xcb82, 0xcb83, 0xcb84, 0xcb85, 0xcb86, 0xcb87, 0xcb88, 0xcb89, 0xcb8a, 0xcb8b, 0xcb8c, 0xcb8d, 0xcb8e, 0xcb8f, 0xcb90, 0xcb91, 0xcb92, 0xcb93, 0xcb94, 0xcb95, 0xcb96, 0xcb97, 0xcb98, 0xcb99, 0xcb9a, 0xcb9b, 0xcb9d, 0xcb9e, 0xcb9f, 0xcba0, 0xcba1, 0xcba2, 0xcba3, 0xcba4, 0xcba5, 0xcba6, 0xcba7, 0xcba8, 0xcba9, 0xcbaa, 0xcbab, 0xcbac, 0xcbad, 0xcbae, 0xcbaf, 0xcbb0, 0xcbb1, 0xcbb2, 0xcbb3, 0xcbb4, 0xcbb5, 0xcbb6, 0xcbb7, 0xcbb9, 0xcbba, 0xcbbb, 0xcbbc, 0xcbbd, 0xcbbe, 0xcbbf, 0xcbc0, 0xcbc1, 0xcbc2, 0xcbc3, 0xcbc4, 0xcbc5, 0xcbc6, 0xcbc7, 0xcbc8, 0xcbc9, 0xcbca, 0xcbcb, 0xcbcc, 0xcbcd, 0xcbce, 0xcbcf, 0xcbd0, 0xcbd1, 0xcbd2, 0xcbd3, 0xcbd5, 0xcbd6, 0xcbd7, 0xcbd8, 0xcbd9, 0xcbda, 0xcbdb, 0xcbdc, 0xcbdd, 0xcbde, 0xcbdf, 0xcbe0, 0xcbe1, 0xcbe2, 0xcbe3, 0xcbe5, 0xcbe6, 0xcbe8, 0xcbea, 0xcbeb, 0xcbec, 0xcbed, 0xcbee, 0xcbef, 0xcbf0, 0xcbf1, 0xcbf2, 0xcbf3, 0xcbf4, 0xcbf5, 0xcbf6, 0xcbf7, 0xcbf8, 0xcbf9, 0xcbfa, 0xcbfb, 0xcbfc, 0xcbfd, 0xcbfe, 0xcbff, 0xcc00, 0xcc01, 0xcc02, 0xcc03, 0xcc04, 0xcc05, 0xcc06, 0xcc07, 0xcc08, 0xcc09, 0xcc0a, 0xcc0b, 0xcc0e, 0xcc0f, 0xcc11, 0xcc12, 0xcc13, 0xcc15, 0xcc16, 0xcc17, 0xcc18, 0xcc19, 0xcc1a, 0xcc1b, 0xcc1e, 0xcc1f, 0xcc20, 0xcc23, 0xcc24, 0xcc25, 0xcc26, 0xcc2a, 0xcc2b, 0xcc2d, 0xcc2f, 0xcc31, 0xcc32, 0xcc33, 0xcc34, 0xcc35, 0xcc36, 0xcc37, 0xcc3a, 0xcc3f, 0xcc40, 0xcc41, 0xcc42, 0xcc43, 0xcc46, 0xcc47, 0xcc49, 0xcc4a, 0xcc4b, 0xcc4d, 0xcc4e, 0xcc4f, 0xcc50, 0xcc51, 0xcc52, 0xcc53, 0xcc56, 0xcc5a, 0xcc5b, 0xcc5c, 0xcc5d, 0xcc5e, 0xcc5f, 0xcc61, 0xcc62, 0xcc63, 0xcc65, 0xcc67, 0xcc69, 0xcc6a, 0xcc6b, 0xcc6c, 0xcc6d, 0xcc6e, 0xcc6f, 0xcc71, 0xcc72, 0xcc73, 0xcc74, 0xcc76, 0xcc77, 0xcc78, 0xcc79, 0xcc7a, 0xcc7b, 0xcc7c, 0xcc7d, 0xcc7e, 0xcc7f, 0xcc80, 0xcc81, 0xcc82, 0xcc83, 0xcc84, 0xcc85, 0xcc86, 0xcc87, 0xcc88, 0xcc89, 0xcc8a, 0xcc8b, 0xcc8c, 0xcc8d, 0xcc8e, 0xcc8f, 0xcc90, 0xcc91, 0xcc92, 0xcc93, 0xcc94, 0xcc95, 0xcc96, 0xcc97, 0xcc9a, 0xcc9b, 0xcc9d, 0xcc9e, 0xcc9f, 0xcca1, 0xcca2, 0xcca3, 0xcca4, 0xcca5, 0xcca6, 0xcca7, 0xccaa, 0xccae, 0xccaf, 0xccb0, 0xccb1, 0xccb2, 0xccb3, 0xccb6, 0xccb7, 0xccb9, 0xccba, 0xccbb, 0xccbd, 0xccbe, 0xccbf, 0xccc0, 0xccc1, 0xccc2, 0xccc3, 0xccc6, 0xccc8, 0xccca, 0xcccb, 0xcccc, 0xcccd, 0xccce, 0xcccf, 0xccd1, 0xccd2, 0xccd3, 0xccd5, 0xccd6, 0xccd7, 0xccd8, 0xccd9, 0xccda, 0xccdb, 0xccdc, 0xccdd, 0xccde, 0xccdf, 0xcce0, 0xcce1, 0xcce2, 0xcce3, 0xcce5, 0xcce6, 0xcce7, 0xcce8, 0xcce9, 0xccea, 0xcceb, 0xcced, 0xccee, 0xccef, 0xccf1, 0xccf2, 0xccf3, 0xccf4, 0xccf5, 0xccf6, 0xccf7, 0xccf8, 0xccf9, 0xccfa, 0xccfb, 0xccfc, 0xccfd, 0xccfe, 0xccff, 0xcd00, 0xcd02, 0xcd03, 0xcd04, 0xcd05, 0xcd06, 0xcd07, 0xcd0a, 0xcd0b, 0xcd0d, 0xcd0e, 0xcd0f, 0xcd11, 0xcd12, 0xcd13, 0xcd14, 0xcd15, 0xcd16, 0xcd17, 0xcd1a, 0xcd1c, 0xcd1e, 0xcd1f, 0xcd20, 0xcd21, 0xcd22, 0xcd23, 0xcd25, 0xcd26, 0xcd27, 0xcd29, 0xcd2a, 0xcd2b, 0xcd2d, 0xcd2e, 0xcd2f, 0xcd30, 0xcd31, 0xcd32, 0xcd33, 0xcd34, 0xcd35, 0xcd36, 0xcd37, 0xcd38, 0xcd3a, 0xcd3b, 0xcd3c, 0xcd3d, 0xcd3e, 0xcd3f, 0xcd40, 0xcd41, 0xcd42, 0xcd43, 0xcd44, 0xcd45, 0xcd46, 0xcd47, 0xcd48, 0xcd49, 0xcd4a, 0xcd4b, 0xcd4c, 0xcd4d, 0xcd4e, 0xcd4f, 0xcd50, 0xcd51, 0xcd52, 0xcd53, 0xcd54, 0xcd55, 0xcd56, 0xcd57, 0xcd58, 0xcd59, 0xcd5a, 0xcd5b, 0xcd5d, 0xcd5e, 0xcd5f, 0xcd61, 0xcd62, 0xcd63, 0xcd65, 0xcd66, 0xcd67, 0xcd68, 0xcd69, 0xcd6a, 0xcd6b, 0xcd6e, 0xcd70, 0xcd72, 0xcd73, 0xcd74, 0xcd75, 0xcd76, 0xcd77, 0xcd79, 0xcd7a, 0xcd7b, 0xcd7c, 0xcd7d, 0xcd7e, 0xcd7f, 0xcd80, 0xcd81, 0xcd82, 0xcd83, 0xcd84, 0xcd85, 0xcd86, 0xcd87, 0xcd89, 0xcd8a, 0xcd8b, 0xcd8c, 0xcd8d, 0xcd8e, 0xcd8f, 0xcd90, 0xcd91, 0xcd92, 0xcd93, 0xcd96, 0xcd97, 0xcd99, 0xcd9a, 0xcd9b, 0xcd9d, 0xcd9e, 0xcd9f, 0xcda0, 0xcda1, 0xcda2, 0xcda3, 0xcda6, 0xcda8, 0xcdaa, 0xcdab, 0xcdac, 0xcdad, 0xcdae, 0xcdaf, 0xcdb1, 0xcdb2, 0xcdb3, 0xcdb4, 0xcdb5, 0xcdb6, 0xcdb7, 0xcdb8, 0xcdb9, 0xcdba, 0xcdbb, 0xcdbc, 0xcdbd, 0xcdbe, 0xcdbf, 0xcdc0, 0xcdc1, 0xcdc2, 0xcdc3, 0xcdc5, 0xcdc6, 0xcdc7, 0xcdc8, 0xcdc9, 0xcdca, 0xcdcb, 0xcdcd, 0xcdce, 0xcdcf, 0xcdd1, 0xcdd2, 0xcdd3, 0xcdd4, 0xcdd5, 0xcdd6, 0xcdd7, 0xcdd8, 0xcdd9, 0xcdda, 0xcddb, 0xcddc, 0xcddd, 0xcdde, 0xcddf, 0xcde0, 0xcde1, 0xcde2, 0xcde3, 0xcde4, 0xcde5, 0xcde6, 0xcde7, 0xcde9, 0xcdea, 0xcdeb, 0xcded, 0xcdee, 0xcdef, 0xcdf1, 0xcdf2, 0xcdf3, 0xcdf4, 0xcdf5, 0xcdf6, 0xcdf7, 0xcdfa, 0xcdfc, 0xcdfe, 0xcdff, 0xce00, 0xce01, 0xce02, 0xce03, 0xce05, 0xce06, 0xce07, 0xce09, 0xce0a, 0xce0b, 0xce0d, 0xce0e, 0xce0f, 0xce10, 0xce11, 0xce12, 0xce13, 0xce15, 0xce16, 0xce17, 0xce18, 0xce1a, 0xce1b, 0xce1c, 0xce1d, 0xce1e, 0xce1f, 0xce22, 0xce23, 0xce25, 0xce26, 0xce27, 0xce29, 0xce2a, 0xce2b, 0xce2c, 0xce2d, 0xce2e, 0xce2f, 0xce32, 0xce34, 0xce36, 0xce37, 0xce38, 0xce39, 0xce3a, 0xce3b, 0xce3c, 0xce3d, 0xce3e, 0xce3f, 0xce40, 0xce41, 0xce42, 0xce43, 0xce44, 0xce45, 0xce46, 0xce47, 0xce48, 0xce49, 0xce4a, 0xce4b, 0xce4c, 0xce4d, 0xce4e, 0xce4f, 0xce50, 0xce51, 0xce52, 0xce53, 0xce54, 0xce55, 0xce56, 0xce57, 0xce5a, 0xce5b, 0xce5d, 0xce5e, 0xce62, 0xce63, 0xce64, 0xce65, 0xce66, 0xce67, 0xce6a, 0xce6c, 0xce6e, 0xce6f, 0xce70, 0xce71, 0xce72, 0xce73, 0xce76, 0xce77, 0xce79, 0xce7a, 0xce7b, 0xce7d, 0xce7e, 0xce7f, 0xce80, 0xce81, 0xce82, 0xce83, 0xce86, 0xce88, 0xce8a, 0xce8b, 0xce8c, 0xce8d, 0xce8e, 0xce8f, 0xce92, 0xce93, 0xce95, 0xce96, 0xce97, 0xce99, 0xce9a, 0xce9b, 0xce9c, 0xce9d, 0xce9e, 0xce9f, 0xcea2, 0xcea6, 0xcea7, 0xcea8, 0xcea9, 0xceaa, 0xceab, 0xceae, 0xceaf, 0xceb0, 0xceb1, 0xceb2, 0xceb3, 0xceb4, 0xceb5, 0xceb6, 0xceb7, 0xceb8, 0xceb9, 0xceba, 0xcebb, 0xcebc, 0xcebd, 0xcebe, 0xcebf, 0xcec0, 0xcec2, 0xcec3, 0xcec4, 0xcec5, 0xcec6, 0xcec7, 0xcec8, 0xcec9, 0xceca, 0xcecb, 0xcecc, 0xcecd, 0xcece, 0xcecf, 0xced0, 0xced1, 0xced2, 0xced3, 0xced4, 0xced5, 0xced6, 0xced7, 0xced8, 0xced9, 0xceda, 0xcedb, 0xcedc, 0xcedd, 0xcede, 0xcedf, 0xcee0, 0xcee1, 0xcee2, 0xcee3, 0xcee6, 0xcee7, 0xcee9, 0xceea, 0xceed, 0xceee, 0xceef, 0xcef0, 0xcef1, 0xcef2, 0xcef3, 0xcef6, 0xcefa, 0xcefb, 0xcefc, 0xcefd, 0xcefe, 0xceff, 0xcf02, 0xcf03, 0xcf05, 0xcf06, 0xcf07, 0xcf09, 0xcf0a, 0xcf0b, 0xcf0c, 0xcf0d, 0xcf0e, 0xcf0f, 0xcf12, 0xcf14, 0xcf16, 0xcf17, 0xcf18, 0xcf19, 0xcf1a, 0xcf1b, 0xcf1d, 0xcf1e, 0xcf1f, 0xcf21, 0xcf22, 0xcf23, 0xcf25, 0xcf26, 0xcf27, 0xcf28, 0xcf29, 0xcf2a, 0xcf2b, 0xcf2e, 0xcf32, 0xcf33, 0xcf34, 0xcf35, 0xcf36, 0xcf37, 0xcf39, 0xcf3a, 0xcf3b, 0xcf3c, 0xcf3d, 0xcf3e, 0xcf3f, 0xcf40, 0xcf41, 0xcf42, 0xcf43, 0xcf44, 0xcf45, 0xcf46, 0xcf47, 0xcf48, 0xcf49, 0xcf4a, 0xcf4b, 0xcf4c, 0xcf4d, 0xcf4e, 0xcf4f, 0xcf50, 0xcf51, 0xcf52, 0xcf53, 0xcf56, 0xcf57, 0xcf59, 0xcf5a, 0xcf5b, 0xcf5d, 0xcf5e, 0xcf5f, 0xcf60, 0xcf61, 0xcf62, 0xcf63, 0xcf66, 0xcf68, 0xcf6a, 0xcf6b, 0xcf6c, 0xcf6d, 0xcf6e, 0xcf6f, 0xcf72, 0xcf73, 0xcf75, 0xcf76, 0xcf77, 0xcf79, 0xcf7a, 0xcf7b, 0xcf7c, 0xcf7d, 0xcf7e, 0xcf7f, 0xcf81, 0xcf82, 0xcf83, 0xcf84, 0xcf86, 0xcf87, 0xcf88, 0xcf89, 0xcf8a, 0xcf8b, 0xcf8d, 0xcf8e, 0xcf8f, 0xcf90, 0xcf91, 0xcf92, 0xcf93, 0xcf94, 0xcf95, 0xcf96, 0xcf97, 0xcf98, 0xcf99, 0xcf9a, 0xcf9b, 0xcf9c, 0xcf9d, 0xcf9e, 0xcf9f, 0xcfa0, 0xcfa2, 0xcfa3, 0xcfa4, 0xcfa5, 0xcfa6, 0xcfa7, 0xcfa9, 0xcfaa, 0xcfab, 0xcfac, 0xcfad, 0xcfae, 0xcfaf, 0xcfb1, 0xcfb2, 0xcfb3, 0xcfb4, 0xcfb5, 0xcfb6, 0xcfb7, 0xcfb8, 0xcfb9, 0xcfba, 0xcfbb, 0xcfbc, 0xcfbd, 0xcfbe, 0xcfbf, 0xcfc0, 0xcfc1, 0xcfc2, 0xcfc3, 0xcfc5, 0xcfc6, 0xcfc7, 0xcfc8, 0xcfc9, 0xcfca, 0xcfcb, 0xcfcc, 0xcfcd, 0xcfce, 0xcfcf, 0xcfd0, 0xcfd1, 0xcfd2, 0xcfd3, 0xcfd4, 0xcfd5, 0xcfd6, 0xcfd7, 0xcfd8, 0xcfd9, 0xcfda, 0xcfdb, 0xcfdc, 0xcfdd, 0xcfde, 0xcfdf, 0xcfe2, 0xcfe3, 0xcfe5, 0xcfe6, 0xcfe7, 0xcfe9, 0xcfea, 0xcfeb, 0xcfec, 0xcfed, 0xcfee, 0xcfef, 0xcff2, 0xcff4, 0xcff6, 0xcff7, 0xcff8, 0xcff9, 0xcffa, 0xcffb, 0xcffd, 0xcffe, 0xcfff, 0xd001, 0xd002, 0xd003, 0xd005, 0xd006, 0xd007, 0xd008, 0xd009, 0xd00a, 0xd00b, 0xd00c, 0xd00d, 0xd00e, 0xd00f, 0xd010, 0xd012, 0xd013, 0xd014, 0xd015, 0xd016, 0xd017, 0xd019, 0xd01a, 0xd01b, 0xd01c, 0xd01d, 0xd01e, 0xd01f, 0xd020, 0xd021, 0xd022, 0xd023, 0xd024, 0xd025, 0xd026, 0xd027, 0xd028, 0xd029, 0xd02a, 0xd02b, 0xd02c, 0xd02e, 0xd02f, 0xd030, 0xd031, 0xd032, 0xd033, 0xd036, 0xd037, 0xd039, 0xd03a, 0xd03b, 0xd03d, 0xd03e, 0xd03f, 0xd040, 0xd041, 0xd042, 0xd043, 0xd046, 0xd048, 0xd04a, 0xd04b, 0xd04c, 0xd04d, 0xd04e, 0xd04f, 0xd051, 0xd052, 0xd053, 0xd055, 0xd056, 0xd057, 0xd059, 0xd05a, 0xd05b, 0xd05c, 0xd05d, 0xd05e, 0xd05f, 0xd061, 0xd062, 0xd063, 0xd064, 0xd065, 0xd066, 0xd067, 0xd068, 0xd069, 0xd06a, 0xd06b, 0xd06e, 0xd06f, 0xd071, 0xd072, 0xd073, 0xd075, 0xd076, 0xd077, 0xd078, 0xd079, 0xd07a, 0xd07b, 0xd07e, 0xd07f, 0xd080, 0xd082, 0xd083, 0xd084, 0xd085, 0xd086, 0xd087, 0xd088, 0xd089, 0xd08a, 0xd08b, 0xd08c, 0xd08d, 0xd08e, 0xd08f, 0xd090, 0xd091, 0xd092, 0xd093, 0xd094, 0xd095, 0xd096, 0xd097, 0xd098, 0xd099, 0xd09a, 0xd09b, 0xd09c, 0xd09d, 0xd09e, 0xd09f, 0xd0a0, 0xd0a1, 0xd0a2, 0xd0a3, 0xd0a6, 0xd0a7, 0xd0a9, 0xd0aa, 0xd0ab, 0xd0ad, 0xd0ae, 0xd0af, 0xd0b0, 0xd0b1, 0xd0b2, 0xd0b3, 0xd0b6, 0xd0b8, 0xd0ba, 0xd0bb, 0xd0bc, 0xd0bd, 0xd0be, 0xd0bf, 0xd0c2, 0xd0c3, 0xd0c5, 0xd0c6, 0xd0c7, 0xd0ca, 0xd0cb, 0xd0cc, 0xd0cd, 0xd0ce, 0xd0cf, 0xd0d2, 0xd0d6, 0xd0d7, 0xd0d8, 0xd0d9, 0xd0da, 0xd0db, 0xd0de, 0xd0df, 0xd0e1, 0xd0e2, 0xd0e3, 0xd0e5, 0xd0e6, 0xd0e7, 0xd0e8, 0xd0e9, 0xd0ea, 0xd0eb, 0xd0ee, 0xd0f2, 0xd0f3, 0xd0f4, 0xd0f5, 0xd0f6, 0xd0f7, 0xd0f9, 0xd0fa, 0xd0fb, 0xd0fc, 0xd0fd, 0xd0fe, 0xd0ff, 0xd100, 0xd101, 0xd102, 0xd103, 0xd104, 0xd105, 0xd106, 0xd107, 0xd108, 0xd109, 0xd10a, 0xd10b, 0xd10c, 0xd10e, 0xd10f, 0xd110, 0xd111, 0xd112, 0xd113, 0xd114, 0xd115, 0xd116, 0xd117, 0xd118, 0xd119, 0xd11a, 0xd11b, 0xd11c, 0xd11d, 0xd11e, 0xd11f, 0xd120, 0xd121, 0xd122, 0xd123, 0xd124, 0xd125, 0xd126, 0xd127, 0xd128, 0xd129, 0xd12a, 0xd12b, 0xd12c, 0xd12d, 0xd12e, 0xd12f, 0xd132, 0xd133, 0xd135, 0xd136, 0xd137, 0xd139, 0xd13b, 0xd13c, 0xd13d, 0xd13e, 0xd13f, 0xd142, 0xd146, 0xd147, 0xd148, 0xd149, 0xd14a, 0xd14b, 0xd14e, 0xd14f, 0xd151, 0xd152, 0xd153, 0xd155, 0xd156, 0xd157, 0xd158, 0xd159, 0xd15a, 0xd15b, 0xd15e, 0xd160, 0xd162, 0xd163, 0xd164, 0xd165, 0xd166, 0xd167, 0xd169, 0xd16a, 0xd16b, 0xd16d, 0xd16e, 0xd16f, 0xd170, 0xd171, 0xd172, 0xd173, 0xd174, 0xd175, 0xd176, 0xd177, 0xd178, 0xd179, 0xd17a, 0xd17b, 0xd17d, 0xd17e, 0xd17f, 0xd180, 0xd181, 0xd182, 0xd183, 0xd185, 0xd186, 0xd187, 0xd189, 0xd18a, 0xd18b, 0xd18c, 0xd18d, 0xd18e, 0xd18f, 0xd190, 0xd191, 0xd192, 0xd193, 0xd194, 0xd195, 0xd196, 0xd197, 0xd198, 0xd199, 0xd19a, 0xd19b, 0xd19c, 0xd19d, 0xd19e, 0xd19f, 0xd1a2, 0xd1a3, 0xd1a5, 0xd1a6, 0xd1a7, 0xd1a9, 0xd1aa, 0xd1ab, 0xd1ac, 0xd1ad, 0xd1ae, 0xd1af, 0xd1b2, 0xd1b4, 0xd1b6, 0xd1b7, 0xd1b8, 0xd1b9, 0xd1bb, 0xd1bd, 0xd1be, 0xd1bf, 0xd1c1, 0xd1c2, 0xd1c3, 0xd1c4, 0xd1c5, 0xd1c6, 0xd1c7, 0xd1c8, 0xd1c9, 0xd1ca, 0xd1cb, 0xd1cc, 0xd1cd, 0xd1ce, 0xd1cf, 0xd1d0, 0xd1d1, 0xd1d2, 0xd1d3, 0xd1d4, 0xd1d5, 0xd1d6, 0xd1d7, 0xd1d9, 0xd1da, 0xd1db, 0xd1dc, 0xd1dd, 0xd1de, 0xd1df, 0xd1e0, 0xd1e1, 0xd1e2, 0xd1e3, 0xd1e4, 0xd1e5, 0xd1e6, 0xd1e7, 0xd1e8, 0xd1e9, 0xd1ea, 0xd1eb, 0xd1ec, 0xd1ed, 0xd1ee, 0xd1ef, 0xd1f0, 0xd1f1, 0xd1f2, 0xd1f3, 0xd1f5, 0xd1f6, 0xd1f7, 0xd1f9, 0xd1fa, 0xd1fb, 0xd1fc, 0xd1fd, 0xd1fe, 0xd1ff, 0xd200, 0xd201, 0xd202, 0xd203, 0xd204, 0xd205, 0xd206, 0xd208, 0xd20a, 0xd20b, 0xd20c, 0xd20d, 0xd20e, 0xd20f, 0xd211, 0xd212, 0xd213, 0xd214, 0xd215, 0xd216, 0xd217, 0xd218, 0xd219, 0xd21a, 0xd21b, 0xd21c, 0xd21d, 0xd21e, 0xd21f, 0xd220, 0xd221, 0xd222, 0xd223, 0xd224, 0xd225, 0xd226, 0xd227, 0xd228, 0xd229, 0xd22a, 0xd22b, 0xd22e, 0xd22f, 0xd231, 0xd232, 0xd233, 0xd235, 0xd236, 0xd237, 0xd238, 0xd239, 0xd23a, 0xd23b, 0xd23e, 0xd240, 0xd242, 0xd243, 0xd244, 0xd245, 0xd246, 0xd247, 0xd249, 0xd24a, 0xd24b, 0xd24c, 0xd24d, 0xd24e, 0xd24f, 0xd250, 0xd251, 0xd252, 0xd253, 0xd254, 0xd255, 0xd256, 0xd257, 0xd258, 0xd259, 0xd25a, 0xd25b, 0xd25d, 0xd25e, 0xd25f, 0xd260, 0xd261, 0xd262, 0xd263, 0xd265, 0xd266, 0xd267, 0xd268, 0xd269, 0xd26a, 0xd26b, 0xd26c, 0xd26d, 0xd26e, 0xd26f, 0xd270, 0xd271, 0xd272, 0xd273, 0xd274, 0xd275, 0xd276, 0xd277, 0xd278, 0xd279, 0xd27a, 0xd27b, 0xd27c, 0xd27d, 0xd27e, 0xd27f, 0xd282, 0xd283, 0xd285, 0xd286, 0xd287, 0xd289, 0xd28a, 0xd28b, 0xd28c, 0xd28d, 0xd28e, 0xd28f, 0xd292, 0xd293, 0xd294, 0xd296, 0xd297, 0xd298, 0xd299, 0xd29a, 0xd29b, 0xd29d, 0xd29e, 0xd29f, 0xd2a1, 0xd2a2, 0xd2a3, 0xd2a5, 0xd2a6, 0xd2a7, 0xd2a8, 0xd2a9, 0xd2aa, 0xd2ab, 0xd2ad, 0xd2ae, 0xd2af, 0xd2b0, 0xd2b2, 0xd2b3, 0xd2b4, 0xd2b5, 0xd2b6, 0xd2b7, 0xd2ba, 0xd2bb, 0xd2bd, 0xd2be, 0xd2c1, 0xd2c3, 0xd2c4, 0xd2c5, 0xd2c6, 0xd2c7, 0xd2ca, 0xd2cc, 0xd2cd, 0xd2ce, 0xd2cf, 0xd2d0, 0xd2d1, 0xd2d2, 0xd2d3, 0xd2d5, 0xd2d6, 0xd2d7, 0xd2d9, 0xd2da, 0xd2db, 0xd2dd, 0xd2de, 0xd2df, 0xd2e0, 0xd2e1, 0xd2e2, 0xd2e3, 0xd2e6, 0xd2e7, 0xd2e8, 0xd2e9, 0xd2ea, 0xd2eb, 0xd2ec, 0xd2ed, 0xd2ee, 0xd2ef, 0xd2f2, 0xd2f3, 0xd2f5, 0xd2f6, 0xd2f7, 0xd2f9, 0xd2fa, 0xd2fb, 0xd2fc, 0xd2fd, 0xd2fe, 0xd2ff, 0xd302, 0xd304, 0xd306, 0xd307, 0xd308, 0xd309, 0xd30a, 0xd30b, 0xd30f, 0xd311, 0xd312, 0xd313, 0xd315, 0xd317, 0xd318, 0xd319, 0xd31a, 0xd31b, 0xd31e, 0xd322, 0xd323, 0xd324, 0xd326, 0xd327, 0xd32a, 0xd32b, 0xd32d, 0xd32e, 0xd32f, 0xd331, 0xd332, 0xd333, 0xd334, 0xd335, 0xd336, 0xd337, 0xd33a, 0xd33e, 0xd33f, 0xd340, 0xd341, 0xd342, 0xd343, 0xd346, 0xd347, 0xd348, 0xd349, 0xd34a, 0xd34b, 0xd34c, 0xd34d, 0xd34e, 0xd34f, 0xd350, 0xd351, 0xd352, 0xd353, 0xd354, 0xd355, 0xd356, 0xd357, 0xd358, 0xd359, 0xd35a, 0xd35b, 0xd35c, 0xd35d, 0xd35e, 0xd35f, 0xd360, 0xd361, 0xd362, 0xd363, 0xd364, 0xd365, 0xd366, 0xd367, 0xd368, 0xd369, 0xd36a, 0xd36b, 0xd36c, 0xd36d, 0xd36e, 0xd36f, 0xd370, 0xd371, 0xd372, 0xd373, 0xd374, 0xd375, 0xd376, 0xd377, 0xd378, 0xd379, 0xd37a, 0xd37b, 0xd37e, 0xd37f, 0xd381, 0xd382, 0xd383, 0xd385, 0xd386, 0xd387, 0xd388, 0xd389, 0xd38a, 0xd38b, 0xd38e, 0xd392, 0xd393, 0xd394, 0xd395, 0xd396, 0xd397, 0xd39a, 0xd39b, 0xd39d, 0xd39e, 0xd39f, 0xd3a1, 0xd3a2, 0xd3a3, 0xd3a4, 0xd3a5, 0xd3a6, 0xd3a7, 0xd3aa, 0xd3ac, 0xd3ae, 0xd3af, 0xd3b0, 0xd3b1, 0xd3b2, 0xd3b3, 0xd3b5, 0xd3b6, 0xd3b7, 0xd3b9, 0xd3ba, 0xd3bb, 0xd3bd, 0xd3be, 0xd3bf, 0xd3c0, 0xd3c1, 0xd3c2, 0xd3c3, 0xd3c6, 0xd3c7, 0xd3ca, 0xd3cb, 0xd3cc, 0xd3cd, 0xd3ce, 0xd3cf, 0xd3d1, 0xd3d2, 0xd3d3, 0xd3d4, 0xd3d5, 0xd3d6, 0xd3d7, 0xd3d9, 0xd3da, 0xd3db, 0xd3dc, 0xd3dd, 0xd3de, 0xd3df, 0xd3e0, 0xd3e2, 0xd3e4, 0xd3e5, 0xd3e6, 0xd3e7, 0xd3e8, 0xd3e9, 0xd3ea, 0xd3eb, 0xd3ee, 0xd3ef, 0xd3f1, 0xd3f2, 0xd3f3, 0xd3f5, 0xd3f6, 0xd3f7, 0xd3f8, 0xd3f9, 0xd3fa, 0xd3fb, 0xd3fe, 0xd400, 0xd402, 0xd403, 0xd404, 0xd405, 0xd406, 0xd407, 0xd409, 0xd40a, 0xd40b, 0xd40c, 0xd40d, 0xd40e, 0xd40f, 0xd410, 0xd411, 0xd412, 0xd413, 0xd414, 0xd415, 0xd416, 0xd417, 0xd418, 0xd419, 0xd41a, 0xd41b, 0xd41c, 0xd41e, 0xd41f, 0xd420, 0xd421, 0xd422, 0xd423, 0xd424, 0xd425, 0xd426, 0xd427, 0xd428, 0xd429, 0xd42a, 0xd42b, 0xd42c, 0xd42d, 0xd42e, 0xd42f, 0xd430, 0xd431, 0xd432, 0xd433, 0xd434, 0xd435, 0xd436, 0xd437, 0xd438, 0xd439, 0xd43a, 0xd43b, 0xd43c, 0xd43d, 0xd43e, 0xd43f, 0xd441, 0xd442, 0xd443, 0xd445, 0xd446, 0xd447, 0xd448, 0xd449, 0xd44a, 0xd44b, 0xd44c, 0xd44d, 0xd44e, 0xd44f, 0xd450, 0xd451, 0xd452, 0xd453, 0xd454, 0xd455, 0xd456, 0xd457, 0xd458, 0xd459, 0xd45a, 0xd45b, 0xd45d, 0xd45e, 0xd45f, 0xd461, 0xd462, 0xd463, 0xd465, 0xd466, 0xd467, 0xd468, 0xd469, 0xd46a, 0xd46b, 0xd46c, 0xd46e, 0xd470, 0xd471, 0xd472, 0xd473, 0xd474, 0xd475, 0xd476, 0xd477, 0xd47a, 0xd47b, 0xd47d, 0xd47e, 0xd481, 0xd483, 0xd484, 0xd485, 0xd486, 0xd487, 0xd48a, 0xd48c, 0xd48e, 0xd48f, 0xd490, 0xd491, 0xd492, 0xd493, 0xd495, 0xd496, 0xd497, 0xd498, 0xd499, 0xd49a, 0xd49b, 0xd49c, 0xd49d, 0xd49e, 0xd49f, 0xd4a0, 0xd4a1, 0xd4a2, 0xd4a3, 0xd4a4, 0xd4a5, 0xd4a6, 0xd4a7, 0xd4a8, 0xd4aa, 0xd4ab, 0xd4ac, 0xd4ad, 0xd4ae, 0xd4af, 0xd4b0, 0xd4b1, 0xd4b2, 0xd4b3, 0xd4b4, 0xd4b5, 0xd4b6, 0xd4b7, 0xd4b8, 0xd4b9, 0xd4ba, 0xd4bb, 0xd4bc, 0xd4bd, 0xd4be, 0xd4bf, 0xd4c0, 0xd4c1, 0xd4c2, 0xd4c3, 0xd4c4, 0xd4c5, 0xd4c6, 0xd4c7, 0xd4c8, 0xd4c9, 0xd4ca, 0xd4cb, 0xd4cd, 0xd4ce, 0xd4cf, 0xd4d1, 0xd4d2, 0xd4d3, 0xd4d5, 0xd4d6, 0xd4d7, 0xd4d8, 0xd4d9, 0xd4da, 0xd4db, 0xd4dd, 0xd4de, 0xd4e0, 0xd4e1, 0xd4e2, 0xd4e3, 0xd4e4, 0xd4e5, 0xd4e6, 0xd4e7, 0xd4e9, 0xd4ea, 0xd4eb, 0xd4ed, 0xd4ee, 0xd4ef, 0xd4f1, 0xd4f2, 0xd4f3, 0xd4f4, 0xd4f5, 0xd4f6, 0xd4f7, 0xd4f9, 0xd4fa, 0xd4fc, 0xd4fe, 0xd4ff, 0xd500, 0xd501, 0xd502, 0xd503, 0xd505, 0xd506, 0xd507, 0xd509, 0xd50a, 0xd50b, 0xd50d, 0xd50e, 0xd50f, 0xd510, 0xd511, 0xd512, 0xd513, 0xd516, 0xd518, 0xd519, 0xd51a, 0xd51b, 0xd51c, 0xd51d, 0xd51e, 0xd51f, 0xd520, 0xd521, 0xd522, 0xd523, 0xd524, 0xd525, 0xd526, 0xd527, 0xd528, 0xd529, 0xd52a, 0xd52b, 0xd52c, 0xd52d, 0xd52e, 0xd52f, 0xd530, 0xd531, 0xd532, 0xd533, 0xd534, 0xd535, 0xd536, 0xd537, 0xd538, 0xd539, 0xd53a, 0xd53b, 0xd53e, 0xd53f, 0xd541, 0xd542, 0xd543, 0xd545, 0xd546, 0xd547, 0xd548, 0xd549, 0xd54a, 0xd54b, 0xd54e, 0xd550, 0xd552, 0xd553, 0xd554, 0xd555, 0xd556, 0xd557, 0xd55a, 0xd55b, 0xd55d, 0xd55e, 0xd55f, 0xd561, 0xd562, 0xd563, 0xd564, 0xd566, 0xd567, 0xd56a, 0xd56c, 0xd56e, 0xd56f, 0xd570, 0xd571, 0xd572, 0xd573, 0xd576, 0xd577, 0xd579, 0xd57a, 0xd57b, 0xd57d, 0xd57e, 0xd57f, 0xd580, 0xd581, 0xd582, 0xd583, 0xd586, 0xd58a, 0xd58b, 0xd58c, 0xd58d, 0xd58e, 0xd58f, 0xd591, 0xd592, 0xd593, 0xd594, 0xd595, 0xd596, 0xd597, 0xd598, 0xd599, 0xd59a, 0xd59b, 0xd59c, 0xd59d, 0xd59e, 0xd59f, 0xd5a0, 0xd5a1, 0xd5a2, 0xd5a3, 0xd5a4, 0xd5a6, 0xd5a7, 0xd5a8, 0xd5a9, 0xd5aa, 0xd5ab, 0xd5ac, 0xd5ad, 0xd5ae, 0xd5af, 0xd5b0, 0xd5b1, 0xd5b2, 0xd5b3, 0xd5b4, 0xd5b5, 0xd5b6, 0xd5b7, 0xd5b8, 0xd5b9, 0xd5ba, 0xd5bb, 0xd5bc, 0xd5bd, 0xd5be, 0xd5bf, 0xd5c0, 0xd5c1, 0xd5c2, 0xd5c3, 0xd5c4, 0xd5c5, 0xd5c6, 0xd5c7, 0xd5ca, 0xd5cb, 0xd5cd, 0xd5ce, 0xd5cf, 0xd5d1, 0xd5d3, 0xd5d4, 0xd5d5, 0xd5d6, 0xd5d7, 0xd5da, 0xd5dc, 0xd5de, 0xd5df, 0xd5e0, 0xd5e1, 0xd5e2, 0xd5e3, 0xd5e6, 0xd5e7, 0xd5e9, 0xd5ea, 0xd5eb, 0xd5ed, 0xd5ee, 0xd5ef, 0xd5f0, 0xd5f1, 0xd5f2, 0xd5f3, 0xd5f6, 0xd5f8, 0xd5fa, 0xd5fb, 0xd5fc, 0xd5fd, 0xd5fe, 0xd5ff, 0xd602, 0xd603, 0xd605, 0xd606, 0xd607, 0xd609, 0xd60a, 0xd60b, 0xd60c, 0xd60d, 0xd60e, 0xd60f, 0xd612, 0xd616, 0xd617, 0xd618, 0xd619, 0xd61a, 0xd61b, 0xd61d, 0xd61e, 0xd61f, 0xd621, 0xd622, 0xd623, 0xd625, 0xd626, 0xd627, 0xd628, 0xd629, 0xd62a, 0xd62b, 0xd62c, 0xd62e, 0xd62f, 0xd630, 0xd631, 0xd632, 0xd633, 0xd634, 0xd635, 0xd636, 0xd637, 0xd63a, 0xd63b, 0xd63d, 0xd63e, 0xd63f, 0xd641, 0xd642, 0xd643, 0xd644, 0xd646, 0xd647, 0xd64a, 0xd64c, 0xd64e, 0xd64f, 0xd650, 0xd652, 0xd653, 0xd656, 0xd657, 0xd659, 0xd65a, 0xd65b, 0xd65d, 0xd65e, 0xd65f, 0xd660, 0xd661, 0xd662, 0xd663, 0xd664, 0xd665, 0xd666, 0xd668, 0xd66a, 0xd66b, 0xd66c, 0xd66d, 0xd66e, 0xd66f, 0xd672, 0xd673, 0xd675, 0xd676, 0xd677, 0xd678, 0xd679, 0xd67a, 0xd67b, 0xd67c, 0xd67d, 0xd67e, 0xd67f, 0xd680, 0xd681, 0xd682, 0xd684, 0xd686, 0xd687, 0xd688, 0xd689, 0xd68a, 0xd68b, 0xd68e, 0xd68f, 0xd691, 0xd692, 0xd693, 0xd695, 0xd696, 0xd697, 0xd698, 0xd699, 0xd69a, 0xd69b, 0xd69c, 0xd69e, 0xd6a0, 0xd6a2, 0xd6a3, 0xd6a4, 0xd6a5, 0xd6a6, 0xd6a7, 0xd6a9, 0xd6aa, 0xd6ab, 0xd6ad, 0xd6ae, 0xd6af, 0xd6b1, 0xd6b2, 0xd6b3, 0xd6b4, 0xd6b5, 0xd6b6, 0xd6b7, 0xd6b8, 0xd6ba, 0xd6bc, 0xd6bd, 0xd6be, 0xd6bf, 0xd6c0, 0xd6c1, 0xd6c2, 0xd6c3, 0xd6c6, 0xd6c7, 0xd6c9, 0xd6ca, 0xd6cb, 0xd6cd, 0xd6ce, 0xd6cf, 0xd6d0, 0xd6d2, 0xd6d3, 0xd6d5, 0xd6d6, 0xd6d8, 0xd6da, 0xd6db, 0xd6dc, 0xd6dd, 0xd6de, 0xd6df, 0xd6e1, 0xd6e2, 0xd6e3, 0xd6e5, 0xd6e6, 0xd6e7, 0xd6e9, 0xd6ea, 0xd6eb, 0xd6ec, 0xd6ed, 0xd6ee, 0xd6ef, 0xd6f1, 0xd6f2, 0xd6f3, 0xd6f4, 0xd6f6, 0xd6f7, 0xd6f8, 0xd6f9, 0xd6fa, 0xd6fb, 0xd6fe, 0xd6ff, 0xd701, 0xd702, 0xd703, 0xd705, 0xd706, 0xd707, 0xd708, 0xd709, 0xd70a, 0xd70b, 0xd70c, 0xd70d, 0xd70e, 0xd70f, 0xd710, 0xd712, 0xd713, 0xd714, 0xd715, 0xd716, 0xd717, 0xd71a, 0xd71b, 0xd71d, 0xd71e, 0xd71f, 0xd721, 0xd722, 0xd723, 0xd724, 0xd725, 0xd726, 0xd727, 0xd72a, 0xd72c, 0xd72e, 0xd72f, 0xd730, 0xd731, 0xd732, 0xd733, 0xd736, 0xd737, 0xd739, 0xd73a, 0xd73b, 0xd73d, 0xd73e, 0xd73f, 0xd740, 0xd741, 0xd742, 0xd743, 0xd745, 0xd746, 0xd748, 0xd74a, 0xd74b, 0xd74c, 0xd74d, 0xd74e, 0xd74f, 0xd752, 0xd753, 0xd755, 0xd75a, 0xd75b, 0xd75c, 0xd75d, 0xd75e, 0xd75f, 0xd762, 0xd764, 0xd766, 0xd767, 0xd768, 0xd76a, 0xd76b, 0xd76d, 0xd76e, 0xd76f, 0xd771, 0xd772, 0xd773, 0xd775, 0xd776, 0xd777, 0xd778, 0xd779, 0xd77a, 0xd77b, 0xd77e, 0xd77f, 0xd780, 0xd782, 0xd783, 0xd784, 0xd785, 0xd786, 0xd787, 0xd78a, 0xd78b, 0xd78d, 0xd78e, 0xd78f, 0xd791, 0xd792, 0xd793, 0xd794, 0xd795, 0xd796, 0xd797, 0xd79a, 0xd79c, 0xd79e, 0xd79f, 0xd7a0, 0xd7a1, 0xd7a2, 0xd7a3, }; static const uint16_t ksc5601_hanja_to_unicode[4888] = { 0x4f3d, 0x4f73, 0x5047, 0x50f9, 0x52a0, 0x53ef, 0x5475, 0x54e5, 0x5609, 0x5ac1, 0x5bb6, 0x6687, 0x67b6, 0x67b7, 0x67ef, 0x6b4c, 0x73c2, 0x75c2, 0x7a3c, 0x82db, 0x8304, 0x8857, 0x8888, 0x8a36, 0x8cc8, 0x8dcf, 0x8efb, 0x8fe6, 0x99d5, 0x523b, 0x5374, 0x5404, 0x606a, 0x6164, 0x6bbc, 0x73cf, 0x811a, 0x89ba, 0x89d2, 0x95a3, 0x4f83, 0x520a, 0x58be, 0x5978, 0x59e6, 0x5e72, 0x5e79, 0x61c7, 0x63c0, 0x6746, 0x67ec, 0x687f, 0x6f97, 0x764e, 0x770b, 0x78f5, 0x7a08, 0x7aff, 0x7c21, 0x809d, 0x826e, 0x8271, 0x8aeb, 0x9593, 0x4e6b, 0x559d, 0x66f7, 0x6e34, 0x78a3, 0x7aed, 0x845b, 0x8910, 0x874e, 0x97a8, 0x52d8, 0x574e, 0x582a, 0x5d4c, 0x611f, 0x61be, 0x6221, 0x6562, 0x67d1, 0x6a44, 0x6e1b, 0x7518, 0x75b3, 0x76e3, 0x77b0, 0x7d3a, 0x90af, 0x9451, 0x9452, 0x9f95, 0x5323, 0x5cac, 0x7532, 0x80db, 0x9240, 0x9598, 0x525b, 0x5808, 0x59dc, 0x5ca1, 0x5d17, 0x5eb7, 0x5f3a, 0x5f4a, 0x6177, 0x6c5f, 0x757a, 0x7586, 0x7ce0, 0x7d73, 0x7db1, 0x7f8c, 0x8154, 0x8221, 0x8591, 0x8941, 0x8b1b, 0x92fc, 0x964d, 0x9c47, 0x4ecb, 0x4ef7, 0x500b, 0x51f1, 0x584f, 0x6137, 0x613e, 0x6168, 0x6539, 0x69ea, 0x6f11, 0x75a5, 0x7686, 0x76d6, 0x7b87, 0x82a5, 0x84cb, 0xf900, 0x93a7, 0x958b, 0x5580, 0x5ba2, 0x5751, 0xf901, 0x7cb3, 0x7fb9, 0x91b5, 0x5028, 0x53bb, 0x5c45, 0x5de8, 0x62d2, 0x636e, 0x64da, 0x64e7, 0x6e20, 0x70ac, 0x795b, 0x8ddd, 0x8e1e, 0xf902, 0x907d, 0x9245, 0x92f8, 0x4e7e, 0x4ef6, 0x5065, 0x5dfe, 0x5efa, 0x6106, 0x6957, 0x8171, 0x8654, 0x8e47, 0x9375, 0x9a2b, 0x4e5e, 0x5091, 0x6770, 0x6840, 0x5109, 0x528d, 0x5292, 0x6aa2, 0x77bc, 0x9210, 0x9ed4, 0x52ab, 0x602f, 0x8ff2, 0x5048, 0x61a9, 0x63ed, 0x64ca, 0x683c, 0x6a84, 0x6fc0, 0x8188, 0x89a1, 0x9694, 0x5805, 0x727d, 0x72ac, 0x7504, 0x7d79, 0x7e6d, 0x80a9, 0x898b, 0x8b74, 0x9063, 0x9d51, 0x6289, 0x6c7a, 0x6f54, 0x7d50, 0x7f3a, 0x8a23, 0x517c, 0x614a, 0x7b9d, 0x8b19, 0x9257, 0x938c, 0x4eac, 0x4fd3, 0x501e, 0x50be, 0x5106, 0x52c1, 0x52cd, 0x537f, 0x5770, 0x5883, 0x5e9a, 0x5f91, 0x6176, 0x61ac, 0x64ce, 0x656c, 0x666f, 0x66bb, 0x66f4, 0x6897, 0x6d87, 0x7085, 0x70f1, 0x749f, 0x74a5, 0x74ca, 0x75d9, 0x786c, 0x78ec, 0x7adf, 0x7af6, 0x7d45, 0x7d93, 0x8015, 0x803f, 0x811b, 0x8396, 0x8b66, 0x8f15, 0x9015, 0x93e1, 0x9803, 0x9838, 0x9a5a, 0x9be8, 0x4fc2, 0x5553, 0x583a, 0x5951, 0x5b63, 0x5c46, 0x60b8, 0x6212, 0x6842, 0x68b0, 0x68e8, 0x6eaa, 0x754c, 0x7678, 0x78ce, 0x7a3d, 0x7cfb, 0x7e6b, 0x7e7c, 0x8a08, 0x8aa1, 0x8c3f, 0x968e, 0x9dc4, 0x53e4, 0x53e9, 0x544a, 0x5471, 0x56fa, 0x59d1, 0x5b64, 0x5c3b, 0x5eab, 0x62f7, 0x6537, 0x6545, 0x6572, 0x66a0, 0x67af, 0x69c1, 0x6cbd, 0x75fc, 0x7690, 0x777e, 0x7a3f, 0x7f94, 0x8003, 0x80a1, 0x818f, 0x82e6, 0x82fd, 0x83f0, 0x85c1, 0x8831, 0x88b4, 0x8aa5, 0xf903, 0x8f9c, 0x932e, 0x96c7, 0x9867, 0x9ad8, 0x9f13, 0x54ed, 0x659b, 0x66f2, 0x688f, 0x7a40, 0x8c37, 0x9d60, 0x56f0, 0x5764, 0x5d11, 0x6606, 0x68b1, 0x68cd, 0x6efe, 0x7428, 0x889e, 0x9be4, 0x6c68, 0xf904, 0x9aa8, 0x4f9b, 0x516c, 0x5171, 0x529f, 0x5b54, 0x5de5, 0x6050, 0x606d, 0x62f1, 0x63a7, 0x653b, 0x73d9, 0x7a7a, 0x86a3, 0x8ca2, 0x978f, 0x4e32, 0x5be1, 0x6208, 0x679c, 0x74dc, 0x79d1, 0x83d3, 0x8a87, 0x8ab2, 0x8de8, 0x904e, 0x934b, 0x9846, 0x5ed3, 0x69e8, 0x85ff, 0x90ed, 0xf905, 0x51a0, 0x5b98, 0x5bec, 0x6163, 0x68fa, 0x6b3e, 0x704c, 0x742f, 0x74d8, 0x7ba1, 0x7f50, 0x83c5, 0x89c0, 0x8cab, 0x95dc, 0x9928, 0x522e, 0x605d, 0x62ec, 0x9002, 0x4f8a, 0x5149, 0x5321, 0x58d9, 0x5ee3, 0x66e0, 0x6d38, 0x709a, 0x72c2, 0x73d6, 0x7b50, 0x80f1, 0x945b, 0x5366, 0x639b, 0x7f6b, 0x4e56, 0x5080, 0x584a, 0x58de, 0x602a, 0x6127, 0x62d0, 0x69d0, 0x9b41, 0x5b8f, 0x7d18, 0x80b1, 0x8f5f, 0x4ea4, 0x50d1, 0x54ac, 0x55ac, 0x5b0c, 0x5da0, 0x5de7, 0x652a, 0x654e, 0x6821, 0x6a4b, 0x72e1, 0x768e, 0x77ef, 0x7d5e, 0x7ff9, 0x81a0, 0x854e, 0x86df, 0x8f03, 0x8f4e, 0x90ca, 0x9903, 0x9a55, 0x9bab, 0x4e18, 0x4e45, 0x4e5d, 0x4ec7, 0x4ff1, 0x5177, 0x52fe, 0x5340, 0x53e3, 0x53e5, 0x548e, 0x5614, 0x5775, 0x57a2, 0x5bc7, 0x5d87, 0x5ed0, 0x61fc, 0x62d8, 0x6551, 0x67b8, 0x67e9, 0x69cb, 0x6b50, 0x6bc6, 0x6bec, 0x6c42, 0x6e9d, 0x7078, 0x72d7, 0x7396, 0x7403, 0x77bf, 0x77e9, 0x7a76, 0x7d7f, 0x8009, 0x81fc, 0x8205, 0x820a, 0x82df, 0x8862, 0x8b33, 0x8cfc, 0x8ec0, 0x9011, 0x90b1, 0x9264, 0x92b6, 0x99d2, 0x9a45, 0x9ce9, 0x9dd7, 0x9f9c, 0x570b, 0x5c40, 0x83ca, 0x97a0, 0x97ab, 0x9eb4, 0x541b, 0x7a98, 0x7fa4, 0x88d9, 0x8ecd, 0x90e1, 0x5800, 0x5c48, 0x6398, 0x7a9f, 0x5bae, 0x5f13, 0x7a79, 0x7aae, 0x828e, 0x8eac, 0x5026, 0x5238, 0x52f8, 0x5377, 0x5708, 0x62f3, 0x6372, 0x6b0a, 0x6dc3, 0x7737, 0x53a5, 0x7357, 0x8568, 0x8e76, 0x95d5, 0x673a, 0x6ac3, 0x6f70, 0x8a6d, 0x8ecc, 0x994b, 0xf906, 0x6677, 0x6b78, 0x8cb4, 0x9b3c, 0xf907, 0x53eb, 0x572d, 0x594e, 0x63c6, 0x69fb, 0x73ea, 0x7845, 0x7aba, 0x7ac5, 0x7cfe, 0x8475, 0x898f, 0x8d73, 0x9035, 0x95a8, 0x52fb, 0x5747, 0x7547, 0x7b60, 0x83cc, 0x921e, 0xf908, 0x6a58, 0x514b, 0x524b, 0x5287, 0x621f, 0x68d8, 0x6975, 0x9699, 0x50c5, 0x52a4, 0x52e4, 0x61c3, 0x65a4, 0x6839, 0x69ff, 0x747e, 0x7b4b, 0x82b9, 0x83eb, 0x89b2, 0x8b39, 0x8fd1, 0x9949, 0xf909, 0x4eca, 0x5997, 0x64d2, 0x6611, 0x6a8e, 0x7434, 0x7981, 0x79bd, 0x82a9, 0x887e, 0x887f, 0x895f, 0xf90a, 0x9326, 0x4f0b, 0x53ca, 0x6025, 0x6271, 0x6c72, 0x7d1a, 0x7d66, 0x4e98, 0x5162, 0x77dc, 0x80af, 0x4f01, 0x4f0e, 0x5176, 0x5180, 0x55dc, 0x5668, 0x573b, 0x57fa, 0x57fc, 0x5914, 0x5947, 0x5993, 0x5bc4, 0x5c90, 0x5d0e, 0x5df1, 0x5e7e, 0x5fcc, 0x6280, 0x65d7, 0x65e3, 0x671e, 0x671f, 0x675e, 0x68cb, 0x68c4, 0x6a5f, 0x6b3a, 0x6c23, 0x6c7d, 0x6c82, 0x6dc7, 0x7398, 0x7426, 0x742a, 0x7482, 0x74a3, 0x7578, 0x757f, 0x7881, 0x78ef, 0x7941, 0x7947, 0x7948, 0x797a, 0x7b95, 0x7d00, 0x7dba, 0x7f88, 0x8006, 0x802d, 0x808c, 0x8a18, 0x8b4f, 0x8c48, 0x8d77, 0x9321, 0x9324, 0x98e2, 0x9951, 0x9a0e, 0x9a0f, 0x9a65, 0x9e92, 0x7dca, 0x4f76, 0x5409, 0x62ee, 0x6854, 0x91d1, 0x55ab, 0x513a, 0xf90b, 0xf90c, 0x5a1c, 0x61e6, 0xf90d, 0x62cf, 0x62ff, 0xf90e, 0xf90f, 0xf910, 0xf911, 0xf912, 0xf913, 0x90a3, 0xf914, 0xf915, 0xf916, 0xf917, 0xf918, 0x8afe, 0xf919, 0xf91a, 0xf91b, 0xf91c, 0x6696, 0xf91d, 0x7156, 0xf91e, 0xf91f, 0x96e3, 0xf920, 0x634f, 0x637a, 0x5357, 0xf921, 0x678f, 0x6960, 0x6e73, 0xf922, 0x7537, 0xf923, 0xf924, 0xf925, 0x7d0d, 0xf926, 0xf927, 0x8872, 0x56ca, 0x5a18, 0xf928, 0xf929, 0xf92a, 0xf92b, 0xf92c, 0x4e43, 0xf92d, 0x5167, 0x5948, 0x67f0, 0x8010, 0xf92e, 0x5973, 0x5e74, 0x649a, 0x79ca, 0x5ff5, 0x606c, 0x62c8, 0x637b, 0x5be7, 0x5bd7, 0x52aa, 0xf92f, 0x5974, 0x5f29, 0x6012, 0xf930, 0xf931, 0xf932, 0x7459, 0xf933, 0xf934, 0xf935, 0xf936, 0xf937, 0xf938, 0x99d1, 0xf939, 0xf93a, 0xf93b, 0xf93c, 0xf93d, 0xf93e, 0xf93f, 0xf940, 0xf941, 0xf942, 0xf943, 0x6fc3, 0xf944, 0xf945, 0x81bf, 0x8fb2, 0x60f1, 0xf946, 0xf947, 0x8166, 0xf948, 0xf949, 0x5c3f, 0xf94a, 0xf94b, 0xf94c, 0xf94d, 0xf94e, 0xf94f, 0xf950, 0xf951, 0x5ae9, 0x8a25, 0x677b, 0x7d10, 0xf952, 0xf953, 0xf954, 0xf955, 0xf956, 0xf957, 0x80fd, 0xf958, 0xf959, 0x5c3c, 0x6ce5, 0x533f, 0x6eba, 0x591a, 0x8336, 0x4e39, 0x4eb6, 0x4f46, 0x55ae, 0x5718, 0x58c7, 0x5f56, 0x65b7, 0x65e6, 0x6a80, 0x6bb5, 0x6e4d, 0x77ed, 0x7aef, 0x7c1e, 0x7dde, 0x86cb, 0x8892, 0x9132, 0x935b, 0x64bb, 0x6fbe, 0x737a, 0x75b8, 0x9054, 0x5556, 0x574d, 0x61ba, 0x64d4, 0x66c7, 0x6de1, 0x6e5b, 0x6f6d, 0x6fb9, 0x75f0, 0x8043, 0x81bd, 0x8541, 0x8983, 0x8ac7, 0x8b5a, 0x931f, 0x6c93, 0x7553, 0x7b54, 0x8e0f, 0x905d, 0x5510, 0x5802, 0x5858, 0x5e62, 0x6207, 0x649e, 0x68e0, 0x7576, 0x7cd6, 0x87b3, 0x9ee8, 0x4ee3, 0x5788, 0x576e, 0x5927, 0x5c0d, 0x5cb1, 0x5e36, 0x5f85, 0x6234, 0x64e1, 0x73b3, 0x81fa, 0x888b, 0x8cb8, 0x968a, 0x9edb, 0x5b85, 0x5fb7, 0x60b3, 0x5012, 0x5200, 0x5230, 0x5716, 0x5835, 0x5857, 0x5c0e, 0x5c60, 0x5cf6, 0x5d8b, 0x5ea6, 0x5f92, 0x60bc, 0x6311, 0x6389, 0x6417, 0x6843, 0x68f9, 0x6ac2, 0x6dd8, 0x6e21, 0x6ed4, 0x6fe4, 0x71fe, 0x76dc, 0x7779, 0x79b1, 0x7a3b, 0x8404, 0x89a9, 0x8ced, 0x8df3, 0x8e48, 0x9003, 0x9014, 0x9053, 0x90fd, 0x934d, 0x9676, 0x97dc, 0x6bd2, 0x7006, 0x7258, 0x72a2, 0x7368, 0x7763, 0x79bf, 0x7be4, 0x7e9b, 0x8b80, 0x58a9, 0x60c7, 0x6566, 0x65fd, 0x66be, 0x6c8c, 0x711e, 0x71c9, 0x8c5a, 0x9813, 0x4e6d, 0x7a81, 0x4edd, 0x51ac, 0x51cd, 0x52d5, 0x540c, 0x61a7, 0x6771, 0x6850, 0x68df, 0x6d1e, 0x6f7c, 0x75bc, 0x77b3, 0x7ae5, 0x80f4, 0x8463, 0x9285, 0x515c, 0x6597, 0x675c, 0x6793, 0x75d8, 0x7ac7, 0x8373, 0xf95a, 0x8c46, 0x9017, 0x982d, 0x5c6f, 0x81c0, 0x829a, 0x9041, 0x906f, 0x920d, 0x5f97, 0x5d9d, 0x6a59, 0x71c8, 0x767b, 0x7b49, 0x85e4, 0x8b04, 0x9127, 0x9a30, 0x5587, 0x61f6, 0xf95b, 0x7669, 0x7f85, 0x863f, 0x87ba, 0x88f8, 0x908f, 0xf95c, 0x6d1b, 0x70d9, 0x73de, 0x7d61, 0x843d, 0xf95d, 0x916a, 0x99f1, 0xf95e, 0x4e82, 0x5375, 0x6b04, 0x6b12, 0x703e, 0x721b, 0x862d, 0x9e1e, 0x524c, 0x8fa3, 0x5d50, 0x64e5, 0x652c, 0x6b16, 0x6feb, 0x7c43, 0x7e9c, 0x85cd, 0x8964, 0x89bd, 0x62c9, 0x81d8, 0x881f, 0x5eca, 0x6717, 0x6d6a, 0x72fc, 0x7405, 0x746f, 0x8782, 0x90de, 0x4f86, 0x5d0d, 0x5fa0, 0x840a, 0x51b7, 0x63a0, 0x7565, 0x4eae, 0x5006, 0x5169, 0x51c9, 0x6881, 0x6a11, 0x7cae, 0x7cb1, 0x7ce7, 0x826f, 0x8ad2, 0x8f1b, 0x91cf, 0x4fb6, 0x5137, 0x52f5, 0x5442, 0x5eec, 0x616e, 0x623e, 0x65c5, 0x6ada, 0x6ffe, 0x792a, 0x85dc, 0x8823, 0x95ad, 0x9a62, 0x9a6a, 0x9e97, 0x9ece, 0x529b, 0x66c6, 0x6b77, 0x701d, 0x792b, 0x8f62, 0x9742, 0x6190, 0x6200, 0x6523, 0x6f23, 0x7149, 0x7489, 0x7df4, 0x806f, 0x84ee, 0x8f26, 0x9023, 0x934a, 0x51bd, 0x5217, 0x52a3, 0x6d0c, 0x70c8, 0x88c2, 0x5ec9, 0x6582, 0x6bae, 0x6fc2, 0x7c3e, 0x7375, 0x4ee4, 0x4f36, 0x56f9, 0xf95f, 0x5cba, 0x5dba, 0x601c, 0x73b2, 0x7b2d, 0x7f9a, 0x7fce, 0x8046, 0x901e, 0x9234, 0x96f6, 0x9748, 0x9818, 0x9f61, 0x4f8b, 0x6fa7, 0x79ae, 0x91b4, 0x96b7, 0x52de, 0xf960, 0x6488, 0x64c4, 0x6ad3, 0x6f5e, 0x7018, 0x7210, 0x76e7, 0x8001, 0x8606, 0x865c, 0x8def, 0x8f05, 0x9732, 0x9b6f, 0x9dfa, 0x9e75, 0x788c, 0x797f, 0x7da0, 0x83c9, 0x9304, 0x9e7f, 0x9e93, 0x8ad6, 0x58df, 0x5f04, 0x6727, 0x7027, 0x74cf, 0x7c60, 0x807e, 0x5121, 0x7028, 0x7262, 0x78ca, 0x8cc2, 0x8cda, 0x8cf4, 0x96f7, 0x4e86, 0x50da, 0x5bee, 0x5ed6, 0x6599, 0x71ce, 0x7642, 0x77ad, 0x804a, 0x84fc, 0x907c, 0x9b27, 0x9f8d, 0x58d8, 0x5a41, 0x5c62, 0x6a13, 0x6dda, 0x6f0f, 0x763b, 0x7d2f, 0x7e37, 0x851e, 0x8938, 0x93e4, 0x964b, 0x5289, 0x65d2, 0x67f3, 0x69b4, 0x6d41, 0x6e9c, 0x700f, 0x7409, 0x7460, 0x7559, 0x7624, 0x786b, 0x8b2c, 0x985e, 0x516d, 0x622e, 0x9678, 0x4f96, 0x502b, 0x5d19, 0x6dea, 0x7db8, 0x8f2a, 0x5f8b, 0x6144, 0x6817, 0xf961, 0x9686, 0x52d2, 0x808b, 0x51dc, 0x51cc, 0x695e, 0x7a1c, 0x7dbe, 0x83f1, 0x9675, 0x4fda, 0x5229, 0x5398, 0x540f, 0x550e, 0x5c65, 0x60a7, 0x674e, 0x68a8, 0x6d6c, 0x7281, 0x72f8, 0x7406, 0x7483, 0xf962, 0x75e2, 0x7c6c, 0x7f79, 0x7fb8, 0x8389, 0x88cf, 0x88e1, 0x91cc, 0x91d0, 0x96e2, 0x9bc9, 0x541d, 0x6f7e, 0x71d0, 0x7498, 0x85fa, 0x8eaa, 0x96a3, 0x9c57, 0x9e9f, 0x6797, 0x6dcb, 0x7433, 0x81e8, 0x9716, 0x782c, 0x7acb, 0x7b20, 0x7c92, 0x6469, 0x746a, 0x75f2, 0x78bc, 0x78e8, 0x99ac, 0x9b54, 0x9ebb, 0x5bde, 0x5e55, 0x6f20, 0x819c, 0x83ab, 0x9088, 0x4e07, 0x534d, 0x5a29, 0x5dd2, 0x5f4e, 0x6162, 0x633d, 0x6669, 0x66fc, 0x6eff, 0x6f2b, 0x7063, 0x779e, 0x842c, 0x8513, 0x883b, 0x8f13, 0x9945, 0x9c3b, 0x551c, 0x62b9, 0x672b, 0x6cab, 0x8309, 0x896a, 0x977a, 0x4ea1, 0x5984, 0x5fd8, 0x5fd9, 0x671b, 0x7db2, 0x7f54, 0x8292, 0x832b, 0x83bd, 0x8f1e, 0x9099, 0x57cb, 0x59b9, 0x5a92, 0x5bd0, 0x6627, 0x679a, 0x6885, 0x6bcf, 0x7164, 0x7f75, 0x8cb7, 0x8ce3, 0x9081, 0x9b45, 0x8108, 0x8c8a, 0x964c, 0x9a40, 0x9ea5, 0x5b5f, 0x6c13, 0x731b, 0x76f2, 0x76df, 0x840c, 0x51aa, 0x8993, 0x514d, 0x5195, 0x52c9, 0x68c9, 0x6c94, 0x7704, 0x7720, 0x7dbf, 0x7dec, 0x9762, 0x9eb5, 0x6ec5, 0x8511, 0x51a5, 0x540d, 0x547d, 0x660e, 0x669d, 0x6927, 0x6e9f, 0x76bf, 0x7791, 0x8317, 0x84c2, 0x879f, 0x9169, 0x9298, 0x9cf4, 0x8882, 0x4fae, 0x5192, 0x52df, 0x59c6, 0x5e3d, 0x6155, 0x6478, 0x6479, 0x66ae, 0x67d0, 0x6a21, 0x6bcd, 0x6bdb, 0x725f, 0x7261, 0x7441, 0x7738, 0x77db, 0x8017, 0x82bc, 0x8305, 0x8b00, 0x8b28, 0x8c8c, 0x6728, 0x6c90, 0x7267, 0x76ee, 0x7766, 0x7a46, 0x9da9, 0x6b7f, 0x6c92, 0x5922, 0x6726, 0x8499, 0x536f, 0x5893, 0x5999, 0x5edf, 0x63cf, 0x6634, 0x6773, 0x6e3a, 0x732b, 0x7ad7, 0x82d7, 0x9328, 0x52d9, 0x5deb, 0x61ae, 0x61cb, 0x620a, 0x62c7, 0x64ab, 0x65e0, 0x6959, 0x6b66, 0x6bcb, 0x7121, 0x73f7, 0x755d, 0x7e46, 0x821e, 0x8302, 0x856a, 0x8aa3, 0x8cbf, 0x9727, 0x9d61, 0x58a8, 0x9ed8, 0x5011, 0x520e, 0x543b, 0x554f, 0x6587, 0x6c76, 0x7d0a, 0x7d0b, 0x805e, 0x868a, 0x9580, 0x96ef, 0x52ff, 0x6c95, 0x7269, 0x5473, 0x5a9a, 0x5c3e, 0x5d4b, 0x5f4c, 0x5fae, 0x672a, 0x68b6, 0x6963, 0x6e3c, 0x6e44, 0x7709, 0x7c73, 0x7f8e, 0x8587, 0x8b0e, 0x8ff7, 0x9761, 0x9ef4, 0x5cb7, 0x60b6, 0x610d, 0x61ab, 0x654f, 0x65fb, 0x65fc, 0x6c11, 0x6cef, 0x739f, 0x73c9, 0x7de1, 0x9594, 0x5bc6, 0x871c, 0x8b10, 0x525d, 0x535a, 0x62cd, 0x640f, 0x64b2, 0x6734, 0x6a38, 0x6cca, 0x73c0, 0x749e, 0x7b94, 0x7c95, 0x7e1b, 0x818a, 0x8236, 0x8584, 0x8feb, 0x96f9, 0x99c1, 0x4f34, 0x534a, 0x53cd, 0x53db, 0x62cc, 0x642c, 0x6500, 0x6591, 0x69c3, 0x6cee, 0x6f58, 0x73ed, 0x7554, 0x7622, 0x76e4, 0x76fc, 0x78d0, 0x78fb, 0x792c, 0x7d46, 0x822c, 0x87e0, 0x8fd4, 0x9812, 0x98ef, 0x52c3, 0x62d4, 0x64a5, 0x6e24, 0x6f51, 0x767c, 0x8dcb, 0x91b1, 0x9262, 0x9aee, 0x9b43, 0x5023, 0x508d, 0x574a, 0x59a8, 0x5c28, 0x5e47, 0x5f77, 0x623f, 0x653e, 0x65b9, 0x65c1, 0x6609, 0x678b, 0x699c, 0x6ec2, 0x78c5, 0x7d21, 0x80aa, 0x8180, 0x822b, 0x82b3, 0x84a1, 0x868c, 0x8a2a, 0x8b17, 0x90a6, 0x9632, 0x9f90, 0x500d, 0x4ff3, 0xf963, 0x57f9, 0x5f98, 0x62dc, 0x6392, 0x676f, 0x6e43, 0x7119, 0x76c3, 0x80cc, 0x80da, 0x88f4, 0x88f5, 0x8919, 0x8ce0, 0x8f29, 0x914d, 0x966a, 0x4f2f, 0x4f70, 0x5e1b, 0x67cf, 0x6822, 0x767d, 0x767e, 0x9b44, 0x5e61, 0x6a0a, 0x7169, 0x71d4, 0x756a, 0xf964, 0x7e41, 0x8543, 0x85e9, 0x98dc, 0x4f10, 0x7b4f, 0x7f70, 0x95a5, 0x51e1, 0x5e06, 0x68b5, 0x6c3e, 0x6c4e, 0x6cdb, 0x72af, 0x7bc4, 0x8303, 0x6cd5, 0x743a, 0x50fb, 0x5288, 0x58c1, 0x64d8, 0x6a97, 0x74a7, 0x7656, 0x78a7, 0x8617, 0x95e2, 0x9739, 0xf965, 0x535e, 0x5f01, 0x8b8a, 0x8fa8, 0x8faf, 0x908a, 0x5225, 0x77a5, 0x9c49, 0x9f08, 0x4e19, 0x5002, 0x5175, 0x5c5b, 0x5e77, 0x661e, 0x663a, 0x67c4, 0x68c5, 0x70b3, 0x7501, 0x75c5, 0x79c9, 0x7add, 0x8f27, 0x9920, 0x9a08, 0x4fdd, 0x5821, 0x5831, 0x5bf6, 0x666e, 0x6b65, 0x6d11, 0x6e7a, 0x6f7d, 0x73e4, 0x752b, 0x83e9, 0x88dc, 0x8913, 0x8b5c, 0x8f14, 0x4f0f, 0x50d5, 0x5310, 0x535c, 0x5b93, 0x5fa9, 0x670d, 0x798f, 0x8179, 0x832f, 0x8514, 0x8907, 0x8986, 0x8f39, 0x8f3b, 0x99a5, 0x9c12, 0x672c, 0x4e76, 0x4ff8, 0x5949, 0x5c01, 0x5cef, 0x5cf0, 0x6367, 0x68d2, 0x70fd, 0x71a2, 0x742b, 0x7e2b, 0x84ec, 0x8702, 0x9022, 0x92d2, 0x9cf3, 0x4e0d, 0x4ed8, 0x4fef, 0x5085, 0x5256, 0x526f, 0x5426, 0x5490, 0x57e0, 0x592b, 0x5a66, 0x5b5a, 0x5b75, 0x5bcc, 0x5e9c, 0xf966, 0x6276, 0x6577, 0x65a7, 0x6d6e, 0x6ea5, 0x7236, 0x7b26, 0x7c3f, 0x7f36, 0x8150, 0x8151, 0x819a, 0x8240, 0x8299, 0x83a9, 0x8a03, 0x8ca0, 0x8ce6, 0x8cfb, 0x8d74, 0x8dba, 0x90e8, 0x91dc, 0x961c, 0x9644, 0x99d9, 0x9ce7, 0x5317, 0x5206, 0x5429, 0x5674, 0x58b3, 0x5954, 0x596e, 0x5fff, 0x61a4, 0x626e, 0x6610, 0x6c7e, 0x711a, 0x76c6, 0x7c89, 0x7cde, 0x7d1b, 0x82ac, 0x8cc1, 0x96f0, 0xf967, 0x4f5b, 0x5f17, 0x5f7f, 0x62c2, 0x5d29, 0x670b, 0x68da, 0x787c, 0x7e43, 0x9d6c, 0x4e15, 0x5099, 0x5315, 0x532a, 0x5351, 0x5983, 0x5a62, 0x5e87, 0x60b2, 0x618a, 0x6249, 0x6279, 0x6590, 0x6787, 0x69a7, 0x6bd4, 0x6bd6, 0x6bd7, 0x6bd8, 0x6cb8, 0xf968, 0x7435, 0x75fa, 0x7812, 0x7891, 0x79d5, 0x79d8, 0x7c83, 0x7dcb, 0x7fe1, 0x80a5, 0x813e, 0x81c2, 0x83f2, 0x871a, 0x88e8, 0x8ab9, 0x8b6c, 0x8cbb, 0x9119, 0x975e, 0x98db, 0x9f3b, 0x56ac, 0x5b2a, 0x5f6c, 0x658c, 0x6ab3, 0x6baf, 0x6d5c, 0x6ff1, 0x7015, 0x725d, 0x73ad, 0x8ca7, 0x8cd3, 0x983b, 0x6191, 0x6c37, 0x8058, 0x9a01, 0x4e4d, 0x4e8b, 0x4e9b, 0x4ed5, 0x4f3a, 0x4f3c, 0x4f7f, 0x4fdf, 0x50ff, 0x53f2, 0x53f8, 0x5506, 0x55e3, 0x56db, 0x58eb, 0x5962, 0x5a11, 0x5beb, 0x5bfa, 0x5c04, 0x5df3, 0x5e2b, 0x5f99, 0x601d, 0x6368, 0x659c, 0x65af, 0x67f6, 0x67fb, 0x68ad, 0x6b7b, 0x6c99, 0x6cd7, 0x6e23, 0x7009, 0x7345, 0x7802, 0x793e, 0x7940, 0x7960, 0x79c1, 0x7be9, 0x7d17, 0x7d72, 0x8086, 0x820d, 0x838e, 0x84d1, 0x86c7, 0x88df, 0x8a50, 0x8a5e, 0x8b1d, 0x8cdc, 0x8d66, 0x8fad, 0x90aa, 0x98fc, 0x99df, 0x9e9d, 0x524a, 0xf969, 0x6714, 0xf96a, 0x5098, 0x522a, 0x5c71, 0x6563, 0x6c55, 0x73ca, 0x7523, 0x759d, 0x7b97, 0x849c, 0x9178, 0x9730, 0x4e77, 0x6492, 0x6bba, 0x715e, 0x85a9, 0x4e09, 0xf96b, 0x6749, 0x68ee, 0x6e17, 0x829f, 0x8518, 0x886b, 0x63f7, 0x6f81, 0x9212, 0x98af, 0x4e0a, 0x50b7, 0x50cf, 0x511f, 0x5546, 0x55aa, 0x5617, 0x5b40, 0x5c19, 0x5ce0, 0x5e38, 0x5e8a, 0x5ea0, 0x5ec2, 0x60f3, 0x6851, 0x6a61, 0x6e58, 0x723d, 0x7240, 0x72c0, 0x76f8, 0x7965, 0x7bb1, 0x7fd4, 0x88f3, 0x89f4, 0x8a73, 0x8c61, 0x8cde, 0x971c, 0x585e, 0x74bd, 0x8cfd, 0x55c7, 0xf96c, 0x7a61, 0x7d22, 0x8272, 0x7272, 0x751f, 0x7525, 0xf96d, 0x7b19, 0x5885, 0x58fb, 0x5dbc, 0x5e8f, 0x5eb6, 0x5f90, 0x6055, 0x6292, 0x637f, 0x654d, 0x6691, 0x66d9, 0x66f8, 0x6816, 0x68f2, 0x7280, 0x745e, 0x7b6e, 0x7d6e, 0x7dd6, 0x7f72, 0x80e5, 0x8212, 0x85af, 0x897f, 0x8a93, 0x901d, 0x92e4, 0x9ecd, 0x9f20, 0x5915, 0x596d, 0x5e2d, 0x60dc, 0x6614, 0x6673, 0x6790, 0x6c50, 0x6dc5, 0x6f5f, 0x77f3, 0x78a9, 0x84c6, 0x91cb, 0x932b, 0x4ed9, 0x50ca, 0x5148, 0x5584, 0x5b0b, 0x5ba3, 0x6247, 0x657e, 0x65cb, 0x6e32, 0x717d, 0x7401, 0x7444, 0x7487, 0x74bf, 0x766c, 0x79aa, 0x7dda, 0x7e55, 0x7fa8, 0x817a, 0x81b3, 0x8239, 0x861a, 0x87ec, 0x8a75, 0x8de3, 0x9078, 0x9291, 0x9425, 0x994d, 0x9bae, 0x5368, 0x5c51, 0x6954, 0x6cc4, 0x6d29, 0x6e2b, 0x820c, 0x859b, 0x893b, 0x8a2d, 0x8aaa, 0x96ea, 0x9f67, 0x5261, 0x66b9, 0x6bb2, 0x7e96, 0x87fe, 0x8d0d, 0x9583, 0x965d, 0x651d, 0x6d89, 0x71ee, 0xf96e, 0x57ce, 0x59d3, 0x5bac, 0x6027, 0x60fa, 0x6210, 0x661f, 0x665f, 0x7329, 0x73f9, 0x76db, 0x7701, 0x7b6c, 0x8056, 0x8072, 0x8165, 0x8aa0, 0x9192, 0x4e16, 0x52e2, 0x6b72, 0x6d17, 0x7a05, 0x7b39, 0x7d30, 0xf96f, 0x8cb0, 0x53ec, 0x562f, 0x5851, 0x5bb5, 0x5c0f, 0x5c11, 0x5de2, 0x6240, 0x6383, 0x6414, 0x662d, 0x68b3, 0x6cbc, 0x6d88, 0x6eaf, 0x701f, 0x70a4, 0x71d2, 0x7526, 0x758f, 0x758e, 0x7619, 0x7b11, 0x7be0, 0x7c2b, 0x7d20, 0x7d39, 0x852c, 0x856d, 0x8607, 0x8a34, 0x900d, 0x9061, 0x90b5, 0x92b7, 0x97f6, 0x9a37, 0x4fd7, 0x5c6c, 0x675f, 0x6d91, 0x7c9f, 0x7e8c, 0x8b16, 0x8d16, 0x901f, 0x5b6b, 0x5dfd, 0x640d, 0x84c0, 0x905c, 0x98e1, 0x7387, 0x5b8b, 0x609a, 0x677e, 0x6dde, 0x8a1f, 0x8aa6, 0x9001, 0x980c, 0x5237, 0xf970, 0x7051, 0x788e, 0x9396, 0x8870, 0x91d7, 0x4fee, 0x53d7, 0x55fd, 0x56da, 0x5782, 0x58fd, 0x5ac2, 0x5b88, 0x5cab, 0x5cc0, 0x5e25, 0x6101, 0x620d, 0x624b, 0x6388, 0x641c, 0x6536, 0x6578, 0x6a39, 0x6b8a, 0x6c34, 0x6d19, 0x6f31, 0x71e7, 0x72e9, 0x7378, 0x7407, 0x74b2, 0x7626, 0x7761, 0x79c0, 0x7a57, 0x7aea, 0x7cb9, 0x7d8f, 0x7dac, 0x7e61, 0x7f9e, 0x8129, 0x8331, 0x8490, 0x84da, 0x85ea, 0x8896, 0x8ab0, 0x8b90, 0x8f38, 0x9042, 0x9083, 0x916c, 0x9296, 0x92b9, 0x968b, 0x96a7, 0x96a8, 0x96d6, 0x9700, 0x9808, 0x9996, 0x9ad3, 0x9b1a, 0x53d4, 0x587e, 0x5919, 0x5b70, 0x5bbf, 0x6dd1, 0x6f5a, 0x719f, 0x7421, 0x74b9, 0x8085, 0x83fd, 0x5de1, 0x5f87, 0x5faa, 0x6042, 0x65ec, 0x6812, 0x696f, 0x6a53, 0x6b89, 0x6d35, 0x6df3, 0x73e3, 0x76fe, 0x77ac, 0x7b4d, 0x7d14, 0x8123, 0x821c, 0x8340, 0x84f4, 0x8563, 0x8a62, 0x8ac4, 0x9187, 0x931e, 0x9806, 0x99b4, 0x620c, 0x8853, 0x8ff0, 0x9265, 0x5d07, 0x5d27, 0x5d69, 0x745f, 0x819d, 0x8768, 0x6fd5, 0x62fe, 0x7fd2, 0x8936, 0x8972, 0x4e1e, 0x4e58, 0x50e7, 0x52dd, 0x5347, 0x627f, 0x6607, 0x7e69, 0x8805, 0x965e, 0x4f8d, 0x5319, 0x5636, 0x59cb, 0x5aa4, 0x5c38, 0x5c4e, 0x5c4d, 0x5e02, 0x5f11, 0x6043, 0x65bd, 0x662f, 0x6642, 0x67be, 0x67f4, 0x731c, 0x77e2, 0x793a, 0x7fc5, 0x8494, 0x84cd, 0x8996, 0x8a66, 0x8a69, 0x8ae1, 0x8c55, 0x8c7a, 0x57f4, 0x5bd4, 0x5f0f, 0x606f, 0x62ed, 0x690d, 0x6b96, 0x6e5c, 0x7184, 0x7bd2, 0x8755, 0x8b58, 0x8efe, 0x98df, 0x98fe, 0x4f38, 0x4f81, 0x4fe1, 0x547b, 0x5a20, 0x5bb8, 0x613c, 0x65b0, 0x6668, 0x71fc, 0x7533, 0x795e, 0x7d33, 0x814e, 0x81e3, 0x8398, 0x85aa, 0x85ce, 0x8703, 0x8a0a, 0x8eab, 0x8f9b, 0xf971, 0x8fc5, 0x5931, 0x5ba4, 0x5be6, 0x6089, 0x5be9, 0x5c0b, 0x5fc3, 0x6c81, 0xf972, 0x6df1, 0x700b, 0x751a, 0x82af, 0x8af6, 0x4ec0, 0x5341, 0xf973, 0x96d9, 0x6c0f, 0x4e9e, 0x4fc4, 0x5152, 0x555e, 0x5a25, 0x5ce8, 0x6211, 0x7259, 0x82bd, 0x83aa, 0x86fe, 0x8859, 0x8a1d, 0x963f, 0x96c5, 0x9913, 0x9d09, 0x9d5d, 0x580a, 0x5cb3, 0x5dbd, 0x5e44, 0x60e1, 0x6115, 0x63e1, 0x6a02, 0x6e25, 0x9102, 0x9354, 0x984e, 0x9c10, 0x9f77, 0x5b89, 0x5cb8, 0x6309, 0x664f, 0x6848, 0x773c, 0x96c1, 0x978d, 0x9854, 0x9b9f, 0x65a1, 0x8b01, 0x8ecb, 0x95bc, 0x5535, 0x5ca9, 0x5dd6, 0x5eb5, 0x6697, 0x764c, 0x83f4, 0x95c7, 0x58d3, 0x62bc, 0x72ce, 0x9d28, 0x4ef0, 0x592e, 0x600f, 0x663b, 0x6b83, 0x79e7, 0x9d26, 0x5393, 0x54c0, 0x57c3, 0x5d16, 0x611b, 0x66d6, 0x6daf, 0x788d, 0x827e, 0x9698, 0x9744, 0x5384, 0x627c, 0x6396, 0x6db2, 0x7e0a, 0x814b, 0x984d, 0x6afb, 0x7f4c, 0x9daf, 0x9e1a, 0x4e5f, 0x503b, 0x51b6, 0x591c, 0x60f9, 0x63f6, 0x6930, 0x723a, 0x8036, 0xf974, 0x91ce, 0x5f31, 0xf975, 0xf976, 0x7d04, 0x82e5, 0x846f, 0x84bb, 0x85e5, 0x8e8d, 0xf977, 0x4f6f, 0xf978, 0xf979, 0x58e4, 0x5b43, 0x6059, 0x63da, 0x6518, 0x656d, 0x6698, 0xf97a, 0x694a, 0x6a23, 0x6d0b, 0x7001, 0x716c, 0x75d2, 0x760d, 0x79b3, 0x7a70, 0xf97b, 0x7f8a, 0xf97c, 0x8944, 0xf97d, 0x8b93, 0x91c0, 0x967d, 0xf97e, 0x990a, 0x5704, 0x5fa1, 0x65bc, 0x6f01, 0x7600, 0x79a6, 0x8a9e, 0x99ad, 0x9b5a, 0x9f6c, 0x5104, 0x61b6, 0x6291, 0x6a8d, 0x81c6, 0x5043, 0x5830, 0x5f66, 0x7109, 0x8a00, 0x8afa, 0x5b7c, 0x8616, 0x4ffa, 0x513c, 0x56b4, 0x5944, 0x63a9, 0x6df9, 0x5daa, 0x696d, 0x5186, 0x4e88, 0x4f59, 0xf97f, 0xf980, 0xf981, 0x5982, 0xf982, 0xf983, 0x6b5f, 0x6c5d, 0xf984, 0x74b5, 0x7916, 0xf985, 0x8207, 0x8245, 0x8339, 0x8f3f, 0x8f5d, 0xf986, 0x9918, 0xf987, 0xf988, 0xf989, 0x4ea6, 0xf98a, 0x57df, 0x5f79, 0x6613, 0xf98b, 0xf98c, 0x75ab, 0x7e79, 0x8b6f, 0xf98d, 0x9006, 0x9a5b, 0x56a5, 0x5827, 0x59f8, 0x5a1f, 0x5bb4, 0xf98e, 0x5ef6, 0xf98f, 0xf990, 0x6350, 0x633b, 0xf991, 0x693d, 0x6c87, 0x6cbf, 0x6d8e, 0x6d93, 0x6df5, 0x6f14, 0xf992, 0x70df, 0x7136, 0x7159, 0xf993, 0x71c3, 0x71d5, 0xf994, 0x784f, 0x786f, 0xf995, 0x7b75, 0x7de3, 0xf996, 0x7e2f, 0xf997, 0x884d, 0x8edf, 0xf998, 0xf999, 0xf99a, 0x925b, 0xf99b, 0x9cf6, 0xf99c, 0xf99d, 0xf99e, 0x6085, 0x6d85, 0xf99f, 0x71b1, 0xf9a0, 0xf9a1, 0x95b1, 0x53ad, 0xf9a2, 0xf9a3, 0xf9a4, 0x67d3, 0xf9a5, 0x708e, 0x7130, 0x7430, 0x8276, 0x82d2, 0xf9a6, 0x95bb, 0x9ae5, 0x9e7d, 0x66c4, 0xf9a7, 0x71c1, 0x8449, 0xf9a8, 0xf9a9, 0x584b, 0xf9aa, 0xf9ab, 0x5db8, 0x5f71, 0xf9ac, 0x6620, 0x668e, 0x6979, 0x69ae, 0x6c38, 0x6cf3, 0x6e36, 0x6f41, 0x6fda, 0x701b, 0x702f, 0x7150, 0x71df, 0x7370, 0xf9ad, 0x745b, 0xf9ae, 0x74d4, 0x76c8, 0x7a4e, 0x7e93, 0xf9af, 0xf9b0, 0x82f1, 0x8a60, 0x8fce, 0xf9b1, 0x9348, 0xf9b2, 0x9719, 0xf9b3, 0xf9b4, 0x4e42, 0x502a, 0xf9b5, 0x5208, 0x53e1, 0x66f3, 0x6c6d, 0x6fca, 0x730a, 0x777f, 0x7a62, 0x82ae, 0x85dd, 0x8602, 0xf9b6, 0x88d4, 0x8a63, 0x8b7d, 0x8c6b, 0xf9b7, 0x92b3, 0xf9b8, 0x9713, 0x9810, 0x4e94, 0x4f0d, 0x4fc9, 0x50b2, 0x5348, 0x543e, 0x5433, 0x55da, 0x5862, 0x58ba, 0x5967, 0x5a1b, 0x5be4, 0x609f, 0xf9b9, 0x61ca, 0x6556, 0x65ff, 0x6664, 0x68a7, 0x6c5a, 0x6fb3, 0x70cf, 0x71ac, 0x7352, 0x7b7d, 0x8708, 0x8aa4, 0x9c32, 0x9f07, 0x5c4b, 0x6c83, 0x7344, 0x7389, 0x923a, 0x6eab, 0x7465, 0x761f, 0x7a69, 0x7e15, 0x860a, 0x5140, 0x58c5, 0x64c1, 0x74ee, 0x7515, 0x7670, 0x7fc1, 0x9095, 0x96cd, 0x9954, 0x6e26, 0x74e6, 0x7aa9, 0x7aaa, 0x81e5, 0x86d9, 0x8778, 0x8a1b, 0x5a49, 0x5b8c, 0x5b9b, 0x68a1, 0x6900, 0x6d63, 0x73a9, 0x7413, 0x742c, 0x7897, 0x7de9, 0x7feb, 0x8118, 0x8155, 0x839e, 0x8c4c, 0x962e, 0x9811, 0x66f0, 0x5f80, 0x65fa, 0x6789, 0x6c6a, 0x738b, 0x502d, 0x5a03, 0x6b6a, 0x77ee, 0x5916, 0x5d6c, 0x5dcd, 0x7325, 0x754f, 0xf9ba, 0xf9bb, 0x50e5, 0x51f9, 0x582f, 0x592d, 0x5996, 0x59da, 0x5be5, 0xf9bc, 0xf9bd, 0x5da2, 0x62d7, 0x6416, 0x6493, 0x64fe, 0xf9be, 0x66dc, 0xf9bf, 0x6a48, 0xf9c0, 0x71ff, 0x7464, 0xf9c1, 0x7a88, 0x7aaf, 0x7e47, 0x7e5e, 0x8000, 0x8170, 0xf9c2, 0x87ef, 0x8981, 0x8b20, 0x9059, 0xf9c3, 0x9080, 0x9952, 0x617e, 0x6b32, 0x6d74, 0x7e1f, 0x8925, 0x8fb1, 0x4fd1, 0x50ad, 0x5197, 0x52c7, 0x57c7, 0x5889, 0x5bb9, 0x5eb8, 0x6142, 0x6995, 0x6d8c, 0x6e67, 0x6eb6, 0x7194, 0x7462, 0x7528, 0x752c, 0x8073, 0x8338, 0x84c9, 0x8e0a, 0x9394, 0x93de, 0xf9c4, 0x4e8e, 0x4f51, 0x5076, 0x512a, 0x53c8, 0x53cb, 0x53f3, 0x5b87, 0x5bd3, 0x5c24, 0x611a, 0x6182, 0x65f4, 0x725b, 0x7397, 0x7440, 0x76c2, 0x7950, 0x7991, 0x79b9, 0x7d06, 0x7fbd, 0x828b, 0x85d5, 0x865e, 0x8fc2, 0x9047, 0x90f5, 0x91ea, 0x9685, 0x96e8, 0x96e9, 0x52d6, 0x5f67, 0x65ed, 0x6631, 0x682f, 0x715c, 0x7a36, 0x90c1, 0x980a, 0x4e91, 0xf9c5, 0x6a52, 0x6b9e, 0x6f90, 0x7189, 0x8018, 0x82b8, 0x8553, 0x904b, 0x9695, 0x96f2, 0x97fb, 0x851a, 0x9b31, 0x4e90, 0x718a, 0x96c4, 0x5143, 0x539f, 0x54e1, 0x5713, 0x5712, 0x57a3, 0x5a9b, 0x5ac4, 0x5bc3, 0x6028, 0x613f, 0x63f4, 0x6c85, 0x6d39, 0x6e72, 0x6e90, 0x7230, 0x733f, 0x7457, 0x82d1, 0x8881, 0x8f45, 0x9060, 0xf9c6, 0x9662, 0x9858, 0x9d1b, 0x6708, 0x8d8a, 0x925e, 0x4f4d, 0x5049, 0x50de, 0x5371, 0x570d, 0x59d4, 0x5a01, 0x5c09, 0x6170, 0x6690, 0x6e2d, 0x7232, 0x744b, 0x7def, 0x80c3, 0x840e, 0x8466, 0x853f, 0x875f, 0x885b, 0x8918, 0x8b02, 0x9055, 0x97cb, 0x9b4f, 0x4e73, 0x4f91, 0x5112, 0x516a, 0xf9c7, 0x552f, 0x55a9, 0x5b7a, 0x5ba5, 0x5e7c, 0x5e7d, 0x5ebe, 0x60a0, 0x60df, 0x6108, 0x6109, 0x63c4, 0x6538, 0x6709, 0xf9c8, 0x67d4, 0x67da, 0xf9c9, 0x6961, 0x6962, 0x6cb9, 0x6d27, 0xf9ca, 0x6e38, 0xf9cb, 0x6fe1, 0x7336, 0x7337, 0xf9cc, 0x745c, 0x7531, 0xf9cd, 0x7652, 0xf9ce, 0xf9cf, 0x7dad, 0x81fe, 0x8438, 0x88d5, 0x8a98, 0x8adb, 0x8aed, 0x8e30, 0x8e42, 0x904a, 0x903e, 0x907a, 0x9149, 0x91c9, 0x936e, 0xf9d0, 0xf9d1, 0x5809, 0xf9d2, 0x6bd3, 0x8089, 0x80b2, 0xf9d3, 0xf9d4, 0x5141, 0x596b, 0x5c39, 0xf9d5, 0xf9d6, 0x6f64, 0x73a7, 0x80e4, 0x8d07, 0xf9d7, 0x9217, 0x958f, 0xf9d8, 0xf9d9, 0xf9da, 0xf9db, 0x807f, 0x620e, 0x701c, 0x7d68, 0x878d, 0xf9dc, 0x57a0, 0x6069, 0x6147, 0x6bb7, 0x8abe, 0x9280, 0x96b1, 0x4e59, 0x541f, 0x6deb, 0x852d, 0x9670, 0x97f3, 0x98ee, 0x63d6, 0x6ce3, 0x9091, 0x51dd, 0x61c9, 0x81ba, 0x9df9, 0x4f9d, 0x501a, 0x5100, 0x5b9c, 0x610f, 0x61ff, 0x64ec, 0x6905, 0x6bc5, 0x7591, 0x77e3, 0x7fa9, 0x8264, 0x858f, 0x87fb, 0x8863, 0x8abc, 0x8b70, 0x91ab, 0x4e8c, 0x4ee5, 0x4f0a, 0xf9dd, 0xf9de, 0x5937, 0x59e8, 0xf9df, 0x5df2, 0x5f1b, 0x5f5b, 0x6021, 0xf9e0, 0xf9e1, 0xf9e2, 0xf9e3, 0x723e, 0x73e5, 0xf9e4, 0x7570, 0x75cd, 0xf9e5, 0x79fb, 0xf9e6, 0x800c, 0x8033, 0x8084, 0x82e1, 0x8351, 0xf9e7, 0xf9e8, 0x8cbd, 0x8cb3, 0x9087, 0xf9e9, 0xf9ea, 0x98f4, 0x990c, 0xf9eb, 0xf9ec, 0x7037, 0x76ca, 0x7fca, 0x7fcc, 0x7ffc, 0x8b1a, 0x4eba, 0x4ec1, 0x5203, 0x5370, 0xf9ed, 0x54bd, 0x56e0, 0x59fb, 0x5bc5, 0x5f15, 0x5fcd, 0x6e6e, 0xf9ee, 0xf9ef, 0x7d6a, 0x8335, 0xf9f0, 0x8693, 0x8a8d, 0xf9f1, 0x976d, 0x9777, 0xf9f2, 0xf9f3, 0x4e00, 0x4f5a, 0x4f7e, 0x58f9, 0x65e5, 0x6ea2, 0x9038, 0x93b0, 0x99b9, 0x4efb, 0x58ec, 0x598a, 0x59d9, 0x6041, 0xf9f4, 0xf9f5, 0x7a14, 0xf9f6, 0x834f, 0x8cc3, 0x5165, 0x5344, 0xf9f7, 0xf9f8, 0xf9f9, 0x4ecd, 0x5269, 0x5b55, 0x82bf, 0x4ed4, 0x523a, 0x54a8, 0x59c9, 0x59ff, 0x5b50, 0x5b57, 0x5b5c, 0x6063, 0x6148, 0x6ecb, 0x7099, 0x716e, 0x7386, 0x74f7, 0x75b5, 0x78c1, 0x7d2b, 0x8005, 0x81ea, 0x8328, 0x8517, 0x85c9, 0x8aee, 0x8cc7, 0x96cc, 0x4f5c, 0x52fa, 0x56bc, 0x65ab, 0x6628, 0x707c, 0x70b8, 0x7235, 0x7dbd, 0x828d, 0x914c, 0x96c0, 0x9d72, 0x5b71, 0x68e7, 0x6b98, 0x6f7a, 0x76de, 0x5c91, 0x66ab, 0x6f5b, 0x7bb4, 0x7c2a, 0x8836, 0x96dc, 0x4e08, 0x4ed7, 0x5320, 0x5834, 0x58bb, 0x58ef, 0x596c, 0x5c07, 0x5e33, 0x5e84, 0x5f35, 0x638c, 0x66b2, 0x6756, 0x6a1f, 0x6aa3, 0x6b0c, 0x6f3f, 0x7246, 0xf9fa, 0x7350, 0x748b, 0x7ae0, 0x7ca7, 0x8178, 0x81df, 0x81e7, 0x838a, 0x846c, 0x8523, 0x8594, 0x85cf, 0x88dd, 0x8d13, 0x91ac, 0x9577, 0x969c, 0x518d, 0x54c9, 0x5728, 0x5bb0, 0x624d, 0x6750, 0x683d, 0x6893, 0x6e3d, 0x6ed3, 0x707d, 0x7e21, 0x88c1, 0x8ca1, 0x8f09, 0x9f4b, 0x9f4e, 0x722d, 0x7b8f, 0x8acd, 0x931a, 0x4f47, 0x4f4e, 0x5132, 0x5480, 0x59d0, 0x5e95, 0x62b5, 0x6775, 0x696e, 0x6a17, 0x6cae, 0x6e1a, 0x72d9, 0x732a, 0x75bd, 0x7bb8, 0x7d35, 0x82e7, 0x83f9, 0x8457, 0x85f7, 0x8a5b, 0x8caf, 0x8e87, 0x9019, 0x90b8, 0x96ce, 0x9f5f, 0x52e3, 0x540a, 0x5ae1, 0x5bc2, 0x6458, 0x6575, 0x6ef4, 0x72c4, 0xf9fb, 0x7684, 0x7a4d, 0x7b1b, 0x7c4d, 0x7e3e, 0x7fdf, 0x837b, 0x8b2b, 0x8cca, 0x8d64, 0x8de1, 0x8e5f, 0x8fea, 0x8ff9, 0x9069, 0x93d1, 0x4f43, 0x4f7a, 0x50b3, 0x5168, 0x5178, 0x524d, 0x526a, 0x5861, 0x587c, 0x5960, 0x5c08, 0x5c55, 0x5edb, 0x609b, 0x6230, 0x6813, 0x6bbf, 0x6c08, 0x6fb1, 0x714e, 0x7420, 0x7530, 0x7538, 0x7551, 0x7672, 0x7b4c, 0x7b8b, 0x7bad, 0x7bc6, 0x7e8f, 0x8a6e, 0x8f3e, 0x8f49, 0x923f, 0x9293, 0x9322, 0x942b, 0x96fb, 0x985a, 0x986b, 0x991e, 0x5207, 0x622a, 0x6298, 0x6d59, 0x7664, 0x7aca, 0x7bc0, 0x7d76, 0x5360, 0x5cbe, 0x5e97, 0x6f38, 0x70b9, 0x7c98, 0x9711, 0x9b8e, 0x9ede, 0x63a5, 0x647a, 0x8776, 0x4e01, 0x4e95, 0x4ead, 0x505c, 0x5075, 0x5448, 0x59c3, 0x5b9a, 0x5e40, 0x5ead, 0x5ef7, 0x5f81, 0x60c5, 0x633a, 0x653f, 0x6574, 0x65cc, 0x6676, 0x6678, 0x67fe, 0x6968, 0x6a89, 0x6b63, 0x6c40, 0x6dc0, 0x6de8, 0x6e1f, 0x6e5e, 0x701e, 0x70a1, 0x738e, 0x73fd, 0x753a, 0x775b, 0x7887, 0x798e, 0x7a0b, 0x7a7d, 0x7cbe, 0x7d8e, 0x8247, 0x8a02, 0x8aea, 0x8c9e, 0x912d, 0x914a, 0x91d8, 0x9266, 0x92cc, 0x9320, 0x9706, 0x9756, 0x975c, 0x9802, 0x9f0e, 0x5236, 0x5291, 0x557c, 0x5824, 0x5e1d, 0x5f1f, 0x608c, 0x63d0, 0x68af, 0x6fdf, 0x796d, 0x7b2c, 0x81cd, 0x85ba, 0x88fd, 0x8af8, 0x8e44, 0x918d, 0x9664, 0x969b, 0x973d, 0x984c, 0x9f4a, 0x4fce, 0x5146, 0x51cb, 0x52a9, 0x5632, 0x5f14, 0x5f6b, 0x63aa, 0x64cd, 0x65e9, 0x6641, 0x66fa, 0x66f9, 0x671d, 0x689d, 0x68d7, 0x69fd, 0x6f15, 0x6f6e, 0x7167, 0x71e5, 0x722a, 0x74aa, 0x773a, 0x7956, 0x795a, 0x79df, 0x7a20, 0x7a95, 0x7c97, 0x7cdf, 0x7d44, 0x7e70, 0x8087, 0x85fb, 0x86a4, 0x8a54, 0x8abf, 0x8d99, 0x8e81, 0x9020, 0x906d, 0x91e3, 0x963b, 0x96d5, 0x9ce5, 0x65cf, 0x7c07, 0x8db3, 0x93c3, 0x5b58, 0x5c0a, 0x5352, 0x62d9, 0x731d, 0x5027, 0x5b97, 0x5f9e, 0x60b0, 0x616b, 0x68d5, 0x6dd9, 0x742e, 0x7a2e, 0x7d42, 0x7d9c, 0x7e31, 0x816b, 0x8e2a, 0x8e35, 0x937e, 0x9418, 0x4f50, 0x5750, 0x5de6, 0x5ea7, 0x632b, 0x7f6a, 0x4e3b, 0x4f4f, 0x4f8f, 0x505a, 0x59dd, 0x80c4, 0x546a, 0x5468, 0x55fe, 0x594f, 0x5b99, 0x5dde, 0x5eda, 0x665d, 0x6731, 0x67f1, 0x682a, 0x6ce8, 0x6d32, 0x6e4a, 0x6f8d, 0x70b7, 0x73e0, 0x7587, 0x7c4c, 0x7d02, 0x7d2c, 0x7da2, 0x821f, 0x86db, 0x8a3b, 0x8a85, 0x8d70, 0x8e8a, 0x8f33, 0x9031, 0x914e, 0x9152, 0x9444, 0x99d0, 0x7af9, 0x7ca5, 0x4fca, 0x5101, 0x51c6, 0x57c8, 0x5bef, 0x5cfb, 0x6659, 0x6a3d, 0x6d5a, 0x6e96, 0x6fec, 0x710c, 0x756f, 0x7ae3, 0x8822, 0x9021, 0x9075, 0x96cb, 0x99ff, 0x8301, 0x4e2d, 0x4ef2, 0x8846, 0x91cd, 0x537d, 0x6adb, 0x696b, 0x6c41, 0x847a, 0x589e, 0x618e, 0x66fe, 0x62ef, 0x70dd, 0x7511, 0x75c7, 0x7e52, 0x84b8, 0x8b49, 0x8d08, 0x4e4b, 0x53ea, 0x54ab, 0x5730, 0x5740, 0x5fd7, 0x6301, 0x6307, 0x646f, 0x652f, 0x65e8, 0x667a, 0x679d, 0x67b3, 0x6b62, 0x6c60, 0x6c9a, 0x6f2c, 0x77e5, 0x7825, 0x7949, 0x7957, 0x7d19, 0x80a2, 0x8102, 0x81f3, 0x829d, 0x82b7, 0x8718, 0x8a8c, 0xf9fc, 0x8d04, 0x8dbe, 0x9072, 0x76f4, 0x7a19, 0x7a37, 0x7e54, 0x8077, 0x5507, 0x55d4, 0x5875, 0x632f, 0x6422, 0x6649, 0x664b, 0x686d, 0x699b, 0x6b84, 0x6d25, 0x6eb1, 0x73cd, 0x7468, 0x74a1, 0x755b, 0x75b9, 0x76e1, 0x771e, 0x778b, 0x79e6, 0x7e09, 0x7e1d, 0x81fb, 0x852f, 0x8897, 0x8a3a, 0x8cd1, 0x8eeb, 0x8fb0, 0x9032, 0x93ad, 0x9663, 0x9673, 0x9707, 0x4f84, 0x53f1, 0x59ea, 0x5ac9, 0x5e19, 0x684e, 0x74c6, 0x75be, 0x79e9, 0x7a92, 0x81a3, 0x86ed, 0x8cea, 0x8dcc, 0x8fed, 0x659f, 0x6715, 0xf9fd, 0x57f7, 0x6f57, 0x7ddd, 0x8f2f, 0x93f6, 0x96c6, 0x5fb5, 0x61f2, 0x6f84, 0x4e14, 0x4f98, 0x501f, 0x53c9, 0x55df, 0x5d6f, 0x5dee, 0x6b21, 0x6b64, 0x78cb, 0x7b9a, 0xf9fe, 0x8e49, 0x8eca, 0x906e, 0x6349, 0x643e, 0x7740, 0x7a84, 0x932f, 0x947f, 0x9f6a, 0x64b0, 0x6faf, 0x71e6, 0x74a8, 0x74da, 0x7ac4, 0x7c12, 0x7e82, 0x7cb2, 0x7e98, 0x8b9a, 0x8d0a, 0x947d, 0x9910, 0x994c, 0x5239, 0x5bdf, 0x64e6, 0x672d, 0x7d2e, 0x50ed, 0x53c3, 0x5879, 0x6158, 0x6159, 0x61fa, 0x65ac, 0x7ad9, 0x8b92, 0x8b96, 0x5009, 0x5021, 0x5275, 0x5531, 0x5a3c, 0x5ee0, 0x5f70, 0x6134, 0x655e, 0x660c, 0x6636, 0x66a2, 0x69cd, 0x6ec4, 0x6f32, 0x7316, 0x7621, 0x7a93, 0x8139, 0x8259, 0x83d6, 0x84bc, 0x50b5, 0x57f0, 0x5bc0, 0x5be8, 0x5f69, 0x63a1, 0x7826, 0x7db5, 0x83dc, 0x8521, 0x91c7, 0x91f5, 0x518a, 0x67f5, 0x7b56, 0x8cac, 0x51c4, 0x59bb, 0x60bd, 0x8655, 0x501c, 0xf9ff, 0x5254, 0x5c3a, 0x617d, 0x621a, 0x62d3, 0x64f2, 0x65a5, 0x6ecc, 0x7620, 0x810a, 0x8e60, 0x965f, 0x96bb, 0x4edf, 0x5343, 0x5598, 0x5929, 0x5ddd, 0x64c5, 0x6cc9, 0x6dfa, 0x7394, 0x7a7f, 0x821b, 0x85a6, 0x8ce4, 0x8e10, 0x9077, 0x91e7, 0x95e1, 0x9621, 0x97c6, 0x51f8, 0x54f2, 0x5586, 0x5fb9, 0x64a4, 0x6f88, 0x7db4, 0x8f1f, 0x8f4d, 0x9435, 0x50c9, 0x5c16, 0x6cbe, 0x6dfb, 0x751b, 0x77bb, 0x7c3d, 0x7c64, 0x8a79, 0x8ac2, 0x581e, 0x59be, 0x5e16, 0x6377, 0x7252, 0x758a, 0x776b, 0x8adc, 0x8cbc, 0x8f12, 0x5ef3, 0x6674, 0x6df8, 0x807d, 0x83c1, 0x8acb, 0x9751, 0x9bd6, 0xfa00, 0x5243, 0x66ff, 0x6d95, 0x6eef, 0x7de0, 0x8ae6, 0x902e, 0x905e, 0x9ad4, 0x521d, 0x527f, 0x54e8, 0x6194, 0x6284, 0x62db, 0x68a2, 0x6912, 0x695a, 0x6a35, 0x7092, 0x7126, 0x785d, 0x7901, 0x790e, 0x79d2, 0x7a0d, 0x8096, 0x8278, 0x82d5, 0x8349, 0x8549, 0x8c82, 0x8d85, 0x9162, 0x918b, 0x91ae, 0x4fc3, 0x56d1, 0x71ed, 0x77d7, 0x8700, 0x89f8, 0x5bf8, 0x5fd6, 0x6751, 0x90a8, 0x53e2, 0x585a, 0x5bf5, 0x60a4, 0x6181, 0x6460, 0x7e3d, 0x8070, 0x8525, 0x9283, 0x64ae, 0x50ac, 0x5d14, 0x6700, 0x589c, 0x62bd, 0x63a8, 0x690e, 0x6978, 0x6a1e, 0x6e6b, 0x76ba, 0x79cb, 0x82bb, 0x8429, 0x8acf, 0x8da8, 0x8ffd, 0x9112, 0x914b, 0x919c, 0x9310, 0x9318, 0x939a, 0x96db, 0x9a36, 0x9c0d, 0x4e11, 0x755c, 0x795d, 0x7afa, 0x7b51, 0x7bc9, 0x7e2e, 0x84c4, 0x8e59, 0x8e74, 0x8ef8, 0x9010, 0x6625, 0x693f, 0x7443, 0x51fa, 0x672e, 0x9edc, 0x5145, 0x5fe0, 0x6c96, 0x87f2, 0x885d, 0x8877, 0x60b4, 0x81b5, 0x8403, 0x8d05, 0x53d6, 0x5439, 0x5634, 0x5a36, 0x5c31, 0x708a, 0x7fe0, 0x805a, 0x8106, 0x81ed, 0x8da3, 0x9189, 0x9a5f, 0x9df2, 0x5074, 0x4ec4, 0x53a0, 0x60fb, 0x6e2c, 0x5c64, 0x4f88, 0x5024, 0x55e4, 0x5cd9, 0x5e5f, 0x6065, 0x6894, 0x6cbb, 0x6dc4, 0x71be, 0x75d4, 0x75f4, 0x7661, 0x7a1a, 0x7a49, 0x7dc7, 0x7dfb, 0x7f6e, 0x81f4, 0x86a9, 0x8f1c, 0x96c9, 0x99b3, 0x9f52, 0x5247, 0x52c5, 0x98ed, 0x89aa, 0x4e03, 0x67d2, 0x6f06, 0x4fb5, 0x5be2, 0x6795, 0x6c88, 0x6d78, 0x741b, 0x7827, 0x91dd, 0x937c, 0x87c4, 0x79e4, 0x7a31, 0x5feb, 0x4ed6, 0x54a4, 0x553e, 0x58ae, 0x59a5, 0x60f0, 0x6253, 0x62d6, 0x6736, 0x6955, 0x8235, 0x9640, 0x99b1, 0x99dd, 0x502c, 0x5353, 0x5544, 0x577c, 0xfa01, 0x6258, 0xfa02, 0x64e2, 0x666b, 0x67dd, 0x6fc1, 0x6fef, 0x7422, 0x7438, 0x8a17, 0x9438, 0x5451, 0x5606, 0x5766, 0x5f48, 0x619a, 0x6b4e, 0x7058, 0x70ad, 0x7dbb, 0x8a95, 0x596a, 0x812b, 0x63a2, 0x7708, 0x803d, 0x8caa, 0x5854, 0x642d, 0x69bb, 0x5b95, 0x5e11, 0x6e6f, 0xfa03, 0x8569, 0x514c, 0x53f0, 0x592a, 0x6020, 0x614b, 0x6b86, 0x6c70, 0x6cf0, 0x7b1e, 0x80ce, 0x82d4, 0x8dc6, 0x90b0, 0x98b1, 0xfa04, 0x64c7, 0x6fa4, 0x6491, 0x6504, 0x514e, 0x5410, 0x571f, 0x8a0e, 0x615f, 0x6876, 0xfa05, 0x75db, 0x7b52, 0x7d71, 0x901a, 0x5806, 0x69cc, 0x817f, 0x892a, 0x9000, 0x9839, 0x5078, 0x5957, 0x59ac, 0x6295, 0x900f, 0x9b2a, 0x615d, 0x7279, 0x95d6, 0x5761, 0x5a46, 0x5df4, 0x628a, 0x64ad, 0x64fa, 0x6777, 0x6ce2, 0x6d3e, 0x722c, 0x7436, 0x7834, 0x7f77, 0x82ad, 0x8ddb, 0x9817, 0x5224, 0x5742, 0x677f, 0x7248, 0x74e3, 0x8ca9, 0x8fa6, 0x9211, 0x962a, 0x516b, 0x53ed, 0x634c, 0x4f69, 0x5504, 0x6096, 0x6557, 0x6c9b, 0x6d7f, 0x724c, 0x72fd, 0x7a17, 0x8987, 0x8c9d, 0x5f6d, 0x6f8e, 0x70f9, 0x81a8, 0x610e, 0x4fbf, 0x504f, 0x6241, 0x7247, 0x7bc7, 0x7de8, 0x7fe9, 0x904d, 0x97ad, 0x9a19, 0x8cb6, 0x576a, 0x5e73, 0x67b0, 0x840d, 0x8a55, 0x5420, 0x5b16, 0x5e63, 0x5ee2, 0x5f0a, 0x6583, 0x80ba, 0x853d, 0x9589, 0x965b, 0x4f48, 0x5305, 0x530d, 0x530f, 0x5486, 0x54fa, 0x5703, 0x5e03, 0x6016, 0x629b, 0x62b1, 0x6355, 0xfa06, 0x6ce1, 0x6d66, 0x75b1, 0x7832, 0x80de, 0x812f, 0x82de, 0x8461, 0x84b2, 0x888d, 0x8912, 0x900b, 0x92ea, 0x98fd, 0x9b91, 0x5e45, 0x66b4, 0x66dd, 0x7011, 0x7206, 0xfa07, 0x4ff5, 0x527d, 0x5f6a, 0x6153, 0x6753, 0x6a19, 0x6f02, 0x74e2, 0x7968, 0x8868, 0x8c79, 0x98c7, 0x98c4, 0x9a43, 0x54c1, 0x7a1f, 0x6953, 0x8af7, 0x8c4a, 0x98a8, 0x99ae, 0x5f7c, 0x62ab, 0x75b2, 0x76ae, 0x88ab, 0x907f, 0x9642, 0x5339, 0x5f3c, 0x5fc5, 0x6ccc, 0x73cc, 0x7562, 0x758b, 0x7b46, 0x82fe, 0x999d, 0x4e4f, 0x903c, 0x4e0b, 0x4f55, 0x53a6, 0x590f, 0x5ec8, 0x6630, 0x6cb3, 0x7455, 0x8377, 0x8766, 0x8cc0, 0x9050, 0x971e, 0x9c15, 0x58d1, 0x5b78, 0x8650, 0x8b14, 0x9db4, 0x5bd2, 0x6068, 0x608d, 0x65f1, 0x6c57, 0x6f22, 0x6fa3, 0x701a, 0x7f55, 0x7ff0, 0x9591, 0x9592, 0x9650, 0x97d3, 0x5272, 0x8f44, 0x51fd, 0x542b, 0x54b8, 0x5563, 0x558a, 0x6abb, 0x6db5, 0x7dd8, 0x8266, 0x929c, 0x9677, 0x9e79, 0x5408, 0x54c8, 0x76d2, 0x86e4, 0x95a4, 0x95d4, 0x965c, 0x4ea2, 0x4f09, 0x59ee, 0x5ae6, 0x5df7, 0x6052, 0x6297, 0x676d, 0x6841, 0x6c86, 0x6e2f, 0x7f38, 0x809b, 0x822a, 0xfa08, 0xfa09, 0x9805, 0x4ea5, 0x5055, 0x54b3, 0x5793, 0x595a, 0x5b69, 0x5bb3, 0x61c8, 0x6977, 0x6d77, 0x7023, 0x87f9, 0x89e3, 0x8a72, 0x8ae7, 0x9082, 0x99ed, 0x9ab8, 0x52be, 0x6838, 0x5016, 0x5e78, 0x674f, 0x8347, 0x884c, 0x4eab, 0x5411, 0x56ae, 0x73e6, 0x9115, 0x97ff, 0x9909, 0x9957, 0x9999, 0x5653, 0x589f, 0x865b, 0x8a31, 0x61b2, 0x6af6, 0x737b, 0x8ed2, 0x6b47, 0x96aa, 0x9a57, 0x5955, 0x7200, 0x8d6b, 0x9769, 0x4fd4, 0x5cf4, 0x5f26, 0x61f8, 0x665b, 0x6ceb, 0x70ab, 0x7384, 0x73b9, 0x73fe, 0x7729, 0x774d, 0x7d43, 0x7d62, 0x7e23, 0x8237, 0x8852, 0xfa0a, 0x8ce2, 0x9249, 0x986f, 0x5b51, 0x7a74, 0x8840, 0x9801, 0x5acc, 0x4fe0, 0x5354, 0x593e, 0x5cfd, 0x633e, 0x6d79, 0x72f9, 0x8105, 0x8107, 0x83a2, 0x92cf, 0x9830, 0x4ea8, 0x5144, 0x5211, 0x578b, 0x5f62, 0x6cc2, 0x6ece, 0x7005, 0x7050, 0x70af, 0x7192, 0x73e9, 0x7469, 0x834a, 0x87a2, 0x8861, 0x9008, 0x90a2, 0x93a3, 0x99a8, 0x516e, 0x5f57, 0x60e0, 0x6167, 0x66b3, 0x8559, 0x8e4a, 0x91af, 0x978b, 0x4e4e, 0x4e92, 0x547c, 0x58d5, 0x58fa, 0x597d, 0x5cb5, 0x5f27, 0x6236, 0x6248, 0x660a, 0x6667, 0x6beb, 0x6d69, 0x6dcf, 0x6e56, 0x6ef8, 0x6f94, 0x6fe0, 0x6fe9, 0x705d, 0x72d0, 0x7425, 0x745a, 0x74e0, 0x7693, 0x795c, 0x7cca, 0x7e1e, 0x80e1, 0x82a6, 0x846b, 0x84bf, 0x864e, 0x865f, 0x8774, 0x8b77, 0x8c6a, 0x93ac, 0x9800, 0x9865, 0x60d1, 0x6216, 0x9177, 0x5a5a, 0x660f, 0x6df7, 0x6e3e, 0x743f, 0x9b42, 0x5ffd, 0x60da, 0x7b0f, 0x54c4, 0x5f18, 0x6c5e, 0x6cd3, 0x6d2a, 0x70d8, 0x7d05, 0x8679, 0x8a0c, 0x9d3b, 0x5316, 0x548c, 0x5b05, 0x6a3a, 0x706b, 0x7575, 0x798d, 0x79be, 0x82b1, 0x83ef, 0x8a71, 0x8b41, 0x8ca8, 0x9774, 0xfa0b, 0x64f4, 0x652b, 0x78ba, 0x78bb, 0x7a6b, 0x4e38, 0x559a, 0x5950, 0x5ba6, 0x5e7b, 0x60a3, 0x63db, 0x6b61, 0x6665, 0x6853, 0x6e19, 0x7165, 0x74b0, 0x7d08, 0x9084, 0x9a69, 0x9c25, 0x6d3b, 0x6ed1, 0x733e, 0x8c41, 0x95ca, 0x51f0, 0x5e4c, 0x5fa8, 0x604d, 0x60f6, 0x6130, 0x614c, 0x6643, 0x6644, 0x69a5, 0x6cc1, 0x6e5f, 0x6ec9, 0x6f62, 0x714c, 0x749c, 0x7687, 0x7bc1, 0x7c27, 0x8352, 0x8757, 0x9051, 0x968d, 0x9ec3, 0x532f, 0x56de, 0x5efb, 0x5f8a, 0x6062, 0x6094, 0x61f7, 0x6666, 0x6703, 0x6a9c, 0x6dee, 0x6fae, 0x7070, 0x736a, 0x7e6a, 0x81be, 0x8334, 0x86d4, 0x8aa8, 0x8cc4, 0x5283, 0x7372, 0x5b96, 0x6a6b, 0x9404, 0x54ee, 0x5686, 0x5b5d, 0x6548, 0x6585, 0x66c9, 0x689f, 0x6d8d, 0x6dc6, 0x723b, 0x80b4, 0x9175, 0x9a4d, 0x4faf, 0x5019, 0x539a, 0x540e, 0x543c, 0x5589, 0x55c5, 0x5e3f, 0x5f8c, 0x673d, 0x7166, 0x73dd, 0x9005, 0x52db, 0x52f3, 0x5864, 0x58ce, 0x7104, 0x718f, 0x71fb, 0x85b0, 0x8a13, 0x6688, 0x85a8, 0x55a7, 0x6684, 0x714a, 0x8431, 0x5349, 0x5599, 0x6bc1, 0x5f59, 0x5fbd, 0x63ee, 0x6689, 0x7147, 0x8af1, 0x8f1d, 0x9ebe, 0x4f11, 0x643a, 0x70cb, 0x7566, 0x8667, 0x6064, 0x8b4e, 0x9df8, 0x5147, 0x51f6, 0x5308, 0x6d36, 0x80f8, 0x9ed1, 0x6615, 0x6b23, 0x7098, 0x75d5, 0x5403, 0x5c79, 0x7d07, 0x8a16, 0x6b20, 0x6b3d, 0x6b46, 0x5438, 0x6070, 0x6d3d, 0x7fd5, 0x8208, 0x50d6, 0x51de, 0x559c, 0x566b, 0x56cd, 0x59ec, 0x5b09, 0x5e0c, 0x6199, 0x6198, 0x6231, 0x665e, 0x66e6, 0x7199, 0x71b9, 0x71ba, 0x72a7, 0x79a7, 0x7a00, 0x7fb2, 0x8a70, }; /* Table including ksc5601 symbol to unicode */ static const uint16_t ksc5601_symbol_to_unicode[1115] = { 0x3000, 0x3001, 0x3002, 0x00b7, 0x2025, 0x2026, 0x00a8, 0x3003, 0x00ad, 0x2015, 0x2225, 0xff3c, 0x223c, 0x2018, 0x2019, 0x201c, 0x201d, 0x3014, 0x3015, 0x3008, 0x3009, 0x300a, 0x300b, 0x300c, 0x300d, 0x300e, 0x300f, 0x3010, 0x3011, 0x00b1, 0x00d7, 0x00f7, 0x2260, 0x2264, 0x2265, 0x221e, 0x2234, 0x00b0, 0x2032, 0x2033, 0x2103, 0x212b, 0xffe0, 0xffe1, 0xffe5, 0x2642, 0x2640, 0x2220, 0x22a5, 0x2312, 0x2202, 0x2207, 0x2261, 0x2252, 0x00a7, 0x203b, 0x2606, 0x2605, 0x25cb, 0x25cf, 0x25ce, 0x25c7, 0x25c6, 0x25a1, 0x25a0, 0x25b3, 0x25b2, 0x25bd, 0x25bc, 0x2192, 0x2190, 0x2191, 0x2193, 0x2194, 0x3013, 0x226a, 0x226b, 0x221a, 0x223d, 0x221d, 0x2235, 0x222b, 0x222c, 0x2208, 0x220b, 0x2286, 0x2287, 0x2282, 0x2283, 0x222a, 0x2229, 0x2227, 0x2228, 0xffe2, 0x21d2, 0x21d4, 0x2200, 0x2203, 0x00b4, 0xff5e, 0x02c7, 0x02d8, 0x02dd, 0x02da, 0x02d9, 0x00b8, 0x02db, 0x00a1, 0x00bf, 0x02d0, 0x222e, 0x2211, 0x220f, 0x00a4, 0x2109, 0x2030, 0x25c1, 0x25c0, 0x25b7, 0x25b6, 0x2664, 0x2660, 0x2661, 0x2665, 0x2667, 0x2663, 0x2299, 0x25c8, 0x25a3, 0x25d0, 0x25d1, 0x2592, 0x25a4, 0x25a5, 0x25a8, 0x25a7, 0x25a6, 0x25a9, 0x2668, 0x260f, 0x260e, 0x261c, 0x261e, 0x00b6, 0x2020, 0x2021, 0x2195, 0x2197, 0x2199, 0x2196, 0x2198, 0x266d, 0x2669, 0x266a, 0x266c, 0x327f, 0x321c, 0x2116, 0x33c7, 0x2122, 0x33c2, 0x33d8, 0x2121, 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, 0xff01, 0xff02, 0xff03, 0xff04, 0xff05, 0xff06, 0xff07, 0xff08, 0xff09, 0xff0a, 0xff0b, 0xff0c, 0xff0d, 0xff0e, 0xff0f, 0xff10, 0xff11, 0xff12, 0xff13, 0xff14, 0xff15, 0xff16, 0xff17, 0xff18, 0xff19, 0xff1a, 0xff1b, 0xff1c, 0xff1d, 0xff1e, 0xff1f, 0xff20, 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, 0xff3b, 0xffe6, 0xff3d, 0xff3e, 0xff3f, 0xff40, 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, 0xff5b, 0xff5c, 0xff5d, 0xffe3, 0x3131, 0x3132, 0x3133, 0x3134, 0x3135, 0x3136, 0x3137, 0x3138, 0x3139, 0x313a, 0x313b, 0x313c, 0x313d, 0x313e, 0x313f, 0x3140, 0x3141, 0x3142, 0x3143, 0x3144, 0x3145, 0x3146, 0x3147, 0x3148, 0x3149, 0x314a, 0x314b, 0x314c, 0x314d, 0x314e, 0x314f, 0x3150, 0x3151, 0x3152, 0x3153, 0x3154, 0x3155, 0x3156, 0x3157, 0x3158, 0x3159, 0x315a, 0x315b, 0x315c, 0x315d, 0x315e, 0x315f, 0x3160, 0x3161, 0x3162, 0x3163, 0x3164, 0x3165, 0x3166, 0x3167, 0x3168, 0x3169, 0x316a, 0x316b, 0x316c, 0x316d, 0x316e, 0x316f, 0x3170, 0x3171, 0x3172, 0x3173, 0x3174, 0x3175, 0x3176, 0x3177, 0x3178, 0x3179, 0x317a, 0x317b, 0x317c, 0x317d, 0x317e, 0x317f, 0x3180, 0x3181, 0x3182, 0x3183, 0x3184, 0x3185, 0x3186, 0x3187, 0x3188, 0x3189, 0x318a, 0x318b, 0x318c, 0x318d, 0x318e, 0x2170, 0x2171, 0x2172, 0x2173, 0x2174, 0x2175, 0x2176, 0x2177, 0x2178, 0x2179, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x2160, 0x2161, 0x2162, 0x2163, 0x2164, 0x2165, 0x2166, 0x2167, 0x2168, 0x2169, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 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, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 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, 0x2512, 0x2511, 0x251a, 0x2519, 0x2516, 0x2515, 0x250e, 0x250d, 0x251e, 0x251f, 0x2521, 0x2522, 0x2526, 0x2527, 0x2529, 0x252a, 0x252d, 0x252e, 0x2531, 0x2532, 0x2535, 0x2536, 0x2539, 0x253a, 0x253d, 0x253e, 0x2540, 0x2541, 0x2543, 0x2544, 0x2545, 0x2546, 0x2547, 0x2548, 0x2549, 0x254a, 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, 0x3395, 0x3396, 0x3397, 0x2113, 0x3398, 0x33c4, 0x33a3, 0x33a4, 0x33a5, 0x33a6, 0x3399, 0x339a, 0x339b, 0x339c, 0x339d, 0x339e, 0x339f, 0x33a0, 0x33a1, 0x33a2, 0x33ca, 0x338d, 0x338e, 0x338f, 0x33cf, 0x3388, 0x3389, 0x33c8, 0x33a7, 0x33a8, 0x33b0, 0x33b1, 0x33b2, 0x33b3, 0x33b4, 0x33b5, 0x33b6, 0x33b7, 0x33b8, 0x33b9, 0x3380, 0x3381, 0x3382, 0x3383, 0x3384, 0x33ba, 0x33bb, 0x33bc, 0x33bd, 0x33be, 0x33bf, 0x3390, 0x3391, 0x3392, 0x3393, 0x3394, 0x2126, 0x33c0, 0x33c1, 0x338a, 0x338b, 0x338c, 0x33d6, 0x33c5, 0x33ad, 0x33ae, 0x33af, 0x33db, 0x33a9, 0x33aa, 0x33ab, 0x33ac, 0x33dd, 0x33d0, 0x33d3, 0x33c3, 0x33c9, 0x33dc, 0x33c6, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x00c6, 0x00d0, 0x00aa, 0x0126, 0x0000, 0x0132, 0x0000, 0x013f, 0x0141, 0x00d8, 0x0152, 0x00ba, 0x00de, 0x0166, 0x014a, 0x0000, 0x3260, 0x3261, 0x3262, 0x3263, 0x3264, 0x3265, 0x3266, 0x3267, 0x3268, 0x3269, 0x326a, 0x326b, 0x326c, 0x326d, 0x326e, 0x326f, 0x3270, 0x3271, 0x3272, 0x3273, 0x3274, 0x3275, 0x3276, 0x3277, 0x3278, 0x3279, 0x327a, 0x327b, 0x24d0, 0x24d1, 0x24d2, 0x24d3, 0x24d4, 0x24d5, 0x24d6, 0x24d7, 0x24d8, 0x24d9, 0x24da, 0x24db, 0x24dc, 0x24dd, 0x24de, 0x24df, 0x24e0, 0x24e1, 0x24e2, 0x24e3, 0x24e4, 0x24e5, 0x24e6, 0x24e7, 0x24e8, 0x24e9, 0x2460, 0x2461, 0x2462, 0x2463, 0x2464, 0x2465, 0x2466, 0x2467, 0x2468, 0x2469, 0x246a, 0x246b, 0x246c, 0x246d, 0x246e, 0x00bd, 0x2153, 0x2154, 0x00bc, 0x00be, 0x215b, 0x215c, 0x215d, 0x215e, 0x00e6, 0x0111, 0x00f0, 0x0127, 0x0131, 0x0133, 0x0138, 0x0140, 0x0142, 0x00f8, 0x0153, 0x00df, 0x00fe, 0x0167, 0x014b, 0x0149, 0x3200, 0x3201, 0x3202, 0x3203, 0x3204, 0x3205, 0x3206, 0x3207, 0x3208, 0x3209, 0x320a, 0x320b, 0x320c, 0x320d, 0x320e, 0x320f, 0x3210, 0x3211, 0x3212, 0x3213, 0x3214, 0x3215, 0x3216, 0x3217, 0x3218, 0x3219, 0x321a, 0x321b, 0x249c, 0x249d, 0x249e, 0x249f, 0x24a0, 0x24a1, 0x24a2, 0x24a3, 0x24a4, 0x24a5, 0x24a6, 0x24a7, 0x24a8, 0x24a9, 0x24aa, 0x24ab, 0x24ac, 0x24ad, 0x24ae, 0x24af, 0x24b0, 0x24b1, 0x24b2, 0x24b3, 0x24b4, 0x24b5, 0x2474, 0x2475, 0x2476, 0x2477, 0x2478, 0x2479, 0x247a, 0x247b, 0x247c, 0x247d, 0x247e, 0x247f, 0x2480, 0x2481, 0x2482, 0x00b9, 0x00b2, 0x00b3, 0x2074, 0x207f, 0x2081, 0x2082, 0x2083, 0x2084, 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, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 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, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 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, }; static const uint16_t REPLACEMENT = 0xfffd; static inline bool IsEucChar(unsigned c) { return c >= 0xa1 && c <= 0xfe; } static inline bool IsCP949Char(unsigned c) { return c >= 0x81 && c <= 0xa0; } static inline uint16_t ValidChar(unsigned u) { return u != 0 ? static_cast(u) : REPLACEMENT; } static uint16_t ksc2unicode(unsigned code) { int ch1 = code >> 8; int ch2 = code & 0x00ff; int idx; if (ch1 < 0x80 || (ch1 - 0x80) <= 0x20 || (ch1 - 0x80) >= 0x7e || (ch1 - 0x80) == 0x49) return 0; if (ch2 < 0x80 || (ch2 - 0x80) <= 0x20 || (ch2 - 0x80) >= 0x7f) return 0; idx = (ch1 - 0x80 - 0x21) * 94 + (ch2 - 0x80 - 0x21); /* Hangul : row 16 - row 40 : 1410 = 15 * 94 , 3760 = 40 * 94 */ if (idx >= 1410 && idx < 1410 + 2350) return ksc5601_hangul_to_unicode[idx - 1410]; else if (idx >= 3854) /* Hanja : row 42 - row 93 : 3854 = 94 * (42-1) */ return ksc5601_hanja_to_unicode[idx - 3854]; else if (idx <= 1114) return ksc5601_symbol_to_unicode[idx]; return 0; } void KRTextDecoder::AppendEucKr(std::vector& result, const uint8_t* bytes, size_t length) { uint8_t buf[2] = { 0, 0 }; int nbuf = 0; int invalid = 0; for (size_t i = 0; i= 8822) { result.push_back(REPLACEMENT); ++invalid; break; } else result.push_back(ValidChar(cp949_icode_to_unicode[internal_code])); } nbuf = 0; break; } } }zxing-cpp-1.0.8+ds2/core/src/textcodec/KRTextDecoder.h000066400000000000000000000033611361167020700224520ustar00rootroot00000000000000#pragma once /**************************************************************************** ** ** Copyright (C) 2015 The Qt Company Ltd. ** Contact: http://www.qt.io/licensing/ ** ** This file is part of the QtCore module of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:LGPL21$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and The Qt Company. For licensing terms ** and conditions see http://www.qt.io/terms-conditions. For further ** information use the contact form at http://www.qt.io/contact-us. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 or version 3 as published by the Free ** Software Foundation and appearing in the file LICENSE.LGPLv21 and ** LICENSE.LGPLv3 included in the packaging of this file. Please review the ** following information to ensure the GNU Lesser General Public License ** requirements will be met: https://www.gnu.org/licenses/lgpl.html and ** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** As a special exception, The Qt Company gives you certain additional ** rights. These rights are described in The Qt Company LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** $QT_END_LICENSE$ ** ****************************************************************************/ #include #include #include class KRTextDecoder { public: static void AppendEucKr(std::vector& utf16, const uint8_t* bytes, size_t length); }; zxing-cpp-1.0.8+ds2/core/src/textcodec/KRTextEncoder.cpp000066400000000000000000003171741361167020700230310ustar00rootroot00000000000000/**************************************************************************** ** ** Copyright (C) 2015 The Qt Company Ltd. ** Contact: http://www.qt.io/licensing/ ** ** This file is part of the QtCore module of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:LGPL21$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and The Qt Company. For licensing terms ** and conditions see http://www.qt.io/terms-conditions. For further ** information use the contact form at http://www.qt.io/contact-us. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 or version 3 as published by the Free ** Software Foundation and appearing in the file LICENSE.LGPLv21 and ** LICENSE.LGPLv3 included in the packaging of this file. Please review the ** following information to ensure the GNU Lesser General Public License ** requirements will be met: https://www.gnu.org/licenses/lgpl.html and ** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** As a special exception, The Qt Company gives you certain additional ** rights. These rights are described in The Qt Company LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** $QT_END_LICENSE$ ** ****************************************************************************/ // Most of the cp949 code was originally written by Joon-Kyu Park, and is included // in Qt with the author's permission and the grateful thanks of the Qt team. #include "KRTextEncoder.h" #include "KRHangulMapping.h" struct Mapping { uint16_t unicode; uint16_t kscode; }; /* Map Table including unicode to ksc5601 symbol */ static const Mapping unicode_to_ksc5601_symbol[986] = { {0x4e00,0x6c69}, {0x4e01,0x6f4b}, {0x4e03,0x7652}, {0x4e07,0x5832}, {0x4e08,0x6d5b}, {0x4e09,0x5f32}, {0x4e0a,0x5f3e}, {0x4e0b,0x793b}, {0x4e0d,0x5c74}, {0x4e11,0x7564}, {0x4e14,0x7326}, {0x4e15,0x5d60}, {0x4e16,0x6126}, {0x4e18,0x4e78}, {0x4e19,0x5c30}, {0x4e1e,0x632a}, {0x4e2d,0x7169}, {0x4e32,0x4d7a}, {0x4e38,0x7c2f}, {0x4e39,0x5321}, {0x4e3b,0x712b}, {0x4e42,0x6751}, {0x4e43,0x522c}, {0x4e45,0x4e79}, {0x4e4b,0x717d}, {0x4e4d,0x5e3f}, {0x4e4e,0x7b3a}, {0x4e4f,0x7939}, {0x4e56,0x4e52}, {0x4e58,0x632b}, {0x4e59,0x6b60}, {0x4e5d,0x4e7a}, {0x4e5e,0x4b77}, {0x4e5f,0x6525}, {0x4e6b,0x4a61}, {0x4e6d,0x544c}, {0x4e73,0x6a61}, {0x4e76,0x5c63}, {0x4e77,0x5f2d}, {0x4e7e,0x4b6b}, {0x4e82,0x552f}, {0x4e86,0x5675}, {0x4e88,0x6578}, {0x4e8b,0x5e40}, {0x4e8c,0x6c23}, {0x4e8e,0x694d}, {0x4e90,0x6a27}, {0x4e91,0x6976}, {0x4e92,0x7b3b}, {0x4e94,0x6769}, {0x4e95,0x6f4c}, {0x4e98,0x5066}, {0x4e9b,0x5e41}, {0x4e9e,0x642c}, {0x4ea1,0x584c}, {0x4ea2,0x7971}, {0x4ea4,0x4e5f}, {0x4ea5,0x7a24}, {0x4ea6,0x6632}, {0x4ea8,0x7a7b}, {0x4eab,0x7a3d}, {0x4eac,0x4c48}, {0x4ead,0x6f4d}, {0x4eae,0x5555}, {0x4eb6,0x5322}, {0x4eba,0x6c51}, {0x4ec0,0x6427}, {0x4ec1,0x6c52}, {0x4ec4,0x7631}, {0x4ec7,0x4e7b}, {0x4eca,0x5051}, {0x4ecb,0x4b3f}, {0x4ecd,0x6d24}, {0x4ed4,0x6d28}, {0x4ed5,0x5e42}, {0x4ed6,0x7662}, {0x4ed7,0x6d5c}, {0x4ed8,0x5c75}, {0x4ed9,0x6039}, {0x4edd,0x544e}, {0x4edf,0x7435}, {0x4ee3,0x535b}, {0x4ee4,0x5635}, {0x4ee5,0x6c24}, {0x4ef0,0x6466}, {0x4ef2,0x716a}, {0x4ef6,0x4b6c}, {0x4ef7,0x4b40}, {0x4efb,0x6c72}, {0x4f01,0x506a}, {0x4f09,0x7972}, {0x4f0a,0x6c25}, {0x4f0b,0x505f}, {0x4f0d,0x676a}, {0x4f0e,0x506b}, {0x4f0f,0x5c51}, {0x4f10,0x5b69}, {0x4f11,0x7d4c}, {0x4f2f,0x5b57}, {0x4f34,0x5a61}, {0x4f36,0x5636}, {0x4f38,0x635f}, {0x4f3a,0x5e43}, {0x4f3c,0x5e44}, {0x4f3d,0x4a21}, {0x4f43,0x6e6c}, {0x4f46,0x5323}, {0x4f47,0x6e37}, {0x4f48,0x784f}, {0x4f4d,0x6a48}, {0x4f4e,0x6e38}, {0x4f4f,0x712c}, {0x4f50,0x7125}, {0x4f51,0x694e}, {0x4f55,0x793c}, {0x4f59,0x6579}, {0x4f5a,0x6c6a}, {0x4f5b,0x5d56}, {0x4f5c,0x6d42}, {0x4f69,0x7825}, {0x4f6f,0x653a}, {0x4f70,0x5b58}, {0x4f73,0x4a22}, {0x4f76,0x514d}, {0x4f7a,0x6e6d}, {0x4f7e,0x6c6b}, {0x4f7f,0x5e45}, {0x4f81,0x6360}, {0x4f83,0x4a49}, {0x4f84,0x7269}, {0x4f86,0x554e}, {0x4f88,0x7636}, {0x4f8a,0x4e42}, {0x4f8b,0x5647}, {0x4f8d,0x6334}, {0x4f8f,0x712d}, {0x4f91,0x6a62}, {0x4f96,0x5742}, {0x4f98,0x7327}, {0x4f9b,0x4d6a}, {0x4f9d,0x6b6e}, {0x4fae,0x5932}, {0x4faf,0x7d25}, {0x4fb5,0x7655}, {0x4fb6,0x5562}, {0x4fbf,0x7835}, {0x4fc2,0x4c75}, {0x4fc3,0x7535}, {0x4fc4,0x642d}, {0x4fc9,0x676b}, {0x4fca,0x7155}, {0x4fce,0x703b}, {0x4fd1,0x6935}, {0x4fd3,0x4c49}, {0x4fd4,0x7a55}, {0x4fd7,0x6154}, {0x4fda,0x5756}, {0x4fdd,0x5c41}, {0x4fdf,0x5e46}, {0x4fe0,0x7a6f}, {0x4fe1,0x6361}, {0x4fee,0x6173}, {0x4fef,0x5c76}, {0x4ff1,0x4e7c}, {0x4ff3,0x5b44}, {0x4ff5,0x7871}, {0x4ff8,0x5c64}, {0x4ffa,0x656f}, {0x5002,0x5c31}, {0x5006,0x5556}, {0x5009,0x735a}, {0x500b,0x4b41}, {0x500d,0x5b43}, {0x5011,0x597a}, {0x5012,0x536e}, {0x5016,0x7a38}, {0x5019,0x7d26}, {0x501a,0x6b6f}, {0x501c,0x7426}, {0x501e,0x4c4a}, {0x501f,0x7328}, {0x5021,0x735b}, {0x5023,0x5b27}, {0x5024,0x7637}, {0x5026,0x4f66}, {0x5027,0x7072}, {0x5028,0x4b5a}, {0x502a,0x6752}, {0x502b,0x5743}, {0x502c,0x7670}, {0x502d,0x685e}, {0x503b,0x6526}, {0x5043,0x6567}, {0x5047,0x4a23}, {0x5048,0x4c27}, {0x5049,0x6a49}, {0x504f,0x7836}, {0x5055,0x7a25}, {0x505a,0x712e}, {0x505c,0x6f4e}, {0x5065,0x4b6d}, {0x5074,0x7630}, {0x5075,0x6f4f}, {0x5076,0x694f}, {0x5078,0x775e}, {0x5080,0x4e53}, {0x5085,0x5c77}, {0x508d,0x5b28}, {0x5091,0x4b78}, {0x5098,0x5f21}, {0x5099,0x5d61}, {0x50ac,0x754a}, {0x50ad,0x6936}, {0x50b2,0x676c}, {0x50b3,0x6e6e}, {0x50b5,0x7370}, {0x50b7,0x5f3f}, {0x50be,0x4c4b}, {0x50c5,0x5041}, {0x50c9,0x7452}, {0x50ca,0x603a}, {0x50cf,0x5f40}, {0x50d1,0x4e60}, {0x50d5,0x5c52}, {0x50d6,0x7d6a}, {0x50da,0x5676}, {0x50de,0x6a4a}, {0x50e5,0x6869}, {0x50e7,0x632c}, {0x50ed,0x7350}, {0x50f9,0x4a24}, {0x50fb,0x5b78}, {0x50ff,0x5e47}, {0x5100,0x6b70}, {0x5101,0x7156}, {0x5104,0x6562}, {0x5106,0x4c4c}, {0x5109,0x4b7b}, {0x5112,0x6a63}, {0x511f,0x5f41}, {0x5121,0x566d}, {0x512a,0x6950}, {0x5132,0x6e39}, {0x5137,0x5563}, {0x513a,0x5153}, {0x513c,0x6570}, {0x5140,0x6834}, {0x5141,0x6b43}, {0x5143,0x6a2a}, {0x5144,0x7a7c}, {0x5145,0x7576}, {0x5146,0x703c}, {0x5147,0x7d54}, {0x5148,0x603b}, {0x5149,0x4e43}, {0x514b,0x503a}, {0x514c,0x773a}, {0x514d,0x5873}, {0x514e,0x774d}, {0x5152,0x642e}, {0x515c,0x545f}, {0x5162,0x5067}, {0x5165,0x6c7d}, {0x5167,0x522e}, {0x5168,0x6e6f}, {0x5169,0x5557}, {0x516a,0x6a64}, {0x516b,0x7822}, {0x516c,0x4d6b}, {0x516d,0x573f}, {0x516e,0x7b31}, {0x5171,0x4d6c}, {0x5175,0x5c32}, {0x5176,0x506c}, {0x5177,0x4e7d}, {0x5178,0x6e70}, {0x517c,0x4c42}, {0x5180,0x506d}, {0x5186,0x6577}, {0x518a,0x737c}, {0x518d,0x6e22}, {0x5192,0x5933}, {0x5195,0x5874}, {0x5197,0x6937}, {0x51a0,0x4e2e}, {0x51a5,0x5922}, {0x51aa,0x5871}, {0x51ac,0x544f}, {0x51b6,0x6527}, {0x51b7,0x5552}, {0x51bd,0x5629}, {0x51c4,0x7422}, {0x51c6,0x7157}, {0x51c9,0x5558}, {0x51cb,0x703d}, {0x51cc,0x5750}, {0x51cd,0x5450}, {0x51dc,0x574f}, {0x51dd,0x6b6a}, {0x51de,0x7d6b}, {0x51e1,0x5b6d}, {0x51f0,0x7c45}, {0x51f1,0x4b42}, {0x51f6,0x7d55}, {0x51f8,0x7448}, {0x51f9,0x686a}, {0x51fa,0x7573}, {0x51fd,0x795e}, {0x5200,0x536f}, {0x5203,0x6c53}, {0x5206,0x5d42}, {0x5207,0x6f37}, {0x5208,0x6754}, {0x520a,0x4a4a}, {0x520e,0x597b}, {0x5211,0x7a7d}, {0x5217,0x562a}, {0x521d,0x7478}, {0x5224,0x7777}, {0x5225,0x5c2c}, {0x5229,0x5757}, {0x522a,0x5f22}, {0x522e,0x4e3e}, {0x5230,0x5370}, {0x5236,0x7024}, {0x5237,0x616c}, {0x5238,0x4f67}, {0x5239,0x734b}, {0x523a,0x6d29}, {0x523b,0x4a3e}, {0x5243,0x746f}, {0x5247,0x764e}, {0x524a,0x5e7b}, {0x524b,0x503b}, {0x524c,0x5537}, {0x524d,0x6e71}, {0x5254,0x7428}, {0x5256,0x5c78}, {0x525b,0x4b27}, {0x525d,0x5a4e}, {0x5261,0x6066}, {0x5269,0x6d25}, {0x526a,0x6e72}, {0x526f,0x5c79}, {0x5272,0x795c}, {0x5275,0x735c}, {0x527d,0x7872}, {0x527f,0x7479}, {0x5283,0x7c71}, {0x5287,0x503c}, {0x5288,0x5b79}, {0x5289,0x5731}, {0x528d,0x4b7c}, {0x5291,0x7025}, {0x5292,0x4b7d}, {0x529b,0x5574}, {0x529f,0x4d6d}, {0x52a0,0x4a25}, {0x52a3,0x562b}, {0x52a4,0x5042}, {0x52a9,0x703e}, {0x52aa,0x523d}, {0x52ab,0x4c24}, {0x52be,0x7a36}, {0x52c1,0x4c4d}, {0x52c3,0x5a7a}, {0x52c5,0x764f}, {0x52c7,0x6938}, {0x52c9,0x5875}, {0x52cd,0x4c4e}, {0x52d2,0x574d}, {0x52d5,0x5451}, {0x52d6,0x696d}, {0x52d8,0x4a6b}, {0x52d9,0x5962}, {0x52db,0x7d32}, {0x52dd,0x632d}, {0x52de,0x564c}, {0x52df,0x5934}, {0x52e2,0x6127}, {0x52e3,0x6e53}, {0x52e4,0x5043}, {0x52f3,0x7d33}, {0x52f5,0x5564}, {0x52f8,0x4f68}, {0x52fa,0x6d43}, {0x52fb,0x5032}, {0x52fe,0x4e7e}, {0x52ff,0x5a28}, {0x5305,0x7850}, {0x5308,0x7d56}, {0x530d,0x7851}, {0x530f,0x7852}, {0x5310,0x5c53}, {0x5315,0x5d62}, {0x5316,0x7b79}, {0x5317,0x5d41}, {0x5319,0x6335}, {0x5320,0x6d5d}, {0x5321,0x4e44}, {0x5323,0x4b21}, {0x532a,0x5d63}, {0x532f,0x7c5d}, {0x5339,0x792f}, {0x533f,0x527b}, {0x5340,0x4f21}, {0x5341,0x6428}, {0x5343,0x7436}, {0x5344,0x6c7e}, {0x5347,0x632e}, {0x5348,0x676d}, {0x5349,0x7d41}, {0x534a,0x5a62}, {0x534d,0x5833}, {0x5351,0x5d64}, {0x5352,0x706f}, {0x5353,0x7671}, {0x5354,0x7a70}, {0x5357,0x5175}, {0x535a,0x5a4f}, {0x535c,0x5c54}, {0x535e,0x5c26}, {0x5360,0x6f3f}, {0x5366,0x4e4f}, {0x5368,0x6059}, {0x536f,0x5956}, {0x5370,0x6c54}, {0x5371,0x6a4b}, {0x5374,0x4a3f}, {0x5375,0x5530}, {0x5377,0x4f69}, {0x537d,0x716d}, {0x537f,0x4c4f}, {0x5384,0x6478}, {0x5393,0x646d}, {0x5398,0x5758}, {0x539a,0x7d27}, {0x539f,0x6a2b}, {0x53a0,0x7632}, {0x53a5,0x4f70}, {0x53a6,0x793d}, {0x53ad,0x6674}, {0x53bb,0x4b5b}, {0x53c3,0x7351}, {0x53c8,0x6951}, {0x53c9,0x7329}, {0x53ca,0x5060}, {0x53cb,0x6952}, {0x53cd,0x5a63}, {0x53d4,0x6252}, {0x53d6,0x7622}, {0x53d7,0x6174}, {0x53db,0x5a64}, {0x53e1,0x6755}, {0x53e2,0x753f}, {0x53e3,0x4f22}, {0x53e4,0x4d2f}, {0x53e5,0x4f23}, {0x53e9,0x4d30}, {0x53ea,0x717e}, {0x53eb,0x5023}, {0x53ec,0x612f}, {0x53ed,0x7823}, {0x53ef,0x4a26}, {0x53f0,0x773b}, {0x53f1,0x726a}, {0x53f2,0x5e48}, {0x53f3,0x6953}, {0x53f8,0x5e49}, {0x5403,0x7d5e}, {0x5404,0x4a40}, {0x5408,0x796a}, {0x5409,0x514e}, {0x540a,0x6e54}, {0x540c,0x5452}, {0x540d,0x5923}, {0x540e,0x7d28}, {0x540f,0x5759}, {0x5410,0x774e}, {0x5411,0x7a3e}, {0x541b,0x4f56}, {0x541d,0x5770}, {0x541f,0x6b61}, {0x5420,0x7845}, {0x5426,0x5c7a}, {0x5429,0x5d43}, {0x542b,0x795f}, {0x5433,0x676f}, {0x5438,0x7d65}, {0x5439,0x7623}, {0x543b,0x597c}, {0x543c,0x7d29}, {0x543e,0x676e}, {0x5442,0x5565}, {0x5448,0x6f50}, {0x544a,0x4d31}, {0x5451,0x7722}, {0x5468,0x7132}, {0x546a,0x7131}, {0x5471,0x4d32}, {0x5473,0x5a2b}, {0x5475,0x4a27}, {0x547b,0x6362}, {0x547c,0x7b3c}, {0x547d,0x5924}, {0x5480,0x6e3a}, {0x5486,0x7853}, {0x548c,0x7b7a}, {0x548e,0x4f24}, {0x5490,0x5c7b}, {0x54a4,0x7663}, {0x54a8,0x6d2a}, {0x54ab,0x7221}, {0x54ac,0x4e61}, {0x54b3,0x7a26}, {0x54b8,0x7960}, {0x54bd,0x6c56}, {0x54c0,0x646e}, {0x54c1,0x7921}, {0x54c4,0x7b6f}, {0x54c8,0x796b}, {0x54c9,0x6e23}, {0x54e1,0x6a2c}, {0x54e5,0x4a28}, {0x54e8,0x747a}, {0x54ed,0x4d56}, {0x54ee,0x7c76}, {0x54f2,0x7449}, {0x54fa,0x7854}, {0x5504,0x7826}, {0x5506,0x5e4a}, {0x5507,0x7246}, {0x550e,0x575a}, {0x5510,0x5350}, {0x551c,0x5845}, {0x552f,0x6a66}, {0x5531,0x735d}, {0x5535,0x645a}, {0x553e,0x7664}, {0x5544,0x7672}, {0x5546,0x5f42}, {0x554f,0x597d}, {0x5553,0x4c76}, {0x5556,0x533a}, {0x555e,0x642f}, {0x5563,0x7961}, {0x557c,0x7026}, {0x5580,0x4b53}, {0x5584,0x603c}, {0x5586,0x744a}, {0x5587,0x547a}, {0x5589,0x7d2a}, {0x558a,0x7962}, {0x5598,0x7437}, {0x5599,0x7d42}, {0x559a,0x7c30}, {0x559c,0x7d6c}, {0x559d,0x4a62}, {0x55a7,0x7d3d}, {0x55a9,0x6a67}, {0x55aa,0x5f43}, {0x55ab,0x5152}, {0x55ac,0x4e62}, {0x55ae,0x5324}, {0x55c5,0x7d2b}, {0x55c7,0x5f60}, {0x55d4,0x7247}, {0x55da,0x6770}, {0x55dc,0x506e}, {0x55df,0x732a}, {0x55e3,0x5e4b}, {0x55e4,0x7638}, {0x55fd,0x6175}, {0x55fe,0x7133}, {0x5606,0x7723}, {0x5609,0x4a29}, {0x5614,0x4f25}, {0x5617,0x5f44}, {0x562f,0x6130}, {0x5632,0x703f}, {0x5634,0x7624}, {0x5636,0x6336}, {0x5653,0x7a46}, {0x5668,0x506f}, {0x566b,0x7d6d}, {0x5674,0x5d44}, {0x5686,0x7c77}, {0x56a5,0x663f}, {0x56ac,0x5e2d}, {0x56ae,0x7a3f}, {0x56b4,0x6571}, {0x56bc,0x6d44}, {0x56ca,0x5225}, {0x56cd,0x7d6e}, {0x56d1,0x7536}, {0x56da,0x6176}, {0x56db,0x5e4c}, {0x56de,0x7c5e}, {0x56e0,0x6c57}, {0x56f0,0x4d5d}, {0x56f9,0x5637}, {0x56fa,0x4d33}, {0x5703,0x7855}, {0x5704,0x6558}, {0x5708,0x4f6a}, {0x570b,0x4f50}, {0x570d,0x6a4c}, {0x5712,0x6a2e}, {0x5713,0x6a2d}, {0x5716,0x5371}, {0x5718,0x5325}, {0x571f,0x774f}, {0x5728,0x6e24}, {0x572d,0x5024}, {0x5730,0x7222}, {0x573b,0x5070}, {0x5740,0x7223}, {0x5742,0x7778}, {0x5747,0x5033}, {0x574a,0x5b29}, {0x574d,0x533b}, {0x574e,0x4a6c}, {0x5750,0x7126}, {0x5751,0x4b55}, {0x5761,0x7767}, {0x5764,0x4d5e}, {0x5766,0x7724}, {0x576a,0x7840}, {0x576e,0x535d}, {0x5770,0x4c50}, {0x5775,0x4f26}, {0x577c,0x7673}, {0x5782,0x6177}, {0x5788,0x535c}, {0x578b,0x7a7e}, {0x5793,0x7a27}, {0x57a0,0x6b59}, {0x57a2,0x4f27}, {0x57a3,0x6a2f}, {0x57c3,0x646f}, {0x57c7,0x6939}, {0x57c8,0x7158}, {0x57cb,0x5858}, {0x57ce,0x6072}, {0x57df,0x6634}, {0x57e0,0x5c7c}, {0x57f0,0x7371}, {0x57f4,0x6350}, {0x57f7,0x727b}, {0x57f9,0x5b46}, {0x57fa,0x5071}, {0x57fc,0x5072}, {0x5800,0x4f5c}, {0x5802,0x5351}, {0x5805,0x4c31}, {0x5806,0x7758}, {0x5808,0x4b28}, {0x5809,0x6b3c}, {0x580a,0x643e}, {0x581e,0x745c}, {0x5821,0x5c42}, {0x5824,0x7027}, {0x5827,0x6640}, {0x582a,0x4a6d}, {0x582f,0x686b}, {0x5830,0x6568}, {0x5831,0x5c43}, {0x5834,0x6d5e}, {0x5835,0x5372}, {0x583a,0x4c77}, {0x584a,0x4e54}, {0x584b,0x672b}, {0x584f,0x4b43}, {0x5851,0x6131}, {0x5854,0x7732}, {0x5857,0x5373}, {0x5858,0x5352}, {0x585a,0x7540}, {0x585e,0x5f5d}, {0x5861,0x6e73}, {0x5862,0x6771}, {0x5864,0x7d34}, {0x5875,0x7248}, {0x5879,0x7352}, {0x587c,0x6e74}, {0x587e,0x6253}, {0x5883,0x4c51}, {0x5885,0x5f6a}, {0x5889,0x693a}, {0x5893,0x5957}, {0x589c,0x754d}, {0x589e,0x7172}, {0x589f,0x7a47}, {0x58a8,0x5978}, {0x58a9,0x5442}, {0x58ae,0x7665}, {0x58b3,0x5d45}, {0x58ba,0x6772}, {0x58bb,0x6d5f}, {0x58be,0x4a4b}, {0x58c1,0x5b7a}, {0x58c5,0x6835}, {0x58c7,0x5326}, {0x58ce,0x7d35}, {0x58d1,0x7949}, {0x58d3,0x6462}, {0x58d5,0x7b3d}, {0x58d8,0x5724}, {0x58d9,0x4e45}, {0x58de,0x4e55}, {0x58df,0x5666}, {0x58e4,0x653d}, {0x58eb,0x5e4d}, {0x58ec,0x6c73}, {0x58ef,0x6d60}, {0x58f9,0x6c6c}, {0x58fa,0x7b3e}, {0x58fb,0x5f6b}, {0x58fd,0x6178}, {0x590f,0x793e}, {0x5914,0x5073}, {0x5915,0x602a}, {0x5916,0x6862}, {0x5919,0x6254}, {0x591a,0x527d}, {0x591c,0x6528}, {0x5922,0x5953}, {0x5927,0x535e}, {0x5929,0x7438}, {0x592a,0x773c}, {0x592b,0x5c7d}, {0x592d,0x686c}, {0x592e,0x6467}, {0x5931,0x6377}, {0x5937,0x6c28}, {0x593e,0x7a71}, {0x5944,0x6572}, {0x5947,0x5074}, {0x5948,0x522f}, {0x5949,0x5c65}, {0x594e,0x5025}, {0x594f,0x7134}, {0x5950,0x7c31}, {0x5951,0x4c78}, {0x5954,0x5d46}, {0x5955,0x7a51}, {0x5957,0x775f}, {0x595a,0x7a28}, {0x5960,0x6e75}, {0x5962,0x5e4e}, {0x5967,0x6773}, {0x596a,0x772c}, {0x596b,0x6b44}, {0x596c,0x6d61}, {0x596d,0x602b}, {0x596e,0x5d47}, {0x5973,0x5233}, {0x5974,0x523f}, {0x5978,0x4a4c}, {0x597d,0x7b3f}, {0x5982,0x657d}, {0x5983,0x5d65}, {0x5984,0x584d}, {0x598a,0x6c74}, {0x5993,0x5075}, {0x5996,0x686d}, {0x5997,0x5052}, {0x5999,0x5958}, {0x59a5,0x7666}, {0x59a8,0x5b2a}, {0x59ac,0x7760}, {0x59b9,0x5859}, {0x59bb,0x7423}, {0x59be,0x745d}, {0x59c3,0x6f51}, {0x59c6,0x5935}, {0x59c9,0x6d2b}, {0x59cb,0x6337}, {0x59d0,0x6e3b}, {0x59d1,0x4d34}, {0x59d3,0x6073}, {0x59d4,0x6a4d}, {0x59d9,0x6c75}, {0x59da,0x686e}, {0x59dc,0x4b29}, {0x59dd,0x712f}, {0x59e6,0x4a4d}, {0x59e8,0x6c29}, {0x59ea,0x726b}, {0x59ec,0x7d6f}, {0x59ee,0x7973}, {0x59f8,0x6641}, {0x59fb,0x6c58}, {0x59ff,0x6d2c}, {0x5a01,0x6a4e}, {0x5a03,0x685f}, {0x5a11,0x5e4f}, {0x5a18,0x5226}, {0x5a1b,0x6774}, {0x5a1c,0x5156}, {0x5a1f,0x6642}, {0x5a20,0x6363}, {0x5a25,0x6430}, {0x5a29,0x5834}, {0x5a36,0x7625}, {0x5a3c,0x735e}, {0x5a41,0x5725}, {0x5a46,0x7768}, {0x5a49,0x6846}, {0x5a5a,0x7b66}, {0x5a62,0x5d66}, {0x5a66,0x5c7e}, {0x5a92,0x585a}, {0x5a9a,0x5a2c}, {0x5a9b,0x6a30}, {0x5aa4,0x6338}, {0x5ac1,0x4a2a}, {0x5ac2,0x6179}, {0x5ac4,0x6a31}, {0x5ac9,0x726c}, {0x5acc,0x7a6e}, {0x5ae1,0x6e55}, {0x5ae6,0x7974}, {0x5ae9,0x526c}, {0x5b05,0x7b7b}, {0x5b09,0x7d70}, {0x5b0b,0x603d}, {0x5b0c,0x4e63}, {0x5b16,0x7846}, {0x5b2a,0x5e2e}, {0x5b40,0x5f45}, {0x5b43,0x653e}, {0x5b50,0x6d2d}, {0x5b51,0x7a6a}, {0x5b54,0x4d6e}, {0x5b55,0x6d26}, {0x5b57,0x6d2e}, {0x5b58,0x706d}, {0x5b5a,0x5d21}, {0x5b5c,0x6d2f}, {0x5b5d,0x7c78}, {0x5b5f,0x586b}, {0x5b63,0x4c79}, {0x5b64,0x4d35}, {0x5b69,0x7a29}, {0x5b6b,0x615d}, {0x5b70,0x6255}, {0x5b71,0x6d4f}, {0x5b75,0x5d22}, {0x5b78,0x794a}, {0x5b7a,0x6a68}, {0x5b7c,0x656d}, {0x5b85,0x536b}, {0x5b87,0x6954}, {0x5b88,0x617a}, {0x5b89,0x644c}, {0x5b8b,0x6164}, {0x5b8c,0x6847}, {0x5b8f,0x4e5b}, {0x5b93,0x5c55}, {0x5b95,0x7735}, {0x5b96,0x7c73}, {0x5b97,0x7073}, {0x5b98,0x4e2f}, {0x5b99,0x7135}, {0x5b9a,0x6f52}, {0x5b9b,0x6848}, {0x5b9c,0x6b71}, {0x5ba2,0x4b54}, {0x5ba3,0x603e}, {0x5ba4,0x6378}, {0x5ba5,0x6a69}, {0x5ba6,0x7c32}, {0x5bac,0x6074}, {0x5bae,0x4f60}, {0x5bb0,0x6e25}, {0x5bb3,0x7a2a}, {0x5bb4,0x6643}, {0x5bb5,0x6132}, {0x5bb6,0x4a2b}, {0x5bb8,0x6364}, {0x5bb9,0x693b}, {0x5bbf,0x6256}, {0x5bc0,0x7372}, {0x5bc2,0x6e56}, {0x5bc3,0x6a32}, {0x5bc4,0x5076}, {0x5bc5,0x6c59}, {0x5bc6,0x5a4b}, {0x5bc7,0x4f28}, {0x5bcc,0x5d23}, {0x5bd0,0x585b}, {0x5bd2,0x794e}, {0x5bd3,0x6955}, {0x5bd4,0x6351}, {0x5bd7,0x523c}, {0x5bde,0x582c}, {0x5bdf,0x734c}, {0x5be1,0x4d7b}, {0x5be2,0x7656}, {0x5be4,0x6775}, {0x5be5,0x686f}, {0x5be6,0x6379}, {0x5be7,0x523b}, {0x5be8,0x7373}, {0x5be9,0x637b}, {0x5beb,0x5e50}, {0x5bec,0x4e30}, {0x5bee,0x5677}, {0x5bef,0x7159}, {0x5bf5,0x7541}, {0x5bf6,0x5c44}, {0x5bf8,0x753b}, {0x5bfa,0x5e51}, {0x5c01,0x5c66}, {0x5c04,0x5e52}, {0x5c07,0x6d62}, {0x5c08,0x6e76}, {0x5c09,0x6a4f}, {0x5c0a,0x706e}, {0x5c0b,0x637c}, {0x5c0d,0x535f}, {0x5c0e,0x5374}, {0x5c0f,0x6133}, {0x5c11,0x6134}, {0x5c16,0x7453}, {0x5c19,0x5f46}, {0x5c24,0x6956}, {0x5c28,0x5b2b}, {0x5c31,0x7626}, {0x5c38,0x6339}, {0x5c39,0x6b45}, {0x5c3a,0x7429}, {0x5c3b,0x4d36}, {0x5c3c,0x5279}, {0x5c3e,0x5a2d}, {0x5c3f,0x5263}, {0x5c40,0x4f51}, {0x5c45,0x4b5c}, {0x5c46,0x4c7a}, {0x5c48,0x4f5d}, {0x5c4b,0x6829}, {0x5c4d,0x633b}, {0x5c4e,0x633a}, {0x5c51,0x605a}, {0x5c55,0x6e77}, {0x5c5b,0x5c33}, {0x5c60,0x5375}, {0x5c62,0x5726}, {0x5c64,0x7635}, {0x5c65,0x575b}, {0x5c6c,0x6155}, {0x5c6f,0x546a}, {0x5c71,0x5f23}, {0x5c79,0x7d5f}, {0x5c90,0x5077}, {0x5c91,0x6d54}, {0x5ca1,0x4b2a}, {0x5ca9,0x645b}, {0x5cab,0x617b}, {0x5cac,0x4b22}, {0x5cb1,0x5360}, {0x5cb3,0x643f}, {0x5cb5,0x7b40}, {0x5cb7,0x5a3e}, {0x5cb8,0x644d}, {0x5cba,0x5639}, {0x5cbe,0x6f40}, {0x5cc0,0x617c}, {0x5cd9,0x7639}, {0x5ce0,0x5f47}, {0x5ce8,0x6431}, {0x5cef,0x5c67}, {0x5cf0,0x5c68}, {0x5cf4,0x7a56}, {0x5cf6,0x5376}, {0x5cfb,0x715a}, {0x5cfd,0x7a72}, {0x5d07,0x627d}, {0x5d0d,0x554f}, {0x5d0e,0x5078}, {0x5d11,0x4d5f}, {0x5d14,0x754b}, {0x5d16,0x6470}, {0x5d17,0x4b2b}, {0x5d19,0x5744}, }; /* Map Table including unicode to ksc5601 hanja */ static const Mapping unicode_to_ksc5601_hanja[4888] = { {0x4e00,0x6c69}, {0x4e01,0x6f4b}, {0x4e03,0x7652}, {0x4e07,0x5832}, {0x4e08,0x6d5b}, {0x4e09,0x5f32}, {0x4e0a,0x5f3e}, {0x4e0b,0x793b}, {0x4e0d,0x5c74}, {0x4e11,0x7564}, {0x4e14,0x7326}, {0x4e15,0x5d60}, {0x4e16,0x6126}, {0x4e18,0x4e78}, {0x4e19,0x5c30}, {0x4e1e,0x632a}, {0x4e2d,0x7169}, {0x4e32,0x4d7a}, {0x4e38,0x7c2f}, {0x4e39,0x5321}, {0x4e3b,0x712b}, {0x4e42,0x6751}, {0x4e43,0x522c}, {0x4e45,0x4e79}, {0x4e4b,0x717d}, {0x4e4d,0x5e3f}, {0x4e4e,0x7b3a}, {0x4e4f,0x7939}, {0x4e56,0x4e52}, {0x4e58,0x632b}, {0x4e59,0x6b60}, {0x4e5d,0x4e7a}, {0x4e5e,0x4b77}, {0x4e5f,0x6525}, {0x4e6b,0x4a61}, {0x4e6d,0x544c}, {0x4e73,0x6a61}, {0x4e76,0x5c63}, {0x4e77,0x5f2d}, {0x4e7e,0x4b6b}, {0x4e82,0x552f}, {0x4e86,0x5675}, {0x4e88,0x6578}, {0x4e8b,0x5e40}, {0x4e8c,0x6c23}, {0x4e8e,0x694d}, {0x4e90,0x6a27}, {0x4e91,0x6976}, {0x4e92,0x7b3b}, {0x4e94,0x6769}, {0x4e95,0x6f4c}, {0x4e98,0x5066}, {0x4e9b,0x5e41}, {0x4e9e,0x642c}, {0x4ea1,0x584c}, {0x4ea2,0x7971}, {0x4ea4,0x4e5f}, {0x4ea5,0x7a24}, {0x4ea6,0x6632}, {0x4ea8,0x7a7b}, {0x4eab,0x7a3d}, {0x4eac,0x4c48}, {0x4ead,0x6f4d}, {0x4eae,0x5555}, {0x4eb6,0x5322}, {0x4eba,0x6c51}, {0x4ec0,0x6427}, {0x4ec1,0x6c52}, {0x4ec4,0x7631}, {0x4ec7,0x4e7b}, {0x4eca,0x5051}, {0x4ecb,0x4b3f}, {0x4ecd,0x6d24}, {0x4ed4,0x6d28}, {0x4ed5,0x5e42}, {0x4ed6,0x7662}, {0x4ed7,0x6d5c}, {0x4ed8,0x5c75}, {0x4ed9,0x6039}, {0x4edd,0x544e}, {0x4edf,0x7435}, {0x4ee3,0x535b}, {0x4ee4,0x5635}, {0x4ee5,0x6c24}, {0x4ef0,0x6466}, {0x4ef2,0x716a}, {0x4ef6,0x4b6c}, {0x4ef7,0x4b40}, {0x4efb,0x6c72}, {0x4f01,0x506a}, {0x4f09,0x7972}, {0x4f0a,0x6c25}, {0x4f0b,0x505f}, {0x4f0d,0x676a}, {0x4f0e,0x506b}, {0x4f0f,0x5c51}, {0x4f10,0x5b69}, {0x4f11,0x7d4c}, {0x4f2f,0x5b57}, {0x4f34,0x5a61}, {0x4f36,0x5636}, {0x4f38,0x635f}, {0x4f3a,0x5e43}, {0x4f3c,0x5e44}, {0x4f3d,0x4a21}, {0x4f43,0x6e6c}, {0x4f46,0x5323}, {0x4f47,0x6e37}, {0x4f48,0x784f}, {0x4f4d,0x6a48}, {0x4f4e,0x6e38}, {0x4f4f,0x712c}, {0x4f50,0x7125}, {0x4f51,0x694e}, {0x4f55,0x793c}, {0x4f59,0x6579}, {0x4f5a,0x6c6a}, {0x4f5b,0x5d56}, {0x4f5c,0x6d42}, {0x4f69,0x7825}, {0x4f6f,0x653a}, {0x4f70,0x5b58}, {0x4f73,0x4a22}, {0x4f76,0x514d}, {0x4f7a,0x6e6d}, {0x4f7e,0x6c6b}, {0x4f7f,0x5e45}, {0x4f81,0x6360}, {0x4f83,0x4a49}, {0x4f84,0x7269}, {0x4f86,0x554e}, {0x4f88,0x7636}, {0x4f8a,0x4e42}, {0x4f8b,0x5647}, {0x4f8d,0x6334}, {0x4f8f,0x712d}, {0x4f91,0x6a62}, {0x4f96,0x5742}, {0x4f98,0x7327}, {0x4f9b,0x4d6a}, {0x4f9d,0x6b6e}, {0x4fae,0x5932}, {0x4faf,0x7d25}, {0x4fb5,0x7655}, {0x4fb6,0x5562}, {0x4fbf,0x7835}, {0x4fc2,0x4c75}, {0x4fc3,0x7535}, {0x4fc4,0x642d}, {0x4fc9,0x676b}, {0x4fca,0x7155}, {0x4fce,0x703b}, {0x4fd1,0x6935}, {0x4fd3,0x4c49}, {0x4fd4,0x7a55}, {0x4fd7,0x6154}, {0x4fda,0x5756}, {0x4fdd,0x5c41}, {0x4fdf,0x5e46}, {0x4fe0,0x7a6f}, {0x4fe1,0x6361}, {0x4fee,0x6173}, {0x4fef,0x5c76}, {0x4ff1,0x4e7c}, {0x4ff3,0x5b44}, {0x4ff5,0x7871}, {0x4ff8,0x5c64}, {0x4ffa,0x656f}, {0x5002,0x5c31}, {0x5006,0x5556}, {0x5009,0x735a}, {0x500b,0x4b41}, {0x500d,0x5b43}, {0x5011,0x597a}, {0x5012,0x536e}, {0x5016,0x7a38}, {0x5019,0x7d26}, {0x501a,0x6b6f}, {0x501c,0x7426}, {0x501e,0x4c4a}, {0x501f,0x7328}, {0x5021,0x735b}, {0x5023,0x5b27}, {0x5024,0x7637}, {0x5026,0x4f66}, {0x5027,0x7072}, {0x5028,0x4b5a}, {0x502a,0x6752}, {0x502b,0x5743}, {0x502c,0x7670}, {0x502d,0x685e}, {0x503b,0x6526}, {0x5043,0x6567}, {0x5047,0x4a23}, {0x5048,0x4c27}, {0x5049,0x6a49}, {0x504f,0x7836}, {0x5055,0x7a25}, {0x505a,0x712e}, {0x505c,0x6f4e}, {0x5065,0x4b6d}, {0x5074,0x7630}, {0x5075,0x6f4f}, {0x5076,0x694f}, {0x5078,0x775e}, {0x5080,0x4e53}, {0x5085,0x5c77}, {0x508d,0x5b28}, {0x5091,0x4b78}, {0x5098,0x5f21}, {0x5099,0x5d61}, {0x50ac,0x754a}, {0x50ad,0x6936}, {0x50b2,0x676c}, {0x50b3,0x6e6e}, {0x50b5,0x7370}, {0x50b7,0x5f3f}, {0x50be,0x4c4b}, {0x50c5,0x5041}, {0x50c9,0x7452}, {0x50ca,0x603a}, {0x50cf,0x5f40}, {0x50d1,0x4e60}, {0x50d5,0x5c52}, {0x50d6,0x7d6a}, {0x50da,0x5676}, {0x50de,0x6a4a}, {0x50e5,0x6869}, {0x50e7,0x632c}, {0x50ed,0x7350}, {0x50f9,0x4a24}, {0x50fb,0x5b78}, {0x50ff,0x5e47}, {0x5100,0x6b70}, {0x5101,0x7156}, {0x5104,0x6562}, {0x5106,0x4c4c}, {0x5109,0x4b7b}, {0x5112,0x6a63}, {0x511f,0x5f41}, {0x5121,0x566d}, {0x512a,0x6950}, {0x5132,0x6e39}, {0x5137,0x5563}, {0x513a,0x5153}, {0x513c,0x6570}, {0x5140,0x6834}, {0x5141,0x6b43}, {0x5143,0x6a2a}, {0x5144,0x7a7c}, {0x5145,0x7576}, {0x5146,0x703c}, {0x5147,0x7d54}, {0x5148,0x603b}, {0x5149,0x4e43}, {0x514b,0x503a}, {0x514c,0x773a}, {0x514d,0x5873}, {0x514e,0x774d}, {0x5152,0x642e}, {0x515c,0x545f}, {0x5162,0x5067}, {0x5165,0x6c7d}, {0x5167,0x522e}, {0x5168,0x6e6f}, {0x5169,0x5557}, {0x516a,0x6a64}, {0x516b,0x7822}, {0x516c,0x4d6b}, {0x516d,0x573f}, {0x516e,0x7b31}, {0x5171,0x4d6c}, {0x5175,0x5c32}, {0x5176,0x506c}, {0x5177,0x4e7d}, {0x5178,0x6e70}, {0x517c,0x4c42}, {0x5180,0x506d}, {0x5186,0x6577}, {0x518a,0x737c}, {0x518d,0x6e22}, {0x5192,0x5933}, {0x5195,0x5874}, {0x5197,0x6937}, {0x51a0,0x4e2e}, {0x51a5,0x5922}, {0x51aa,0x5871}, {0x51ac,0x544f}, {0x51b6,0x6527}, {0x51b7,0x5552}, {0x51bd,0x5629}, {0x51c4,0x7422}, {0x51c6,0x7157}, {0x51c9,0x5558}, {0x51cb,0x703d}, {0x51cc,0x5750}, {0x51cd,0x5450}, {0x51dc,0x574f}, {0x51dd,0x6b6a}, {0x51de,0x7d6b}, {0x51e1,0x5b6d}, {0x51f0,0x7c45}, {0x51f1,0x4b42}, {0x51f6,0x7d55}, {0x51f8,0x7448}, {0x51f9,0x686a}, {0x51fa,0x7573}, {0x51fd,0x795e}, {0x5200,0x536f}, {0x5203,0x6c53}, {0x5206,0x5d42}, {0x5207,0x6f37}, {0x5208,0x6754}, {0x520a,0x4a4a}, {0x520e,0x597b}, {0x5211,0x7a7d}, {0x5217,0x562a}, {0x521d,0x7478}, {0x5224,0x7777}, {0x5225,0x5c2c}, {0x5229,0x5757}, {0x522a,0x5f22}, {0x522e,0x4e3e}, {0x5230,0x5370}, {0x5236,0x7024}, {0x5237,0x616c}, {0x5238,0x4f67}, {0x5239,0x734b}, {0x523a,0x6d29}, {0x523b,0x4a3e}, {0x5243,0x746f}, {0x5247,0x764e}, {0x524a,0x5e7b}, {0x524b,0x503b}, {0x524c,0x5537}, {0x524d,0x6e71}, {0x5254,0x7428}, {0x5256,0x5c78}, {0x525b,0x4b27}, {0x525d,0x5a4e}, {0x5261,0x6066}, {0x5269,0x6d25}, {0x526a,0x6e72}, {0x526f,0x5c79}, {0x5272,0x795c}, {0x5275,0x735c}, {0x527d,0x7872}, {0x527f,0x7479}, {0x5283,0x7c71}, {0x5287,0x503c}, {0x5288,0x5b79}, {0x5289,0x5731}, {0x528d,0x4b7c}, {0x5291,0x7025}, {0x5292,0x4b7d}, {0x529b,0x5574}, {0x529f,0x4d6d}, {0x52a0,0x4a25}, {0x52a3,0x562b}, {0x52a4,0x5042}, {0x52a9,0x703e}, {0x52aa,0x523d}, {0x52ab,0x4c24}, {0x52be,0x7a36}, {0x52c1,0x4c4d}, {0x52c3,0x5a7a}, {0x52c5,0x764f}, {0x52c7,0x6938}, {0x52c9,0x5875}, {0x52cd,0x4c4e}, {0x52d2,0x574d}, {0x52d5,0x5451}, {0x52d6,0x696d}, {0x52d8,0x4a6b}, {0x52d9,0x5962}, {0x52db,0x7d32}, {0x52dd,0x632d}, {0x52de,0x564c}, {0x52df,0x5934}, {0x52e2,0x6127}, {0x52e3,0x6e53}, {0x52e4,0x5043}, {0x52f3,0x7d33}, {0x52f5,0x5564}, {0x52f8,0x4f68}, {0x52fa,0x6d43}, {0x52fb,0x5032}, {0x52fe,0x4e7e}, {0x52ff,0x5a28}, {0x5305,0x7850}, {0x5308,0x7d56}, {0x530d,0x7851}, {0x530f,0x7852}, {0x5310,0x5c53}, {0x5315,0x5d62}, {0x5316,0x7b79}, {0x5317,0x5d41}, {0x5319,0x6335}, {0x5320,0x6d5d}, {0x5321,0x4e44}, {0x5323,0x4b21}, {0x532a,0x5d63}, {0x532f,0x7c5d}, {0x5339,0x792f}, {0x533f,0x527b}, {0x5340,0x4f21}, {0x5341,0x6428}, {0x5343,0x7436}, {0x5344,0x6c7e}, {0x5347,0x632e}, {0x5348,0x676d}, {0x5349,0x7d41}, {0x534a,0x5a62}, {0x534d,0x5833}, {0x5351,0x5d64}, {0x5352,0x706f}, {0x5353,0x7671}, {0x5354,0x7a70}, {0x5357,0x5175}, {0x535a,0x5a4f}, {0x535c,0x5c54}, {0x535e,0x5c26}, {0x5360,0x6f3f}, {0x5366,0x4e4f}, {0x5368,0x6059}, {0x536f,0x5956}, {0x5370,0x6c54}, {0x5371,0x6a4b}, {0x5374,0x4a3f}, {0x5375,0x5530}, {0x5377,0x4f69}, {0x537d,0x716d}, {0x537f,0x4c4f}, {0x5384,0x6478}, {0x5393,0x646d}, {0x5398,0x5758}, {0x539a,0x7d27}, {0x539f,0x6a2b}, {0x53a0,0x7632}, {0x53a5,0x4f70}, {0x53a6,0x793d}, {0x53ad,0x6674}, {0x53bb,0x4b5b}, {0x53c3,0x7351}, {0x53c8,0x6951}, {0x53c9,0x7329}, {0x53ca,0x5060}, {0x53cb,0x6952}, {0x53cd,0x5a63}, {0x53d4,0x6252}, {0x53d6,0x7622}, {0x53d7,0x6174}, {0x53db,0x5a64}, {0x53e1,0x6755}, {0x53e2,0x753f}, {0x53e3,0x4f22}, {0x53e4,0x4d2f}, {0x53e5,0x4f23}, {0x53e9,0x4d30}, {0x53ea,0x717e}, {0x53eb,0x5023}, {0x53ec,0x612f}, {0x53ed,0x7823}, {0x53ef,0x4a26}, {0x53f0,0x773b}, {0x53f1,0x726a}, {0x53f2,0x5e48}, {0x53f3,0x6953}, {0x53f8,0x5e49}, {0x5403,0x7d5e}, {0x5404,0x4a40}, {0x5408,0x796a}, {0x5409,0x514e}, {0x540a,0x6e54}, {0x540c,0x5452}, {0x540d,0x5923}, {0x540e,0x7d28}, {0x540f,0x5759}, {0x5410,0x774e}, {0x5411,0x7a3e}, {0x541b,0x4f56}, {0x541d,0x5770}, {0x541f,0x6b61}, {0x5420,0x7845}, {0x5426,0x5c7a}, {0x5429,0x5d43}, {0x542b,0x795f}, {0x5433,0x676f}, {0x5438,0x7d65}, {0x5439,0x7623}, {0x543b,0x597c}, {0x543c,0x7d29}, {0x543e,0x676e}, {0x5442,0x5565}, {0x5448,0x6f50}, {0x544a,0x4d31}, {0x5451,0x7722}, {0x5468,0x7132}, {0x546a,0x7131}, {0x5471,0x4d32}, {0x5473,0x5a2b}, {0x5475,0x4a27}, {0x547b,0x6362}, {0x547c,0x7b3c}, {0x547d,0x5924}, {0x5480,0x6e3a}, {0x5486,0x7853}, {0x548c,0x7b7a}, {0x548e,0x4f24}, {0x5490,0x5c7b}, {0x54a4,0x7663}, {0x54a8,0x6d2a}, {0x54ab,0x7221}, {0x54ac,0x4e61}, {0x54b3,0x7a26}, {0x54b8,0x7960}, {0x54bd,0x6c56}, {0x54c0,0x646e}, {0x54c1,0x7921}, {0x54c4,0x7b6f}, {0x54c8,0x796b}, {0x54c9,0x6e23}, {0x54e1,0x6a2c}, {0x54e5,0x4a28}, {0x54e8,0x747a}, {0x54ed,0x4d56}, {0x54ee,0x7c76}, {0x54f2,0x7449}, {0x54fa,0x7854}, {0x5504,0x7826}, {0x5506,0x5e4a}, {0x5507,0x7246}, {0x550e,0x575a}, {0x5510,0x5350}, {0x551c,0x5845}, {0x552f,0x6a66}, {0x5531,0x735d}, {0x5535,0x645a}, {0x553e,0x7664}, {0x5544,0x7672}, {0x5546,0x5f42}, {0x554f,0x597d}, {0x5553,0x4c76}, {0x5556,0x533a}, {0x555e,0x642f}, {0x5563,0x7961}, {0x557c,0x7026}, {0x5580,0x4b53}, {0x5584,0x603c}, {0x5586,0x744a}, {0x5587,0x547a}, {0x5589,0x7d2a}, {0x558a,0x7962}, {0x5598,0x7437}, {0x5599,0x7d42}, {0x559a,0x7c30}, {0x559c,0x7d6c}, {0x559d,0x4a62}, {0x55a7,0x7d3d}, {0x55a9,0x6a67}, {0x55aa,0x5f43}, {0x55ab,0x5152}, {0x55ac,0x4e62}, {0x55ae,0x5324}, {0x55c5,0x7d2b}, {0x55c7,0x5f60}, {0x55d4,0x7247}, {0x55da,0x6770}, {0x55dc,0x506e}, {0x55df,0x732a}, {0x55e3,0x5e4b}, {0x55e4,0x7638}, {0x55fd,0x6175}, {0x55fe,0x7133}, {0x5606,0x7723}, {0x5609,0x4a29}, {0x5614,0x4f25}, {0x5617,0x5f44}, {0x562f,0x6130}, {0x5632,0x703f}, {0x5634,0x7624}, {0x5636,0x6336}, {0x5653,0x7a46}, {0x5668,0x506f}, {0x566b,0x7d6d}, {0x5674,0x5d44}, {0x5686,0x7c77}, {0x56a5,0x663f}, {0x56ac,0x5e2d}, {0x56ae,0x7a3f}, {0x56b4,0x6571}, {0x56bc,0x6d44}, {0x56ca,0x5225}, {0x56cd,0x7d6e}, {0x56d1,0x7536}, {0x56da,0x6176}, {0x56db,0x5e4c}, {0x56de,0x7c5e}, {0x56e0,0x6c57}, {0x56f0,0x4d5d}, {0x56f9,0x5637}, {0x56fa,0x4d33}, {0x5703,0x7855}, {0x5704,0x6558}, {0x5708,0x4f6a}, {0x570b,0x4f50}, {0x570d,0x6a4c}, {0x5712,0x6a2e}, {0x5713,0x6a2d}, {0x5716,0x5371}, {0x5718,0x5325}, {0x571f,0x774f}, {0x5728,0x6e24}, {0x572d,0x5024}, {0x5730,0x7222}, {0x573b,0x5070}, {0x5740,0x7223}, {0x5742,0x7778}, {0x5747,0x5033}, {0x574a,0x5b29}, {0x574d,0x533b}, {0x574e,0x4a6c}, {0x5750,0x7126}, {0x5751,0x4b55}, {0x5761,0x7767}, {0x5764,0x4d5e}, {0x5766,0x7724}, {0x576a,0x7840}, {0x576e,0x535d}, {0x5770,0x4c50}, {0x5775,0x4f26}, {0x577c,0x7673}, {0x5782,0x6177}, {0x5788,0x535c}, {0x578b,0x7a7e}, {0x5793,0x7a27}, {0x57a0,0x6b59}, {0x57a2,0x4f27}, {0x57a3,0x6a2f}, {0x57c3,0x646f}, {0x57c7,0x6939}, {0x57c8,0x7158}, {0x57cb,0x5858}, {0x57ce,0x6072}, {0x57df,0x6634}, {0x57e0,0x5c7c}, {0x57f0,0x7371}, {0x57f4,0x6350}, {0x57f7,0x727b}, {0x57f9,0x5b46}, {0x57fa,0x5071}, {0x57fc,0x5072}, {0x5800,0x4f5c}, {0x5802,0x5351}, {0x5805,0x4c31}, {0x5806,0x7758}, {0x5808,0x4b28}, {0x5809,0x6b3c}, {0x580a,0x643e}, {0x581e,0x745c}, {0x5821,0x5c42}, {0x5824,0x7027}, {0x5827,0x6640}, {0x582a,0x4a6d}, {0x582f,0x686b}, {0x5830,0x6568}, {0x5831,0x5c43}, {0x5834,0x6d5e}, {0x5835,0x5372}, {0x583a,0x4c77}, {0x584a,0x4e54}, {0x584b,0x672b}, {0x584f,0x4b43}, {0x5851,0x6131}, {0x5854,0x7732}, {0x5857,0x5373}, {0x5858,0x5352}, {0x585a,0x7540}, {0x585e,0x5f5d}, {0x5861,0x6e73}, {0x5862,0x6771}, {0x5864,0x7d34}, {0x5875,0x7248}, {0x5879,0x7352}, {0x587c,0x6e74}, {0x587e,0x6253}, {0x5883,0x4c51}, {0x5885,0x5f6a}, {0x5889,0x693a}, {0x5893,0x5957}, {0x589c,0x754d}, {0x589e,0x7172}, {0x589f,0x7a47}, {0x58a8,0x5978}, {0x58a9,0x5442}, {0x58ae,0x7665}, {0x58b3,0x5d45}, {0x58ba,0x6772}, {0x58bb,0x6d5f}, {0x58be,0x4a4b}, {0x58c1,0x5b7a}, {0x58c5,0x6835}, {0x58c7,0x5326}, {0x58ce,0x7d35}, {0x58d1,0x7949}, {0x58d3,0x6462}, {0x58d5,0x7b3d}, {0x58d8,0x5724}, {0x58d9,0x4e45}, {0x58de,0x4e55}, {0x58df,0x5666}, {0x58e4,0x653d}, {0x58eb,0x5e4d}, {0x58ec,0x6c73}, {0x58ef,0x6d60}, {0x58f9,0x6c6c}, {0x58fa,0x7b3e}, {0x58fb,0x5f6b}, {0x58fd,0x6178}, {0x590f,0x793e}, {0x5914,0x5073}, {0x5915,0x602a}, {0x5916,0x6862}, {0x5919,0x6254}, {0x591a,0x527d}, {0x591c,0x6528}, {0x5922,0x5953}, {0x5927,0x535e}, {0x5929,0x7438}, {0x592a,0x773c}, {0x592b,0x5c7d}, {0x592d,0x686c}, {0x592e,0x6467}, {0x5931,0x6377}, {0x5937,0x6c28}, {0x593e,0x7a71}, {0x5944,0x6572}, {0x5947,0x5074}, {0x5948,0x522f}, {0x5949,0x5c65}, {0x594e,0x5025}, {0x594f,0x7134}, {0x5950,0x7c31}, {0x5951,0x4c78}, {0x5954,0x5d46}, {0x5955,0x7a51}, {0x5957,0x775f}, {0x595a,0x7a28}, {0x5960,0x6e75}, {0x5962,0x5e4e}, {0x5967,0x6773}, {0x596a,0x772c}, {0x596b,0x6b44}, {0x596c,0x6d61}, {0x596d,0x602b}, {0x596e,0x5d47}, {0x5973,0x5233}, {0x5974,0x523f}, {0x5978,0x4a4c}, {0x597d,0x7b3f}, {0x5982,0x657d}, {0x5983,0x5d65}, {0x5984,0x584d}, {0x598a,0x6c74}, {0x5993,0x5075}, {0x5996,0x686d}, {0x5997,0x5052}, {0x5999,0x5958}, {0x59a5,0x7666}, {0x59a8,0x5b2a}, {0x59ac,0x7760}, {0x59b9,0x5859}, {0x59bb,0x7423}, {0x59be,0x745d}, {0x59c3,0x6f51}, {0x59c6,0x5935}, {0x59c9,0x6d2b}, {0x59cb,0x6337}, {0x59d0,0x6e3b}, {0x59d1,0x4d34}, {0x59d3,0x6073}, {0x59d4,0x6a4d}, {0x59d9,0x6c75}, {0x59da,0x686e}, {0x59dc,0x4b29}, {0x59dd,0x712f}, {0x59e6,0x4a4d}, {0x59e8,0x6c29}, {0x59ea,0x726b}, {0x59ec,0x7d6f}, {0x59ee,0x7973}, {0x59f8,0x6641}, {0x59fb,0x6c58}, {0x59ff,0x6d2c}, {0x5a01,0x6a4e}, {0x5a03,0x685f}, {0x5a11,0x5e4f}, {0x5a18,0x5226}, {0x5a1b,0x6774}, {0x5a1c,0x5156}, {0x5a1f,0x6642}, {0x5a20,0x6363}, {0x5a25,0x6430}, {0x5a29,0x5834}, {0x5a36,0x7625}, {0x5a3c,0x735e}, {0x5a41,0x5725}, {0x5a46,0x7768}, {0x5a49,0x6846}, {0x5a5a,0x7b66}, {0x5a62,0x5d66}, {0x5a66,0x5c7e}, {0x5a92,0x585a}, {0x5a9a,0x5a2c}, {0x5a9b,0x6a30}, {0x5aa4,0x6338}, {0x5ac1,0x4a2a}, {0x5ac2,0x6179}, {0x5ac4,0x6a31}, {0x5ac9,0x726c}, {0x5acc,0x7a6e}, {0x5ae1,0x6e55}, {0x5ae6,0x7974}, {0x5ae9,0x526c}, {0x5b05,0x7b7b}, {0x5b09,0x7d70}, {0x5b0b,0x603d}, {0x5b0c,0x4e63}, {0x5b16,0x7846}, {0x5b2a,0x5e2e}, {0x5b40,0x5f45}, {0x5b43,0x653e}, {0x5b50,0x6d2d}, {0x5b51,0x7a6a}, {0x5b54,0x4d6e}, {0x5b55,0x6d26}, {0x5b57,0x6d2e}, {0x5b58,0x706d}, {0x5b5a,0x5d21}, {0x5b5c,0x6d2f}, {0x5b5d,0x7c78}, {0x5b5f,0x586b}, {0x5b63,0x4c79}, {0x5b64,0x4d35}, {0x5b69,0x7a29}, {0x5b6b,0x615d}, {0x5b70,0x6255}, {0x5b71,0x6d4f}, {0x5b75,0x5d22}, {0x5b78,0x794a}, {0x5b7a,0x6a68}, {0x5b7c,0x656d}, {0x5b85,0x536b}, {0x5b87,0x6954}, {0x5b88,0x617a}, {0x5b89,0x644c}, {0x5b8b,0x6164}, {0x5b8c,0x6847}, {0x5b8f,0x4e5b}, {0x5b93,0x5c55}, {0x5b95,0x7735}, {0x5b96,0x7c73}, {0x5b97,0x7073}, {0x5b98,0x4e2f}, {0x5b99,0x7135}, {0x5b9a,0x6f52}, {0x5b9b,0x6848}, {0x5b9c,0x6b71}, {0x5ba2,0x4b54}, {0x5ba3,0x603e}, {0x5ba4,0x6378}, {0x5ba5,0x6a69}, {0x5ba6,0x7c32}, {0x5bac,0x6074}, {0x5bae,0x4f60}, {0x5bb0,0x6e25}, {0x5bb3,0x7a2a}, {0x5bb4,0x6643}, {0x5bb5,0x6132}, {0x5bb6,0x4a2b}, {0x5bb8,0x6364}, {0x5bb9,0x693b}, {0x5bbf,0x6256}, {0x5bc0,0x7372}, {0x5bc2,0x6e56}, {0x5bc3,0x6a32}, {0x5bc4,0x5076}, {0x5bc5,0x6c59}, {0x5bc6,0x5a4b}, {0x5bc7,0x4f28}, {0x5bcc,0x5d23}, {0x5bd0,0x585b}, {0x5bd2,0x794e}, {0x5bd3,0x6955}, {0x5bd4,0x6351}, {0x5bd7,0x523c}, {0x5bde,0x582c}, {0x5bdf,0x734c}, {0x5be1,0x4d7b}, {0x5be2,0x7656}, {0x5be4,0x6775}, {0x5be5,0x686f}, {0x5be6,0x6379}, {0x5be7,0x523b}, {0x5be8,0x7373}, {0x5be9,0x637b}, {0x5beb,0x5e50}, {0x5bec,0x4e30}, {0x5bee,0x5677}, {0x5bef,0x7159}, {0x5bf5,0x7541}, {0x5bf6,0x5c44}, {0x5bf8,0x753b}, {0x5bfa,0x5e51}, {0x5c01,0x5c66}, {0x5c04,0x5e52}, {0x5c07,0x6d62}, {0x5c08,0x6e76}, {0x5c09,0x6a4f}, {0x5c0a,0x706e}, {0x5c0b,0x637c}, {0x5c0d,0x535f}, {0x5c0e,0x5374}, {0x5c0f,0x6133}, {0x5c11,0x6134}, {0x5c16,0x7453}, {0x5c19,0x5f46}, {0x5c24,0x6956}, {0x5c28,0x5b2b}, {0x5c31,0x7626}, {0x5c38,0x6339}, {0x5c39,0x6b45}, {0x5c3a,0x7429}, {0x5c3b,0x4d36}, {0x5c3c,0x5279}, {0x5c3e,0x5a2d}, {0x5c3f,0x5263}, {0x5c40,0x4f51}, {0x5c45,0x4b5c}, {0x5c46,0x4c7a}, {0x5c48,0x4f5d}, {0x5c4b,0x6829}, {0x5c4d,0x633b}, {0x5c4e,0x633a}, {0x5c51,0x605a}, {0x5c55,0x6e77}, {0x5c5b,0x5c33}, {0x5c60,0x5375}, {0x5c62,0x5726}, {0x5c64,0x7635}, {0x5c65,0x575b}, {0x5c6c,0x6155}, {0x5c6f,0x546a}, {0x5c71,0x5f23}, {0x5c79,0x7d5f}, {0x5c90,0x5077}, {0x5c91,0x6d54}, {0x5ca1,0x4b2a}, {0x5ca9,0x645b}, {0x5cab,0x617b}, {0x5cac,0x4b22}, {0x5cb1,0x5360}, {0x5cb3,0x643f}, {0x5cb5,0x7b40}, {0x5cb7,0x5a3e}, {0x5cb8,0x644d}, {0x5cba,0x5639}, {0x5cbe,0x6f40}, {0x5cc0,0x617c}, {0x5cd9,0x7639}, {0x5ce0,0x5f47}, {0x5ce8,0x6431}, {0x5cef,0x5c67}, {0x5cf0,0x5c68}, {0x5cf4,0x7a56}, {0x5cf6,0x5376}, {0x5cfb,0x715a}, {0x5cfd,0x7a72}, {0x5d07,0x627d}, {0x5d0d,0x554f}, {0x5d0e,0x5078}, {0x5d11,0x4d5f}, {0x5d14,0x754b}, {0x5d16,0x6470}, {0x5d17,0x4b2b}, {0x5d19,0x5744}, {0x5d27,0x627e}, {0x5d29,0x5d5a}, {0x5d4b,0x5a2e}, {0x5d4c,0x4a6e}, {0x5d50,0x5539}, {0x5d69,0x6321}, {0x5d6c,0x6863}, {0x5d6f,0x732b}, {0x5d87,0x4f29}, {0x5d8b,0x5377}, {0x5d9d,0x5471}, {0x5da0,0x4e64}, {0x5da2,0x6872}, {0x5daa,0x6575}, {0x5db8,0x672e}, {0x5dba,0x563a}, {0x5dbc,0x5f6c}, {0x5dbd,0x6440}, {0x5dcd,0x6864}, {0x5dd2,0x5835}, {0x5dd6,0x645c}, {0x5ddd,0x7439}, {0x5dde,0x7136}, {0x5de1,0x625e}, {0x5de2,0x6135}, {0x5de5,0x4d6f}, {0x5de6,0x7127}, {0x5de7,0x4e65}, {0x5de8,0x4b5d}, {0x5deb,0x5963}, {0x5dee,0x732c}, {0x5df1,0x5079}, {0x5df2,0x6c2b}, {0x5df3,0x5e53}, {0x5df4,0x7769}, {0x5df7,0x7975}, {0x5dfd,0x615e}, {0x5dfe,0x4b6e}, {0x5e02,0x633c}, {0x5e03,0x7856}, {0x5e06,0x5b6e}, {0x5e0c,0x7d71}, {0x5e11,0x7736}, {0x5e16,0x745e}, {0x5e19,0x726d}, {0x5e1b,0x5b59}, {0x5e1d,0x7028}, {0x5e25,0x617d}, {0x5e2b,0x5e54}, {0x5e2d,0x602c}, {0x5e33,0x6d63}, {0x5e36,0x5361}, {0x5e38,0x5f48}, {0x5e3d,0x5936}, {0x5e3f,0x7d2c}, {0x5e40,0x6f53}, {0x5e44,0x6441}, {0x5e45,0x786b}, {0x5e47,0x5b2c}, {0x5e4c,0x7c46}, {0x5e55,0x582d}, {0x5e5f,0x763a}, {0x5e61,0x5b5f}, {0x5e62,0x5353}, {0x5e63,0x7847}, {0x5e72,0x4a4e}, {0x5e73,0x7841}, {0x5e74,0x5234}, {0x5e77,0x5c34}, {0x5e78,0x7a39}, {0x5e79,0x4a4f}, {0x5e7b,0x7c33}, {0x5e7c,0x6a6a}, {0x5e7d,0x6a6b}, {0x5e7e,0x507a}, {0x5e84,0x6d64}, {0x5e87,0x5d67}, {0x5e8a,0x5f49}, {0x5e8f,0x5f6d}, {0x5e95,0x6e3c}, {0x5e97,0x6f41}, {0x5e9a,0x4c52}, {0x5e9c,0x5d24}, {0x5ea0,0x5f4a}, {0x5ea6,0x5378}, {0x5ea7,0x7128}, {0x5eab,0x4d37}, {0x5ead,0x6f54}, {0x5eb5,0x645d}, {0x5eb6,0x5f6e}, {0x5eb7,0x4b2c}, {0x5eb8,0x693c}, {0x5ebe,0x6a6c}, {0x5ec2,0x5f4b}, {0x5ec8,0x793f}, {0x5ec9,0x562f}, {0x5eca,0x5546}, {0x5ed0,0x4f2a}, {0x5ed3,0x4e29}, {0x5ed6,0x5678}, {0x5eda,0x7137}, {0x5edb,0x6e78}, {0x5edf,0x5959}, {0x5ee0,0x735f}, {0x5ee2,0x7848}, {0x5ee3,0x4e46}, {0x5eec,0x5566}, {0x5ef3,0x7466}, {0x5ef6,0x6645}, {0x5ef7,0x6f55}, {0x5efa,0x4b6f}, {0x5efb,0x7c5f}, {0x5f01,0x5c27}, {0x5f04,0x5667}, {0x5f0a,0x7849}, {0x5f0f,0x6352}, {0x5f11,0x633d}, {0x5f13,0x4f61}, {0x5f14,0x7040}, {0x5f15,0x6c5a}, {0x5f17,0x5d57}, {0x5f18,0x7b70}, {0x5f1b,0x6c2c}, {0x5f1f,0x7029}, {0x5f26,0x7a57}, {0x5f27,0x7b41}, {0x5f29,0x5240}, {0x5f31,0x6530}, {0x5f35,0x6d65}, {0x5f3a,0x4b2d}, {0x5f3c,0x7930}, {0x5f48,0x7725}, {0x5f4a,0x4b2e}, {0x5f4c,0x5a2f}, {0x5f4e,0x5836}, {0x5f56,0x5327}, {0x5f57,0x7b32}, {0x5f59,0x7d44}, {0x5f5b,0x6c2d}, {0x5f62,0x7b21}, {0x5f66,0x6569}, {0x5f67,0x696e}, {0x5f69,0x7374}, {0x5f6a,0x7873}, {0x5f6b,0x7041}, {0x5f6c,0x5e2f}, {0x5f6d,0x7830}, {0x5f70,0x7360}, {0x5f71,0x672f}, {0x5f77,0x5b2d}, {0x5f79,0x6635}, {0x5f7c,0x7928}, {0x5f7f,0x5d58}, {0x5f80,0x6859}, {0x5f81,0x6f56}, {0x5f85,0x5362}, {0x5f87,0x625f}, {0x5f8a,0x7c60}, {0x5f8b,0x5748}, {0x5f8c,0x7d2d}, {0x5f90,0x5f6f}, {0x5f91,0x4c53}, {0x5f92,0x5379}, {0x5f97,0x5470}, {0x5f98,0x5b47}, {0x5f99,0x5e55}, {0x5f9e,0x7074}, {0x5fa0,0x5550}, {0x5fa1,0x6559}, {0x5fa8,0x7c47}, {0x5fa9,0x5c56}, {0x5faa,0x6260}, {0x5fae,0x5a30}, {0x5fb5,0x7323}, {0x5fb7,0x536c}, {0x5fb9,0x744b}, {0x5fbd,0x7d45}, {0x5fc3,0x637d}, {0x5fc5,0x7931}, {0x5fcc,0x507b}, {0x5fcd,0x6c5b}, {0x5fd6,0x753c}, {0x5fd7,0x7224}, {0x5fd8,0x584e}, {0x5fd9,0x584f}, {0x5fe0,0x7577}, {0x5feb,0x7661}, {0x5ff5,0x5237}, {0x5ffd,0x7b6c}, {0x5fff,0x5d48}, {0x600f,0x6468}, {0x6012,0x5241}, {0x6016,0x7857}, {0x601c,0x563b}, {0x601d,0x5e56}, {0x6020,0x773d}, {0x6021,0x6c2e}, {0x6025,0x5061}, {0x6027,0x6075}, {0x6028,0x6a33}, {0x602a,0x4e56}, {0x602f,0x4c25}, {0x6041,0x6c76}, {0x6042,0x6261}, {0x6043,0x633e}, {0x604d,0x7c48}, {0x6050,0x4d70}, {0x6052,0x7976}, {0x6055,0x5f70}, {0x6059,0x653f}, {0x605d,0x4e3f}, {0x6062,0x7c61}, {0x6063,0x6d30}, {0x6064,0x7d51}, {0x6065,0x763b}, {0x6068,0x794f}, {0x6069,0x6b5a}, {0x606a,0x4a41}, {0x606c,0x5238}, {0x606d,0x4d71}, {0x606f,0x6353}, {0x6070,0x7d66}, {0x6085,0x666d}, {0x6089,0x637a}, {0x608c,0x702a}, {0x608d,0x7950}, {0x6094,0x7c62}, {0x6096,0x7827}, {0x609a,0x6165}, {0x609b,0x6e79}, {0x609f,0x6776}, {0x60a0,0x6a6d}, {0x60a3,0x7c34}, {0x60a4,0x7542}, {0x60a7,0x575c}, {0x60b0,0x7075}, {0x60b2,0x5d68}, {0x60b3,0x536d}, {0x60b4,0x757c}, {0x60b6,0x5a3f}, {0x60b8,0x4c7b}, {0x60bc,0x537a}, {0x60bd,0x7424}, {0x60c5,0x6f57}, {0x60c7,0x5443}, {0x60d1,0x7b63}, {0x60da,0x7b6d}, {0x60dc,0x602d}, {0x60df,0x6a6e}, {0x60e0,0x7b33}, {0x60e1,0x6442}, {0x60f0,0x7667}, {0x60f1,0x525d}, {0x60f3,0x5f4c}, {0x60f6,0x7c49}, {0x60f9,0x6529}, {0x60fa,0x6076}, {0x60fb,0x7633}, {0x6101,0x617e}, {0x6106,0x4b70}, {0x6108,0x6a6f}, {0x6109,0x6a70}, {0x610d,0x5a40}, {0x610e,0x7834}, {0x610f,0x6b72}, {0x6115,0x6443}, {0x611a,0x6957}, {0x611b,0x6471}, {0x611f,0x4a6f}, {0x6127,0x4e57}, {0x6130,0x7c4a}, {0x6134,0x7361}, {0x6137,0x4b44}, {0x613c,0x6365}, {0x613e,0x4b45}, {0x613f,0x6a34}, {0x6142,0x693d}, {0x6144,0x5749}, {0x6147,0x6b5b}, {0x6148,0x6d31}, {0x614a,0x4c43}, {0x614b,0x773e}, {0x614c,0x7c4b}, {0x6153,0x7874}, {0x6155,0x5937}, {0x6158,0x7353}, {0x6159,0x7354}, {0x615d,0x7764}, {0x615f,0x7751}, {0x6162,0x5837}, {0x6163,0x4e31}, {0x6164,0x4a42}, {0x6167,0x7b34}, {0x6168,0x4b46}, {0x616b,0x7076}, {0x616e,0x5567}, {0x6170,0x6a50}, {0x6176,0x4c54}, {0x6177,0x4b2f}, {0x617d,0x742a}, {0x617e,0x692f}, {0x6181,0x7543}, {0x6182,0x6958}, {0x618a,0x5d69}, {0x618e,0x7173}, {0x6190,0x557b}, {0x6191,0x5e3b}, {0x6194,0x747b}, {0x6198,0x7d73}, {0x6199,0x7d72}, {0x619a,0x7726}, {0x61a4,0x5d49}, {0x61a7,0x5453}, {0x61a9,0x4c28}, {0x61ab,0x5a41}, {0x61ac,0x4c55}, {0x61ae,0x5964}, {0x61b2,0x7a4a}, {0x61b6,0x6563}, {0x61ba,0x533c}, {0x61be,0x4a70}, {0x61c3,0x5044}, {0x61c7,0x4a50}, {0x61c8,0x7a2b}, {0x61c9,0x6b6b}, {0x61ca,0x6778}, {0x61cb,0x5965}, {0x61e6,0x5157}, {0x61f2,0x7324}, {0x61f6,0x547b}, {0x61f7,0x7c63}, {0x61f8,0x7a58}, {0x61fa,0x7355}, {0x61fc,0x4f2b}, {0x61ff,0x6b73}, {0x6200,0x557c}, {0x6207,0x5354}, {0x6208,0x4d7c}, {0x620a,0x5966}, {0x620c,0x6279}, {0x620d,0x6221}, {0x620e,0x6b54}, {0x6210,0x6077}, {0x6211,0x6432}, {0x6212,0x4c7c}, {0x6216,0x7b64}, {0x621a,0x742b}, {0x621f,0x503d}, {0x6221,0x4a71}, {0x622a,0x6f38}, {0x622e,0x5740}, {0x6230,0x6e7a}, {0x6231,0x7d74}, {0x6234,0x5363}, {0x6236,0x7b42}, {0x623e,0x5568}, {0x623f,0x5b2e}, {0x6240,0x6136}, {0x6241,0x7837}, {0x6247,0x603f}, {0x6248,0x7b43}, {0x6249,0x5d6a}, {0x624b,0x6222}, {0x624d,0x6e26}, {0x6253,0x7668}, {0x6258,0x7675}, {0x626e,0x5d4a}, {0x6271,0x5062}, {0x6276,0x5d26}, {0x6279,0x5d6b}, {0x627c,0x6479}, {0x627f,0x632f}, {0x6280,0x507c}, {0x6284,0x747c}, {0x6289,0x4c3c}, {0x628a,0x776a}, {0x6291,0x6564}, {0x6292,0x5f71}, {0x6295,0x7761}, {0x6297,0x7977}, {0x6298,0x6f39}, {0x629b,0x7858}, {0x62ab,0x7929}, {0x62b1,0x7859}, {0x62b5,0x6e3d}, {0x62b9,0x5846}, {0x62bc,0x6463}, {0x62bd,0x754e}, {0x62c2,0x5d59}, {0x62c7,0x5967}, {0x62c8,0x5239}, {0x62c9,0x5543}, {0x62cc,0x5a65}, {0x62cd,0x5a50}, {0x62cf,0x5159}, {0x62d0,0x4e58}, {0x62d2,0x4b5e}, {0x62d3,0x742c}, {0x62d4,0x5a7b}, {0x62d6,0x7669}, {0x62d7,0x6873}, {0x62d8,0x4f2c}, {0x62d9,0x7070}, {0x62db,0x747d}, {0x62dc,0x5b48}, {0x62ec,0x4e40}, {0x62ed,0x6354}, {0x62ee,0x514f}, {0x62ef,0x7175}, {0x62f1,0x4d72}, {0x62f3,0x4f6b}, {0x62f7,0x4d38}, {0x62fe,0x6326}, {0x62ff,0x515a}, {0x6301,0x7225}, {0x6307,0x7226}, {0x6309,0x644e}, {0x6311,0x537b}, {0x632b,0x7129}, {0x632f,0x7249}, {0x633a,0x6f58}, {0x633b,0x6649}, {0x633d,0x5838}, {0x633e,0x7a73}, {0x6349,0x7335}, {0x634c,0x7824}, {0x634f,0x5173}, {0x6350,0x6648}, {0x6355,0x785a}, {0x6367,0x5c69}, {0x6368,0x5e57}, {0x636e,0x4b5f}, {0x6372,0x4f6c}, {0x6377,0x745f}, {0x637a,0x5174}, {0x637b,0x523a}, {0x637f,0x5f72}, {0x6383,0x6137}, {0x6388,0x6223}, {0x6389,0x537c}, {0x638c,0x6d66}, {0x6392,0x5b49}, {0x6396,0x647a}, {0x6398,0x4f5e}, {0x639b,0x4e50}, {0x63a0,0x5553}, {0x63a1,0x7375}, {0x63a2,0x772e}, {0x63a5,0x6f48}, {0x63a7,0x4d73}, {0x63a8,0x754f}, {0x63a9,0x6573}, {0x63aa,0x7042}, {0x63c0,0x4a51}, {0x63c4,0x6a71}, {0x63c6,0x5026}, {0x63cf,0x595a}, {0x63d0,0x702b}, {0x63d6,0x6b67}, {0x63da,0x6540}, {0x63db,0x7c35}, {0x63e1,0x6444}, {0x63ed,0x4c29}, {0x63ee,0x7d46}, {0x63f4,0x6a35}, {0x63f6,0x652a}, {0x63f7,0x5f3a}, {0x640d,0x615f}, {0x640f,0x5a51}, {0x6414,0x6138}, {0x6416,0x6874}, {0x6417,0x537d}, {0x641c,0x6224}, {0x6422,0x724a}, {0x642c,0x5a66}, {0x642d,0x7733}, {0x643a,0x7d4d}, {0x643e,0x7336}, {0x6458,0x6e57}, {0x6460,0x7544}, {0x6469,0x5824}, {0x646f,0x7227}, {0x6478,0x5938}, {0x6479,0x5939}, {0x647a,0x6f49}, {0x6488,0x564e}, {0x6491,0x774b}, {0x6492,0x5f2e}, {0x6493,0x6875}, {0x649a,0x5235}, {0x649e,0x5355}, {0x64a4,0x744c}, {0x64a5,0x5a7c}, {0x64ab,0x5968}, {0x64ad,0x776b}, {0x64ae,0x7549}, {0x64b0,0x733c}, {0x64b2,0x5a52}, {0x64bb,0x5335}, {0x64c1,0x6836}, {0x64c4,0x564f}, {0x64c5,0x743a}, {0x64c7,0x7749}, {0x64ca,0x4c2a}, {0x64cd,0x7043}, {0x64ce,0x4c56}, {0x64d2,0x5053}, {0x64d4,0x533d}, {0x64d8,0x5b7b}, {0x64da,0x4b60}, {0x64e1,0x5364}, {0x64e2,0x7677}, {0x64e5,0x553a}, {0x64e6,0x734d}, {0x64e7,0x4b61}, {0x64ec,0x6b74}, {0x64f2,0x742d}, {0x64f4,0x7c2a}, {0x64fa,0x776c}, {0x64fe,0x6876}, {0x6500,0x5a67}, {0x6504,0x774c}, {0x6518,0x6541}, {0x651d,0x606e}, {0x6523,0x557d}, {0x652a,0x4e66}, {0x652b,0x7c2b}, {0x652c,0x553b}, {0x652f,0x7228}, {0x6536,0x6225}, {0x6537,0x4d39}, {0x6538,0x6a72}, {0x6539,0x4b47}, {0x653b,0x4d74}, {0x653e,0x5b2f}, {0x653f,0x6f59}, {0x6545,0x4d3a}, {0x6548,0x7c79}, {0x654d,0x5f73}, {0x654e,0x4e67}, {0x654f,0x5a42}, {0x6551,0x4f2d}, {0x6556,0x6779}, {0x6557,0x7828}, {0x655e,0x7362}, {0x6562,0x4a72}, {0x6563,0x5f24}, {0x6566,0x5444}, {0x656c,0x4c57}, {0x656d,0x6542}, {0x6572,0x4d3b}, {0x6574,0x6f5a}, {0x6575,0x6e58}, {0x6577,0x5d27}, {0x6578,0x6226}, {0x657e,0x6040}, {0x6582,0x5630}, {0x6583,0x784a}, {0x6585,0x7c7a}, {0x6587,0x597e}, {0x658c,0x5e30}, {0x6590,0x5d6c}, {0x6591,0x5a68}, {0x6597,0x5460}, {0x6599,0x5679}, {0x659b,0x4d57}, {0x659c,0x5e58}, {0x659f,0x7278}, {0x65a1,0x6456}, {0x65a4,0x5045}, {0x65a5,0x742e}, {0x65a7,0x5d28}, {0x65ab,0x6d45}, {0x65ac,0x7356}, {0x65af,0x5e59}, {0x65b0,0x6366}, {0x65b7,0x5328}, {0x65b9,0x5b30}, {0x65bc,0x655a}, {0x65bd,0x633f}, {0x65c1,0x5b31}, {0x65c5,0x5569}, {0x65cb,0x6041}, {0x65cc,0x6f5b}, {0x65cf,0x7069}, {0x65d2,0x5732}, {0x65d7,0x507d}, {0x65e0,0x5969}, {0x65e3,0x507e}, {0x65e5,0x6c6d}, {0x65e6,0x5329}, {0x65e8,0x7229}, {0x65e9,0x7044}, {0x65ec,0x6262}, {0x65ed,0x696f}, {0x65f1,0x7951}, {0x65f4,0x6959}, {0x65fa,0x685a}, {0x65fb,0x5a43}, {0x65fc,0x5a44}, {0x65fd,0x5445}, {0x65ff,0x677a}, {0x6606,0x4d60}, {0x6607,0x6330}, {0x6609,0x5b32}, {0x660a,0x7b44}, {0x660c,0x7363}, {0x660e,0x5925}, {0x660f,0x7b67}, {0x6610,0x5d4b}, {0x6611,0x5054}, {0x6613,0x6636}, {0x6614,0x602e}, {0x6615,0x7d5a}, {0x661e,0x5c35}, {0x661f,0x6078}, {0x6620,0x6731}, {0x6625,0x7570}, {0x6627,0x585c}, {0x6628,0x6d46}, {0x662d,0x6139}, {0x662f,0x6340}, {0x6630,0x7940}, {0x6631,0x6970}, {0x6634,0x595b}, {0x6636,0x7364}, {0x663a,0x5c36}, {0x663b,0x6469}, {0x6641,0x7045}, {0x6642,0x6341}, {0x6643,0x7c4c}, {0x6644,0x7c4d}, {0x6649,0x724b}, {0x664b,0x724c}, {0x664f,0x644f}, {0x6659,0x715b}, {0x665b,0x7a59}, {0x665d,0x7138}, {0x665e,0x7d75}, {0x665f,0x6079}, {0x6664,0x677b}, {0x6665,0x7c37}, {0x6666,0x7c64}, {0x6667,0x7b45}, {0x6668,0x6367}, {0x6669,0x5839}, {0x666b,0x7678}, {0x666e,0x5c45}, {0x666f,0x4c58}, {0x6673,0x602f}, {0x6674,0x7467}, {0x6676,0x6f5c}, {0x6677,0x4f7c}, {0x6678,0x6f5d}, {0x667a,0x722a}, {0x6684,0x7d3e}, {0x6687,0x4a2c}, {0x6688,0x7d3b}, {0x6689,0x7d47}, {0x668e,0x6732}, {0x6690,0x6a51}, {0x6691,0x5f74}, {0x6696,0x516c}, {0x6697,0x645e}, {0x6698,0x6543}, {0x669d,0x5926}, {0x66a0,0x4d3c}, {0x66a2,0x7365}, {0x66ab,0x6d55}, {0x66ae,0x593a}, {0x66b2,0x6d67}, {0x66b3,0x7b35}, {0x66b4,0x786c}, {0x66b9,0x6067}, {0x66bb,0x4c59}, {0x66be,0x5446}, {0x66c4,0x6725}, {0x66c6,0x5575}, {0x66c7,0x533e}, {0x66c9,0x7c7b}, {0x66d6,0x6472}, {0x66d9,0x5f75}, {0x66dc,0x6878}, {0x66dd,0x786d}, {0x66e0,0x4e47}, {0x66e6,0x7d76}, {0x66f0,0x6858}, {0x66f2,0x4d58}, {0x66f3,0x6756}, {0x66f4,0x4c5a}, {0x66f7,0x4a63}, {0x66f8,0x5f76}, {0x66f9,0x7047}, {0x66fa,0x7046}, {0x66fc,0x583a}, {0x66fe,0x7174}, {0x66ff,0x7470}, {0x6700,0x754c}, {0x6703,0x7c65}, {0x6708,0x6a45}, {0x6709,0x6a73}, {0x670b,0x5d5b}, {0x670d,0x5c57}, {0x6714,0x5e7d}, {0x6715,0x7279}, {0x6717,0x5547}, {0x671b,0x5850}, {0x671d,0x7048}, {0x671e,0x5121}, {0x671f,0x5122}, {0x6726,0x5954}, {0x6727,0x5668}, {0x6728,0x594a}, {0x672a,0x5a31}, {0x672b,0x5847}, {0x672c,0x5c62}, {0x672d,0x734e}, {0x672e,0x7574}, {0x6731,0x7139}, {0x6734,0x5a53}, {0x6736,0x766a}, {0x673a,0x4f75}, {0x673d,0x7d2e}, {0x6746,0x4a52}, {0x6749,0x5f34}, {0x674e,0x575d}, {0x674f,0x7a3a}, {0x6750,0x6e27}, {0x6751,0x753d}, {0x6753,0x7875}, {0x6756,0x6d68}, {0x675c,0x5461}, {0x675e,0x5123}, {0x675f,0x6156}, {0x676d,0x7978}, {0x676f,0x5b4a}, {0x6770,0x4b79}, {0x6771,0x5454}, {0x6773,0x595c}, {0x6775,0x6e3e}, {0x6777,0x776d}, {0x677b,0x526e}, {0x677e,0x6166}, {0x677f,0x7779}, {0x6787,0x5d6d}, {0x6789,0x685b}, {0x678b,0x5b33}, {0x678f,0x5177}, {0x6790,0x6030}, {0x6793,0x5462}, {0x6795,0x7657}, {0x6797,0x5779}, {0x679a,0x585d}, {0x679c,0x4d7d}, {0x679d,0x722b}, {0x67af,0x4d3d}, {0x67b0,0x7842}, {0x67b3,0x722c}, {0x67b6,0x4a2d}, {0x67b7,0x4a2e}, {0x67b8,0x4f2e}, {0x67be,0x6342}, {0x67c4,0x5c37}, {0x67cf,0x5b5a}, {0x67d0,0x593b}, {0x67d1,0x4a73}, {0x67d2,0x7653}, {0x67d3,0x6678}, {0x67d4,0x6a75}, {0x67da,0x6a76}, {0x67dd,0x7679}, {0x67e9,0x4f2f}, {0x67ec,0x4a53}, {0x67ef,0x4a2f}, {0x67f0,0x5230}, {0x67f1,0x713a}, {0x67f3,0x5733}, {0x67f4,0x6343}, {0x67f5,0x737d}, {0x67f6,0x5e5a}, {0x67fb,0x5e5b}, {0x67fe,0x6f5e}, {0x6812,0x6263}, {0x6813,0x6e7b}, {0x6816,0x5f77}, {0x6817,0x574a}, {0x6821,0x4e68}, {0x6822,0x5b5b}, {0x682a,0x713b}, {0x682f,0x6971}, {0x6838,0x7a37}, {0x6839,0x5046}, {0x683c,0x4c2b}, {0x683d,0x6e28}, {0x6840,0x4b7a}, {0x6841,0x7979}, {0x6842,0x4c7d}, {0x6843,0x537e}, {0x6848,0x6450}, {0x684e,0x726e}, {0x6850,0x5455}, {0x6851,0x5f4d}, {0x6853,0x7c38}, {0x6854,0x5150}, {0x686d,0x724d}, {0x6876,0x7752}, {0x687f,0x4a54}, {0x6881,0x5559}, {0x6885,0x585e}, {0x688f,0x4d59}, {0x6893,0x6e29}, {0x6894,0x763c}, {0x6897,0x4c5b}, {0x689d,0x7049}, {0x689f,0x7c7c}, {0x68a1,0x6849}, {0x68a2,0x747e}, {0x68a7,0x677c}, {0x68a8,0x575e}, {0x68ad,0x5e5c}, {0x68af,0x702c}, {0x68b0,0x4c7e}, {0x68b1,0x4d61}, {0x68b3,0x613a}, {0x68b5,0x5b6f}, {0x68b6,0x5a32}, {0x68c4,0x5125}, {0x68c5,0x5c38}, {0x68c9,0x5876}, {0x68cb,0x5124}, {0x68cd,0x4d62}, {0x68d2,0x5c6a}, {0x68d5,0x7077}, {0x68d7,0x704a}, {0x68d8,0x503e}, {0x68da,0x5d5c}, {0x68df,0x5456}, {0x68e0,0x5356}, {0x68e7,0x6d50}, {0x68e8,0x4d21}, {0x68ee,0x5f35}, {0x68f2,0x5f78}, {0x68f9,0x5421}, {0x68fa,0x4e32}, {0x6900,0x684a}, {0x6905,0x6b75}, {0x690d,0x6355}, {0x690e,0x7550}, {0x6912,0x7521}, {0x6927,0x5927}, {0x6930,0x652b}, {0x693d,0x664b}, {0x693f,0x7571}, {0x694a,0x6545}, {0x6953,0x7923}, {0x6954,0x605b}, {0x6955,0x766b}, {0x6957,0x4b71}, {0x6959,0x596a}, {0x695a,0x7522}, {0x695e,0x5751}, {0x6960,0x5178}, {0x6961,0x6a78}, {0x6962,0x6a79}, {0x6963,0x5a33}, {0x6968,0x6f5f}, {0x696b,0x716f}, {0x696d,0x6576}, {0x696e,0x6e3f}, {0x696f,0x6264}, {0x6975,0x503f}, {0x6977,0x7a2c}, {0x6978,0x7551}, {0x6979,0x6733}, {0x6995,0x693e}, {0x699b,0x724e}, {0x699c,0x5b34}, {0x69a5,0x7c4e}, {0x69a7,0x5d6e}, {0x69ae,0x6734}, {0x69b4,0x5734}, {0x69bb,0x7734}, {0x69c1,0x4d3e}, {0x69c3,0x5a69}, {0x69cb,0x4f30}, {0x69cc,0x7759}, {0x69cd,0x7366}, {0x69d0,0x4e59}, {0x69e8,0x4e2a}, {0x69ea,0x4b48}, {0x69fb,0x5027}, {0x69fd,0x704b}, {0x69ff,0x5047}, {0x6a02,0x6445}, {0x6a0a,0x5b60}, {0x6a11,0x555a}, {0x6a13,0x5727}, {0x6a17,0x6e40}, {0x6a19,0x7876}, {0x6a1e,0x7552}, {0x6a1f,0x6d69}, {0x6a21,0x593c}, {0x6a23,0x6546}, {0x6a35,0x7523}, {0x6a38,0x5a54}, {0x6a39,0x6227}, {0x6a3a,0x7b7c}, {0x6a3d,0x715c}, {0x6a44,0x4a74}, {0x6a48,0x687a}, {0x6a4b,0x4e69}, {0x6a52,0x6978}, {0x6a53,0x6265}, {0x6a58,0x5039}, {0x6a59,0x5472}, {0x6a5f,0x5126}, {0x6a61,0x5f4e}, {0x6a6b,0x7c74}, {0x6a80,0x532a}, {0x6a84,0x4c2c}, {0x6a89,0x6f60}, {0x6a8d,0x6565}, {0x6a8e,0x5055}, {0x6a97,0x5b7c}, {0x6a9c,0x7c66}, {0x6aa2,0x4b7e}, {0x6aa3,0x6d6a}, {0x6ab3,0x5e31}, {0x6abb,0x7963}, {0x6ac2,0x5422}, {0x6ac3,0x4f76}, {0x6ad3,0x5650}, {0x6ada,0x556a}, {0x6adb,0x716e}, {0x6af6,0x7a4b}, {0x6afb,0x6521}, {0x6b04,0x5531}, {0x6b0a,0x4f6d}, {0x6b0c,0x6d6b}, {0x6b12,0x5532}, {0x6b16,0x553c}, {0x6b20,0x7d62}, {0x6b21,0x732d}, {0x6b23,0x7d5b}, {0x6b32,0x6930}, {0x6b3a,0x5127}, {0x6b3d,0x7d63}, {0x6b3e,0x4e33}, {0x6b46,0x7d64}, {0x6b47,0x7a4e}, {0x6b4c,0x4a30}, {0x6b4e,0x7727}, {0x6b50,0x4f31}, {0x6b5f,0x6622}, {0x6b61,0x7c36}, {0x6b62,0x722d}, {0x6b63,0x6f61}, {0x6b64,0x732e}, {0x6b65,0x5c46}, {0x6b66,0x596b}, {0x6b6a,0x6860}, {0x6b72,0x6128}, {0x6b77,0x5576}, {0x6b78,0x4f7d}, {0x6b7b,0x5e5d}, {0x6b7f,0x5951}, {0x6b83,0x646a}, {0x6b84,0x724f}, {0x6b86,0x773f}, {0x6b89,0x6266}, {0x6b8a,0x6228}, {0x6b96,0x6356}, {0x6b98,0x6d51}, {0x6b9e,0x6979}, {0x6bae,0x5631}, {0x6baf,0x5e32}, {0x6bb2,0x6068}, {0x6bb5,0x532b}, {0x6bb7,0x6b5c}, {0x6bba,0x5f2f}, {0x6bbc,0x4a43}, {0x6bbf,0x6e7c}, {0x6bc1,0x7d43}, {0x6bc5,0x6b76}, {0x6bc6,0x4f32}, {0x6bcb,0x596c}, {0x6bcd,0x593d}, {0x6bcf,0x585f}, {0x6bd2,0x5438}, {0x6bd3,0x6b3e}, {0x6bd4,0x5d6f}, {0x6bd6,0x5d70}, {0x6bd7,0x5d71}, {0x6bd8,0x5d72}, {0x6bdb,0x593e}, {0x6beb,0x7b46}, {0x6bec,0x4f33}, {0x6c08,0x6e7d}, {0x6c0f,0x642b}, {0x6c11,0x5a45}, {0x6c13,0x586c}, {0x6c23,0x5128}, {0x6c34,0x6229}, {0x6c37,0x5e3c}, {0x6c38,0x6735}, {0x6c3e,0x5b70}, {0x6c40,0x6f62}, {0x6c41,0x7170}, {0x6c42,0x4f34}, {0x6c4e,0x5b71}, {0x6c50,0x6031}, {0x6c55,0x5f25}, {0x6c57,0x7952}, {0x6c5a,0x677d}, {0x6c5d,0x6623}, {0x6c5e,0x7b71}, {0x6c5f,0x4b30}, {0x6c60,0x722e}, {0x6c68,0x4d67}, {0x6c6a,0x685c}, {0x6c6d,0x6757}, {0x6c70,0x7740}, {0x6c72,0x5063}, {0x6c76,0x5a21}, {0x6c7a,0x4c3d}, {0x6c7d,0x5129}, {0x6c7e,0x5d4c}, {0x6c81,0x637e}, {0x6c82,0x512a}, {0x6c83,0x682a}, {0x6c85,0x6a36}, {0x6c86,0x797a}, {0x6c87,0x664c}, {0x6c88,0x7658}, {0x6c8c,0x5447}, {0x6c90,0x594b}, {0x6c92,0x5952}, {0x6c93,0x534b}, {0x6c94,0x5877}, {0x6c95,0x5a29}, {0x6c96,0x7578}, {0x6c99,0x5e5e}, {0x6c9a,0x722f}, {0x6c9b,0x7829}, {0x6cab,0x5848}, {0x6cae,0x6e41}, {0x6cb3,0x7941}, {0x6cb8,0x5d73}, {0x6cb9,0x6a7a}, {0x6cbb,0x763d}, {0x6cbc,0x613b}, {0x6cbd,0x4d3f}, {0x6cbe,0x7454}, {0x6cbf,0x664d}, {0x6cc1,0x7c4f}, {0x6cc2,0x7b22}, {0x6cc4,0x605c}, {0x6cc9,0x743b}, {0x6cca,0x5a55}, {0x6ccc,0x7932}, {0x6cd3,0x7b72}, {0x6cd5,0x5b76}, {0x6cd7,0x5e5f}, {0x6cdb,0x5b72}, {0x6ce1,0x785c}, {0x6ce2,0x776e}, {0x6ce3,0x6b68}, {0x6ce5,0x527a}, {0x6ce8,0x713c}, {0x6ceb,0x7a5a}, {0x6cee,0x5a6a}, {0x6cef,0x5a46}, {0x6cf0,0x7741}, {0x6cf3,0x6736}, {0x6d0b,0x6547}, {0x6d0c,0x562c}, {0x6d11,0x5c47}, {0x6d17,0x6129}, {0x6d19,0x622a}, {0x6d1b,0x5526}, {0x6d1e,0x5457}, {0x6d25,0x7250}, {0x6d27,0x6a7b}, {0x6d29,0x605d}, {0x6d2a,0x7b73}, {0x6d32,0x713d}, {0x6d35,0x6267}, {0x6d36,0x7d57}, {0x6d38,0x4e48}, {0x6d39,0x6a37}, {0x6d3b,0x7c40}, {0x6d3d,0x7d67}, {0x6d3e,0x776f}, {0x6d41,0x5735}, {0x6d59,0x6f3a}, {0x6d5a,0x715d}, {0x6d5c,0x5e33}, {0x6d63,0x684b}, {0x6d66,0x785d}, {0x6d69,0x7b47}, {0x6d6a,0x5548}, {0x6d6c,0x575f}, {0x6d6e,0x5d29}, {0x6d74,0x6931}, {0x6d77,0x7a2d}, {0x6d78,0x7659}, {0x6d79,0x7a74}, {0x6d7f,0x782a}, {0x6d85,0x666e}, {0x6d87,0x4c5c}, {0x6d88,0x613c}, {0x6d89,0x606f}, {0x6d8c,0x693f}, {0x6d8d,0x7c7d}, {0x6d8e,0x664e}, {0x6d91,0x6157}, {0x6d93,0x664f}, {0x6d95,0x7471}, {0x6daf,0x6473}, {0x6db2,0x647b}, {0x6db5,0x7964}, {0x6dc0,0x6f63}, {0x6dc3,0x4f6e}, {0x6dc4,0x763e}, {0x6dc5,0x6032}, {0x6dc6,0x7c7e}, {0x6dc7,0x512b}, {0x6dcb,0x577a}, {0x6dcf,0x7b48}, {0x6dd1,0x6257}, {0x6dd8,0x5423}, {0x6dd9,0x7078}, {0x6dda,0x5728}, {0x6dde,0x6167}, {0x6de1,0x533f}, {0x6de8,0x6f64}, {0x6dea,0x5745}, {0x6deb,0x6b62}, {0x6dee,0x7c67}, {0x6df1,0x6422}, {0x6df3,0x6268}, {0x6df5,0x6650}, {0x6df7,0x7b68}, {0x6df8,0x7468}, {0x6df9,0x6574}, {0x6dfa,0x743c}, {0x6dfb,0x7455}, {0x6e17,0x5f36}, {0x6e19,0x7c39}, {0x6e1a,0x6e42}, {0x6e1b,0x4a75}, {0x6e1f,0x6f65}, {0x6e20,0x4b62}, {0x6e21,0x5424}, {0x6e23,0x5e60}, {0x6e24,0x5a7d}, {0x6e25,0x6446}, {0x6e26,0x683e}, {0x6e2b,0x605e}, {0x6e2c,0x7634}, {0x6e2d,0x6a52}, {0x6e2f,0x797b}, {0x6e32,0x6042}, {0x6e34,0x4a64}, {0x6e36,0x6737}, {0x6e38,0x6a7d}, {0x6e3a,0x595d}, {0x6e3c,0x5a34}, {0x6e3d,0x6e2a}, {0x6e3e,0x7b69}, {0x6e43,0x5b4b}, {0x6e44,0x5a35}, {0x6e4a,0x713e}, {0x6e4d,0x532c}, {0x6e56,0x7b49}, {0x6e58,0x5f4f}, {0x6e5b,0x5340}, {0x6e5c,0x6357}, {0x6e5e,0x6f66}, {0x6e5f,0x7c50}, {0x6e67,0x6940}, {0x6e6b,0x7553}, {0x6e6e,0x6c5c}, {0x6e6f,0x7737}, {0x6e72,0x6a38}, {0x6e73,0x5179}, {0x6e7a,0x5c48}, {0x6e90,0x6a39}, {0x6e96,0x715e}, {0x6e9c,0x5736}, {0x6e9d,0x4f35}, {0x6e9f,0x5928}, {0x6ea2,0x6c6e}, {0x6ea5,0x5d2a}, {0x6eaa,0x4d22}, {0x6eab,0x682e}, {0x6eaf,0x613d}, {0x6eb1,0x7251}, {0x6eb6,0x6941}, {0x6eba,0x527c}, {0x6ec2,0x5b35}, {0x6ec4,0x7367}, {0x6ec5,0x587e}, {0x6ec9,0x7c51}, {0x6ecb,0x6d32}, {0x6ecc,0x742f}, {0x6ece,0x7b23}, {0x6ed1,0x7c41}, {0x6ed3,0x6e2b}, {0x6ed4,0x5425}, {0x6eef,0x7472}, {0x6ef4,0x6e59}, {0x6ef8,0x7b4a}, {0x6efe,0x4d63}, {0x6eff,0x583b}, {0x6f01,0x655b}, {0x6f02,0x7877}, {0x6f06,0x7654}, {0x6f0f,0x5729}, {0x6f11,0x4b49}, {0x6f14,0x6651}, {0x6f15,0x704c}, {0x6f20,0x582e}, {0x6f22,0x7953}, {0x6f23,0x557e}, {0x6f2b,0x583c}, {0x6f2c,0x7230}, {0x6f31,0x622b}, {0x6f32,0x7368}, {0x6f38,0x6f42}, {0x6f3f,0x6d6c}, {0x6f41,0x6738}, {0x6f51,0x5a7e}, {0x6f54,0x4c3e}, {0x6f57,0x727c}, {0x6f58,0x5a6b}, {0x6f5a,0x6258}, {0x6f5b,0x6d56}, {0x6f5e,0x5651}, {0x6f5f,0x6033}, {0x6f62,0x7c52}, {0x6f64,0x6b48}, {0x6f6d,0x5341}, {0x6f6e,0x704d}, {0x6f70,0x4f77}, {0x6f7a,0x6d52}, {0x6f7c,0x5458}, {0x6f7d,0x5c49}, {0x6f7e,0x5771}, {0x6f81,0x5f3b}, {0x6f84,0x7325}, {0x6f88,0x744d}, {0x6f8d,0x713f}, {0x6f8e,0x7831}, {0x6f90,0x697a}, {0x6f94,0x7b4b}, {0x6f97,0x4a55}, {0x6fa3,0x7954}, {0x6fa4,0x774a}, {0x6fa7,0x5648}, {0x6fae,0x7c68}, {0x6faf,0x733d}, {0x6fb1,0x6e7e}, {0x6fb3,0x677e}, {0x6fb9,0x5342}, {0x6fbe,0x5336}, {0x6fc0,0x4c2d}, {0x6fc1,0x767a}, {0x6fc2,0x5632}, {0x6fc3,0x5258}, {0x6fca,0x6758}, {0x6fd5,0x6325}, {0x6fda,0x6739}, {0x6fdf,0x702d}, {0x6fe0,0x7b4c}, {0x6fe1,0x6b21}, {0x6fe4,0x5426}, {0x6fe9,0x7b4d}, {0x6feb,0x553d}, {0x6fec,0x715f}, {0x6fef,0x767b}, {0x6ff1,0x5e34}, {0x6ffe,0x556b}, {0x7001,0x6548}, {0x7005,0x7b24}, {0x7006,0x5439}, {0x7009,0x5e61}, {0x700b,0x6423}, {0x700f,0x5737}, {0x7011,0x786e}, {0x7015,0x5e35}, {0x7018,0x5652}, {0x701a,0x7955}, {0x701b,0x673a}, {0x701c,0x6b55}, {0x701d,0x5577}, {0x701e,0x6f67}, {0x701f,0x613e}, {0x7023,0x7a2e}, {0x7027,0x5669}, {0x7028,0x566e}, {0x702f,0x673b}, {0x7037,0x6c4b}, {0x703e,0x5533}, {0x704c,0x4e34}, {0x7050,0x7b25}, {0x7051,0x616e}, {0x7058,0x7728}, {0x705d,0x7b4e}, {0x7063,0x583d}, {0x706b,0x7b7d}, {0x7070,0x7c69}, {0x7078,0x4f36}, {0x707c,0x6d47}, {0x707d,0x6e2c}, {0x7085,0x4c5d}, {0x708a,0x7627}, {0x708e,0x667a}, {0x7092,0x7524}, {0x7098,0x7d5c}, {0x7099,0x6d33}, {0x709a,0x4e49}, {0x70a1,0x6f68}, {0x70a4,0x613f}, {0x70ab,0x7a5b}, {0x70ac,0x4b63}, {0x70ad,0x7729}, {0x70af,0x7b26}, {0x70b3,0x5c39}, {0x70b7,0x7140}, {0x70b8,0x6d48}, {0x70b9,0x6f43}, {0x70c8,0x562d}, {0x70cb,0x7d4e}, {0x70cf,0x6821}, {0x70d8,0x7b74}, {0x70d9,0x5527}, {0x70dd,0x7176}, {0x70df,0x6653}, {0x70f1,0x4c5e}, {0x70f9,0x7832}, {0x70fd,0x5c6b}, {0x7104,0x7d36}, {0x7109,0x656a}, {0x710c,0x7160}, {0x7119,0x5b4c}, {0x711a,0x5d4d}, {0x711e,0x5448}, {0x7121,0x596d}, {0x7126,0x7525}, {0x7130,0x667b}, {0x7136,0x6654}, {0x7147,0x7d48}, {0x7149,0x5621}, {0x714a,0x7d3f}, {0x714c,0x7c53}, {0x714e,0x6f21}, {0x7150,0x673c}, {0x7156,0x516e}, {0x7159,0x6655}, {0x715c,0x6972}, {0x715e,0x5f30}, {0x7164,0x5860}, {0x7165,0x7c3a}, {0x7166,0x7d2f}, {0x7167,0x704e}, {0x7169,0x5b61}, {0x716c,0x6549}, {0x716e,0x6d34}, {0x717d,0x6043}, {0x7184,0x6358}, {0x7189,0x697b}, {0x718a,0x6a28}, {0x718f,0x7d37}, {0x7192,0x7b27}, {0x7194,0x6942}, {0x7199,0x7d77}, {0x719f,0x6259}, {0x71a2,0x5c6c}, {0x71ac,0x6822}, {0x71b1,0x6670}, {0x71b9,0x7d78}, {0x71ba,0x7d79}, {0x71be,0x763f}, {0x71c1,0x6727}, {0x71c3,0x6657}, {0x71c8,0x5473}, {0x71c9,0x5449}, {0x71ce,0x567a}, {0x71d0,0x5772}, {0x71d2,0x6140}, {0x71d4,0x5b62}, {0x71d5,0x6658}, {0x71df,0x673d}, {0x71e5,0x704f}, {0x71e6,0x733e}, {0x71e7,0x622c}, {0x71ed,0x7537}, {0x71ee,0x6070}, {0x71fb,0x7d38}, {0x71fc,0x6368}, {0x71fe,0x5427}, {0x71ff,0x687c}, {0x7200,0x7a52}, {0x7206,0x786f}, {0x7210,0x5653}, {0x721b,0x5534}, {0x722a,0x7050}, {0x722c,0x7770}, {0x722d,0x6e33}, {0x7230,0x6a3a}, {0x7232,0x6a53}, {0x7235,0x6d49}, {0x7236,0x5d2b}, {0x723a,0x652c}, {0x723b,0x7d21}, {0x723d,0x5f50}, {0x723e,0x6c33}, {0x7240,0x5f51}, {0x7246,0x6d6d}, {0x7247,0x7838}, {0x7248,0x777a}, {0x724c,0x782b}, {0x7252,0x7460}, {0x7258,0x543a}, {0x7259,0x6433}, {0x725b,0x695a}, {0x725d,0x5e36}, {0x725f,0x593f}, {0x7261,0x5940}, {0x7262,0x566f}, {0x7267,0x594c}, {0x7269,0x5a2a}, {0x7272,0x5f65}, {0x7279,0x7765}, {0x727d,0x4c32}, {0x7280,0x5f79}, {0x7281,0x5760}, {0x72a2,0x543b}, {0x72a7,0x7d7a}, {0x72ac,0x4c33}, {0x72af,0x5b73}, {0x72c0,0x5f52}, {0x72c2,0x4e4a}, {0x72c4,0x6e5a}, {0x72ce,0x6464}, {0x72d0,0x7b4f}, {0x72d7,0x4f37}, {0x72d9,0x6e43}, {0x72e1,0x4e6a}, {0x72e9,0x622d}, {0x72f8,0x5761}, {0x72f9,0x7a75}, {0x72fc,0x5549}, {0x72fd,0x782c}, {0x730a,0x6759}, {0x7316,0x7369}, {0x731b,0x586d}, {0x731c,0x6344}, {0x731d,0x7071}, {0x7325,0x6865}, {0x7329,0x607a}, {0x732a,0x6e44}, {0x732b,0x595e}, {0x7336,0x6b22}, {0x7337,0x6b23}, {0x733e,0x7c42}, {0x733f,0x6a3b}, {0x7344,0x682b}, {0x7345,0x5e62}, {0x7350,0x6d6f}, {0x7352,0x6823}, {0x7357,0x4f71}, {0x7368,0x543c}, {0x736a,0x7c6a}, {0x7370,0x673e}, {0x7372,0x7c72}, {0x7375,0x5634}, {0x7378,0x622e}, {0x737a,0x5337}, {0x737b,0x7a4c}, {0x7384,0x7a5c}, {0x7386,0x6d35}, {0x7387,0x6163}, {0x7389,0x682c}, {0x738b,0x685d}, {0x738e,0x6f69}, {0x7394,0x743d}, {0x7396,0x4f38}, {0x7397,0x695b}, {0x7398,0x512c}, {0x739f,0x5a47}, {0x73a7,0x6b49}, {0x73a9,0x684c}, {0x73ad,0x5e37}, {0x73b2,0x563c}, {0x73b3,0x5365}, {0x73b9,0x7a5d}, {0x73c0,0x5a56}, {0x73c2,0x4a31}, {0x73c9,0x5a48}, {0x73ca,0x5f26}, {0x73cc,0x7933}, {0x73cd,0x7252}, {0x73cf,0x4a44}, {0x73d6,0x4e4b}, {0x73d9,0x4d75}, {0x73dd,0x7d30}, {0x73de,0x5528}, {0x73e0,0x7141}, {0x73e3,0x6269}, {0x73e4,0x5c4a}, {0x73e5,0x6c34}, {0x73e6,0x7a40}, {0x73e9,0x7b28}, {0x73ea,0x5028}, {0x73ed,0x5a6c}, {0x73f7,0x596e}, {0x73f9,0x607b}, {0x73fd,0x6f6a}, {0x73fe,0x7a5e}, {0x7401,0x6044}, {0x7403,0x4f39}, {0x7405,0x554a}, {0x7406,0x5762}, {0x7407,0x622f}, {0x7409,0x5738}, {0x7413,0x684d}, {0x741b,0x765a}, {0x7420,0x6f22}, {0x7421,0x625a}, {0x7422,0x767c}, {0x7425,0x7b50}, {0x7426,0x512d}, {0x7428,0x4d64}, {0x742a,0x512e}, {0x742b,0x5c6d}, {0x742c,0x684e}, {0x742e,0x7079}, {0x742f,0x4e35}, {0x7430,0x667c}, {0x7433,0x577b}, {0x7434,0x5056}, {0x7435,0x5d75}, {0x7436,0x7771}, {0x7438,0x767d}, {0x743a,0x5b77}, {0x743f,0x7b6a}, {0x7440,0x695c}, {0x7441,0x5941}, {0x7443,0x7572}, {0x7444,0x6045}, {0x744b,0x6a54}, {0x7455,0x7942}, {0x7457,0x6a3c}, {0x7459,0x5245}, {0x745a,0x7b51}, {0x745b,0x6740}, {0x745c,0x6b25}, {0x745e,0x5f7a}, {0x745f,0x6322}, {0x7460,0x5739}, {0x7462,0x6943}, {0x7464,0x687d}, {0x7465,0x682f}, {0x7468,0x7253}, {0x7469,0x7b29}, {0x746a,0x5825}, {0x746f,0x554b}, {0x747e,0x5048}, {0x7482,0x512f}, {0x7483,0x5763}, {0x7487,0x6046}, {0x7489,0x5622}, {0x748b,0x6d70}, {0x7498,0x5773}, {0x749c,0x7c54}, {0x749e,0x5a57}, {0x749f,0x4c5f}, {0x74a1,0x7254}, {0x74a3,0x5130}, {0x74a5,0x4c60}, {0x74a7,0x5b7d}, {0x74a8,0x733f}, {0x74aa,0x7051}, {0x74b0,0x7c3b}, {0x74b2,0x6230}, {0x74b5,0x6625}, {0x74b9,0x625b}, {0x74bd,0x5f5e}, {0x74bf,0x6047}, {0x74c6,0x726f}, {0x74ca,0x4c61}, {0x74cf,0x566a}, {0x74d4,0x6742}, {0x74d8,0x4e36}, {0x74da,0x7340}, {0x74dc,0x4d7e}, {0x74e0,0x7b52}, {0x74e2,0x7878}, {0x74e3,0x777b}, {0x74e6,0x683f}, {0x74ee,0x6837}, {0x74f7,0x6d36}, {0x7501,0x5c3a}, {0x7504,0x4c34}, {0x7511,0x7177}, {0x7515,0x6838}, {0x7518,0x4a76}, {0x751a,0x6424}, {0x751b,0x7456}, {0x751f,0x5f66}, {0x7523,0x5f27}, {0x7525,0x5f67}, {0x7526,0x6141}, {0x7528,0x6944}, {0x752b,0x5c4b}, {0x752c,0x6945}, {0x7530,0x6f23}, {0x7531,0x6b26}, {0x7532,0x4b23}, {0x7533,0x6369}, {0x7537,0x517b}, {0x7538,0x6f24}, {0x753a,0x6f6b}, {0x7547,0x5034}, {0x754c,0x4d23}, {0x754f,0x6866}, {0x7551,0x6f25}, {0x7553,0x534c}, {0x7554,0x5a6d}, {0x7559,0x573a}, {0x755b,0x7255}, {0x755c,0x7565}, {0x755d,0x596f}, {0x7562,0x7934}, {0x7565,0x5554}, {0x7566,0x7d4f}, {0x756a,0x5b63}, {0x756f,0x7161}, {0x7570,0x6c36}, {0x7575,0x7b7e}, {0x7576,0x5357}, {0x7578,0x5131}, {0x757a,0x4b31}, {0x757f,0x5132}, {0x7586,0x4b32}, {0x7587,0x7142}, {0x758a,0x7461}, {0x758b,0x7935}, {0x758e,0x6143}, {0x758f,0x6142}, {0x7591,0x6b77}, {0x759d,0x5f28}, {0x75a5,0x4b4a}, {0x75ab,0x6639}, {0x75b1,0x785e}, {0x75b2,0x792a}, {0x75b3,0x4a77}, {0x75b5,0x6d37}, {0x75b8,0x5338}, {0x75b9,0x7256}, {0x75bc,0x5459}, {0x75bd,0x6e45}, {0x75be,0x7270}, {0x75c2,0x4a32}, {0x75c5,0x5c3b}, {0x75c7,0x7178}, {0x75cd,0x6c37}, {0x75d2,0x654a}, {0x75d4,0x7640}, {0x75d5,0x7d5d}, {0x75d8,0x5463}, {0x75d9,0x4c62}, {0x75db,0x7754}, {0x75e2,0x5765}, {0x75f0,0x5343}, {0x75f2,0x5826}, {0x75f4,0x7641}, {0x75fa,0x5d76}, {0x75fc,0x4d40}, {0x7600,0x655c}, {0x760d,0x654b}, {0x7619,0x6144}, {0x761f,0x6830}, {0x7620,0x7430}, {0x7621,0x736a}, {0x7622,0x5a6e}, {0x7624,0x573b}, {0x7626,0x6231}, {0x763b,0x572a}, {0x7642,0x567b}, {0x764c,0x645f}, {0x764e,0x4a56}, {0x7652,0x6b28}, {0x7656,0x5b7e}, {0x7661,0x7642}, {0x7664,0x6f3b}, {0x7669,0x547d}, {0x766c,0x6048}, {0x7670,0x6839}, {0x7672,0x6f26}, {0x7678,0x4d24}, {0x767b,0x5474}, {0x767c,0x5b21}, {0x767d,0x5b5c}, {0x767e,0x5b5d}, {0x7684,0x6e5c}, {0x7686,0x4b4b}, {0x7687,0x7c55}, {0x768e,0x4e6b}, {0x7690,0x4d41}, {0x7693,0x7b53}, {0x76ae,0x792b}, {0x76ba,0x7554}, {0x76bf,0x5929}, {0x76c2,0x695d}, {0x76c3,0x5b4d}, {0x76c6,0x5d4e}, {0x76c8,0x6743}, {0x76ca,0x6c4c}, {0x76d2,0x796c}, {0x76d6,0x4b4c}, {0x76db,0x607c}, {0x76dc,0x5428}, {0x76de,0x6d53}, {0x76df,0x586f}, {0x76e1,0x7257}, {0x76e3,0x4a78}, {0x76e4,0x5a6f}, {0x76e7,0x5654}, {0x76ee,0x594d}, {0x76f2,0x586e}, {0x76f4,0x7241}, {0x76f8,0x5f53}, {0x76fc,0x5a70}, {0x76fe,0x626a}, {0x7701,0x607d}, {0x7704,0x5878}, {0x7708,0x772f}, {0x7709,0x5a36}, {0x770b,0x4a57}, {0x771e,0x7258}, {0x7720,0x5879}, {0x7729,0x7a5f}, {0x7737,0x4f6f}, {0x7738,0x5942}, {0x773a,0x7052}, {0x773c,0x6451}, {0x7740,0x7337}, {0x774d,0x7a60}, {0x775b,0x6f6c}, {0x7761,0x6232}, {0x7763,0x543d}, {0x7766,0x594e}, {0x776b,0x7462}, {0x7779,0x5429}, {0x777e,0x4d42}, {0x777f,0x675a}, {0x778b,0x7259}, {0x7791,0x592a}, {0x779e,0x583e}, {0x77a5,0x5c2d}, {0x77ac,0x626b}, {0x77ad,0x567c}, {0x77b0,0x4a79}, {0x77b3,0x545a}, {0x77bb,0x7457}, {0x77bc,0x4c21}, {0x77bf,0x4f3a}, {0x77d7,0x7538}, {0x77db,0x5943}, {0x77dc,0x5068}, {0x77e2,0x6345}, {0x77e3,0x6b78}, {0x77e5,0x7231}, {0x77e9,0x4f3b}, {0x77ed,0x532d}, {0x77ee,0x6861}, {0x77ef,0x4e6c}, {0x77f3,0x6034}, {0x7802,0x5e63}, {0x7812,0x5d77}, {0x7825,0x7232}, {0x7826,0x7376}, {0x7827,0x765b}, {0x782c,0x577e}, {0x7832,0x785f}, {0x7834,0x7772}, {0x7845,0x5029}, {0x784f,0x665a}, {0x785d,0x7526}, {0x786b,0x573c}, {0x786c,0x4c63}, {0x786f,0x665b}, {0x787c,0x5d5d}, {0x7881,0x5133}, {0x7887,0x6f6d}, {0x788c,0x565e}, {0x788d,0x6474}, {0x788e,0x616f}, {0x7891,0x5d78}, {0x7897,0x684f}, {0x78a3,0x4a65}, {0x78a7,0x5c21}, {0x78a9,0x6035}, {0x78ba,0x7c2c}, {0x78bb,0x7c2d}, {0x78bc,0x5827}, {0x78c1,0x6d38}, {0x78c5,0x5b36}, {0x78ca,0x5670}, {0x78cb,0x732f}, {0x78ce,0x4d25}, {0x78d0,0x5a71}, {0x78e8,0x5828}, {0x78ec,0x4c64}, {0x78ef,0x5134}, {0x78f5,0x4a58}, {0x78fb,0x5a72}, {0x7901,0x7527}, {0x790e,0x7528}, {0x7916,0x6626}, {0x792a,0x556c}, {0x792b,0x5578}, {0x792c,0x5a73}, {0x793a,0x6346}, {0x793e,0x5e64}, {0x7940,0x5e65}, {0x7941,0x5135}, {0x7947,0x5136}, {0x7948,0x5137}, {0x7949,0x7233}, {0x7950,0x695e}, {0x7956,0x7053}, {0x7957,0x7234}, {0x795a,0x7054}, {0x795b,0x4b64}, {0x795c,0x7b54}, {0x795d,0x7566}, {0x795e,0x636a}, {0x7960,0x5e66}, {0x7965,0x5f54}, {0x7968,0x7879}, {0x796d,0x702e}, {0x797a,0x5138}, {0x797f,0x565f}, {0x7981,0x5057}, {0x798d,0x7c21}, {0x798e,0x6f6e}, {0x798f,0x5c58}, {0x7991,0x695f}, {0x79a6,0x655d}, {0x79a7,0x7d7b}, {0x79aa,0x6049}, {0x79ae,0x5649}, {0x79b1,0x542a}, {0x79b3,0x654c}, {0x79b9,0x6960}, {0x79bd,0x5058}, {0x79be,0x7c22}, {0x79bf,0x543e}, {0x79c0,0x6233}, {0x79c1,0x5e67}, {0x79c9,0x5c3c}, {0x79ca,0x5236}, {0x79cb,0x7555}, {0x79d1,0x4e21}, {0x79d2,0x7529}, {0x79d5,0x5d79}, {0x79d8,0x5d7a}, {0x79df,0x7055}, {0x79e4,0x765f}, {0x79e6,0x725a}, {0x79e7,0x646b}, {0x79e9,0x7271}, {0x79fb,0x6c39}, {0x7a00,0x7d7c}, {0x7a05,0x612a}, {0x7a08,0x4a59}, {0x7a0b,0x6f6f}, {0x7a0d,0x752a}, {0x7a14,0x6c79}, {0x7a17,0x782d}, {0x7a19,0x7242}, {0x7a1a,0x7643}, {0x7a1c,0x5752}, {0x7a1f,0x7922}, {0x7a20,0x7056}, {0x7a2e,0x707a}, {0x7a31,0x7660}, {0x7a36,0x6973}, {0x7a37,0x7243}, {0x7a3b,0x542b}, {0x7a3c,0x4a33}, {0x7a3d,0x4d26}, {0x7a3f,0x4d43}, {0x7a40,0x4d5a}, {0x7a46,0x594f}, {0x7a49,0x7644}, {0x7a4d,0x6e5d}, {0x7a4e,0x6744}, {0x7a57,0x6234}, {0x7a61,0x5f62}, {0x7a62,0x675b}, {0x7a69,0x6831}, {0x7a6b,0x7c2e}, {0x7a70,0x654d}, {0x7a74,0x7a6b}, {0x7a76,0x4f3c}, {0x7a79,0x4f62}, {0x7a7a,0x4d76}, {0x7a7d,0x6f70}, {0x7a7f,0x743e}, {0x7a81,0x544d}, {0x7a84,0x7338}, {0x7a88,0x6921}, {0x7a92,0x7272}, {0x7a93,0x736b}, {0x7a95,0x7057}, {0x7a98,0x4f57}, {0x7a9f,0x4f5f}, {0x7aa9,0x6840}, {0x7aaa,0x6841}, {0x7aae,0x4f63}, {0x7aaf,0x6922}, {0x7aba,0x502a}, {0x7ac4,0x7341}, {0x7ac5,0x502b}, {0x7ac7,0x5464}, {0x7aca,0x6f3c}, {0x7acb,0x5821}, {0x7ad7,0x595f}, {0x7ad9,0x7357}, {0x7add,0x5c3d}, {0x7adf,0x4c65}, {0x7ae0,0x6d71}, {0x7ae3,0x7162}, {0x7ae5,0x545b}, {0x7aea,0x6235}, {0x7aed,0x4a66}, {0x7aef,0x532e}, {0x7af6,0x4c66}, {0x7af9,0x7153}, {0x7afa,0x7567}, {0x7aff,0x4a5a}, {0x7b0f,0x7b6e}, {0x7b11,0x6145}, {0x7b19,0x5f69}, {0x7b1b,0x6e5e}, {0x7b1e,0x7742}, {0x7b20,0x5822}, {0x7b26,0x5d2c}, {0x7b2c,0x702f}, {0x7b2d,0x563d}, {0x7b39,0x612b}, {0x7b46,0x7936}, {0x7b49,0x5475}, {0x7b4b,0x5049}, {0x7b4c,0x6f27}, {0x7b4d,0x626c}, {0x7b4f,0x5b6a}, {0x7b50,0x4e4c}, {0x7b51,0x7568}, {0x7b52,0x7755}, {0x7b54,0x534d}, {0x7b56,0x737e}, {0x7b60,0x5035}, {0x7b6c,0x607e}, {0x7b6e,0x5f7b}, {0x7b75,0x665d}, {0x7b7d,0x6824}, {0x7b87,0x4b4d}, {0x7b8b,0x6f28}, {0x7b8f,0x6e34}, {0x7b94,0x5a58}, {0x7b95,0x5139}, {0x7b97,0x5f29}, {0x7b9a,0x7330}, {0x7b9d,0x4c44}, {0x7ba1,0x4e37}, {0x7bad,0x6f29}, {0x7bb1,0x5f55}, {0x7bb4,0x6d57}, {0x7bb8,0x6e46}, {0x7bc0,0x6f3d}, {0x7bc1,0x7c56}, {0x7bc4,0x5b74}, {0x7bc6,0x6f2a}, {0x7bc7,0x7839}, {0x7bc9,0x7569}, {0x7bd2,0x6359}, {0x7be0,0x6146}, {0x7be4,0x543f}, {0x7be9,0x5e68}, {0x7c07,0x706a}, {0x7c12,0x7342}, {0x7c1e,0x532f}, {0x7c21,0x4a5b}, {0x7c27,0x7c57}, {0x7c2a,0x6d58}, {0x7c2b,0x6147}, {0x7c3d,0x7458}, {0x7c3e,0x5633}, {0x7c3f,0x5d2d}, {0x7c43,0x553e}, {0x7c4c,0x7143}, {0x7c4d,0x6e5f}, {0x7c60,0x566b}, {0x7c64,0x7459}, {0x7c6c,0x5766}, {0x7c73,0x5a37}, {0x7c83,0x5d7b}, {0x7c89,0x5d4f}, {0x7c92,0x5823}, {0x7c95,0x5a59}, {0x7c97,0x7058}, {0x7c98,0x6f44}, {0x7c9f,0x6158}, {0x7ca5,0x7154}, {0x7ca7,0x6d72}, {0x7cae,0x555b}, {0x7cb1,0x555c}, {0x7cb2,0x7344}, {0x7cb3,0x4b57}, {0x7cb9,0x6236}, {0x7cbe,0x6f71}, {0x7cca,0x7b55}, {0x7cd6,0x5358}, {0x7cde,0x5d50}, {0x7cdf,0x7059}, {0x7ce0,0x4b33}, {0x7ce7,0x555d}, {0x7cfb,0x4d27}, {0x7cfe,0x502c}, {0x7d00,0x513a}, {0x7d02,0x7144}, {0x7d04,0x6533}, {0x7d05,0x7b75}, {0x7d06,0x6961}, {0x7d07,0x7d60}, {0x7d08,0x7c3c}, {0x7d0a,0x5a22}, {0x7d0b,0x5a23}, {0x7d0d,0x5221}, {0x7d10,0x526f}, {0x7d14,0x626d}, {0x7d17,0x5e69}, {0x7d18,0x4e5c}, {0x7d19,0x7235}, {0x7d1a,0x5064}, {0x7d1b,0x5d51}, {0x7d20,0x6148}, {0x7d21,0x5b37}, {0x7d22,0x5f63}, {0x7d2b,0x6d39}, {0x7d2c,0x7145}, {0x7d2e,0x734f}, {0x7d2f,0x572b}, {0x7d30,0x612c}, {0x7d33,0x636b}, {0x7d35,0x6e47}, {0x7d39,0x6149}, {0x7d3a,0x4a7a}, {0x7d42,0x707b}, {0x7d43,0x7a61}, {0x7d44,0x705a}, {0x7d45,0x4c67}, {0x7d46,0x5a74}, {0x7d50,0x4c3f}, {0x7d5e,0x4e6d}, {0x7d61,0x5529}, {0x7d62,0x7a62}, {0x7d66,0x5065}, {0x7d68,0x6b56}, {0x7d6a,0x6c5f}, {0x7d6e,0x5f7c}, {0x7d71,0x7756}, {0x7d72,0x5e6a}, {0x7d73,0x4b34}, {0x7d76,0x6f3e}, {0x7d79,0x4c35}, {0x7d7f,0x4f3d}, {0x7d8e,0x6f72}, {0x7d8f,0x6237}, {0x7d93,0x4c68}, {0x7d9c,0x707c}, {0x7da0,0x5660}, {0x7da2,0x7146}, {0x7dac,0x6238}, {0x7dad,0x6b2b}, {0x7db1,0x4b35}, {0x7db2,0x5851}, {0x7db4,0x744e}, {0x7db5,0x7377}, {0x7db8,0x5746}, {0x7dba,0x513b}, {0x7dbb,0x772a}, {0x7dbd,0x6d4a}, {0x7dbe,0x5753}, {0x7dbf,0x587a}, {0x7dc7,0x7645}, {0x7dca,0x514c}, {0x7dcb,0x5d7c}, {0x7dd6,0x5f7d}, {0x7dd8,0x7965}, {0x7dda,0x604a}, {0x7ddd,0x727d}, {0x7dde,0x5330}, {0x7de0,0x7473}, {0x7de1,0x5a49}, {0x7de3,0x665e}, {0x7de8,0x783a}, {0x7de9,0x6850}, {0x7dec,0x587b}, {0x7def,0x6a55}, {0x7df4,0x5623}, {0x7dfb,0x7646}, {0x7e09,0x725b}, {0x7e0a,0x647c}, {0x7e15,0x6832}, {0x7e1b,0x5a5a}, {0x7e1d,0x725c}, {0x7e1e,0x7b56}, {0x7e1f,0x6932}, {0x7e21,0x6e2d}, {0x7e23,0x7a63}, {0x7e2b,0x5c6e}, {0x7e2e,0x756a}, {0x7e2f,0x6660}, {0x7e31,0x707d}, {0x7e37,0x572c}, {0x7e3d,0x7545}, {0x7e3e,0x6e60}, {0x7e41,0x5b65}, {0x7e43,0x5d5e}, {0x7e46,0x5970}, {0x7e47,0x6923}, {0x7e52,0x7179}, {0x7e54,0x7244}, {0x7e55,0x604b}, {0x7e5e,0x6924}, {0x7e61,0x6239}, {0x7e69,0x6331}, {0x7e6a,0x7c6b}, {0x7e6b,0x4d28}, {0x7e6d,0x4c36}, {0x7e70,0x705b}, {0x7e79,0x663a}, {0x7e7c,0x4d29}, {0x7e82,0x7343}, {0x7e8c,0x6159}, {0x7e8f,0x6f2b}, {0x7e93,0x6745}, {0x7e96,0x6069}, {0x7e98,0x7345}, {0x7e9b,0x5440}, {0x7e9c,0x553f}, {0x7f36,0x5d2e}, {0x7f38,0x797c}, {0x7f3a,0x4c40}, {0x7f4c,0x6522}, {0x7f50,0x4e38}, {0x7f54,0x5852}, {0x7f55,0x7956}, {0x7f6a,0x712a}, {0x7f6b,0x4e51}, {0x7f6e,0x7647}, {0x7f70,0x5b6b}, {0x7f72,0x5f7e}, {0x7f75,0x5861}, {0x7f77,0x7773}, {0x7f79,0x5767}, {0x7f85,0x547e}, {0x7f88,0x513c}, {0x7f8a,0x654f}, {0x7f8c,0x4b36}, {0x7f8e,0x5a38}, {0x7f94,0x4d44}, {0x7f9a,0x563e}, {0x7f9e,0x623a}, {0x7fa4,0x4f58}, {0x7fa8,0x604c}, {0x7fa9,0x6b79}, {0x7fb2,0x7d7d}, {0x7fb8,0x5768}, {0x7fb9,0x4b58}, {0x7fbd,0x6962}, {0x7fc1,0x683a}, {0x7fc5,0x6347}, {0x7fca,0x6c4d}, {0x7fcc,0x6c4e}, {0x7fce,0x563f}, {0x7fd2,0x6327}, {0x7fd4,0x5f56}, {0x7fd5,0x7d68}, {0x7fdf,0x6e61}, {0x7fe0,0x7628}, {0x7fe1,0x5d7d}, {0x7fe9,0x783b}, {0x7feb,0x6851}, {0x7ff0,0x7957}, {0x7ff9,0x4e6e}, {0x7ffc,0x6c4f}, {0x8000,0x6925}, {0x8001,0x5655}, {0x8003,0x4d45}, {0x8005,0x6d3a}, {0x8006,0x513d}, {0x8009,0x4f3e}, {0x800c,0x6c3b}, {0x8010,0x5231}, {0x8015,0x4c69}, {0x8017,0x5944}, {0x8018,0x697c}, {0x802d,0x513e}, {0x8033,0x6c3c}, {0x8036,0x652d}, {0x803d,0x7730}, {0x803f,0x4c6a}, {0x8043,0x5344}, {0x8046,0x5640}, {0x804a,0x567d}, {0x8056,0x6121}, {0x8058,0x5e3d}, {0x805a,0x7629}, {0x805e,0x5a24}, {0x806f,0x5624}, {0x8070,0x7546}, {0x8072,0x6122}, {0x8073,0x6946}, {0x8077,0x7245}, {0x807d,0x7469}, {0x807e,0x566c}, {0x807f,0x6b53}, {0x8084,0x6c3d}, {0x8085,0x625c}, {0x8086,0x5e6b}, {0x8087,0x705c}, {0x8089,0x6b3f}, {0x808b,0x574e}, {0x808c,0x513f}, {0x8096,0x752b}, {0x809b,0x797d}, {0x809d,0x4a5c}, {0x80a1,0x4d46}, {0x80a2,0x7236}, {0x80a5,0x5d7e}, {0x80a9,0x4c37}, {0x80aa,0x5b38}, {0x80af,0x5069}, {0x80b1,0x4e5d}, {0x80b2,0x6b40}, {0x80b4,0x7d22}, {0x80ba,0x784b}, {0x80c3,0x6a56}, {0x80c4,0x7130}, {0x80cc,0x5b4e}, {0x80ce,0x7743}, {0x80da,0x5b4f}, {0x80db,0x4b24}, {0x80de,0x7860}, {0x80e1,0x7b57}, {0x80e4,0x6b4a}, {0x80e5,0x6021}, {0x80f1,0x4e4d}, {0x80f4,0x545c}, {0x80f8,0x7d58}, {0x80fd,0x5276}, {0x8102,0x7237}, {0x8105,0x7a76}, {0x8106,0x762a}, {0x8107,0x7a77}, {0x8108,0x5866}, {0x810a,0x7431}, {0x8118,0x6852}, {0x811a,0x4a45}, {0x811b,0x4c6b}, {0x8123,0x626e}, {0x8129,0x623b}, {0x812b,0x772d}, {0x812f,0x7861}, {0x8139,0x736c}, {0x813e,0x5e21}, {0x814b,0x647d}, {0x814e,0x636c}, {0x8150,0x5d2f}, {0x8151,0x5d30}, {0x8154,0x4b37}, {0x8155,0x6853}, {0x8165,0x6123}, {0x8166,0x5260}, {0x816b,0x707e}, {0x8170,0x6926}, {0x8171,0x4b72}, {0x8178,0x6d73}, {0x8179,0x5c59}, {0x817a,0x604d}, {0x817f,0x775a}, {0x8180,0x5b39}, {0x8188,0x4c2e}, {0x818a,0x5a5b}, {0x818f,0x4d47}, {0x819a,0x5d31}, {0x819c,0x582f}, {0x819d,0x6323}, {0x81a0,0x4e6f}, {0x81a3,0x7273}, {0x81a8,0x7833}, {0x81b3,0x604e}, {0x81b5,0x757d}, {0x81ba,0x6b6c}, {0x81bd,0x5345}, {0x81be,0x7c6c}, {0x81bf,0x525b}, {0x81c0,0x546b}, {0x81c2,0x5e22}, {0x81c6,0x6566}, {0x81cd,0x7030}, {0x81d8,0x5544}, {0x81df,0x6d74}, {0x81e3,0x636d}, {0x81e5,0x6842}, {0x81e7,0x6d75}, {0x81e8,0x577c}, {0x81ea,0x6d3b}, {0x81ed,0x762b}, {0x81f3,0x7238}, {0x81f4,0x7648}, {0x81fa,0x5366}, {0x81fb,0x725d}, {0x81fc,0x4f3f}, {0x81fe,0x6b2c}, {0x8205,0x4f40}, {0x8207,0x6628}, {0x8208,0x7d69}, {0x820a,0x4f41}, {0x820c,0x605f}, {0x820d,0x5e6c}, {0x8212,0x6022}, {0x821b,0x743f}, {0x821c,0x626f}, {0x821e,0x5971}, {0x821f,0x7147}, {0x8221,0x4b38}, {0x822a,0x797e}, {0x822b,0x5b3a}, {0x822c,0x5a75}, {0x8235,0x766c}, {0x8236,0x5a5c}, {0x8237,0x7a64}, {0x8239,0x604f}, {0x8240,0x5d32}, {0x8245,0x6629}, {0x8247,0x6f73}, {0x8259,0x736d}, {0x8264,0x6b7a}, {0x8266,0x7966}, {0x826e,0x4a5d}, {0x826f,0x555e}, {0x8271,0x4a5e}, {0x8272,0x5f64}, {0x8276,0x667d}, {0x8278,0x752c}, {0x827e,0x6475}, {0x828b,0x6963}, {0x828d,0x6d4b}, {0x828e,0x4f64}, {0x8292,0x5853}, {0x8299,0x5d33}, {0x829a,0x546c}, {0x829d,0x7239}, {0x829f,0x5f37}, {0x82a5,0x4b4e}, {0x82a6,0x7b58}, {0x82a9,0x5059}, {0x82ac,0x5d52}, {0x82ad,0x7774}, {0x82ae,0x675c}, {0x82af,0x6425}, {0x82b1,0x7c23}, {0x82b3,0x5b3b}, {0x82b7,0x723a}, {0x82b8,0x697d}, {0x82b9,0x504a}, {0x82bb,0x7556}, {0x82bc,0x5945}, {0x82bd,0x6434}, {0x82bf,0x6d27}, {0x82d1,0x6a3d}, {0x82d2,0x667e}, {0x82d4,0x7744}, {0x82d5,0x752d}, {0x82d7,0x5960}, {0x82db,0x4a34}, {0x82de,0x7862}, {0x82df,0x4f42}, {0x82e1,0x6c3e}, {0x82e5,0x6534}, {0x82e6,0x4d48}, {0x82e7,0x6e48}, {0x82f1,0x6748}, {0x82fd,0x4d49}, {0x82fe,0x7937}, {0x8301,0x7168}, {0x8302,0x5972}, {0x8303,0x5b75}, {0x8304,0x4a35}, {0x8305,0x5946}, {0x8309,0x5849}, {0x8317,0x592b}, {0x8328,0x6d3c}, {0x832b,0x5854}, {0x832f,0x5c5a}, {0x8331,0x623c}, {0x8334,0x7c6d}, {0x8335,0x6c60}, {0x8336,0x527e}, {0x8338,0x6947}, {0x8339,0x662a}, {0x8340,0x6270}, {0x8347,0x7a3b}, {0x8349,0x752e}, {0x834a,0x7b2a}, {0x834f,0x6c7b}, {0x8351,0x6c3f}, {0x8352,0x7c58}, {0x8373,0x5465}, {0x8377,0x7943}, {0x837b,0x6e62}, {0x8389,0x5769}, {0x838a,0x6d76}, {0x838e,0x5e6d}, {0x8396,0x4c6c}, {0x8398,0x636e}, {0x839e,0x6854}, {0x83a2,0x7a78}, {0x83a9,0x5d34}, {0x83aa,0x6435}, {0x83ab,0x5830}, {0x83bd,0x5855}, {0x83c1,0x746a}, {0x83c5,0x4e39}, {0x83c9,0x5661}, {0x83ca,0x4f52}, {0x83cc,0x5036}, {0x83d3,0x4e22}, {0x83d6,0x736e}, {0x83dc,0x7378}, {0x83e9,0x5c4c}, {0x83eb,0x504b}, {0x83ef,0x7c24}, {0x83f0,0x4d4a}, {0x83f1,0x5754}, {0x83f2,0x5e23}, {0x83f4,0x6460}, {0x83f9,0x6e49}, {0x83fd,0x625d}, {0x8403,0x757e}, {0x8404,0x542c}, {0x840a,0x5551}, {0x840c,0x5870}, {0x840d,0x7843}, {0x840e,0x6a57}, {0x8429,0x7557}, {0x842c,0x583f}, {0x8431,0x7d40}, {0x8438,0x6b2d}, {0x843d,0x552a}, {0x8449,0x6728}, {0x8457,0x6e4a}, {0x845b,0x4a67}, {0x8461,0x7863}, {0x8463,0x545d}, {0x8466,0x6a58}, {0x846b,0x7b59}, {0x846c,0x6d77}, {0x846f,0x6535}, {0x8475,0x502d}, {0x847a,0x7171}, {0x8490,0x623d}, {0x8494,0x6348}, {0x8499,0x5955}, {0x849c,0x5f2a}, {0x84a1,0x5b3c}, {0x84b2,0x7864}, {0x84b8,0x717a}, {0x84bb,0x6536}, {0x84bc,0x736f}, {0x84bf,0x7b5a}, {0x84c0,0x6160}, {0x84c2,0x592c}, {0x84c4,0x756b}, {0x84c6,0x6036}, {0x84c9,0x6948}, {0x84cb,0x4b4f}, {0x84cd,0x6349}, {0x84d1,0x5e6e}, {0x84da,0x623e}, {0x84ec,0x5c6f}, {0x84ee,0x5625}, {0x84f4,0x6271}, {0x84fc,0x567e}, {0x8511,0x5921}, {0x8513,0x5840}, {0x8514,0x5c5b}, {0x8517,0x6d3d}, {0x8518,0x5f38}, {0x851a,0x6a25}, {0x851e,0x572d}, {0x8521,0x7379}, {0x8523,0x6d78}, {0x8525,0x7547}, {0x852c,0x614a}, {0x852d,0x6b63}, {0x852f,0x725e}, {0x853d,0x784c}, {0x853f,0x6a59}, {0x8541,0x5346}, {0x8543,0x5b66}, {0x8549,0x752f}, {0x854e,0x4e70}, {0x8553,0x697e}, {0x8559,0x7b36}, {0x8563,0x6272}, {0x8568,0x4f72}, {0x8569,0x7739}, {0x856a,0x5973}, {0x856d,0x614b}, {0x8584,0x5a5d}, {0x8587,0x5a39}, {0x858f,0x6b7b}, {0x8591,0x4b39}, {0x8594,0x6d79}, {0x859b,0x6060}, {0x85a6,0x7440}, {0x85a8,0x7d3c}, {0x85a9,0x5f31}, {0x85aa,0x636f}, {0x85af,0x6023}, {0x85b0,0x7d39}, {0x85ba,0x7031}, {0x85c1,0x4d4b}, {0x85c9,0x6d3e}, {0x85cd,0x5540}, {0x85ce,0x6370}, {0x85cf,0x6d7a}, {0x85d5,0x6964}, {0x85dc,0x556d}, {0x85dd,0x675d}, {0x85e4,0x5476}, {0x85e5,0x6537}, {0x85e9,0x5b67}, {0x85ea,0x623f}, {0x85f7,0x6e4b}, {0x85fa,0x5774}, {0x85fb,0x705d}, {0x85ff,0x4e2b}, {0x8602,0x675e}, {0x8606,0x5656}, {0x8607,0x614c}, {0x860a,0x6833}, {0x8616,0x656e}, {0x8617,0x5c22}, {0x861a,0x6050}, {0x862d,0x5535}, {0x863f,0x5521}, {0x864e,0x7b5b}, {0x8650,0x794b}, {0x8654,0x4b73}, {0x8655,0x7425}, {0x865b,0x7a48}, {0x865c,0x5657}, {0x865e,0x6965}, {0x865f,0x7b5c}, {0x8667,0x7d50}, {0x8679,0x7b76}, {0x868a,0x5a25}, {0x868c,0x5b3d}, {0x8693,0x6c62}, {0x86a3,0x4d77}, {0x86a4,0x705e}, {0x86a9,0x7649}, {0x86c7,0x5e6f}, {0x86cb,0x5331}, {0x86d4,0x7c6e}, {0x86d9,0x6843}, {0x86db,0x7148}, {0x86df,0x4e71}, {0x86e4,0x796d}, {0x86ed,0x7274}, {0x86fe,0x6436}, {0x8700,0x7539}, {0x8702,0x5c70}, {0x8703,0x6371}, {0x8708,0x6825}, {0x8718,0x723b}, {0x871a,0x5e24}, {0x871c,0x5a4c}, {0x874e,0x4a69}, {0x8755,0x635a}, {0x8757,0x7c59}, {0x875f,0x6a5a}, {0x8766,0x7944}, {0x8768,0x6324}, {0x8774,0x7b5d}, {0x8776,0x6f4a}, {0x8778,0x6844}, {0x8782,0x554c}, {0x878d,0x6b57}, {0x879f,0x592d}, {0x87a2,0x7b2b}, {0x87b3,0x5359}, {0x87ba,0x5522}, {0x87c4,0x765e}, {0x87e0,0x5a76}, {0x87ec,0x6051}, {0x87ef,0x6928}, {0x87f2,0x7579}, {0x87f9,0x7a2f}, {0x87fb,0x6b7c}, {0x87fe,0x606a}, {0x8805,0x6332}, {0x881f,0x5545}, {0x8822,0x7163}, {0x8823,0x556e}, {0x8831,0x4d4c}, {0x8836,0x6d59}, {0x883b,0x5841}, {0x8840,0x7a6c}, {0x8846,0x716b}, {0x884c,0x7a3c}, {0x884d,0x6662}, {0x8852,0x7a65}, {0x8853,0x627a}, {0x8857,0x4a36}, {0x8859,0x6437}, {0x885b,0x6a5b}, {0x885d,0x757a}, {0x8861,0x7b2c}, {0x8862,0x4f43}, {0x8863,0x6b7d}, {0x8868,0x787a}, {0x886b,0x5f39}, {0x8870,0x6171}, {0x8872,0x5224}, {0x8877,0x757b}, {0x887e,0x505a}, {0x887f,0x505b}, {0x8881,0x6a3e}, {0x8882,0x5931}, {0x8888,0x4a37}, {0x888b,0x5367}, {0x888d,0x7865}, {0x8892,0x5332}, {0x8896,0x6240}, {0x8897,0x725f}, {0x889e,0x4d65}, {0x88ab,0x792c}, {0x88b4,0x4d4d}, {0x88c1,0x6e2e}, {0x88c2,0x562e}, {0x88cf,0x576a}, {0x88d4,0x6760}, {0x88d5,0x6b2e}, {0x88d9,0x4f59}, {0x88dc,0x5c4d}, {0x88dd,0x6d7b}, {0x88df,0x5e70}, {0x88e1,0x576b}, {0x88e8,0x5e25}, {0x88f3,0x5f57}, {0x88f4,0x5b50}, {0x88f5,0x5b51}, {0x88f8,0x5523}, {0x88fd,0x7032}, {0x8907,0x5c5c}, {0x8910,0x4a68}, {0x8912,0x7866}, {0x8913,0x5c4e}, {0x8918,0x6a5c}, {0x8919,0x5b52}, {0x8925,0x6933}, {0x892a,0x775b}, {0x8936,0x6328}, {0x8938,0x572e}, {0x893b,0x6061}, {0x8941,0x4b3a}, {0x8944,0x6551}, {0x895f,0x505c}, {0x8964,0x5541}, {0x896a,0x584a}, {0x8972,0x6329}, {0x897f,0x6024}, {0x8981,0x6929}, {0x8983,0x5347}, {0x8986,0x5c5d}, {0x8987,0x782e}, {0x898b,0x4c38}, {0x898f,0x502e}, {0x8993,0x5872}, {0x8996,0x634a}, {0x89a1,0x4c2f}, {0x89a9,0x542d}, {0x89aa,0x7651}, {0x89b2,0x504c}, {0x89ba,0x4a46}, {0x89bd,0x5542}, {0x89c0,0x4e3a}, {0x89d2,0x4a47}, {0x89e3,0x7a30}, {0x89f4,0x5f58}, {0x89f8,0x753a}, {0x8a00,0x656b}, {0x8a02,0x6f74}, {0x8a03,0x5d35}, {0x8a08,0x4d2a}, {0x8a0a,0x6372}, {0x8a0c,0x7b77}, {0x8a0e,0x7750}, {0x8a13,0x7d3a}, {0x8a16,0x7d61}, {0x8a17,0x767e}, {0x8a18,0x5140}, {0x8a1b,0x6845}, {0x8a1d,0x6438}, {0x8a1f,0x6168}, {0x8a23,0x4c41}, {0x8a25,0x526d}, {0x8a2a,0x5b3e}, {0x8a2d,0x6062}, {0x8a31,0x7a49}, {0x8a34,0x614d}, {0x8a36,0x4a38}, {0x8a3a,0x7260}, {0x8a3b,0x7149}, {0x8a50,0x5e71}, {0x8a54,0x705f}, {0x8a55,0x7844}, {0x8a5b,0x6e4c}, {0x8a5e,0x5e72}, {0x8a60,0x6749}, {0x8a62,0x6273}, {0x8a63,0x6761}, {0x8a66,0x634b}, {0x8a69,0x634c}, {0x8a6d,0x4f78}, {0x8a6e,0x6f2c}, {0x8a70,0x7d7e}, {0x8a71,0x7c25}, {0x8a72,0x7a31}, {0x8a73,0x5f59}, {0x8a75,0x6052}, {0x8a79,0x745a}, {0x8a85,0x714a}, {0x8a87,0x4e23}, {0x8a8c,0x723c}, {0x8a8d,0x6c63}, {0x8a93,0x6025}, {0x8a95,0x772b}, {0x8a98,0x6b2f}, {0x8a9e,0x655e}, {0x8aa0,0x6124}, {0x8aa1,0x4d2b}, {0x8aa3,0x5974}, {0x8aa4,0x6826}, {0x8aa5,0x4d4e}, {0x8aa6,0x6169}, {0x8aa8,0x7c6f}, {0x8aaa,0x6063}, {0x8ab0,0x6241}, {0x8ab2,0x4e24}, {0x8ab9,0x5e26}, {0x8abc,0x6b7e}, {0x8abe,0x6b5d}, {0x8abf,0x7060}, {0x8ac2,0x745b}, {0x8ac4,0x6274}, {0x8ac7,0x5348}, {0x8acb,0x746b}, {0x8acd,0x6e35}, {0x8acf,0x7558}, {0x8ad2,0x555f}, {0x8ad6,0x5665}, {0x8adb,0x6b30}, {0x8adc,0x7463}, {0x8ae1,0x634d}, {0x8ae6,0x7474}, {0x8ae7,0x7a32}, {0x8aea,0x6f75}, {0x8aeb,0x4a5f}, {0x8aed,0x6b31}, {0x8aee,0x6d3f}, {0x8af1,0x7d49}, {0x8af6,0x6426}, {0x8af7,0x7924}, {0x8af8,0x7033}, {0x8afa,0x656c}, {0x8afe,0x5167}, {0x8b00,0x5947}, {0x8b01,0x6457}, {0x8b02,0x6a5d}, {0x8b04,0x5477}, {0x8b0e,0x5a3a}, {0x8b10,0x5a4d}, {0x8b14,0x794c}, {0x8b16,0x615a}, {0x8b17,0x5b3f}, {0x8b19,0x4c45}, {0x8b1a,0x6c50}, {0x8b1b,0x4b3b}, {0x8b1d,0x5e73}, {0x8b20,0x692a}, {0x8b28,0x5948}, {0x8b2b,0x6e63}, {0x8b2c,0x573d}, {0x8b33,0x4f44}, {0x8b39,0x504d}, {0x8b41,0x7c26}, {0x8b49,0x717b}, {0x8b4e,0x7d52}, {0x8b4f,0x5141}, {0x8b58,0x635b}, {0x8b5a,0x5349}, {0x8b5c,0x5c4f}, {0x8b66,0x4c6d}, {0x8b6c,0x5e27}, {0x8b6f,0x663b}, {0x8b70,0x6c21}, {0x8b74,0x4c39}, {0x8b77,0x7b5e}, {0x8b7d,0x6762}, {0x8b80,0x5441}, {0x8b8a,0x5c28}, {0x8b90,0x6242}, {0x8b92,0x7358}, {0x8b93,0x6553}, {0x8b96,0x7359}, {0x8b9a,0x7346}, {0x8c37,0x4d5b}, {0x8c3f,0x4d2c}, {0x8c41,0x7c43}, {0x8c46,0x5467}, {0x8c48,0x5142}, {0x8c4a,0x7925}, {0x8c4c,0x6855}, {0x8c55,0x634e}, {0x8c5a,0x544a}, {0x8c61,0x5f5a}, {0x8c6a,0x7b5f}, {0x8c6b,0x6763}, {0x8c79,0x787b}, {0x8c7a,0x634f}, {0x8c82,0x7530}, {0x8c8a,0x5867}, {0x8c8c,0x5949}, {0x8c9d,0x782f}, {0x8c9e,0x6f76}, {0x8ca0,0x5d36}, {0x8ca1,0x6e2f}, {0x8ca2,0x4d78}, {0x8ca7,0x5e38}, {0x8ca8,0x7c27}, {0x8ca9,0x777c}, {0x8caa,0x7731}, {0x8cab,0x4e3b}, {0x8cac,0x7421}, {0x8caf,0x6e4d}, {0x8cb0,0x612e}, {0x8cb3,0x6c43}, {0x8cb4,0x4f7e}, {0x8cb6,0x783f}, {0x8cb7,0x5862}, {0x8cb8,0x5368}, {0x8cbb,0x5e28}, {0x8cbc,0x7464}, {0x8cbd,0x6c42}, {0x8cbf,0x5975}, {0x8cc0,0x7945}, {0x8cc1,0x5d53}, {0x8cc2,0x5671}, {0x8cc3,0x6c7c}, {0x8cc4,0x7c70}, {0x8cc7,0x6d40}, {0x8cc8,0x4a39}, {0x8cca,0x6e64}, {0x8cd1,0x7261}, {0x8cd3,0x5e39}, {0x8cda,0x5672}, {0x8cdc,0x5e74}, {0x8cde,0x5f5b}, {0x8ce0,0x5b53}, {0x8ce2,0x7a67}, {0x8ce3,0x5863}, {0x8ce4,0x7441}, {0x8ce6,0x5d37}, {0x8cea,0x7275}, {0x8ced,0x542e}, {0x8cf4,0x5673}, {0x8cfb,0x5d38}, {0x8cfc,0x4f45}, {0x8cfd,0x5f5f}, {0x8d04,0x723e}, {0x8d05,0x7621}, {0x8d07,0x6b4b}, {0x8d08,0x717c}, {0x8d0a,0x7347}, {0x8d0d,0x606b}, {0x8d13,0x6d7c}, {0x8d16,0x615b}, {0x8d64,0x6e65}, {0x8d66,0x5e75}, {0x8d6b,0x7a53}, {0x8d70,0x714b}, {0x8d73,0x502f}, {0x8d74,0x5d39}, {0x8d77,0x5143}, {0x8d85,0x7531}, {0x8d8a,0x6a46}, {0x8d99,0x7061}, {0x8da3,0x762c}, {0x8da8,0x7559}, {0x8db3,0x706b}, {0x8dba,0x5d3a}, {0x8dbe,0x723f}, {0x8dc6,0x7745}, {0x8dcb,0x5b22}, {0x8dcc,0x7276}, {0x8dcf,0x4a3a}, {0x8ddb,0x7775}, {0x8ddd,0x4b65}, {0x8de1,0x6e66}, {0x8de3,0x6053}, {0x8de8,0x4e25}, {0x8def,0x5658}, {0x8df3,0x542f}, {0x8e0a,0x6949}, {0x8e0f,0x534e}, {0x8e10,0x7442}, {0x8e1e,0x4b66}, {0x8e2a,0x7121}, {0x8e30,0x6b32}, {0x8e35,0x7122}, {0x8e42,0x6b33}, {0x8e44,0x7034}, {0x8e47,0x4b74}, {0x8e48,0x5430}, {0x8e49,0x7332}, {0x8e4a,0x7b37}, {0x8e59,0x756c}, {0x8e5f,0x6e67}, {0x8e60,0x7432}, {0x8e74,0x756d}, {0x8e76,0x4f73}, {0x8e81,0x7062}, {0x8e87,0x6e4e}, {0x8e8a,0x714c}, {0x8e8d,0x6538}, {0x8eaa,0x5775}, {0x8eab,0x6373}, {0x8eac,0x4f65}, {0x8ec0,0x4f46}, {0x8eca,0x7333}, {0x8ecb,0x6458}, {0x8ecc,0x4f79}, {0x8ecd,0x4f5a}, {0x8ed2,0x7a4d}, {0x8edf,0x6663}, {0x8eeb,0x7262}, {0x8ef8,0x756e}, {0x8efb,0x4a3b}, {0x8efe,0x635c}, {0x8f03,0x4e72}, {0x8f05,0x5659}, {0x8f09,0x6e30}, {0x8f12,0x7465}, {0x8f13,0x5842}, {0x8f14,0x5c50}, {0x8f15,0x4c6e}, {0x8f1b,0x5560}, {0x8f1c,0x764a}, {0x8f1d,0x7d4a}, {0x8f1e,0x5856}, {0x8f1f,0x744f}, {0x8f26,0x5626}, {0x8f27,0x5c3e}, {0x8f29,0x5b54}, {0x8f2a,0x5747}, {0x8f2f,0x727e}, {0x8f33,0x714d}, {0x8f38,0x6243}, {0x8f39,0x5c5e}, {0x8f3b,0x5c5f}, {0x8f3e,0x6f2d}, {0x8f3f,0x662b}, {0x8f44,0x795d}, {0x8f45,0x6a3f}, {0x8f49,0x6f2e}, {0x8f4d,0x7450}, {0x8f4e,0x4e73}, {0x8f5d,0x662c}, {0x8f5f,0x4e5e}, {0x8f62,0x5579}, {0x8f9b,0x6374}, {0x8f9c,0x4d50}, {0x8fa3,0x5538}, {0x8fa6,0x777d}, {0x8fa8,0x5c29}, {0x8fad,0x5e76}, {0x8faf,0x5c2a}, {0x8fb0,0x7263}, {0x8fb1,0x6934}, {0x8fb2,0x525c}, {0x8fc2,0x6966}, {0x8fc5,0x6376}, {0x8fce,0x674a}, {0x8fd1,0x504e}, {0x8fd4,0x5a77}, {0x8fe6,0x4a3c}, {0x8fea,0x6e68}, {0x8feb,0x5a5e}, {0x8fed,0x7277}, {0x8ff0,0x627b}, {0x8ff2,0x4c26}, {0x8ff7,0x5a3b}, {0x8ff9,0x6e69}, {0x8ffd,0x755a}, {0x9000,0x775c}, {0x9001,0x616a}, {0x9002,0x4e41}, {0x9003,0x5431}, {0x9005,0x7d31}, {0x9006,0x663d}, {0x9008,0x7b2d}, {0x900b,0x7867}, {0x900d,0x614e}, {0x900f,0x7762}, {0x9010,0x756f}, {0x9011,0x4f47}, {0x9014,0x5432}, {0x9015,0x4c6f}, {0x9017,0x5468}, {0x9019,0x6e4f}, {0x901a,0x7757}, {0x901d,0x6026}, {0x901e,0x5641}, {0x901f,0x615c}, {0x9020,0x7063}, {0x9021,0x7164}, {0x9022,0x5c71}, {0x9023,0x5627}, {0x902e,0x7475}, {0x9031,0x714e}, {0x9032,0x7264}, {0x9035,0x5030}, {0x9038,0x6c6f}, {0x903c,0x793a}, {0x903e,0x6b35}, {0x9041,0x546d}, {0x9042,0x6244}, {0x9047,0x6967}, {0x904a,0x6b34}, {0x904b,0x6a21}, {0x904d,0x783c}, {0x904e,0x4e26}, {0x9050,0x7946}, {0x9051,0x7c5a}, {0x9053,0x5433}, {0x9054,0x5339}, {0x9055,0x6a5e}, {0x9059,0x692b}, {0x905c,0x6161}, {0x905d,0x534f}, {0x905e,0x7476}, {0x9060,0x6a40}, {0x9061,0x614f}, {0x9063,0x4c3a}, {0x9069,0x6e6a}, {0x906d,0x7064}, {0x906e,0x7334}, {0x906f,0x546e}, {0x9072,0x7240}, {0x9075,0x7165}, {0x9077,0x7443}, {0x9078,0x6054}, {0x907a,0x6b36}, {0x907c,0x5721}, {0x907d,0x4b68}, {0x907f,0x792d}, {0x9080,0x692d}, {0x9081,0x5864}, {0x9082,0x7a33}, {0x9083,0x6245}, {0x9084,0x7c3d}, {0x9087,0x6c44}, {0x9088,0x5831}, {0x908a,0x5c2b}, {0x908f,0x5524}, {0x9091,0x6b69}, {0x9095,0x683b}, {0x9099,0x5857}, {0x90a2,0x7b2e}, {0x90a3,0x5161}, {0x90a6,0x5b40}, {0x90a8,0x753e}, {0x90aa,0x5e77}, {0x90af,0x4a7b}, {0x90b0,0x7746}, {0x90b1,0x4f48}, {0x90b5,0x6150}, {0x90b8,0x6e50}, {0x90c1,0x6974}, {0x90ca,0x4e74}, {0x90de,0x554d}, {0x90e1,0x4f5b}, {0x90e8,0x5d3b}, {0x90ed,0x4e2c}, {0x90f5,0x6968}, {0x90fd,0x5434}, {0x9102,0x6447}, {0x9112,0x755b}, {0x9115,0x7a41}, {0x9119,0x5e29}, {0x9127,0x5478}, {0x912d,0x6f77}, {0x9132,0x5333}, {0x9149,0x6b37}, {0x914a,0x6f78}, {0x914b,0x755c}, {0x914c,0x6d4c}, {0x914d,0x5b55}, {0x914e,0x714f}, {0x9152,0x7150}, {0x9162,0x7532}, {0x9169,0x592e}, {0x916a,0x552c}, {0x916c,0x6246}, {0x9175,0x7d23}, {0x9177,0x7b65}, {0x9178,0x5f2b}, {0x9187,0x6275}, {0x9189,0x762d}, {0x918b,0x7533}, {0x918d,0x7035}, {0x9192,0x6125}, {0x919c,0x755d}, {0x91ab,0x6c22}, {0x91ac,0x6d7d}, {0x91ae,0x7534}, {0x91af,0x7b38}, {0x91b1,0x5b23}, {0x91b4,0x564a}, {0x91b5,0x4b59}, {0x91c0,0x6554}, {0x91c7,0x737a}, {0x91c9,0x6b38}, {0x91cb,0x6037}, {0x91cc,0x576c}, {0x91cd,0x716c}, {0x91ce,0x652f}, {0x91cf,0x5561}, {0x91d0,0x576d}, {0x91d1,0x5151}, {0x91d7,0x6172}, {0x91d8,0x6f79}, {0x91dc,0x5d3c}, {0x91dd,0x765c}, {0x91e3,0x7065}, {0x91e7,0x7444}, {0x91ea,0x6969}, {0x91f5,0x737b}, {0x920d,0x546f}, {0x9210,0x4c22}, {0x9211,0x777e}, {0x9212,0x5f3c}, {0x9217,0x6b4d}, {0x921e,0x5037}, {0x9234,0x5642}, {0x923a,0x682d}, {0x923f,0x6f2f}, {0x9240,0x4b25}, {0x9245,0x4b69}, {0x9249,0x7a68}, {0x9257,0x4c46}, {0x925b,0x6667}, {0x925e,0x6a47}, {0x9262,0x5b24}, {0x9264,0x4f49}, {0x9265,0x627c}, {0x9266,0x6f7a}, {0x9280,0x6b5e}, {0x9283,0x7548}, {0x9285,0x545e}, {0x9291,0x6055}, {0x9293,0x6f30}, {0x9296,0x6247}, {0x9298,0x592f}, {0x929c,0x7967}, {0x92b3,0x6765}, {0x92b6,0x4f4a}, {0x92b7,0x6151}, {0x92b9,0x6248}, {0x92cc,0x6f7b}, {0x92cf,0x7a79}, {0x92d2,0x5c72}, {0x92e4,0x6027}, {0x92ea,0x7868}, {0x92f8,0x4b6a}, {0x92fc,0x4b3c}, {0x9304,0x5662}, {0x9310,0x755e}, {0x9318,0x755f}, {0x931a,0x6e36}, {0x931e,0x6276}, {0x931f,0x534a}, {0x9320,0x6f7c}, {0x9321,0x5144}, {0x9322,0x6f31}, {0x9324,0x5145}, {0x9326,0x505e}, {0x9328,0x5961}, {0x932b,0x6038}, {0x932e,0x4d51}, {0x932f,0x7339}, {0x9348,0x674c}, {0x934a,0x5628}, {0x934b,0x4e27}, {0x934d,0x5435}, {0x9354,0x6448}, {0x935b,0x5334}, {0x936e,0x6b39}, {0x9375,0x4b75}, {0x937c,0x765d}, {0x937e,0x7123}, {0x938c,0x4c47}, {0x9394,0x694a}, {0x9396,0x6170}, {0x939a,0x7560}, {0x93a3,0x7b2f}, {0x93a7,0x4b51}, {0x93ac,0x7b60}, {0x93ad,0x7265}, {0x93b0,0x6c70}, {0x93c3,0x706c}, {0x93d1,0x6e6b}, {0x93de,0x694b}, {0x93e1,0x4c70}, {0x93e4,0x572f}, {0x93f6,0x7321}, {0x9404,0x7c75}, {0x9418,0x7124}, {0x9425,0x6056}, {0x942b,0x6f32}, {0x9435,0x7451}, {0x9438,0x7721}, {0x9444,0x7151}, {0x9451,0x4a7c}, {0x9452,0x4a7d}, {0x945b,0x4e4e}, {0x947d,0x7348}, {0x947f,0x733a}, {0x9577,0x6d7e}, {0x9580,0x5a26}, {0x9583,0x606c}, {0x9589,0x784d}, {0x958b,0x4b52}, {0x958f,0x6b4e}, {0x9591,0x7958}, {0x9592,0x7959}, {0x9593,0x4a60}, {0x9594,0x5a4a}, {0x9598,0x4b26}, {0x95a3,0x4a48}, {0x95a4,0x796e}, {0x95a5,0x5b6c}, {0x95a8,0x5031}, {0x95ad,0x556f}, {0x95b1,0x6673}, {0x95bb,0x6722}, {0x95bc,0x6459}, {0x95c7,0x6461}, {0x95ca,0x7c44}, {0x95d4,0x796f}, {0x95d5,0x4f74}, {0x95d6,0x7766}, {0x95dc,0x4e3c}, {0x95e1,0x7445}, {0x95e2,0x5c23}, {0x961c,0x5d3d}, {0x9621,0x7446}, {0x962a,0x7821}, {0x962e,0x6856}, {0x9632,0x5b41}, {0x963b,0x7066}, {0x963f,0x6439}, {0x9640,0x766d}, {0x9642,0x792e}, {0x9644,0x5d3e}, {0x964b,0x5730}, {0x964c,0x5868}, {0x964d,0x4b3d}, {0x9650,0x795a}, {0x965b,0x784e}, {0x965c,0x7970}, {0x965d,0x606d}, {0x965e,0x6333}, {0x965f,0x7433}, {0x9662,0x6a42}, {0x9663,0x7266}, {0x9664,0x7036}, {0x966a,0x5b56}, {0x9670,0x6b64}, {0x9673,0x7267}, {0x9675,0x5755}, {0x9676,0x5436}, {0x9677,0x7968}, {0x9678,0x5741}, {0x967d,0x6555}, {0x9685,0x696a}, {0x9686,0x574c}, {0x968a,0x5369}, {0x968b,0x6249}, {0x968d,0x7c5b}, {0x968e,0x4d2d}, {0x9694,0x4c30}, {0x9695,0x6a22}, {0x9698,0x6476}, {0x9699,0x5040}, {0x969b,0x7037}, {0x969c,0x6e21}, {0x96a3,0x5776}, {0x96a7,0x624a}, {0x96a8,0x624b}, {0x96aa,0x7a4f}, {0x96b1,0x6b5f}, {0x96b7,0x564b}, {0x96bb,0x7434}, {0x96c0,0x6d4d}, {0x96c1,0x6452}, {0x96c4,0x6a29}, {0x96c5,0x643a}, {0x96c6,0x7322}, {0x96c7,0x4d52}, {0x96c9,0x764b}, {0x96cb,0x7166}, {0x96cc,0x6d41}, {0x96cd,0x683c}, {0x96ce,0x6e51}, {0x96d5,0x7067}, {0x96d6,0x624c}, {0x96d9,0x642a}, {0x96db,0x7561}, {0x96dc,0x6d5a}, {0x96e2,0x576e}, {0x96e3,0x5171}, {0x96e8,0x696b}, {0x96e9,0x696c}, {0x96ea,0x6064}, {0x96ef,0x5a27}, {0x96f0,0x5d54}, {0x96f2,0x6a23}, {0x96f6,0x5643}, {0x96f7,0x5674}, {0x96f9,0x5a5f}, {0x96fb,0x6f33}, {0x9700,0x624d}, {0x9706,0x6f7d}, {0x9707,0x7268}, {0x9711,0x6f45}, {0x9713,0x6767}, {0x9716,0x577d}, {0x9719,0x674e}, {0x971c,0x5f5c}, {0x971e,0x7947}, {0x9727,0x5976}, {0x9730,0x5f2c}, {0x9732,0x565a}, {0x9739,0x5c24}, {0x973d,0x7038}, {0x9742,0x557a}, {0x9744,0x6477}, {0x9748,0x5644}, {0x9751,0x746c}, {0x9756,0x6f7e}, {0x975c,0x7021}, {0x975e,0x5e2a}, {0x9761,0x5a3c}, {0x9762,0x587c}, {0x9769,0x7a54}, {0x976d,0x6c65}, {0x9774,0x7c28}, {0x9777,0x6c66}, {0x977a,0x584b}, {0x978b,0x7b39}, {0x978d,0x6453}, {0x978f,0x4d79}, {0x97a0,0x4f53}, {0x97a8,0x4a6a}, {0x97ab,0x4f54}, {0x97ad,0x783d}, {0x97c6,0x7447}, {0x97cb,0x6a5f}, {0x97d3,0x795b}, {0x97dc,0x5437}, {0x97f3,0x6b65}, {0x97f6,0x6152}, {0x97fb,0x6a24}, {0x97ff,0x7a42}, {0x9800,0x7b61}, {0x9801,0x7a6d}, {0x9802,0x7022}, {0x9803,0x4c71}, {0x9805,0x7a23}, {0x9806,0x6277}, {0x9808,0x624e}, {0x980a,0x6975}, {0x980c,0x616b}, {0x9810,0x6768}, {0x9811,0x6857}, {0x9812,0x5a78}, {0x9813,0x544b}, {0x9817,0x7776}, {0x9818,0x5645}, {0x982d,0x5469}, {0x9830,0x7a7a}, {0x9838,0x4c72}, {0x9839,0x775d}, {0x983b,0x5e3a}, {0x9846,0x4e28}, {0x984c,0x7039}, {0x984d,0x647e}, {0x984e,0x6449}, {0x9854,0x6454}, {0x9858,0x6a43}, {0x985a,0x6f34}, {0x985e,0x573e}, {0x9865,0x7b62}, {0x9867,0x4d53}, {0x986b,0x6f35}, {0x986f,0x7a69}, {0x98a8,0x7926}, {0x98af,0x5f3d}, {0x98b1,0x7747}, {0x98c4,0x787d}, {0x98c7,0x787c}, {0x98db,0x5e2b}, {0x98dc,0x5b68}, {0x98df,0x635d}, {0x98e1,0x6162}, {0x98e2,0x5146}, {0x98ed,0x7650}, {0x98ee,0x6b66}, {0x98ef,0x5a79}, {0x98f4,0x6c47}, {0x98fc,0x5e78}, {0x98fd,0x7869}, {0x98fe,0x635e}, {0x9903,0x4e75}, {0x9909,0x7a43}, {0x990a,0x6557}, {0x990c,0x6c48}, {0x9910,0x7349}, {0x9913,0x643b}, {0x9918,0x662e}, {0x991e,0x6f36}, {0x9920,0x5c3f}, {0x9928,0x4e3d}, {0x9945,0x5843}, {0x9949,0x504f}, {0x994b,0x4f7a}, {0x994c,0x734a}, {0x994d,0x6057}, {0x9951,0x5147}, {0x9952,0x692e}, {0x9954,0x683d}, {0x9957,0x7a44}, {0x9996,0x624f}, {0x9999,0x7a45}, {0x999d,0x7938}, {0x99a5,0x5c60}, {0x99a8,0x7b30}, {0x99ac,0x5829}, {0x99ad,0x655f}, {0x99ae,0x7927}, {0x99b1,0x766e}, {0x99b3,0x764c}, {0x99b4,0x6278}, {0x99b9,0x6c71}, {0x99c1,0x5a60}, {0x99d0,0x7152}, {0x99d1,0x524c}, {0x99d2,0x4f4b}, {0x99d5,0x4a3d}, {0x99d9,0x5d3f}, {0x99dd,0x766f}, {0x99df,0x5e79}, {0x99ed,0x7a34}, {0x99f1,0x552d}, {0x99ff,0x7167}, {0x9a01,0x5e3e}, {0x9a08,0x5c40}, {0x9a0e,0x5148}, {0x9a0f,0x5149}, {0x9a19,0x783e}, {0x9a2b,0x4b76}, {0x9a30,0x5479}, {0x9a36,0x7562}, {0x9a37,0x6153}, {0x9a40,0x5869}, {0x9a43,0x787e}, {0x9a45,0x4f4c}, {0x9a4d,0x7d24}, {0x9a55,0x4e76}, {0x9a57,0x7a50}, {0x9a5a,0x4c73}, {0x9a5b,0x663e}, {0x9a5f,0x762e}, {0x9a62,0x5570}, {0x9a65,0x514a}, {0x9a69,0x7c3e}, {0x9a6a,0x5571}, {0x9aa8,0x4d69}, {0x9ab8,0x7a35}, {0x9ad3,0x6250}, {0x9ad4,0x7477}, {0x9ad8,0x4d54}, {0x9ae5,0x6723}, {0x9aee,0x5b25}, {0x9b1a,0x6251}, {0x9b27,0x5722}, {0x9b2a,0x7763}, {0x9b31,0x6a26}, {0x9b3c,0x5021}, {0x9b41,0x4e5a}, {0x9b42,0x7b6b}, {0x9b43,0x5b26}, {0x9b44,0x5b5e}, {0x9b45,0x5865}, {0x9b4f,0x6a60}, {0x9b54,0x582a}, {0x9b5a,0x6560}, {0x9b6f,0x565b}, {0x9b8e,0x6f46}, {0x9b91,0x786a}, {0x9b9f,0x6455}, {0x9bab,0x4e77}, {0x9bae,0x6058}, {0x9bc9,0x576f}, {0x9bd6,0x746d}, {0x9be4,0x4d66}, {0x9be8,0x4c74}, {0x9c0d,0x7563}, {0x9c10,0x644a}, {0x9c12,0x5c61}, {0x9c15,0x7948}, {0x9c25,0x7c3f}, {0x9c32,0x6827}, {0x9c3b,0x5844}, {0x9c47,0x4b3e}, {0x9c49,0x5c2e}, {0x9c57,0x5777}, {0x9ce5,0x7068}, {0x9ce7,0x5d40}, {0x9ce9,0x4f4d}, {0x9cf3,0x5c73}, {0x9cf4,0x5930}, {0x9cf6,0x6669}, {0x9d09,0x643c}, {0x9d1b,0x6a44}, {0x9d26,0x646c}, {0x9d28,0x6465}, {0x9d3b,0x7b78}, {0x9d51,0x4c3b}, {0x9d5d,0x643d}, {0x9d60,0x4d5c}, {0x9d61,0x5977}, {0x9d6c,0x5d5f}, {0x9d72,0x6d4e}, {0x9da9,0x5950}, {0x9daf,0x6523}, {0x9db4,0x794d}, {0x9dc4,0x4d2e}, {0x9dd7,0x4f4e}, {0x9df2,0x762f}, {0x9df8,0x7d53}, {0x9df9,0x6b6d}, {0x9dfa,0x565c}, {0x9e1a,0x6524}, {0x9e1e,0x5536}, {0x9e75,0x565d}, {0x9e79,0x7969}, {0x9e7d,0x6724}, {0x9e7f,0x5663}, {0x9e92,0x514b}, {0x9e93,0x5664}, {0x9e97,0x5572}, {0x9e9d,0x5e7a}, {0x9e9f,0x5778}, {0x9ea5,0x586a}, {0x9eb4,0x4f55}, {0x9eb5,0x587d}, {0x9ebb,0x582b}, {0x9ebe,0x7d4b}, {0x9ec3,0x7c5c}, {0x9ecd,0x6028}, {0x9ece,0x5573}, {0x9ed1,0x7d59}, {0x9ed4,0x4c23}, {0x9ed8,0x5979}, {0x9edb,0x536a}, {0x9edc,0x7575}, {0x9ede,0x6f47}, {0x9ee8,0x535a}, {0x9ef4,0x5a3d}, {0x9f07,0x6828}, {0x9f08,0x5c2f}, {0x9f0e,0x7023}, {0x9f13,0x4d55}, {0x9f20,0x6029}, {0x9f3b,0x5e2c}, {0x9f4a,0x703a}, {0x9f4b,0x6e31}, {0x9f4e,0x6e32}, {0x9f52,0x764d}, {0x9f5f,0x6e52}, {0x9f61,0x5646}, {0x9f67,0x6065}, {0x9f6a,0x733b}, {0x9f6c,0x6561}, {0x9f77,0x644b}, {0x9f8d,0x5723}, {0x9f90,0x5b42}, {0x9f95,0x4a7e}, {0x9f9c,0x4f4f}, {0xf900,0x4b50}, {0xf901,0x4b56}, {0xf902,0x4b67}, {0xf903,0x4d4f}, {0xf904,0x4d68}, {0xf905,0x4e2d}, {0xf906,0x4f7b}, {0xf907,0x5022}, {0xf908,0x5038}, {0xf909,0x5050}, {0xf90a,0x505d}, {0xf90b,0x5154}, {0xf90c,0x5155}, {0xf90d,0x5158}, {0xf90e,0x515b}, {0xf90f,0x515c}, {0xf910,0x515d}, {0xf911,0x515e}, {0xf912,0x515f}, {0xf913,0x5160}, {0xf914,0x5162}, {0xf915,0x5163}, {0xf916,0x5164}, {0xf917,0x5165}, {0xf918,0x5166}, {0xf919,0x5168}, {0xf91a,0x5169}, {0xf91b,0x516a}, {0xf91c,0x516b}, {0xf91d,0x516d}, {0xf91e,0x516f}, {0xf91f,0x5170}, {0xf920,0x5172}, {0xf921,0x5176}, {0xf922,0x517a}, {0xf923,0x517c}, {0xf924,0x517d}, {0xf925,0x517e}, {0xf926,0x5222}, {0xf927,0x5223}, {0xf928,0x5227}, {0xf929,0x5228}, {0xf92a,0x5229}, {0xf92b,0x522a}, {0xf92c,0x522b}, {0xf92d,0x522d}, {0xf92e,0x5232}, {0xf92f,0x523e}, {0xf930,0x5242}, {0xf931,0x5243}, {0xf932,0x5244}, {0xf933,0x5246}, {0xf934,0x5247}, {0xf935,0x5248}, {0xf936,0x5249}, {0xf937,0x524a}, {0xf938,0x524b}, {0xf939,0x524d}, {0xf93a,0x524e}, {0xf93b,0x524f}, {0xf93c,0x5250}, {0xf93d,0x5251}, {0xf93e,0x5252}, {0xf93f,0x5253}, {0xf940,0x5254}, {0xf941,0x5255}, {0xf942,0x5256}, {0xf943,0x5257}, {0xf944,0x5259}, {0xf945,0x525a}, {0xf946,0x525e}, {0xf947,0x525f}, {0xf948,0x5261}, {0xf949,0x5262}, {0xf94a,0x5264}, {0xf94b,0x5265}, {0xf94c,0x5266}, {0xf94d,0x5267}, {0xf94e,0x5268}, {0xf94f,0x5269}, {0xf950,0x526a}, {0xf951,0x526b}, {0xf952,0x5270}, {0xf953,0x5271}, {0xf954,0x5272}, {0xf955,0x5273}, {0xf956,0x5274}, {0xf957,0x5275}, {0xf958,0x5277}, {0xf959,0x5278}, {0xf95a,0x5466}, {0xf95b,0x547c}, {0xf95c,0x5525}, {0xf95d,0x552b}, {0xf95e,0x552e}, {0xf95f,0x5638}, {0xf960,0x564d}, {0xf961,0x574b}, {0xf962,0x5764}, {0xf963,0x5b45}, {0xf964,0x5b64}, {0xf965,0x5c25}, {0xf966,0x5d25}, {0xf967,0x5d55}, {0xf968,0x5d74}, {0xf969,0x5e7c}, {0xf96a,0x5e7e}, {0xf96b,0x5f33}, {0xf96c,0x5f61}, {0xf96d,0x5f68}, {0xf96e,0x6071}, {0xf96f,0x612d}, {0xf970,0x616d}, {0xf971,0x6375}, {0xf972,0x6421}, {0xf973,0x6429}, {0xf974,0x652e}, {0xf975,0x6531}, {0xf976,0x6532}, {0xf977,0x6539}, {0xf978,0x653b}, {0xf979,0x653c}, {0xf97a,0x6544}, {0xf97b,0x654e}, {0xf97c,0x6550}, {0xf97d,0x6552}, {0xf97e,0x6556}, {0xf97f,0x657a}, {0xf980,0x657b}, {0xf981,0x657c}, {0xf982,0x657e}, {0xf983,0x6621}, {0xf984,0x6624}, {0xf985,0x6627}, {0xf986,0x662d}, {0xf987,0x662f}, {0xf988,0x6630}, {0xf989,0x6631}, {0xf98a,0x6633}, {0xf98b,0x6637}, {0xf98c,0x6638}, {0xf98d,0x663c}, {0xf98e,0x6644}, {0xf98f,0x6646}, {0xf990,0x6647}, {0xf991,0x664a}, {0xf992,0x6652}, {0xf993,0x6656}, {0xf994,0x6659}, {0xf995,0x665c}, {0xf996,0x665f}, {0xf997,0x6661}, {0xf998,0x6664}, {0xf999,0x6665}, {0xf99a,0x6666}, {0xf99b,0x6668}, {0xf99c,0x666a}, {0xf99d,0x666b}, {0xf99e,0x666c}, {0xf99f,0x666f}, {0xf9a0,0x6671}, {0xf9a1,0x6672}, {0xf9a2,0x6675}, {0xf9a3,0x6676}, {0xf9a4,0x6677}, {0xf9a5,0x6679}, {0xf9a6,0x6721}, {0xf9a7,0x6726}, {0xf9a8,0x6729}, {0xf9a9,0x672a}, {0xf9aa,0x672c}, {0xf9ab,0x672d}, {0xf9ac,0x6730}, {0xf9ad,0x673f}, {0xf9ae,0x6741}, {0xf9af,0x6746}, {0xf9b0,0x6747}, {0xf9b1,0x674b}, {0xf9b2,0x674d}, {0xf9b3,0x674f}, {0xf9b4,0x6750}, {0xf9b5,0x6753}, {0xf9b6,0x675f}, {0xf9b7,0x6764}, {0xf9b8,0x6766}, {0xf9b9,0x6777}, {0xf9ba,0x6867}, {0xf9bb,0x6868}, {0xf9bc,0x6870}, {0xf9bd,0x6871}, {0xf9be,0x6877}, {0xf9bf,0x6879}, {0xf9c0,0x687b}, {0xf9c1,0x687e}, {0xf9c2,0x6927}, {0xf9c3,0x692c}, {0xf9c4,0x694c}, {0xf9c5,0x6977}, {0xf9c6,0x6a41}, {0xf9c7,0x6a65}, {0xf9c8,0x6a74}, {0xf9c9,0x6a77}, {0xf9ca,0x6a7c}, {0xf9cb,0x6a7e}, {0xf9cc,0x6b24}, {0xf9cd,0x6b27}, {0xf9ce,0x6b29}, {0xf9cf,0x6b2a}, {0xf9d0,0x6b3a}, {0xf9d1,0x6b3b}, {0xf9d2,0x6b3d}, {0xf9d3,0x6b41}, {0xf9d4,0x6b42}, {0xf9d5,0x6b46}, {0xf9d6,0x6b47}, {0xf9d7,0x6b4c}, {0xf9d8,0x6b4f}, {0xf9d9,0x6b50}, {0xf9da,0x6b51}, {0xf9db,0x6b52}, {0xf9dc,0x6b58}, {0xf9dd,0x6c26}, {0xf9de,0x6c27}, {0xf9df,0x6c2a}, {0xf9e0,0x6c2f}, {0xf9e1,0x6c30}, {0xf9e2,0x6c31}, {0xf9e3,0x6c32}, {0xf9e4,0x6c35}, {0xf9e5,0x6c38}, {0xf9e6,0x6c3a}, {0xf9e7,0x6c40}, {0xf9e8,0x6c41}, {0xf9e9,0x6c45}, {0xf9ea,0x6c46}, {0xf9eb,0x6c49}, {0xf9ec,0x6c4a}, {0xf9ed,0x6c55}, {0xf9ee,0x6c5d}, {0xf9ef,0x6c5e}, {0xf9f0,0x6c61}, {0xf9f1,0x6c64}, {0xf9f2,0x6c67}, {0xf9f3,0x6c68}, {0xf9f4,0x6c77}, {0xf9f5,0x6c78}, {0xf9f6,0x6c7a}, {0xf9f7,0x6d21}, {0xf9f8,0x6d22}, {0xf9f9,0x6d23}, {0xf9fa,0x6d6e}, {0xf9fb,0x6e5b}, {0xf9fc,0x723d}, {0xf9fd,0x727a}, {0xf9fe,0x7331}, {0xf9ff,0x7427}, {0xfa00,0x746e}, {0xfa01,0x7674}, {0xfa02,0x7676}, {0xfa03,0x7738}, {0xfa04,0x7748}, {0xfa05,0x7753}, {0xfa06,0x785b}, {0xfa07,0x7870}, {0xfa08,0x7a21}, {0xfa09,0x7a22}, {0xfa0a,0x7a66}, {0xfa0b,0x7c29}, }; static uint16_t unicode2ksc(unsigned unicode) { unsigned lo, hi, mid, c2; uint8_t s[2]; lo = mid = c2 = 0; if (unicode >= 0xac00 && unicode <= 0xd7a3) { // Hangul hi = 2349; while (lo <= hi) { // binary search mid = (lo + hi) / 2; c2 = ksc5601_hangul_to_unicode[mid]; if (unicode < c2) hi = mid - 1; else if (unicode > c2) lo = mid + 1; else { // unicode == c2 s[0] = (mid / 94) + 0x30; s[1] = (mid % 94) + 0x21; return ((s[0] << 8) | s[1]); } } } else if ((unicode >= 0x4e00 && unicode <= 0x9fff) || (unicode >= 0xf900 && unicode <= 0xfa0b)) { // Hanja hi = 4887; while (lo <= hi) { // binary search mid = (lo + hi) / 2; c2 = unicode_to_ksc5601_hanja[mid].unicode; if (unicode < c2) hi = mid - 1; else if (unicode > c2) lo = mid + 1; else { // unicode == c2 return unicode_to_ksc5601_hanja[mid].kscode; } } } else { // Symbol hi = 985; while (lo <= hi) { // binary search mid = (lo + hi) / 2; c2 = unicode_to_ksc5601_symbol[mid].unicode; if (unicode < c2) hi = mid - 1; else if (unicode > c2) lo = mid + 1; else { // unicode == c2 return unicode_to_ksc5601_symbol[mid].kscode; } } } return 0; } void KRTextDecoder::EncodeEucKr(const std::wstring& str, std::string& bytes) { static const char replacement = '?'; //int invalid = 0; bytes.resize(2 * str.length() + 1); int index = 0; for (wchar_t ch : str) { unsigned j; if (ch < 0x80) { // ASCII bytes[index++] = static_cast(ch); } else if ((j = unicode2ksc(ch))) { // KSC 5601 bytes[index++] = static_cast((j >> 8) | 0x80); bytes[index++] = static_cast((j & 0xff) | 0x80); } else { // Error bytes[index++] = replacement; //++invalid; } } bytes.resize(index); }zxing-cpp-1.0.8+ds2/core/src/textcodec/KRTextEncoder.h000066400000000000000000000032651361167020700224670ustar00rootroot00000000000000#pragma once /**************************************************************************** ** ** Copyright (C) 2015 The Qt Company Ltd. ** Contact: http://www.qt.io/licensing/ ** ** This file is part of the QtCore module of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:LGPL21$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and The Qt Company. For licensing terms ** and conditions see http://www.qt.io/terms-conditions. For further ** information use the contact form at http://www.qt.io/contact-us. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 or version 3 as published by the Free ** Software Foundation and appearing in the file LICENSE.LGPLv21 and ** LICENSE.LGPLv3 included in the packaging of this file. Please review the ** following information to ensure the GNU Lesser General Public License ** requirements will be met: https://www.gnu.org/licenses/lgpl.html and ** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** As a special exception, The Qt Company gives you certain additional ** rights. These rights are described in The Qt Company LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** $QT_END_LICENSE$ ** ****************************************************************************/ #include class KRTextDecoder { public: static void EncodeEucKr(const std::wstring& str, std::string& bytes); }; zxing-cpp-1.0.8+ds2/example/000077500000000000000000000000001361167020700155615ustar00rootroot00000000000000zxing-cpp-1.0.8+ds2/example/CMakeLists.txt000066400000000000000000000035331361167020700203250ustar00rootroot00000000000000cmake_minimum_required (VERSION 3.1.3) project (ZXingExamples) set (ENABLE_ENCODERS ON CACHE BOOL "Check to include encoders") set (ENABLE_DECODERS ON CACHE BOOL "Check to include decoders") add_definitions (-DUNICODE -D_UNICODE) if (MSVC) add_definitions (-D_SCL_SECURE_NO_WARNINGS -D_CRT_SECURE_NO_WARNINGS -D_CRT_NONSTDC_NO_WARNINGS -DNOMINMAX) set (CMAKE_C_FLAGS_RELEASE "${CMAKE_C_FLAGS_RELEASE} /Oi /GS-") set (CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE} /Oi /GS-") else() set (CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wall -Wextra") set (CMAKE_C_FLAGS_DEBUG "${CMAKE_C_FLAGS_DEBUG} -D_DEBUG") set (CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} -D_DEBUG") endif() add_subdirectory (${CMAKE_CURRENT_SOURCE_DIR}/../core ${CMAKE_BINARY_DIR}/ZXingCore) if (ENABLE_DECODERS) add_executable (scan_image scan_image.cpp ) target_include_directories (scan_image PRIVATE ../thirdparty/stb ) target_compile_options (scan_image PRIVATE -DLODEPNG_NO_COMPILE_ENCODER) if ("${CMAKE_CXX_COMPILER_ID}" MATCHES "GNU") target_compile_options (scan_image PRIVATE -std=c++11) elseif (APPLE) target_compile_options (scan_image PRIVATE -std=c++11 -stdlib=libc++) endif() target_link_libraries (scan_image ZXingCore) endif() if (ENABLE_ENCODERS) add_executable (generate_image generate_image.cpp ) target_include_directories (generate_image PRIVATE ../thirdparty/stb ) target_compile_options (generate_image PRIVATE -DLODEPNG_NO_COMPILE_DECODER) if ("${CMAKE_CXX_COMPILER_ID}" MATCHES "GNU") target_compile_options (generate_image PRIVATE -std=c++11) elseif (APPLE) target_compile_options (generate_image PRIVATE -std=c++11 -stdlib=libc++) endif() target_link_libraries (generate_image ZXingCore) endif() zxing-cpp-1.0.8+ds2/example/generate_image.cpp000066400000000000000000000132671361167020700212320ustar00rootroot00000000000000/* * Copyright 2016 Nu-book Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #include "BarcodeFormat.h" #include "MultiFormatWriter.h" #include "BitMatrix.h" #include "ByteMatrix.h" #include "TextUtfEncoding.h" #include "ZXStrConvWorkaround.h" #include #include #include #include #include #include #define STB_IMAGE_WRITE_IMPLEMENTATION #include "stb_image_write.h" using namespace ZXing; static void PrintUsage(const char* exePath) { std::cout << "Usage: " << exePath << " [-size x] [-margin ] [-encoding ] [-ecc ] \n" << " -size Size of generated image\n" << " -margin Margin around barcode\n" << " -encoding Encoding used to encode input text\n" << " -ecc Error correction level, [0-8]\n" << "\n" << "Supported formats are:\n" << " AZTEC\n" << " CODABAR\n" << " CODE_39\n" << " CODE_93\n" << " CODE_128\n" << " DATA_MATRIX\n" << " EAN_8\n" << " EAN_13\n" << " ITF\n" << " PDF_417\n" << " QR_CODE\n" << " UPC_A\n" << " UPC_E\n" << "Formats can be lowercase letters, with or without underscore.\n"; } static std::string FormatClean(std::string str) { std::transform(str.begin(), str.end(), str.begin(), [](char c) { return (char)std::tolower(c); }); str.erase(std::remove(str.begin(), str.end(), '_'), str.end()); return str; } static std::string ParseFormat(std::string str) { str = FormatClean(str); for (int i = 0; i < (int)BarcodeFormat::FORMAT_COUNT; ++i) { auto standardForm = ToString((BarcodeFormat)i); if (str == FormatClean(standardForm)) return standardForm; } return std::string(); } static bool ParseSize(std::string str, int* width, int* height) { std::transform(str.begin(), str.end(), str.begin(), [](char c) { return (char)std::tolower(c); }); auto xPos = str.find('x'); if (xPos != std::string::npos) { *width = std::stoi(str.substr(0, xPos)); *height = std::stoi(str.substr(xPos + 1)); return true; } return false; } static bool ParseOptions(int argc, char* argv[], int* width, int* height, int* margin, int* eccLevel, std::string* format, std::string* text, std::string* filePath) { int nonOptArgCount = 0; for (int i = 1; i < argc; ++i) { if (strcmp(argv[i], "-size") == 0) { if (i + 1 < argc) { ++i; if (!ParseSize(argv[i], width, height)) { std::cerr << "Invalid size specification: " << argv[i] << std::endl; return false; } } else { return false; } } else if (strcmp(argv[i], "-margin") == 0) { if (i + 1 < argc) { ++i; *margin = std::stoi(argv[i]); } else { return false; } } else if (strcmp(argv[i], "-ecc") == 0) { if (i + 1 < argc) { ++i; *eccLevel = std::stoi(argv[i]); } else { return false; } } else if (nonOptArgCount == 0) { *format = ParseFormat(argv[i]); if (format->empty()) { std::cerr << "Unreconigned format: " << argv[i] << std::endl; return false; } ++nonOptArgCount; } else if (nonOptArgCount == 1) { *text = argv[i]; ++nonOptArgCount; } else if (nonOptArgCount == 2) { *filePath = argv[i]; ++nonOptArgCount; } else { return false; } } return !format->empty() && !text->empty() && !filePath->empty(); } static std::string GetExtension(const std::string& path) { auto fileNameStart = path.find_last_of("/\\"); auto fileName = fileNameStart == std::string::npos ? path : path.substr(fileNameStart + 1); auto extStart = fileName.find_last_of('.'); auto ext = extStart == std::string::npos ? "" : fileName.substr(extStart + 1); std::transform(ext.begin(), ext.end(), ext.begin(), [](unsigned char c) { return std::tolower(c); }); return ext; } int main(int argc, char* argv[]) { if (argc <= 2) { PrintUsage(argv[0]); return 0; } int width = 100, height = 100; int margin = 10; int eccLevel = -1; std::string format, text, filePath; if (!ParseOptions(argc, argv, &width, &height, &margin, &eccLevel, &format, &text, &filePath)) { PrintUsage(argv[0]); return -1; } try { auto barcodeFormat = BarcodeFormatFromString(format); if (barcodeFormat == BarcodeFormat::FORMAT_COUNT) throw std::invalid_argument("Unsupported format: " + format); MultiFormatWriter writer(barcodeFormat); if (margin >= 0) writer.setMargin(margin); if (eccLevel >= 0) writer.setEccLevel(eccLevel); auto bitmap = writer.encode(TextUtfEncoding::FromUtf8(text), width, height).toByteMatrix(); auto ext = GetExtension(filePath); int success = 0; if (ext == "" || ext == "png") { success = stbi_write_png(filePath.c_str(), bitmap.width(), bitmap.height(), 1, bitmap.data(), 0); } else if (ext == "jpg" || ext == "jpeg") { success = stbi_write_jpg(filePath.c_str(), bitmap.width(), bitmap.height(), 1, bitmap.data(), 0); } if (!success) { std::cerr << "Failed to write image: " << filePath << std::endl; return -1; } } catch (const std::exception& e) { std::cerr << e.what() << std::endl; return -1; } return 0; } zxing-cpp-1.0.8+ds2/example/scan_image.cpp000066400000000000000000000075161361167020700203640ustar00rootroot00000000000000/* * Copyright 2016 Nu-book Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #include "ReadBarcode.h" #include "TextUtfEncoding.h" #include #include #include #include #include #define STB_IMAGE_IMPLEMENTATION #include "stb_image.h" using namespace ZXing; static void PrintUsage(const char* exePath) { std::cout << "Usage: " << exePath << " [-fast] [-rotate] [-format ] \n" << " -fast Do not try harder to detect, thus faster\n" << " -rotate Try to rotate image of 90 degrees if it fails to detect barcode\n" << " -format Try to read given format only. Supported formats are:\n"; for (int i = 0; i < (int)BarcodeFormat::FORMAT_COUNT; ++i) { std::cout << " " << ToString((BarcodeFormat)i) << "\n"; } std::cout << " Formats can be lowercase letters, with or without underscore.\n"; } static std::string FormatClean(std::string str) { std::transform(str.begin(), str.end(), str.begin(), [](char c) { return (char)std::tolower(c); }); str.erase(std::remove(str.begin(), str.end(), '_'), str.end()); return str; } static std::string ParseFormat(std::string str) { str = FormatClean(str); for (int i = 0; i < (int)BarcodeFormat::FORMAT_COUNT; ++i) { auto standardForm = ToString((BarcodeFormat)i); if (str == FormatClean(standardForm)) return standardForm; } return std::string(); } static bool ParseOptions(int argc, char* argv[], bool* fastMode, bool* tryRotate, std::string* format, std::string* filePath) { for (int i = 1; i < argc; ++i) { if (strcmp(argv[i], "-fast") == 0) { *fastMode = true; } else if (strcmp(argv[i], "-rotate") == 0) { *tryRotate = true; } else if (strcmp(argv[i], "-format") == 0) { if (i + 1 < argc) { ++i; *format = ParseFormat(argv[i]); if (format->empty()) { std::cerr << "Unreconigned format: " << argv[i] << "\n"; return false; } } else { return false; } } else { *filePath = argv[i]; } } return !filePath->empty(); } std::ostream& operator<<(std::ostream& os, const std::vector& points) { for (const auto& p : points) os << int(p.x() + .5f) << "x" << int(p.y() + .5f) << " "; return os; } int main(int argc, char* argv[]) { if (argc <= 1) { PrintUsage(argv[0]); return 0; } bool fastMode = false; bool tryRotate = false; std::string singleFormat, filePath; if (!ParseOptions(argc, argv, &fastMode, &tryRotate, &singleFormat, &filePath)) { PrintUsage(argv[0]); return -1; } int width, height, channels; std::unique_ptr buffer(stbi_load(filePath.c_str(), &width, &height, &channels, 4), stbi_image_free); if (buffer == nullptr) { std::cerr << "Failed to read image: " << filePath << "\n"; return -1; } auto result = ReadBarcode(width, height, buffer.get(), width * 4, 4, 0, 1, 2, {BarcodeFormatFromString(singleFormat)}, tryRotate, !fastMode); if (result.isValid()) { std::cout << "Text: " << TextUtfEncoding::ToUtf8(result.text()) << "\n" << "Format: " << ToString(result.format()) << "\n" << "Position: " << result.resultPoints() << "\n"; auto errLevel = result.metadata().getString(ResultMetadata::Key::ERROR_CORRECTION_LEVEL); if (!errLevel.empty()) { std::cout << "EC Level: " << TextUtfEncoding::ToUtf8(errLevel) << "\n"; } return 0; } return 1; } zxing-cpp-1.0.8+ds2/wrappers/000077500000000000000000000000001361167020700157715ustar00rootroot00000000000000zxing-cpp-1.0.8+ds2/wrappers/android/000077500000000000000000000000001361167020700174115ustar00rootroot00000000000000zxing-cpp-1.0.8+ds2/wrappers/android/java/000077500000000000000000000000001361167020700203325ustar00rootroot00000000000000zxing-cpp-1.0.8+ds2/wrappers/android/java/com/000077500000000000000000000000001361167020700211105ustar00rootroot00000000000000zxing-cpp-1.0.8+ds2/wrappers/android/java/com/zxing/000077500000000000000000000000001361167020700222475ustar00rootroot00000000000000zxing-cpp-1.0.8+ds2/wrappers/android/java/com/zxing/BarcodeFormat.java000066400000000000000000000027261361167020700256310ustar00rootroot00000000000000/* * Copyright 2007 ZXing authors * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package com.zxing; /** * Enumerates barcode formats known to this package. * Note that this should be keep synchronized with native (C++) side. */ public enum BarcodeFormat { /** Aztec 2D barcode format. */ AZTEC, /** CODABAR 1D format. */ CODABAR, /** Code 39 1D format. */ CODE_39, /** Code 93 1D format. */ CODE_93, /** Code 128 1D format. */ CODE_128, /** Data Matrix 2D barcode format. */ DATA_MATRIX, /** EAN-8 1D format. */ EAN_8, /** EAN-13 1D format. */ EAN_13, /** ITF (Interleaved Two of Five) 1D format. */ ITF, /** MaxiCode 2D barcode format. */ MAXICODE, /** PDF417 format. */ PDF_417, /** QR Code 2D barcode format. */ QR_CODE, /** RSS 14 */ RSS_14, /** RSS EXPANDED */ RSS_EXPANDED, /** UPC-A 1D format. */ UPC_A, /** UPC-E 1D format. */ UPC_E, /** UPC/EAN extension format. Not a stand-alone format. */ UPC_EAN_EXTENSION } zxing-cpp-1.0.8+ds2/wrappers/android/java/com/zxing/BarcodeReader.java000066400000000000000000000045311361167020700255770ustar00rootroot00000000000000/* * Copyright 2016 Nu-book Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package com.zxing; import android.graphics.Bitmap; public class BarcodeReader { public static class Result { public BarcodeFormat getFormat() { return format; } public String getText() { return text; } Result(BarcodeFormat format, String text) { this.format = format; this.text = text; } private BarcodeFormat format; private String text; } public BarcodeReader(BarcodeFormat... formats) { int[] nativeFormats = new int[formats.length]; for (int i = 0; i < formats.length; ++i) { nativeFormats[i] = formats[i].ordinal(); } _nativePtr = createInstance(nativeFormats); } public Result read(Bitmap bitmap, int cropWidth, int cropHeight) { int imgWidth = bitmap.getWidth(); int imgHeight = bitmap.getHeight(); cropWidth = cropWidth <= 0 ? imgWidth : Math.min(imgWidth, cropWidth); cropHeight = cropHeight <= 0 ? imgHeight : Math.min(imgHeight, cropHeight); int cropLeft = (imgWidth - cropWidth) / 2; int cropTop = (imgHeight - cropHeight) / 2; Object[] result = new Object[1]; int resultFormat = readBarcode(_nativePtr, bitmap, cropLeft, cropTop, cropWidth, cropHeight, result); if (resultFormat >= 0) { return new Result(BarcodeFormat.values()[resultFormat], (String)result[0]); } return null; } @Override protected void finalize() throws Throwable { try { if (_nativePtr != 0) { destroyInstance(_nativePtr); _nativePtr = 0; } } finally { super.finalize(); } } private long _nativePtr = 0; private static native long createInstance(int[] formats); private static native void destroyInstance(long objPtr); private static native int readBarcode(long objPtr, Bitmap bitmap, int left, int top, int width, int height, Object[] result); static { System.loadLibrary("zxing-android"); } } zxing-cpp-1.0.8+ds2/wrappers/android/jni/000077500000000000000000000000001361167020700201715ustar00rootroot00000000000000zxing-cpp-1.0.8+ds2/wrappers/android/jni/Android.mk000066400000000000000000000007101361167020700221000ustar00rootroot00000000000000LOCAL_PATH:= $(call my-dir) include $(CLEAR_VARS) LOCAL_MODULE := zxing_android LOCAL_CFLAGS += -Wall LOCAL_CPPFLAGS += -std=c++11 LOCAL_SRC_FILES := \ JNIUtils.cpp \ BarcodeReader.cpp LOCAL_CPP_FEATURES += rtti exceptions LOCAL_STATIC_LIBRARIES := zxing_core LOCAL_LDLIBS := -llog -ljnigraphics ifeq ($(TARGET_ARCH_ABI), armeabi) LOCAL_LDLIBS += -latomic endif include $(BUILD_SHARED_LIBRARY) include $(LOCAL_PATH)/../../../core/Android.mk zxing-cpp-1.0.8+ds2/wrappers/android/jni/Application.mk000066400000000000000000000002601361167020700227630ustar00rootroot00000000000000# See /docs/APPLICATION-MK.html for more details. APP_ABI := armeabi x86 APP_STL := gnustl_shared # The minimum API level our apps run on APP_PLATFORM := android-9 zxing-cpp-1.0.8+ds2/wrappers/android/jni/BarcodeReader.cpp000066400000000000000000000051601361167020700233610ustar00rootroot00000000000000/* * Copyright 2016 Nu-book Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #include "JNIUtils.h" #include "MultiFormatReader.h" #include "DecodeHints.h" #include "Result.h" #include static std::vector GetFormats(JNIEnv* env, jintArray formats) { std::vector result; jsize len = env->GetArrayLength(formats); if (len > 0) { std::vector elems(len); env->GetIntArrayRegion(formats, 0, elems.size(), elems.data()); result.resize(len); for (jsize i = 0; i < len; ++i) { result[i] = ZXing::BarcodeFormat(elems[i]); } } return result; } extern "C" JNIEXPORT jlong JNICALL Java_com_zxing_BarcodeReader_createInstance(JNIEnv* env, jobject thiz, jintArray formats) { try { ZXing::DecodeHints hints; if (formats != nullptr) { hints.setPossibleFormats(GetFormats(env, formats)); } return reinterpret_cast(new ZXing::MultiFormatReader(hints)); } catch (const std::exception& e) { ThrowJavaException(env, e.what()); } catch (...) { ThrowJavaException(env, "Unknown exception"); } return 0; } extern "C" JNIEXPORT void JNICALL Java_com_zxing_BarcodeReader_destroyInstance(JNIEnv* env, jobject thiz, jlong objPtr) { try { delete reinterpret_cast(objPtr); } catch (const std::exception& e) { ThrowJavaException(env, e.what()); } catch (...) { ThrowJavaException(env, "Unknown exception"); } } extern "C" JNIEXPORT jint JNICALL Java_com_zxing_BarcodeReader_readBarcode(JNIEnv* env, jobject thiz, jlong objPtr, jobject bitmap, jint left, jint top, jint width, jint height, jobjectArray result) { try { auto reader = reinterpret_cast(objPtr); auto binImage = BinaryBitmapFromJavaBitmap(env, bitmap, left, top, width, height); auto readResult = reader->read(*binImage); if (readResult.isValid()) { env->SetObjectArrayElement(result, 0, ToJavaString(env, readResult.text())); return static_cast(readResult.format()); } } catch (const std::exception& e) { ThrowJavaException(env, e.what()); } catch (...) { ThrowJavaException(env, "Unknown exception"); } return -1; } zxing-cpp-1.0.8+ds2/wrappers/android/jni/JNIUtils.cpp000066400000000000000000000066131361167020700223440ustar00rootroot00000000000000/* * Copyright 2016 Nu-book Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #include "JNIUtils.h" #include "GenericLuminanceSource.h" #include "HybridBinarizer.h" #include #include #include namespace { struct AutoUnlockPixels { JNIEnv* m_env; jobject m_bitmap; AutoUnlockPixels(JNIEnv* env, jobject bitmap) : m_env(env), m_bitmap(bitmap) {} ~AutoUnlockPixels() { AndroidBitmap_unlockPixels(m_env, m_bitmap); } }; } // anonymous std::shared_ptr BinaryBitmapFromJavaBitmap(JNIEnv* env, jobject bitmap, int cropLeft, int cropTop, int cropWidth, int cropHeight) { using namespace ZXing; AndroidBitmapInfo bmInfo; AndroidBitmap_getInfo(env, bitmap, &bmInfo); cropLeft = std::max(0, cropLeft); cropTop = std::max(0, cropTop); cropWidth = cropWidth < 0 ? ((int)bmInfo.width - cropLeft) : std::min((int)bmInfo.width - cropLeft, cropWidth); cropHeight = cropHeight < 0 ? ((int)bmInfo.height - cropTop) : std::min((int)bmInfo.height - cropTop, cropHeight); void *pixels = nullptr; if (AndroidBitmap_lockPixels(env, bitmap, &pixels) == ANDROID_BITMAP_RESUT_SUCCESS) { AutoUnlockPixels autounlock(env, bitmap); std::shared_ptr luminance; switch (bmInfo.format) { case ANDROID_BITMAP_FORMAT_A_8: luminance = std::make_shared(cropLeft, cropTop, cropWidth, cropHeight, pixels, bmInfo.stride); break; case ANDROID_BITMAP_FORMAT_RGBA_8888: luminance = std::make_shared(cropLeft, cropTop, cropWidth, cropHeight, pixels, bmInfo.stride, 4, 0, 1, 2); break; default: throw std::runtime_error("Unsupported format"); } return std::make_shared(luminance); } else { throw std::runtime_error("Failed to read bitmap's data"); } } void ThrowJavaException(JNIEnv* env, const char* message) { static jclass jcls = env->FindClass("java/lang/RuntimeException"); env->ThrowNew(jcls, message); } static bool RequiresSurrogates(uint32_t ucs4) { return ucs4 >= 0x10000; } static uint16_t HighSurrogate(uint32_t ucs4) { return uint16_t((ucs4 >> 10) + 0xd7c0); } static uint16_t LowSurrogate(uint32_t ucs4) { return uint16_t(ucs4 % 0x400 + 0xdc00); } static void Utf32toUtf16(const uint32_t* utf32, size_t length, std::vector& result) { result.clear(); result.reserve(length); for (size_t i = 0; i < length; ++i) { uint32_t c = utf32[i]; if (RequiresSurrogates(c)) { result.push_back(HighSurrogate(c)); result.push_back(LowSurrogate(c)); } else { result.push_back(c); } } } jstring ToJavaString(JNIEnv* env, const std::wstring& str) { if (sizeof(wchar_t) == 2) { return env->NewString((const jchar*)str.data(), str.size()); } else { std::vector buffer; Utf32toUtf16((const uint32_t*)str.data(), str.size(), buffer); return env->NewString((const jchar*)buffer.data(), buffer.size()); } } zxing-cpp-1.0.8+ds2/wrappers/android/jni/JNIUtils.h000066400000000000000000000025601361167020700220060ustar00rootroot00000000000000#pragma once /* * Copyright 2016 Nu-book Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #include #include #include #include #define ZX_LOG_TAG "ZXing" #define LOGV(...) __android_log_print(ANDROID_LOG_VERBOSE, ZX_LOG_TAG, __VA_ARGS__) #define LOGD(...) __android_log_print(ANDROID_LOG_DEBUG, ZX_LOG_TAG, __VA_ARGS__) #define LOGW(...) __android_log_print(ANDROID_LOG_WARN, ZX_LOG_TAG, __VA_ARGS__) #define LOGE(...) __android_log_print(ANDROID_LOG_ERROR, ZX_LOG_TAG, __VA_ARGS__) namespace ZXing { class BinaryBitmap; } // Create BinaryBitmap from Android's Bitmap std::shared_ptr BinaryBitmapFromJavaBitmap(JNIEnv* env, jobject bitmap, int cropLeft, int cropTop, int cropWidth, int cropHeight); void ThrowJavaException(JNIEnv* env, const char* message); jstring ToJavaString(JNIEnv* env, const std::wstring& str); zxing-cpp-1.0.8+ds2/wrappers/gdiplus/000077500000000000000000000000001361167020700174405ustar00rootroot00000000000000zxing-cpp-1.0.8+ds2/wrappers/gdiplus/BarcodeGenerator.cpp000066400000000000000000000027601361167020700233570ustar00rootroot00000000000000/* * Copyright 2017 Huy Cuong Nguyen * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #include "BarcodeGenerator.h" #include "BarcodeFormat.h" #include "CharacterSetECI.h" #include "MultiFormatWriter.h" #include "BitMatrix.h" #include "ImageWriter.h" #include namespace ZXing { BarcodeGenerator::BarcodeGenerator(const std::string& format) { auto barcodeFormat = BarcodeFormatFromString(format); if (barcodeFormat == BarcodeFormat::FORMAT_COUNT) throw std::invalid_argument("Unsupported format: " + format); _writer.reset(new MultiFormatWriter(barcodeFormat)); } void BarcodeGenerator::setEncoding(const std::string& encoding) { _writer->setEncoding(CharacterSetECI::CharsetFromName(encoding.c_str())); } void BarcodeGenerator::setMargin(int margin) { _writer->setMargin(margin); } std::shared_ptr BarcodeGenerator::generate(const std::wstring& contents, int width, int height) const { return ImageWriter::CreateImage(_writer->encode(contents, width, height)); } } // ZXing zxing-cpp-1.0.8+ds2/wrappers/gdiplus/BarcodeGenerator.h000066400000000000000000000025231361167020700230210ustar00rootroot00000000000000#pragma once /* * Copyright 2017 Huy Cuong Nguyen * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #include #include namespace Gdiplus { class Bitmap; } namespace ZXing { class MultiFormatWriter; class BarcodeGenerator { public: /** Supported formats are: "AZTEC", "CODABAR", "CODE_39", "CODE_93", "CODE_128", "DATA_MATRIX", "EAN_8", "EAN_13", "ITF", "PDF_417", "QR_CODE", "UPC_A", "UPC_E", */ explicit BarcodeGenerator(const std::string& format); /** * Used for AZTEC, PDF417, and QR_CODE only. */ void setEncoding(const std::string& encoding); /** * Used for all except AZTEC, DATA_MATRIX. */ void setMargin(int margin); std::shared_ptr generate(const std::wstring& contents, int width, int height) const; private: std::shared_ptr _writer; }; } // ZXing zxing-cpp-1.0.8+ds2/wrappers/gdiplus/BarcodeReader.cpp000066400000000000000000000035211361167020700226270ustar00rootroot00000000000000/* * Copyright 2016 Nu-book Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #include "BarcodeReader.h" #include "TextUtfEncoding.h" #include "HybridBinarizer.h" #include "BinaryBitmap.h" #include "MultiFormatReader.h" #include "Result.h" #include "DecodeHints.h" #include "ImageReader.h" namespace ZXing { BarcodeReader::BarcodeReader(bool tryHarder, bool tryRotate, const std::string& format) { DecodeHints hints; hints.setTryHarder(tryHarder); hints.setTryRotate(tryRotate); hints.setPossibleFormats({BarcodeFormatFromString(format)}); _reader = std::make_shared(hints); } BarcodeReader::ScanResult BarcodeReader::scan(Gdiplus::Bitmap& bitmap, int rotations) { Result result(DecodeStatus::NotFound); auto binImg = std::make_shared(ImageReader::Read(bitmap)); if ((rotations & Rotation0) != 0) { result = _reader->read(*binImg); } if (!result.isValid() && (rotations & Rotation180) != 0) { result = _reader->read(*binImg->rotated(180)); } if (!result.isValid() && (rotations & RotationCW90) != 0) { result = _reader->read(*binImg->rotated(90)); } if (!result.isValid() && (rotations & RotationCCW90) != 0) { result = _reader->read(*binImg->rotated(270)); } if (result.isValid()) { return{ ToString(result.format()), TextUtfEncoding::ToUtf8(result.text()) }; } return ScanResult(); } } // ZXing zxing-cpp-1.0.8+ds2/wrappers/gdiplus/BarcodeReader.h000066400000000000000000000026441361167020700223010ustar00rootroot00000000000000#pragma once /* * Copyright 2016 Nu-book Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #include #include namespace Gdiplus { class Bitmap; } namespace ZXing { class MultiFormatReader; class BarcodeReader { public: struct ScanResult { std::string format; std::string text; // in UTF-8 }; enum Rotation { Rotation0 = 1, RotationCW90 = 2, Rotation180 = 4, RotationCCW90 = 8, }; /** Supported formats are: "AZTEC", "CODABAR", "CODE_39", "CODE_93", "CODE_128", "DATA_MATRIX", "EAN_8", "EAN_13", "ITF", "MAXICODE", "PDF_417", "QR_CODE", "RSS_14", "RSS_EXPANDED", "UPC_A", "UPC_E", "UPC_EAN_EXTENSION", */ explicit BarcodeReader(bool tryHarder = false, bool tryRotate = true, const std::string& format = std::string()); ScanResult scan(Gdiplus::Bitmap& bitmap, int rotations = Rotation0); private: std::shared_ptr _reader; }; } // ZXing zxing-cpp-1.0.8+ds2/wrappers/gdiplus/CMakeLists.txt000066400000000000000000000034001361167020700221750ustar00rootroot00000000000000if (${CMAKE_SOURCE_DIR} STREQUAL ${CMAKE_CURRENT_SOURCE_DIR}) # this is the top level project cmake_minimum_required (VERSION 2.8.12) project (ZXingGdiPlus) set (ENABLE_ENCODERS OFF CACHE BOOL "Check to include encoders") set (ENABLE_DECODERS ON CACHE BOOL "Check to include decoders") set (LINK_CPP_STATICALLY OFF CACHE BOOL "MSVC only, check to link statically standard library (/MT and /MTd)") add_definitions (-DUNICODE -D_UNICODE) if (MSVC AND LINK_CPP_STATICALLY) set (CMAKE_C_FLAGS_RELEASE "${CMAKE_C_FLAGS_RELEASE} /MT") set (CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE} /MT") set (CMAKE_C_FLAGS_DEBUG "${CMAKE_C_FLAGS_DEBUG} /MTd") set (CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} /MTd") endif() endif() if (NOT DEFINED ENABLE_ENCODERS) set (ENABLE_ENCODERS OFF) endif() if (NOT DEFINED ENABLE_DECODERS) set (ENABLE_DECODERS ON) endif() add_subdirectory (${CMAKE_CURRENT_SOURCE_DIR}/../../core ${CMAKE_BINARY_DIR}/ZXingCore) set (LOCAL_COMMON_FILES GdiplusInit.h GdiplusInit.cpp ) if (ENABLE_DECODERS) set (DECODERS_FILES ImageReader.h ImageReader.cpp BarcodeReader.h BarcodeReader.cpp ) endif() if (ENABLE_ENCODERS) set (ENCODERS_FILES ImageWriter.h ImageWriter.cpp BarcodeGenerator.h BarcodeGenerator.cpp ) endif() source_group (Sources FILES ${LOCAL_COMMON_FILES} ${DECODERS_FILES} ${ENCODERS_FILES} ) add_library (ZXingGdiPlus ${LOCAL_COMMON_FILES} ${DECODERS_FILES} ${ENCODERS_FILES} ) target_include_directories (ZXingGdiPlus PUBLIC . ) target_link_libraries (ZXingGdiPlus PRIVATE ZXingCore gdiplus.lib ) target_compile_options (ZXingGdiPlus PUBLIC -DGDIPVER=0x0110 ) zxing-cpp-1.0.8+ds2/wrappers/gdiplus/GdiplusInit.cpp000066400000000000000000000005621361167020700224020ustar00rootroot00000000000000#include "GdiplusInit.h" #include #include namespace ZXing { GdiplusInit::GdiplusInit() { Gdiplus::GdiplusStartupInput input; if (Gdiplus::GdiplusStartup(&_token, &input, NULL) != Gdiplus::Ok) throw std::runtime_error("Unable to initialize GDI+ runtimes"); } GdiplusInit::~GdiplusInit() { Gdiplus::GdiplusShutdown(_token); } } // ZXing zxing-cpp-1.0.8+ds2/wrappers/gdiplus/GdiplusInit.h000066400000000000000000000013451361167020700220470ustar00rootroot00000000000000#pragma once /* * Copyright 2016 Nu-book Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #include namespace ZXing { class GdiplusInit { public: GdiplusInit(); ~GdiplusInit(); private: ULONG_PTR _token; }; } // ZXing zxing-cpp-1.0.8+ds2/wrappers/gdiplus/ImageReader.cpp000066400000000000000000000031601361167020700223110ustar00rootroot00000000000000/* * Copyright 2016 Nu-book Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #include "ImageReader.h" #include #include #include #include #include "GenericLuminanceSource.h" namespace ZXing { static std::shared_ptr CreateLuminanceSource(Gdiplus::Bitmap& bitmap, const Gdiplus::BitmapData& data) { switch (bitmap.GetPixelFormat()) { case PixelFormat24bppRGB: return std::make_shared(data.Width, data.Height, data.Scan0, data.Stride, 3, 2, 1, 0); case PixelFormat32bppARGB: case PixelFormat32bppRGB: return std::make_shared(data.Width, data.Height, data.Scan0, data.Stride, 4, 2, 1, 0); } throw std::invalid_argument("Unsupported format"); } std::shared_ptr ImageReader::Read(Gdiplus::Bitmap& bitmap) { Gdiplus::BitmapData data; bitmap.LockBits(nullptr, Gdiplus::ImageLockModeRead, bitmap.GetPixelFormat(), &data); try { auto result = CreateLuminanceSource(bitmap, data); bitmap.UnlockBits(&data); return result; } catch (...) { bitmap.UnlockBits(&data); throw; } } } // ZXing zxing-cpp-1.0.8+ds2/wrappers/gdiplus/ImageReader.h000066400000000000000000000014541361167020700217620ustar00rootroot00000000000000#pragma once /* * Copyright 2016 Nu-book Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #include namespace Gdiplus { class Bitmap; } namespace ZXing { class LuminanceSource; class ImageReader { public: static std::shared_ptr Read(Gdiplus::Bitmap& bitmap); }; } // ZXing zxing-cpp-1.0.8+ds2/wrappers/gdiplus/ImageWriter.cpp000066400000000000000000000027341361167020700223710ustar00rootroot00000000000000/* * Copyright 2016 Nu-book Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #include "ImageWriter.h" #include "BitMatrix.h" #include #include namespace ZXing { std::shared_ptr ImageWriter::CreateImage(const BitMatrix& barcode) { using namespace Gdiplus; auto bitmap = std::make_shared(barcode.width(), barcode.height(), PixelFormat32bppARGB); auto black = Color::Black; auto white = Color::White; auto rect = Rect(0, 0, barcode.width(), barcode.height()); BitmapData bitmapData; bitmap->LockBits(&rect, Gdiplus::ImageLockModeWrite, PixelFormat32bppARGB, &bitmapData); auto pixelBytes = reinterpret_cast(bitmapData.Scan0); for (int y = 0; y < barcode.height(); ++y) { auto pixels = reinterpret_cast(pixelBytes); for (int x = 0; x < barcode.width(); ++x) { *pixels++ = barcode.get(x, y) ? black : white; } pixelBytes += bitmapData.Stride; } bitmap->UnlockBits(&bitmapData); return bitmap; } } // ZXing zxing-cpp-1.0.8+ds2/wrappers/gdiplus/ImageWriter.h000066400000000000000000000014561361167020700220360ustar00rootroot00000000000000#pragma once /* * Copyright 2016 Nu-book Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #include namespace Gdiplus { class Bitmap; } namespace ZXing { class BitMatrix; class ImageWriter { public: static std::shared_ptr CreateImage(const BitMatrix& barcode); }; } // ZXing zxing-cpp-1.0.8+ds2/zxing.pc.in000066400000000000000000000004301361167020700162130ustar00rootroot00000000000000prefix=@INSTALLDIR@ exec_prefix=${prefix} libdir=${exec_prefix}/@CMAKE_INSTALL_LIBDIR@ includedir=${prefix}/@CMAKE_INSTALL_INCLUDEDIR@ Name: ZXing Description: ZXing library set Version: @VERSION@ Libs: -L${libdir} -l@TARGET_ZXING@ Cflags: -I${includedir} -I${includedir}/ZXing